From 168836cf2b4967a5fb2332867b329785cccc932a Mon Sep 17 00:00:00 2001 From: Moritz Bunkus Date: Fri, 1 Mar 2013 13:32:11 +0100 Subject: [PATCH] =?utf8?q?Verkn=C3=BCpfte=20Belege:=20beliebige=20Verkn?= =?utf8?q?=C3=BCpfungen=20hinzuf=C3=BCgen=20k=C3=B6nnen?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- SL/Controller/RecordLinks.pm | 141 ++++++++++++++++-- SL/DB/Manager/DeliveryOrder.pm | 33 +++- SL/DB/Manager/Invoice.pm | 32 +++- SL/DB/Manager/Order.pm | 2 + SL/DB/Manager/PurchaseInvoice.pm | 33 +++- SL/Presenter/Invoice.pm | 2 +- SL/Presenter/Record.pm | 33 ++-- css/presenter/record/record_list.css | 37 +++++ image/dialog-close.png | Bin 0 -> 2085 bytes locale/de/all | 10 +- .../presenter/record/empty_record_list.html | 2 - .../presenter/record/grouped_record_list.html | 48 ++++-- .../presenter/record/record_list.html | 14 +- .../webpages/record_links/add_filter.html | 96 ++++++++++++ templates/webpages/record_links/add_list.html | 34 +++++ 15 files changed, 467 insertions(+), 50 deletions(-) create mode 100644 css/presenter/record/record_list.css create mode 100644 image/dialog-close.png delete mode 100644 templates/webpages/presenter/record/empty_record_list.html create mode 100644 templates/webpages/record_links/add_filter.html create mode 100644 templates/webpages/record_links/add_list.html diff --git a/SL/Controller/RecordLinks.pm b/SL/Controller/RecordLinks.pm index a76144333..de0377577 100644 --- a/SL/Controller/RecordLinks.pm +++ b/SL/Controller/RecordLinks.pm @@ -4,13 +4,36 @@ use strict; use parent qw(SL::Controller::Base); +use List::Util qw(first); + +use SL::DB::Helper::Mappings; use SL::DB::Order; use SL::DB::DeliveryOrder; use SL::DB::Invoice; use SL::DB::PurchaseInvoice; +use SL::DB::RecordLink; +use SL::JSON; use SL::Locale::String; -__PACKAGE__->run_before('check_object_params', only => [ qw(ajax_list ajax_delete) ]); +use Rose::Object::MakeMethods::Generic +( + scalar => [ qw(object object_model object_id link_type link_direction link_type_desc) ], +); + +__PACKAGE__->run_before('check_object_params', only => [ qw(ajax_list ajax_delete ajax_add_select_type ajax_add_filter ajax_add_list ajax_add_do) ]); +__PACKAGE__->run_before('check_link_params', only => [ qw( ajax_add_list ajax_add_do) ]); + +my @link_types = ( + { title => t8('Sales quotation'), type => 'sales_quotation', model => 'Order', number => 'quonumber', }, + { title => t8('Sales Order'), type => 'sales_order', model => 'Order', number => 'ordnumber', }, + { title => t8('Sales delivery order'), type => 'sales_delivery_order', model => 'DeliveryOrder', number => 'donumber', }, + { title => t8('Sales Invoice'), type => 'invoice', model => 'Invoice', number => 'invnumber', }, + { title => t8('Request for Quotation'), type => 'request_quotation', model => 'Order', number => 'quonumber', }, + { title => t8('Purchase Order'), type => 'purchase_order', model => 'Order', number => 'ordnumber', }, + { title => t8('Purchase delivery order'), type => 'purchase_delivery_order', model => 'DeliveryOrder', number => 'donumber', }, + { title => t8('Purchase Invoice'), type => 'purchase_invoice', model => 'PurchaseInvoice', number => 'invnumber', }, +); + # # actions @@ -20,15 +43,13 @@ sub action_ajax_list { my ($self) = @_; eval { - my $model = 'SL::DB::' . $::form->{object_model}; - my $object = $model->new(id => $::form->{object_id})->load || die $::locale->text("Record not found"); - my $linked_records = $object->linked_records(direction => 'both'); + my $linked_records = $self->object->linked_records(direction => 'both'); my $output = SL::Presenter->get->grouped_record_list( $linked_records, with_columns => [ qw(record_link_direction) ], edit_record_links => 1, - object_model => $::form->{object_model}, - object_id => $::form->{object_id}, + object_model => $self->object_model, + object_id => $self->object_id, ); $self->render(\$output, { layout => 0, process => 0 }); @@ -41,16 +62,13 @@ sub action_ajax_list { sub action_ajax_delete { my ($self) = @_; - my $prefix = $::form->{form_prefix} || 'record_links'; - foreach my $str (@{ $::form->{"${prefix}_delete"} || [] }) { + foreach my $str (@{ $::form->{record_links_delete} || [] }) { my ($from_table, $from_id, $to_table, $to_id) = split m/__/, $str, 4; $from_id *= 1; $to_id *= 1; next if !$from_table || !$from_id || !$to_table || !$to_id; - # $::lxdebug->message(0, "INSERT INTO record_links (from_table, from_id, to_table, to_id) VALUES ('${from_table}', ${from_id}, '${to_table}', ${to_id});"); - SL::DB::Manager::RecordLink->delete_all(where => [ from_table => $from_table, from_id => $from_id, @@ -62,6 +80,87 @@ sub action_ajax_delete { $self->action_ajax_list; } +sub action_ajax_add_filter { + my ($self) = @_; + + my $presenter = $self->presenter; + + my @link_type_select = map { [ $_->{type}, $_->{title} ] } @link_types; + my @projects = map { [ $_->id, $presenter->project($_, display => 'inline', style => 'both', no_link => 1) ] } @{ SL::DB::Manager::Project->get_all_sorted }; + my $is_sales = $self->object->can('customer_id') && $self->object->customer_id; + + $self->render( + 'record_links/add_filter', + { layout => 0 }, + is_sales => $is_sales, + DEFAULT_LINK_TYPE => $is_sales ? 'sales_quotation' : 'request_quotation', + LINK_TYPES => \@link_type_select, + PROJECTS => \@projects, + ); +} + +sub action_ajax_add_list { + my ($self) = @_; + + my $manager = 'SL::DB::Manager::' . $self->link_type_desc->{model}; + my $vc = $self->link_type =~ m/sales_|^invoice$/ ? 'customer' : 'vendor'; + + my @where = $manager->type_filter($self->link_type); + push @where, ("${vc}.${vc}number" => { ilike => '%' . $::form->{vc_number} . '%' }) if $::form->{vc_number}; + push @where, ("${vc}.name" => { ilike => '%' . $::form->{vc_name} . '%' }) if $::form->{vc_name}; + push @where, (transaction_description => { ilike => '%' . $::form->{transaction_description} . '%' }) if $::form->{transaction_description}; + push @where, (globalproject_id => $::form->{globalproject_id}) if $::form->{globalproject_id}; + + my $objects = $manager->get_all_sorted(where => \@where, with_objects => [ $vc, 'globalproject' ]); + my $output = $self->render( + 'record_links/add_list', + { output => 0 }, + OBJECTS => $objects, + vc => $vc, + number_column => $self->link_type_desc->{number}, + ); + + my %result = ( count => scalar(@{ $objects }), html => $output ); + + $self->render(\to_json(\%result), { type => 'json', process => 0 }); +} + +sub action_ajax_add_do { + my ($self, %params) = @_; + + my $object_side = $self->link_direction eq 'from' ? 'from' : 'to'; + my $link_side = $object_side eq 'from' ? 'to' : 'from'; + my $link_table = SL::DB::Helper::Mappings::get_table_for_package($self->link_type_desc->{model}); + + foreach my $link_id (@{ $::form->{link_id} || [] }) { + # Check for existing reverse connections in order to avoid loops. + my @props = ( + "${link_side}_table" => $self->object->meta->table, + "${link_side}_id" => $self->object_id, + "${object_side}_table" => $link_table, + "${object_side}_id" => $link_id, + ); + + my $existing = SL::DB::Manager::RecordLink->get_all(where => \@props, limit => 1)->[0]; + next if $existing; + + # Check for existing connections in order to avoid duplicates. + @props = ( + "${object_side}_table" => $self->object->meta->table, + "${object_side}_id" => $self->object_id, + "${link_side}_table" => $link_table, + "${link_side}_id" => $link_id, + ); + + $existing = SL::DB::Manager::RecordLink->get_all(where => \@props, limit => 1)->[0]; + + SL::DB::RecordLink->new(@props)->save if !$existing; + } + + $self->action_ajax_list; +} + + # # filters # @@ -69,7 +168,27 @@ sub action_ajax_delete { sub check_object_params { my ($self) = @_; - return $::form->{object_id} && ($::form->{object_model} =~ m/^(?:Order|DeliveryOrder|Invoice|PurchaseInvoice)$/); + my %models = map { ($_->{model} => 1 ) } @link_types; + + $self->object_id( $::form->{object_id}); + $self->object_model($::form->{object_model}); + + die "Invalid object_model or object_id" if !$self->object_id || !$models{$self->object_model}; + + my $model = 'SL::DB::' . $self->object_model; + $self->object($model->new(id => $self->object_id)->load || die "Record not found"); + + return 1; +} + +sub check_link_params { + my ($self) = @_; + + $self->link_type( $::form->{link_type}); + $self->link_type_desc((first { $_->{type} eq $::form->{link_type} } @link_types) || die "Invalid link_type"); + $self->link_direction($::form->{link_direction} =~ m/^(?:from|to)$/ ? $::form->{link_direction} : die "Invalid link_direction"); + + return 1; } 1; diff --git a/SL/DB/Manager/DeliveryOrder.pm b/SL/DB/Manager/DeliveryOrder.pm index 1b76830ad..fa67f6675 100644 --- a/SL/DB/Manager/DeliveryOrder.pm +++ b/SL/DB/Manager/DeliveryOrder.pm @@ -2,8 +2,10 @@ package SL::DB::Manager::DeliveryOrder; use strict; -use SL::DB::Helper::Manager; -use base qw(SL::DB::Helper::Manager); +use parent qw(SL::DB::Helper::Manager); + +use SL::DB::Helper::Paginated; +use SL::DB::Helper::Sorted; sub object_class { 'SL::DB::DeliveryOrder' } @@ -19,4 +21,31 @@ sub type_filter { die "Unknown type $type"; } +sub _sort_spec { + return ( + default => [ 'transdate', 1 ], + nulls => { + transaction_description => 'FIRST', + customer_name => 'FIRST', + vendor_name => 'FIRST', + default => 'LAST', + }, + columns => { + SIMPLE => 'ALL', + customer => 'customer.name', + vendor => 'vendor.name', + globalprojectnumber => 'lower(globalproject.projectnumber)', + + # Bug in Rose::DB::Object: the next should be + # "globalproject.project_type.description". This workaround will + # only work if no other table with "project_type" is visible in + # the current query + globalproject_type => 'lower(project_type.description)', + + map { ( $_ => "lower(delivery_orders.$_)" ) } qw(donumber ordnumber cusordnumber oreqnumber shippingpoint shipvia notes intnotes transaction_description), + }); +} + +sub default_objects_per_page { 40 } + 1; diff --git a/SL/DB/Manager/Invoice.pm b/SL/DB/Manager/Invoice.pm index c3a9a7bb4..493789e84 100644 --- a/SL/DB/Manager/Invoice.pm +++ b/SL/DB/Manager/Invoice.pm @@ -2,7 +2,10 @@ package SL::DB::Manager::Invoice; use strict; -use base qw(SL::DB::Helper::Manager); +use parent qw(SL::DB::Helper::Manager); + +use SL::DB::Helper::Paginated; +use SL::DB::Helper::Sorted; sub object_class { 'SL::DB::Invoice' } @@ -13,7 +16,7 @@ sub type_filter { my $type = lc(shift || ''); return (or => [ invoice => 0, invoice => undef ]) if $type eq 'ar_transaction'; - return (and => [ invoice => 1, amount => { ge => 0 }, or => [ storno => 0, storno => undef ] ]) if $type eq 'invoice'; + return (and => [ invoice => 1, amount => { ge => 0 }, or => [ storno => 0, storno => undef ] ]) if $type =~ m/^(?:sales_)?invoice$/; return (and => [ invoice => 1, amount => { lt => 0 }, or => [ storno => 0, storno => undef ] ]) if $type eq 'credit_note'; return (and => [ invoice => 1, amount => { lt => 0 }, storno => 1 ]) if $type =~ m/(?:invoice_)?storno/; return (and => [ invoice => 1, amount => { ge => 0 }, storno => 1 ]) if $type eq 'credit_note_storno'; @@ -21,4 +24,29 @@ sub type_filter { die "Unknown type $type"; } +sub _sort_spec { + return ( + default => [ 'transdate', 1 ], + nulls => { + transaction_description => 'FIRST', + customer_name => 'FIRST', + default => 'LAST', + }, + columns => { + SIMPLE => 'ALL', + customer => 'customer.name', + globalprojectnumber => 'lower(globalproject.projectnumber)', + + # Bug in Rose::DB::Object: the next should be + # "globalproject.project_type.description". This workaround will + # only work if no other table with "project_type" is visible in + # the current query + globalproject_type => 'lower(project_type.description)', + + map { ( $_ => "lower(ar.$_)" ) } qw(invnumber ordnumber quonumber cusordnumber shippingpoint shipvia notes intnotes transaction_description), + }); +} + +sub default_objects_per_page { 40 } + 1; diff --git a/SL/DB/Manager/Order.pm b/SL/DB/Manager/Order.pm index 3c76073e8..69aa26679 100644 --- a/SL/DB/Manager/Order.pm +++ b/SL/DB/Manager/Order.pm @@ -30,11 +30,13 @@ sub _sort_spec { nulls => { transaction_description => 'FIRST', customer_name => 'FIRST', + vendor_name => 'FIRST', default => 'LAST', }, columns => { SIMPLE => 'ALL', customer => 'customer.name', + vendor => 'vendor.name', globalprojectnumber => 'lower(globalproject.projectnumber)', map { ( $_ => "lower(oe.$_)" ) } qw(ordnumber quonumber cusordnumber shippingpoint shipvia notes intnotes transaction_description), }); diff --git a/SL/DB/Manager/PurchaseInvoice.pm b/SL/DB/Manager/PurchaseInvoice.pm index 1cc573795..2dd3fad17 100644 --- a/SL/DB/Manager/PurchaseInvoice.pm +++ b/SL/DB/Manager/PurchaseInvoice.pm @@ -2,8 +2,10 @@ package SL::DB::Manager::PurchaseInvoice; use strict; -use SL::DB::Helper::Manager; -use base qw(SL::DB::Helper::Manager); +use parent qw(SL::DB::Helper::Manager); + +use SL::DB::Helper::Paginated; +use SL::DB::Helper::Sorted; sub object_class { 'SL::DB::PurchaseInvoice' } @@ -14,10 +16,35 @@ sub type_filter { my $type = lc(shift || ''); return (or => [ invoice => 0, invoice => undef ]) if $type eq 'ap_transaction'; - return (and => [ invoice => 1, or => [ storno => 0, storno => undef ] ]) if $type eq 'invoice'; + return (and => [ invoice => 1, or => [ storno => 0, storno => undef ] ]) if $type =~ m/^(?:purchase_)?invoice$/; return (and => [ invoice => 1, storno => 1 ]) if $type =~ m/(?:invoice_)?storno/; die "Unknown type $type"; } +sub _sort_spec { + return ( + default => [ 'transdate', 1 ], + nulls => { + transaction_description => 'FIRST', + vendor_name => 'FIRST', + default => 'LAST', + }, + columns => { + SIMPLE => 'ALL', + vendor => 'vendor.name', + globalprojectnumber => 'lower(globalproject.projectnumber)', + + # Bug in Rose::DB::Object: the next should be + # "globalproject.project_type.description". This workaround will + # only work if no other table with "project_type" is visible in + # the current query + globalproject_type => 'lower(project_type.description)', + + map { ( $_ => "lower(ap.$_)" ) } qw(invnumber ordnumber quonumber shipvia notes intnotes transaction_description), + }); +} + +sub default_objects_per_page { 40 } + 1; diff --git a/SL/Presenter/Invoice.pm b/SL/Presenter/Invoice.pm index f1aaf7f6f..c07845016 100644 --- a/SL/Presenter/Invoice.pm +++ b/SL/Presenter/Invoice.pm @@ -24,7 +24,7 @@ sub ar_transaction { sub purchase_invoice { my ($self, $invoice, %params) = @_; - return _is_ir_record($self, $invoice, 'is', %params); + return _is_ir_record($self, $invoice, 'ir', %params); } sub ap_transaction { diff --git a/SL/Presenter/Record.pm b/SL/Presenter/Record.pm index db0caa542..18c719092 100644 --- a/SL/Presenter/Record.pm +++ b/SL/Presenter/Record.pm @@ -20,8 +20,7 @@ sub _arrayify { sub grouped_record_list { my ($self, $list, %params) = @_; - %params = map { exists $params{$_} ? ($_ => $params{$_}) : () } qw(edit_record_links form_prefix with_columns object_id object_model); - $params{form_prefix} ||= 'record_links'; + %params = map { exists $params{$_} ? ($_ => $params{$_}) : () } qw(edit_record_links with_columns object_id object_model); my %groups = _group_records($list); my $output = ''; @@ -38,14 +37,14 @@ sub grouped_record_list { $output .= _purchase_invoice_list( $self, $groups{purchase_invoices}, %params) if $groups{purchase_invoices}; $output .= _ar_transaction_list( $self, $groups{ar_transactions}, %params) if $groups{ar_transactions}; - $output = $self->render('presenter/record/grouped_record_list', %params, output => $output, nownow => DateTime->now) if $output; + $output = $self->render('presenter/record/grouped_record_list', %params, output => $output); - return $output || $self->empty_record_list; + 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 { @@ -121,8 +120,6 @@ sub record_list { alignment => $data[0]->{columns}->[$_]->{alignment}, }, (0..scalar(@columns) - 1); - $params{form_prefix} ||= 'record_links'; - return $self->render( 'presenter/record/record_list', %params, @@ -168,6 +165,7 @@ sub _sales_quotation_list { 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') } ], @@ -187,9 +185,10 @@ sub _request_quotation_list { 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' ], @@ -206,6 +205,7 @@ sub _sales_order_list { 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') } ], @@ -226,9 +226,10 @@ sub _purchase_order_list { 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' ], @@ -246,6 +247,7 @@ sub _sales_delivery_order_list { 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') } ], @@ -266,9 +268,10 @@ sub _purchase_delivery_order_list { 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' ], @@ -286,6 +289,7 @@ sub _sales_invoice_list { return $self->record_list( $list, title => $::locale->text('Sales Invoices'), + type => 'sales_invoice', columns => [ [ $::locale->text('Invoice Date'), 'transdate' ], [ $::locale->text('Invoice Number'), sub { $self->sales_invoice($_[0], display => 'table-cell') } ], @@ -306,9 +310,10 @@ sub _purchase_invoice_list { 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' ], @@ -326,6 +331,7 @@ sub _ar_transaction_list { return $self->record_list( $list, title => $::locale->text('AR Transactions'), + type => 'ar_transaction', columns => [ [ $::locale->text('Invoice Date'), 'transdate' ], [ $::locale->text('Invoice Number'), sub { $self->ar_transaction($_[0], display => 'table-cell') } ], @@ -344,9 +350,10 @@ sub _ap_transaction_list { 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' ], diff --git a/css/presenter/record/record_list.css b/css/presenter/record/record_list.css new file mode 100644 index 000000000..59ab17772 --- /dev/null +++ b/css/presenter/record/record_list.css @@ -0,0 +1,37 @@ +/* the overlayed element */ +.record_list_overlay { + position: fixed; + top: 50%; + margin-top: -250px; + height: 500px; + + left: 50%; + margin-left: -400px; + width: 800px; + + background-color: #fff; + border: 1px solid #333; + + /* CSS3 styling for latest browsers */ + box-shadow: 0 0 90px 5px #000; + -moz-box-shadow: 0 0 90px 5px #000; + -webkit-box-shadow: 0 0 90px #000; + + padding: 10px; +} + +.record_list_overlay .overlay_content { + width: 790px; + height: 490px; + overflow: auto; +} + +.record_list_overlay .close { + background-image: url(../../../image/dialog-close.png); + position: absolute; + right: -16px; + top: -16px; + cursor: pointer; + height: 32px; + width: 32px; +} diff --git a/image/dialog-close.png b/image/dialog-close.png new file mode 100644 index 0000000000000000000000000000000000000000..b049b6886af97b3720f372ad573a3f69c1f12f88 GIT binary patch literal 2085 zcmV+=2-^3FP)Zm*P4U6w0xYjrCE)Zf4oAAD7VF9^(1p$br4$U4ww!+!+cGT_b4 z&jz#k5yg+l156t?4F0tR3~&W1mm@Z2-d2DrB)K=~Ea zhhcZYaR?|8WHtBP!?l5EVh?&cAdi!=dKKh73IWm{bml^+!2N+0okxh3A z4ZXNV-!L2jBb{WR`!Y_|80wyUlC0y9>gd1~q9!g~N+}SLgj=41vDYS`JP6|_!fT}v zC`TMDT7Xum(L0o6($~Jjo6PvT(#)F4%P*rBn*T!mGHPIxqOdsG>)28 zYbn;4xr>?k$Y$ER6C#ZSxonco?l?~MR2Kf^m#F>#06~%9j13z|CK4EZeMHBOWq54B z2kRF>aAX3()$l?Ts!J)T2vAa2iWb!Aj$a_z*+KQv1{6gBpkzWdk?QH3_}d=(2l~-! z7qI*nub>5j6f1eAmBWueLb;(6GHskx3UhD}6AFkEv;`+B>QJ;>s%`$|g-ES~H8TL^rFS-!+Q7>vRiyA6m;;Gesp9W?MT( zB8dxFfB`rV{|CI|1C&OX;{(3{8sLk9s#!QgorD!1GsXpIIkbcQhQXSjZ@VI*R-{tE z$m;y~6nh?AO|3G(Sk;CB9dJprYRB(Y| zqly$$Spjorz_C3$IJ|2+*Osa0+4{{jR0NYup8}C`IiHeTLRAEce`F9X3Q%k?qySm2 z12|sy%x3b?mVmltjV%A(!(3bbV2Fo*_a_F;5d8)a0xjYpEP?7JETJR4;-;Zj0~92o zlM^t(wL}-lq@ndZxSwfc!_KB*vg_5{hDO$IZQ|q35Xqd3RxJn-P_(ONJg%NA>%iM^ zRs|br93uyoE|79A#LEdxWB=7CqH0qwXLpx@2-QR$Oi=Z z`_DHpDb_>HWaz)pOsXrvgavE7I~U5uLRDHli;IU|Cy!2a+nQZyYdDM_#N8cX`;M-9ykWaHZ>47dx!=>alke~ z72RJTI^RsLH$klaOPttpAGy|lq9mky#Ri{@-}oy$b_&`7d*thNco}?dGwf3#W&kGO zhC!OrGczktAh9K>ZF$|0kF1#keE zWY5F7t?>Q*@Bxs%(L13mc`|nZT4V6(99R^ENT9fcx}exnjgtj8BcbJ`;}W10C`W$o zfPFs}X5NPuAOkozwJ!hyz?kVU^J!Q=3+`7SYDjL(;v_Qa4~CG}2jJA-;SVptTR=CE z1)N*j8F}MIfvOsq@&i~k6PCrGJ^+=@=t0a3T{texts} = { 'Add and edit units' => 'Einheiten erfassen und bearbeiten', 'Add bank account' => 'Bankkonto erfassen', 'Add custom variable' => 'Benutzerdefinierte Variable erfassen', + 'Add link: select records to link with' => 'Verknüpfungen hinzufügen: zu verknüpfende Belege auswählen', + 'Add links' => 'Verknüpfungen hinzufügen', 'Add note' => 'Notiz erfassen', 'Add unit' => 'Einheit hinzufügen', 'Address' => 'Adresse', @@ -209,6 +211,7 @@ $self->{texts} = { 'Are you sure you want to delete this payment term?' => 'Wollen Sie diese Zahlungsbedingungen wirklich löschen?', 'Are you sure you want to remove the marked entries from the queue?' => 'Sind Sie sicher, dass die markierten Einträge von der Warteschlange gelöscht werden sollen?', 'Are you sure you want to update the prices' => 'Sind Sie sicher, dass Sie die Preise aktualisieren wollen?', + 'Are you sure?' => 'Sind Sie sicher?', 'Article Code' => 'Artikelkürzel', 'Article Code missing!' => 'Artikelkürzel fehlt', 'Article type (see below)' => 'Artikeltyp (siehe unten)', @@ -541,7 +544,7 @@ $self->{texts} = { 'Customer/Vendor' => 'Kunde/Lieferant', 'Customer/Vendor (database ID)' => 'Kunde/Lieferant (Datenbank-ID)', 'Customer/Vendor Name' => 'Kunde/Lieferant', - 'Customer/Vendor Number' => 'Kundennummer/Lieferantennummer', + 'Customer/Vendor Number' => 'Kunden-/Lieferantennummer', 'Customername' => 'Kundenname', 'Customernumberinit' => 'Kunden-/Lieferantennummernkreis', 'Customers' => 'Kunden', @@ -1127,6 +1130,7 @@ $self->{texts} = { 'Line and column' => 'Zeile und Spalte', 'Line endings' => 'Zeilenumbrüche', 'Link direction' => 'Verknüpfungsrichtung', + 'Link to' => 'Verknüpfen mit', 'Linked Records' => 'Verknüpfte Belege', 'List Accounts' => 'Konten anzeigen', 'List Languages' => 'Sprachen anzeigen', @@ -1569,7 +1573,6 @@ $self->{texts} = { 'Reconciliation' => 'Kontenabgleich', 'Record Vendor Invoice' => 'Einkaufsrechnung erfassen', 'Record in' => 'Buchen auf', - 'Record not found' => 'Objekt nicht gefunden', 'Recorded Tax' => 'Gespeicherte Steuern', 'Recorded taxkey' => 'Gespeicherter Steuerschlüssel', 'Reference' => 'Referenz', @@ -1676,6 +1679,7 @@ $self->{texts} = { 'Save settings as' => 'Einstellungen speichern unter', 'Saving the file \'%s\' failed. OS error message: %s' => 'Das Speichern der Datei \'%s\' schlug fehl. Fehlermeldung des Betriebssystems: %s', 'Screen' => 'Bildschirm', + 'Search' => 'Suchen', 'Search AP Aging' => 'Offene Verbindlichkeiten', 'Search AR Aging' => 'Offene Forderungen', 'Search contacts' => 'Ansprechpersonensuche', @@ -1965,6 +1969,7 @@ $self->{texts} = { 'The end date is the last day for which invoices will possibly be created.' => 'Das Enddatum ist das letztmögliche Datum, an dem eine Rechnung erzeugt wird.', 'The execution schedule is invalid.' => 'Der Ausführungszeitplan ist ungültig.', 'The execution type is invalid.' => 'Der Ausführungstyp ist ungültig.', + 'The existing record has been created from the link target to add.' => 'Der bestehende Beleg wurde aus dem auszuwählenden Verknüpfungsziel erstellt.', 'The factor is missing in row %d.' => 'Der Faktor fehlt in Zeile %d.', 'The factor is missing.' => 'Der Faktor fehlt.', 'The first reason is that kivitendo contained a bug which resulted in the wrong taxkeys being recorded for transactions in which two entries are posted for the same chart with different taxkeys.' => 'Der erste Grund war ein Fehler in kivitendo, der dazu führte, dass bei einer Transaktion, bei der zwei Buchungen mit unterschiedlichen Steuerschlüsseln auf dasselbe Konto durchgeführt wurden, die falschen Steuerschlüssel gespeichert wurden.', @@ -1987,6 +1992,7 @@ $self->{texts} = { 'The group memberships have been saved.' => 'Die Gruppenmitgliedschaften wurden gespeichert.', 'The group name is missing.' => 'Der Gruppenname fehlt.', 'The items are imported accoring do their number "X" regardless of the column order inside the file.' => 'Die Einträge werden in der Reihenfolge ihrer Indizes "X" unabhängig von der Spaltenreihenfolge in der Datei importiert.', + 'The link target to add has been created from the existing record.' => 'Das auszuwählende Verknüpfungsziel wurde aus dem bestehenden Beleg erstellt.', 'The list has been printed.' => 'Die Liste wurde ausgedruckt.', 'The long description is missing.' => 'Der Langtext fehlt.', 'The name in row %d has already been used before.' => 'Der Name in Zeile %d wurde vorher bereits benutzt.', diff --git a/templates/webpages/presenter/record/empty_record_list.html b/templates/webpages/presenter/record/empty_record_list.html deleted file mode 100644 index d082315c5..000000000 --- a/templates/webpages/presenter/record/empty_record_list.html +++ /dev/null @@ -1,2 +0,0 @@ -[% USE LxERP %] -

[% LxERP.t8('No data was found.') %]

diff --git a/templates/webpages/presenter/record/grouped_record_list.html b/templates/webpages/presenter/record/grouped_record_list.html index 0016612df..82c16f35c 100644 --- a/templates/webpages/presenter/record/grouped_record_list.html +++ b/templates/webpages/presenter/record/grouped_record_list.html @@ -1,19 +1,45 @@ [%- USE LxERP -%][%- USE L -%][%- USE HTML -%][%- USE JavaScript -%] -
-

[% nownow %]

+