From: Jan Büren Date: Tue, 7 Jan 2014 17:13:39 +0000 (+0100) Subject: Merge branch 'master' of github.com:kivitendo/kivitendo-erp X-Git-Tag: release-3.1.0beta1~22^2~25 X-Git-Url: http://wagnertech.de/gitweb/gitweb.cgi/mfinanz.git/commitdiff_plain/9bfde8af91ac295afb6e68b8580f000fd6051f15?hp=f46afb13bacfe1d838cb4a7a5b5b58e8145ff4b1 Merge branch 'master' of github.com:kivitendo/kivitendo-erp --- diff --git a/SL/Auth.pm b/SL/Auth.pm index 59542d65d..13044e776 100644 --- a/SL/Auth.pm +++ b/SL/Auth.pm @@ -1067,6 +1067,7 @@ sub all_rights_full { ["sales_all_edit", $locale->text("View/edit all employees sales documents")], ["edit_prices", $locale->text("Edit prices and discount (if not used, textfield is ONLY set readonly)")], ["show_ar_transactions", $locale->text("Show AR transactions as part of AR invoice report")], + ["delivery_plan", $locale->text("Show delivery plan")], ["--ap", $locale->text("AP")], ["request_quotation_edit", $locale->text("Create and edit RFQs")], ["purchase_order_edit", $locale->text("Create and edit purchase orders")], diff --git a/SL/Controller/Admin.pm b/SL/Controller/Admin.pm index 2e5542086..179142c73 100644 --- a/SL/Controller/Admin.pm +++ b/SL/Controller/Admin.pm @@ -129,6 +129,12 @@ sub action_edit_user { $self->edit_user_form(title => t8('Edit User')); } +sub action_save_newuser { + my ($self) = @_; + $::form->{user}{clients} = 0; + $self->action_save_user(); +} + sub action_save_user { my ($self) = @_; my $params = delete($::form->{user}) || { }; diff --git a/SL/Controller/DeliveryPlan.pm b/SL/Controller/DeliveryPlan.pm index ee4a29265..ebf6fa6b2 100644 --- a/SL/Controller/DeliveryPlan.pm +++ b/SL/Controller/DeliveryPlan.pm @@ -11,10 +11,10 @@ use SL::Locale::String; use Rose::Object::MakeMethods::Generic ( scalar => [ qw(db_args flat_filter) ], - 'scalar --get_set_init' => [ qw(models) ], + 'scalar --get_set_init' => [ qw(models all_edit_right) ], ); -__PACKAGE__->run_before(sub { $::auth->assert('sales_order_edit'); }); +__PACKAGE__->run_before(sub { $::auth->assert('delivery_plan'); }); my %sort_columns = ( reqdate => t8('Reqdate'), @@ -27,78 +27,6 @@ my %sort_columns = ( customer => t8('Customer'), ); -my $delivery_plan_query = [ - 'order.customer_id' => { gt => 0 }, - 'order.closed' => 0, - or => [ 'order.quotation' => 0, 'order.quotation' => undef ], - - # filter by shipped_qty < qty, read from innermost to outermost - 'id' => [ \" - -- 3. resolve the desired information about those - SELECT oi.id FROM ( - -- 2. slice only part, orderitem and both quantities from it - SELECT parts_id, trans_id, qty, SUM(doi_qty) AS doi_qty FROM ( - -- 1. join orderitems and deliverorder items via record_links. - -- also add customer data to filter for sales_orders - SELECT oi.parts_id, oi.trans_id, oi.id, oi.qty, doi.qty AS doi_qty - FROM orderitems oi, oe, record_links rl, delivery_order_items doi - WHERE - oe.id = oi.trans_id AND - oe.customer_id IS NOT NULL AND - (oe.quotation = 'f' OR oe.quotation IS NULL) AND - NOT oe.closed AND - rl.from_id = oe.id AND - rl.from_id = oi.trans_id AND - oe.id = oi.trans_id AND - rl.from_table = 'oe' AND - rl.to_table = 'delivery_orders' AND - rl.to_id = doi.delivery_order_id AND - oi.parts_id = doi.parts_id - ) tuples GROUP BY parts_id, trans_id, qty - ) partials - LEFT JOIN orderitems oi ON partials.parts_id = oi.parts_id AND partials.trans_id = oi.trans_id - WHERE oi.qty > doi_qty - - UNION ALL - - -- 4. since the join over record_links fails for sales_orders wihtout any delivery order - -- retrieve those without record_links at all - SELECT oi.id FROM orderitems oi, oe - WHERE - oe.id = oi.trans_id AND - oe.customer_id IS NOT NULL AND - (oe.quotation = 'f' OR oe.quotation IS NULL) AND - NOT oe.closed AND - oi.trans_id NOT IN ( - SELECT from_id - FROM record_links rl - WHERE - rl.from_table ='oe' AND - rl.to_table = 'delivery_orders' - ) - - UNION ALL - - -- 5. In case someone deleted a line of the delivery_order there will be a record_link (4 fails) - -- but there won't be a delivery_order_items to find (3 fails too). Search for orphaned orderitems this way - SELECT oi.id FROM orderitems AS oi, oe, record_links AS rl - WHERE - rl.from_table = 'oe' AND - rl.to_table = 'delivery_orders' AND - - oi.trans_id = rl.from_id AND - oi.parts_id NOT IN ( - SELECT doi.parts_id FROM delivery_order_items AS doi WHERE doi.delivery_order_id = rl.to_id - ) AND - - oe.id = oi.trans_id AND - - oe.customer_id IS NOT NULL AND - (oe.quotation = 'f' OR oe.quotation IS NULL) AND - NOT oe.closed - " ], -]; - sub action_list { my ($self) = @_; @@ -194,6 +122,85 @@ sub make_filter_summary { $self->{filter_summary} = join ', ', @filter_strings; } +sub delivery_plan_query { + my $employee_id = SL::DB::Manager::Employee->current->id; + my $oe_owner = $_[0]->all_edit_right ? '' : " oe.eployee_id = $employee_id AND"; + [ + 'order.customer_id' => { gt => 0 }, + 'order.closed' => 0, + or => [ 'order.quotation' => 0, 'order.quotation' => undef ], + + # filter by shipped_qty < qty, read from innermost to outermost + 'id' => [ \" + -- 3. resolve the desired information about those + SELECT oi.id FROM ( + -- 2. slice only part, orderitem and both quantities from it + SELECT parts_id, trans_id, qty, SUM(doi_qty) AS doi_qty FROM ( + -- 1. join orderitems and deliverorder items via record_links. + -- also add customer data to filter for sales_orders + SELECT oi.parts_id, oi.trans_id, oi.id, oi.qty, doi.qty AS doi_qty + FROM orderitems oi, oe, record_links rl, delivery_order_items doi + WHERE + oe.id = oi.trans_id AND + oe.customer_id IS NOT NULL AND + (oe.quotation = 'f' OR oe.quotation IS NULL) AND + NOT oe.closed AND + $oe_owner + rl.from_id = oe.id AND + rl.from_id = oi.trans_id AND + oe.id = oi.trans_id AND + rl.from_table = 'oe' AND + rl.to_table = 'delivery_orders' AND + rl.to_id = doi.delivery_order_id AND + oi.parts_id = doi.parts_id + ) tuples GROUP BY parts_id, trans_id, qty + ) partials + LEFT JOIN orderitems oi ON partials.parts_id = oi.parts_id AND partials.trans_id = oi.trans_id + WHERE oi.qty > doi_qty + + UNION ALL + + -- 4. since the join over record_links fails for sales_orders wihtout any delivery order + -- retrieve those without record_links at all + SELECT oi.id FROM orderitems oi, oe + WHERE + oe.id = oi.trans_id AND + oe.customer_id IS NOT NULL AND + (oe.quotation = 'f' OR oe.quotation IS NULL) AND + NOT oe.closed AND + $oe_owner + oi.trans_id NOT IN ( + SELECT from_id + FROM record_links rl + WHERE + rl.from_table ='oe' AND + rl.to_table = 'delivery_orders' + ) + + UNION ALL + + -- 5. In case someone deleted a line of the delivery_order there will be a record_link (4 fails) + -- but there won't be a delivery_order_items to find (3 fails too). Search for orphaned orderitems this way + SELECT oi.id FROM orderitems AS oi, oe, record_links AS rl + WHERE + rl.from_table = 'oe' AND + rl.to_table = 'delivery_orders' AND + + oi.trans_id = rl.from_id AND + oi.parts_id NOT IN ( + SELECT doi.parts_id FROM delivery_order_items AS doi WHERE doi.delivery_order_id = rl.to_id + ) AND + + oe.id = oi.trans_id AND + + oe.customer_id IS NOT NULL AND + (oe.quotation = 'f' OR oe.quotation IS NULL) AND + $oe_owner + NOT oe.closed + " ], + ] +} + sub init_models { my ($self) = @_; @@ -207,11 +214,15 @@ sub init_models { }, %sort_columns, }, - query => $delivery_plan_query, + query => $self->delivery_plan_query, with_objects => [ 'order', 'order.customer', 'part' ], ); } +sub init_all_edit_right { + $::auth->assert('sales_all_edit', 1) +} + sub link_to { my ($self, $object, %params) = @_; diff --git a/SL/DB/CustomVariable.pm b/SL/DB/CustomVariable.pm index 144acef00..6073925bf 100644 --- a/SL/DB/CustomVariable.pm +++ b/SL/DB/CustomVariable.pm @@ -43,6 +43,40 @@ sub value { goto &text_value; # text, textfield, date and select } +sub value_as_text { + my $self = $_[0]; + my $type = $self->config->type; + + die 'not an accessor' if @_ > 1; + + if ($type eq 'boolean') { + return $self->bool_value ? $::locale->text('Yes') : $::locale->text('No'); + } elsif ($type eq 'timestamp') { + return $::locale->reformat_date( { dateformat => 'yy-mm-dd' }, $self->timestamp_value->ymd, $::myconfig{dateformat}); + } elsif ($type eq 'number') { + return $::form->format_amount(\%::myconfig, $self->number_value, $self->config->processed_options->{PRECISION}); + } elsif ( $type eq 'customer' ) { + require SL::DB::Customer; + + my $id = int($self->number_value); + my $customer = $id ? SL::DB::Customer->new(id => $id)->load() : 0; + return $customer ? $customer->name : ''; + } elsif ( $type eq 'vendor' ) { + require SL::DB::Vendor; + + my $id = int($self->number_value); + return $id ? SL::DB::Vendor->new(id => $id)->load() : 0; + } elsif ( $type eq 'part' ) { + require SL::DB::Part; + + my $id = int($self->number_value); + my $vendor = $id ? SL::DB::Part->new(id => $id)->load() : 0; + return $vendor ? $vendor->name : ''; + } + + goto &text_value; # text, textfield, date and select +} + sub is_valid { my ($self) = @_; diff --git a/SL/DB/Helper/TransNumberGenerator.pm b/SL/DB/Helper/TransNumberGenerator.pm index 6cdc281a8..cc5fc327c 100644 --- a/SL/DB/Helper/TransNumberGenerator.pm +++ b/SL/DB/Helper/TransNumberGenerator.pm @@ -53,7 +53,8 @@ sub get_next_trans_number { require SL::DB::Default; require SL::DB::Business; - my %conditions = ( query => [ $scoping_conditions ? $scoping_conditions->($spec_type) : () ] ); + my %conditions = ( query => [ $scoping_conditions ? $scoping_conditions->($spec_type) : () ] ); + my %conditions_for_in_use = ( query => [ $scoping_conditions ? $scoping_conditions->($spec_type) : () ] ); my $business; if ($spec_type =~ m{^(?:customer|vendor)$}) { @@ -69,15 +70,17 @@ sub get_next_trans_number { } } - my @numbers = map { $_->$number_column } @{ $self->_get_manager_class->get_all(%conditions) }; - my %numbers_in_use = map { ( $_ => 1 ) } @numbers; + my %numbers_in_use = map { ( $_->$number_column => 1 ) } @{ $self->_get_manager_class->get_all(%conditions_for_in_use) }; my $range_table = $business ? $business : SL::DB::Default->get; my $start_number = $range_table->$number_range_column; $start_number = $range_table->articlenumber if ($number_range_column eq 'assemblynumber') && (length($start_number) < 1); my $sequence = SL::PrefixedNumber->new(number => $start_number); - $sequence->set_to_max(@numbers) if !$fill_holes_in_range; + if (!$fill_holes_in_range) { + my @numbers = map { $_->$number_column } @{ $self->_get_manager_class->get_all(%conditions) }; + $sequence->set_to_max(@numbers) ; + } my $new_number = $sequence->get_next; $new_number = $sequence->get_next while $numbers_in_use{$new_number}; diff --git a/SL/DB/Project.pm b/SL/DB/Project.pm index ba6f12f0a..73390d85e 100644 --- a/SL/DB/Project.pm +++ b/SL/DB/Project.pm @@ -8,7 +8,7 @@ use SL::DB::MetaSetup::Project; use SL::DB::Manager::Project; use SL::DB::Helper::CustomVariables( - module => 'Project', + module => 'Projects', cvars_alias => 1, ); diff --git a/SL/DO.pm b/SL/DO.pm index bc651c8ed..3d4cb23bf 100644 --- a/SL/DO.pm +++ b/SL/DO.pm @@ -63,7 +63,7 @@ sub transactions { my $vc = $form->{vc} eq "customer" ? "customer" : "vendor"; my $query = - qq|SELECT dord.id, dord.donumber, dord.ordnumber, + qq|SELECT dord.id, dord.donumber, dord.ordnumber, dord.cusordnumber, dord.transdate, dord.reqdate, ct.${vc}number, ct.name, dord.${vc}_id, dord.globalproject_id, dord.closed, dord.delivered, dord.shippingpoint, dord.shipvia, @@ -415,7 +415,9 @@ sub save { my $rc = $dbh->commit(); $form->{saved_donumber} = $form->{donumber}; - + $form->{saved_ordnumber} = $form->{ordnumber}; + $form->{saved_cusordnumber} = $form->{cusordnumber}; + Common::webdav_folder($form); $main::lxdebug->leave_sub(); @@ -604,6 +606,9 @@ sub retrieve { $sth = prepare_execute_query($form, $dbh, $query, @do_ids); delete $form->{"${vc}_id"}; + my $pos = 0; + $form->{ordnumber_array} = ' '; + $form->{cusordnumber_array} = ' '; while (my $ref = $sth->fetchrow_hashref("NAME_lc")) { if ($form->{"${vc}_id"} && ($ref->{"${vc}_id"} != $form->{"${vc}_id"})) { $sth->finish(); @@ -614,12 +619,26 @@ sub retrieve { map { $form->{$_} = $ref->{$_} } keys %$ref if ($ref); $form->{donumber_array} .= $form->{donumber} . ' '; + $pos = index($form->{ordnumber_array},' ' . $form->{ordnumber} . ' '); + if ($pos == -1) { + $form->{ordnumber_array} .= $form->{ordnumber} . ' '; + } + $pos = index($form->{cusordnumber_array},' ' . $form->{cusordnumber} . ' '); + if ($pos == -1) { + $form->{cusordnumber_array} .= $form->{cusordnumber} . ' '; + } } $sth->finish(); $form->{donumber_array} =~ s/\s*$//g; + $form->{ordnumber_array} =~ s/ //; + $form->{ordnumber_array} =~ s/\s*$//g; + $form->{cusordnumber_array} =~ s/ //; + $form->{cusordnumber_array} =~ s/\s*$//g; $form->{saved_donumber} = $form->{donumber}; + $form->{saved_ordnumber} = $form->{ordnumber}; + $form->{saved_cusordnumber} = $form->{cusordnumber}; # if not given, fill transdate with current_date $form->{transdate} = $form->current_date($myconfig) unless $form->{transdate}; @@ -728,7 +747,7 @@ sub order_details { my $subtotal_header = 0; my $subposition = 0; - my (@project_ids, %projectnumbers, %projectdescriptions); + my (@project_ids); push(@project_ids, $form->{"globalproject_id"}) if ($form->{"globalproject_id"}); @@ -742,21 +761,21 @@ sub order_details { push(@project_ids, $form->{"project_id_$i"}) if ($form->{"project_id_$i"}); } + my $projects = []; + my %projects_by_id; if (@project_ids) { - $query = "SELECT id, projectnumber, description FROM project WHERE id IN (" . - join(", ", map("?", @project_ids)) . ")"; - $sth = prepare_execute_query($form, $dbh, $query, @project_ids); - while (my $ref = $sth->fetchrow_hashref()) { - $projectnumbers{$ref->{id}} = $ref->{projectnumber}; - $projectdescriptions{$ref->{id}} = $ref->{description}; - } - $sth->finish(); + $projects = SL::DB::Manager::Project->get_all(query => [ id => \@project_ids ]); + %projects_by_id = map { $_->id => $_ } @$projects; } - $form->{"globalprojectnumber"} = - $projectnumbers{$form->{"globalproject_id"}}; - $form->{"globalprojectdescription"} = - $projectdescriptions{$form->{"globalproject_id"}}; + if ($projects_by_id{$form->{"globalproject_id"}}) { + $form->{globalprojectnumber} = $projects_by_id{$form->{"globalproject_id"}}->projectnumber; + $form->{globalprojectdescription} = $projects_by_id{$form->{"globalproject_id"}}->description; + + for (@{ $projects_by_id{$form->{"globalproject_id"}}->cvars_by_config }) { + $form->{"project_cvar_" . $_->config->name} = $_->value_as_text; + } + } my $q_pg = qq|SELECT p.partnumber, p.description, p.unit, a.qty, pg.partsgroup FROM assembly a @@ -775,6 +794,7 @@ sub order_details { my $num_si = 0; my $ic_cvar_configs = CVar->get_configs(module => 'IC'); + my $project_cvar_configs = CVar->get_configs(module => 'Projects'); $form->{TEMPLATE_ARRAYS} = { }; IC->prepare_parts_for_printing(myconfig => $myconfig, form => $form); @@ -788,6 +808,7 @@ sub order_details { map { $form->{TEMPLATE_ARRAYS}->{$_} = [] } (@arrays); push @arrays, map { "ic_cvar_$_->{name}" } @{ $ic_cvar_configs }; + push @arrays, map { "project_cvar_$_->{name}" } @{ $project_cvar_configs }; $form->get_lists('price_factors' => 'ALL_PRICE_FACTORS'); my %price_factors = map { $_->{id} => $_->{factor} } @{ $form->{ALL_PRICE_FACTORS} }; @@ -824,6 +845,7 @@ sub order_details { } my $price_factor = $price_factors{$form->{"price_factor_id_$i"}} || { 'factor' => 1 }; + my $project = $projects_by_id{$form->{"project_id_$i"}} || SL::DB::Project->new; push @{ $form->{TEMPLATE_ARRAYS}{runningnumber} }, $position; push @{ $form->{TEMPLATE_ARRAYS}{number} }, $form->{"partnumber_$i"}; @@ -835,9 +857,8 @@ sub order_details { push @{ $form->{TEMPLATE_ARRAYS}{partnotes} }, $form->{"partnotes_$i"}; push @{ $form->{TEMPLATE_ARRAYS}{serialnumber} }, $form->{"serialnumber_$i"}; push @{ $form->{TEMPLATE_ARRAYS}{reqdate} }, $form->{"reqdate_$i"}; - push @{ $form->{TEMPLATE_ARRAYS}{projectnumber} }, $projectnumbers{$form->{"project_id_$i"}}; - push @{ $form->{TEMPLATE_ARRAYS}{projectdescription} }, - $projectdescriptions{$form->{"project_id_$i"}}; + push @{ $form->{TEMPLATE_ARRAYS}{projectnumber} }, $project->projectnumber; + push @{ $form->{TEMPLATE_ARRAYS}{projectdescription} }, $project->description; if ($form->{"subtotal_$i"} && $subtotal_header && ($subtotal_header != $i)) { $subtotal_header = 0; @@ -901,6 +922,8 @@ sub order_details { push @{ $form->{TEMPLATE_ARRAYS}->{"ic_cvar_$_->{name}"} }, CVar->format_to_template(CVar->parse($form->{"ic_cvar_$_->{name}_$i"}, $_), $_) for @{ $ic_cvar_configs }; + + push @{ $form->{TEMPLATE_ARRAYS}->{"project_cvar_" . $_->config->name} }, $_->value_as_text for @{ $project->cvars_by_config }; } $form->{totalweight} = $form->format_amount($myconfig, $totalweight, 3); diff --git a/SL/Form.pm b/SL/Form.pm index f0500d3b5..e115f9706 100644 --- a/SL/Form.pm +++ b/SL/Form.pm @@ -2137,10 +2137,22 @@ sub _get_taxzones { sub _get_employees { $main::lxdebug->enter_sub(); - my ($self, $dbh, $default_key, $key) = @_; + my ($self, $dbh, $params) = @_; + + my $deleted = 0; + + my $key; + if (ref $params eq 'HASH') { + $key = $params->{key}; + $deleted = $params->{deleted}; + + } else { + $key = $params; + } - $key = $default_key unless ($key); - $self->{$key} = selectall_hashref_query($self, $dbh, qq|SELECT * FROM employee ORDER BY lower(name)|); + $key ||= "all_employees"; + my $filter = $deleted ? '' : 'WHERE NOT COALESCE(deleted, FALSE)'; + $self->{$key} = selectall_hashref_query($self, $dbh, qq|SELECT * FROM employee $filter ORDER BY lower(name)|); $main::lxdebug->leave_sub(); } @@ -2380,7 +2392,7 @@ sub get_lists { } if ($params{"employees"}) { - $self->_get_employees($dbh, "all_employees", $params{"employees"}); + $self->_get_employees($dbh, $params{"employees"}); } if ($params{"salesmen"}) { diff --git a/SL/IC.pm b/SL/IC.pm index b99ec2aad..3b7eb0848 100644 --- a/SL/IC.pm +++ b/SL/IC.pm @@ -457,6 +457,22 @@ sub save { # add assembly records if ($form->{item} eq 'assembly') { + # check additional assembly row + my $i = $form->{assembly_rows}; + # if last row is not empty add them + if ($form->{"partnumber_$i"} ne "") { + $query = qq|SELECT id FROM parts WHERE partnumber = ?|; + my ($partid) = selectrow_query($form, $dbh, $query,$form->{"partnumber_$i"} ); + if ( $partid ) { + $form->{"qty_$i"} = 1 unless ($form->{"qty_$i"}); + $form->{"id_$i"} = $partid; + $form->{"bom_$i"} = 0; + $form->{assembly_rows}++; + } + else { + $::form->error($::locale->text("uncorrect partnumber ").$form->{"partnumber_$i"}); + } + } for my $i (1 .. $form->{assembly_rows}) { $form->{"qty_$i"} = $form->parse_amount($myconfig, $form->{"qty_$i"}); @@ -469,7 +485,6 @@ sub save { do_query($form, $dbh, $query, @values); } } - my @a = localtime; $a[5] += 1900; $a[4]++; diff --git a/SL/IS.pm b/SL/IS.pm index 23b6f80f7..b00e809b5 100644 --- a/SL/IS.pm +++ b/SL/IS.pm @@ -68,7 +68,7 @@ sub invoice_details { my $query = qq|SELECT date | . conv_dateq($form->{duedate}) . qq| - date | . conv_dateq($form->{invdate}) . qq| AS terms|; ($form->{terms}) = selectrow_query($form, $dbh, $query); - my (@project_ids, %projectnumbers, %projectdescriptions); + my (@project_ids); $form->{TEMPLATE_ARRAYS} = {}; push(@project_ids, $form->{"globalproject_id"}) if ($form->{"globalproject_id"}); @@ -92,23 +92,21 @@ sub invoice_details { push(@project_ids, $form->{"project_id_$i"}) if ($form->{"project_id_$i"}); } + my $projects = []; + my %projects_by_id; if (@project_ids) { - $query = "SELECT id, projectnumber, description FROM project WHERE id IN (" . - join(", ", map({ "?" } @project_ids)) . ")"; - $sth = $dbh->prepare($query); - $sth->execute(@project_ids) || - $form->dberror($query . " (" . join(", ", @project_ids) . ")"); - while (my $ref = $sth->fetchrow_hashref()) { - $projectnumbers{$ref->{id}} = $ref->{projectnumber}; - $projectdescriptions{$ref->{id}} = $ref->{description}; - } - $sth->finish(); + $projects = SL::DB::Manager::Project->get_all(query => [ id => \@project_ids ]); + %projects_by_id = map { $_->id => $_ } @$projects; } - $form->{"globalprojectnumber"} = - $projectnumbers{$form->{"globalproject_id"}}; - $form->{"globalprojectdescription"} = - $projectdescriptions{$form->{"globalproject_id"}}; + if ($projects_by_id{$form->{"globalproject_id"}}) { + $form->{globalprojectnumber} = $projects_by_id{$form->{"globalproject_id"}}->projectnumber; + $form->{globalprojectdescription} = $projects_by_id{$form->{"globalproject_id"}}->description; + + for (@{ $projects_by_id{$form->{"globalproject_id"}}->cvars_by_config }) { + $form->{"project_cvar_" . $_->config->name} = $_->value_as_text; + } + } my $tax = 0; my $item; @@ -146,6 +144,7 @@ sub invoice_details { IC->prepare_parts_for_printing(myconfig => $myconfig, form => $form); my $ic_cvar_configs = CVar->get_configs(module => 'IC'); + my $project_cvar_configs = CVar->get_configs(module => 'Projects'); my @arrays = qw(runningnumber number description longdescription qty ship unit bin @@ -156,6 +155,7 @@ sub invoice_details { price_factor price_factor_name partsgroup weight lineweight); push @arrays, map { "ic_cvar_$_->{name}" } @{ $ic_cvar_configs }; + push @arrays, map { "project_cvar_$_->{name}" } @{ $project_cvar_configs }; my @tax_arrays = qw(taxbase tax taxdescription taxrate taxnumber); @@ -277,8 +277,10 @@ sub invoice_details { push @{ $form->{TEMPLATE_ARRAYS}->{nodiscount_linetotal} }, $form->format_amount($myconfig, $nodiscount_linetotal, 2); push @{ $form->{TEMPLATE_ARRAYS}->{nodiscount_linetotal_nofmt} }, $nodiscount_linetotal; - push(@{ $form->{TEMPLATE_ARRAYS}->{projectnumber} }, $projectnumbers{$form->{"project_id_$i"}}); - push(@{ $form->{TEMPLATE_ARRAYS}->{projectdescription} }, $projectdescriptions{$form->{"project_id_$i"}}); + my $project = $projects_by_id{$form->{"project_id_$i"}} || SL::DB::Project->new; + + push @{ $form->{TEMPLATE_ARRAYS}->{projectnumber} }, $project->projectnumber; + push @{ $form->{TEMPLATE_ARRAYS}->{projectdescription} }, $project->description; my $lineweight = $form->{"qty_$i"} * $form->{"weight_$i"}; $totalweight += $lineweight; @@ -370,6 +372,8 @@ sub invoice_details { push @{ $form->{TEMPLATE_ARRAYS}->{"ic_cvar_$_->{name}"} }, CVar->format_to_template(CVar->parse($form->{"ic_cvar_$_->{name}_$i"}, $_), $_) for @{ $ic_cvar_configs }; + + push @{ $form->{TEMPLATE_ARRAYS}->{"project_cvar_" . $_->config->name} }, $_->value_as_text for @{ $project->cvars_by_config }; } } diff --git a/SL/Layout/MenuLeft.pm b/SL/Layout/MenuLeft.pm index 9a47d292d..f2e8a053f 100644 --- a/SL/Layout/MenuLeft.pm +++ b/SL/Layout/MenuLeft.pm @@ -51,7 +51,7 @@ sub section_menu { my $menuitem = $menu->{$item}; my $olabel = apply { s/.*--// } $item; my $ml = apply { s/--.*// } $item; - my $icon_class = apply { y/ /-/ } $item; + my $icon_class = apply { $_ =lc $_; s/[^a-z0-9_-]/-/g } $item; my $spacer = "s" . (0 + $item =~ s/--/--/g); next if $level && $item ne "$level--$olabel"; diff --git a/SL/OE.pm b/SL/OE.pm index 0e5c05b46..797eb9717 100644 --- a/SL/OE.pm +++ b/SL/OE.pm @@ -1032,7 +1032,7 @@ sub order_details { my $tax_rate; my $taxamount; - my (@project_ids, %projectnumbers, %projectdescriptions); + my (@project_ids); push(@project_ids, $form->{"globalproject_id"}) if ($form->{"globalproject_id"}); @@ -1063,19 +1063,21 @@ sub order_details { push(@project_ids, $form->{"project_id_$i"}) if ($form->{"project_id_$i"}); } + my $projects = []; + my %projects_by_id; if (@project_ids) { - $query = "SELECT id, projectnumber, description FROM project WHERE id IN (" . - join(", ", map("?", @project_ids)) . ")"; - $sth = prepare_execute_query($form, $dbh, $query, @project_ids); - while (my $ref = $sth->fetchrow_hashref()) { - $projectnumbers{$ref->{id}} = $ref->{projectnumber}; - $projectdescriptions{$ref->{id}} = $ref->{description}; - } - $sth->finish(); + $projects = SL::DB::Manager::Project->get_all(query => [ id => \@project_ids ]); + %projects_by_id = map { $_->id => $_ } @$projects; } - $form->{"globalprojectnumber"} = $projectnumbers{$form->{"globalproject_id"}}; - $form->{"globalprojectdescription"} = $projectdescriptions{$form->{"globalproject_id"}}; + if ($projects_by_id{$form->{"globalproject_id"}}) { + $form->{globalprojectnumber} = $projects_by_id{$form->{"globalproject_id"}}->projectnumber; + $form->{globalprojectdescription} = $projects_by_id{$form->{"globalproject_id"}}->description; + + for (@{ $projects_by_id{$form->{"globalproject_id"}}->cvars_by_config }) { + $form->{"project_cvar_" . $_->config->name} = $_->value_as_text; + } + } $form->{discount} = []; @@ -1083,6 +1085,7 @@ sub order_details { IC->prepare_parts_for_printing(myconfig => $myconfig, form => $form); my $ic_cvar_configs = CVar->get_configs(module => 'IC'); + my $project_cvar_configs = CVar->get_configs(module => 'Projects'); my @arrays = qw(runningnumber number description longdescription qty ship unit bin @@ -1092,6 +1095,7 @@ sub order_details { price_factor price_factor_name partsgroup weight lineweight); push @arrays, map { "ic_cvar_$_->{name}" } @{ $ic_cvar_configs }; + push @arrays, map { "project_cvar_$_->{name}" } @{ $project_cvar_configs }; my @tax_arrays = qw(taxbase tax taxdescription taxrate taxnumber); @@ -1205,12 +1209,14 @@ sub order_details { $nodiscount += $linetotal; } + my $project = $projects_by_id{$form->{"project_id_$i"}} || SL::DB::Project->new; + push @{ $form->{TEMPLATE_ARRAYS}->{linetotal} }, $form->format_amount($myconfig, $linetotal, 2); push @{ $form->{TEMPLATE_ARRAYS}->{linetotal_nofmt} }, $linetotal_exact; push @{ $form->{TEMPLATE_ARRAYS}->{nodiscount_linetotal} }, $form->format_amount($myconfig, $nodiscount_linetotal, 2); push @{ $form->{TEMPLATE_ARRAYS}->{nodiscount_linetotal_nofmt} }, $nodiscount_linetotal; - push(@{ $form->{TEMPLATE_ARRAYS}->{projectnumber} }, $projectnumbers{$form->{"project_id_$i"}}); - push(@{ $form->{TEMPLATE_ARRAYS}->{projectdescription} }, $projectdescriptions{$form->{"project_id_$i"}}); + push @{ $form->{TEMPLATE_ARRAYS}->{projectnumber} }, $project->projectnumber; + push @{ $form->{TEMPLATE_ARRAYS}->{projectdescription} }, $project->description; my $lineweight = $form->{"qty_$i"} * $form->{"weight_$i"}; $totalweight += $lineweight; @@ -1282,6 +1288,8 @@ sub order_details { push @{ $form->{TEMPLATE_ARRAYS}->{"ic_cvar_$_->{name}"} }, CVar->format_to_template(CVar->parse($form->{"ic_cvar_$_->{name}_$i"}, $_), $_) for @{ $ic_cvar_configs }; + + push @{ $form->{TEMPLATE_ARRAYS}->{"project_cvar_" . $_->config->name} }, $_->value_as_text for @{ $project->cvars_by_config }; } } diff --git a/bin/mozilla/do.pl b/bin/mozilla/do.pl index b722e2081..e633b424e 100644 --- a/bin/mozilla/do.pl +++ b/bin/mozilla/do.pl @@ -293,16 +293,16 @@ sub form_header { $form->{oldvcname} = $form->{"old$form->{vc}"}; $form->{oldvcname} =~ s/--.*//; - if ($form->{resubmit}) { - my $dispatch_to_popup = ''; - if ($form->{format} eq "html") { - $dispatch_to_popup .= "window.open('about:blank','Beleg'); document.do.target = 'Beleg';"; - } - # emulate click for resubmitting actions - $dispatch_to_popup .= "document.do.${_}.click(); " for grep { /^action_/ } keys %$form; + my $dispatch_to_popup = ''; + if ($form->{resubmit} && ($form->{format} eq "html")) { + $dispatch_to_popup = "window.open('about:blank','Beleg'); document.do.target = 'Beleg';"; $dispatch_to_popup .= "document.do.submit();"; - $::request->{layout}->add_javascripts_inline("\$(function(){$dispatch_to_popup})"); + } elsif ($form->{resubmit}) { + # emulate click for resubmitting actions + $dispatch_to_popup = "document.do.${_}.click(); " for grep { /^action_/ } keys %$form; } + $::request->{layout}->add_javascripts_inline("\$(function(){$dispatch_to_popup})"); + my $follow_up_vc = $form->{ $form->{vc} eq 'customer' ? 'customer' : 'vendor' }; $follow_up_vc =~ s/--\d*\s*$//; @@ -491,7 +491,7 @@ sub orders { my @columns = qw( ids transdate reqdate id donumber - ordnumber customernumber + ordnumber customernumber cusordnumber name employee salesman shipvia globalprojectnumber transaction_description department @@ -508,7 +508,7 @@ sub orders { my $report = SL::ReportGenerator->new(\%myconfig, $form); my @hidden_variables = map { "l_${_}" } @columns; - push @hidden_variables, $form->{vc}, qw(l_closed l_notdelivered open closed delivered notdelivered donumber ordnumber serialnumber + push @hidden_variables, $form->{vc}, qw(l_closed l_notdelivered open closed delivered notdelivered donumber ordnumber serialnumber cusordnumber transaction_description transdatefrom transdateto reqdatefrom reqdateto type vc employee_id salesman_id project_id); @@ -522,6 +522,7 @@ sub orders { 'donumber' => { 'text' => $locale->text('Delivery Order'), }, 'ordnumber' => { 'text' => $locale->text('Order'), }, 'customernumber' => { 'text' => $locale->text('Customer Number'), }, + 'cusordnumber' => { 'text' => $locale->text('Customer Order Number'), }, 'name' => { 'text' => $form->{vc} eq 'customer' ? $locale->text('Customer') : $locale->text('Vendor'), }, 'employee' => { 'text' => $locale->text('Employee'), }, 'salesman' => { 'text' => $locale->text('Salesman'), }, @@ -867,6 +868,8 @@ sub invoice_multi { # Hinweis: delete gibt den wert zurueck und loescht danach das element (nett und einfach) # $shell: perldoc perlunc; /delete EXPR $form->{donumber} = delete $form->{donumber_array}; + $form->{ordnumber} = delete $form->{ordnumber_array}; + $form->{cusordnumber} = delete $form->{cusordnumber_array}; $form->{deliverydate} = $form->{transdate}; $form->{transdate} = $form->current_date(\%myconfig); $form->{duedate} = $form->current_date(\%myconfig, $form->{invdate}, $form->{terms} * 1); diff --git a/bin/mozilla/is.pl b/bin/mozilla/is.pl index cf3ac5768..d0e501473 100644 --- a/bin/mozilla/is.pl +++ b/bin/mozilla/is.pl @@ -818,6 +818,7 @@ sub use_as_new { $form->{rowcount}--; $form->{invdate} = $form->current_date(\%myconfig); $form->{duedate} = $form->get_duedate(\%myconfig, $form->{invdate}) || $form->{invdate}; + $form->{employee_id} = SL::DB::Manager::Employee->current->id; # remember pricegroups for "use as new" IS->get_pricegroups_for_parts(\%myconfig, \%$form); diff --git a/bin/mozilla/rp.pl b/bin/mozilla/rp.pl index f257b51b8..302dbc16e 100644 --- a/bin/mozilla/rp.pl +++ b/bin/mozilla/rp.pl @@ -403,9 +403,6 @@ sub generate_balance_sheet { $::lxdebug->enter_sub; $::auth->assert('report'); - my $defaults = SL::DB::Default->get; - $::form->error($::locale->text('No print templates have been created for this client yet. Please do so in the client configuration.')) if !$defaults->templates; - $::form->{templates} = $defaults->templates; $::form->{decimalplaces} = $::form->{decimalplaces} * 1 || 2; $::form->{padding} = "  "; $::form->{bold} = ""; diff --git a/css/icons16.css b/css/icons16.css index f8477119e..55ec59743 100644 --- a/css/icons16.css +++ b/css/icons16.css @@ -1,96 +1,96 @@ .icon16 { background: url(../image/maps/icons16.png) 16px 0px no-repeat; padding: 0; width: 16px; height: 16px; } -.icon16.AP--Add-Purchase-Order { background-position: -0px 0px; } -.icon16.AP--Add-RFQ { background-position: -16px 0px; } -.icon16.AP { background-position: -32px 0px; } -.icon16.AP--Reports { background-position: -48px 0px; } -.icon16.AP--Reports--Purchase-Orders { background-position: -64px 0px; } -.icon16.AP--Reports--RFQs { background-position: -80px 0px; } -.icon16.AR--Add-Credit-Note { background-position: -96px 0px; } -.icon16.AR--Add-Delivery-Order { background-position: -112px 0px; } -.icon16.AR--Add-Dunning { background-position: -128px 0px; } -.icon16.AR--Add-Quotation { background-position: -144px 0px; } -.icon16.AR--Add-Sales-Invoice { background-position: -160px 0px; } -.icon16.AR--Add-Sales-Order { background-position: -176px 0px; } -.icon16.AR { background-position: -192px 0px; } -.icon16.AR--Reports--Delivery-Orders { background-position: -208px 0px; } -.icon16.AR--Reports--Dunnings { background-position: -224px 0px; } -.icon16.AR--Reports--Invoices { background-position: -240px 0px; } -.icon16.AR--Reports { background-position: -256px 0px; } -.icon16.AR--Reports--Quotations { background-position: -272px 0px; } -.icon16.AR--Reports--Sales-Orders { background-position: -288px 0px; } -.icon16.Batch-Printing--Packing-Lists { background-position: -304px 0px; } -.icon16.Batch-Printing { background-position: -320px 0px; } -.icon16.Batch-Printing--Purchase-Orders { background-position: -336px 0px; } -.icon16.Batch-Printing--Quotations { background-position: -352px 0px; } -.icon16.Batch-Printing--Receipts { background-position: -368px 0px; } -.icon16.Batch-Printing--RFQs { background-position: -384px 0px; } -.icon16.Batch-Printing--Sales-Invoices { background-position: -400px 0px; } -.icon16.Batch-Printing--Sales-Orders { background-position: -416px 0px; } -.icon16.Cash--Payment { background-position: -432px 0px; } -.icon16.Cash { background-position: -448px 0px; } -.icon16.Cash--Receipt { background-position: -464px 0px; } -.icon16.Cash--Reconciliation { background-position: -480px 0px; } -.icon16.Cash--Reports--Payments { background-position: -496px 0px; } -.icon16.Cash--Reports { background-position: -512px 0px; } -.icon16.Cash--Reports--Receipts { background-position: -528px 0px; } -.icon16.CRM--Admin--Benutzer { background-position: -544px 0px; } -.icon16.CRM--Admin--Dokumentvorlage { background-position: -560px 0px; } -.icon16.CRM--Admin--Etiketten { background-position: -576px 0px; } -.icon16.CRM--Admin--Gruppen { background-position: -592px 0px; } -.icon16.CRM--Admin--Mitteilungen { background-position: -608px 0px; } -.icon16.CRM--Admin { background-position: -624px 0px; } -.icon16.CRM--Admin--Status { background-position: -640px 0px; } -.icon16.CRM--Auftragschance { background-position: -656px 0px; } -.icon16.CRM--eMail { background-position: -672px 0px; } -.icon16.CRM--Hilfe { background-position: -688px 0px; } -.icon16.CRM--Kunden { background-position: -704px 0px; } -.icon16.CRM--Lieferant { background-position: -720px 0px; } -.icon16.CRM--Notizen { background-position: -736px 0px; } -.icon16.CRM--Personen { background-position: -752px 0px; } -.icon16.CRM { background-position: -768px 0px; } -.icon16.CRM--Schnellsuche { background-position: -784px 0px; } -.icon16.CRM--Service { background-position: -800px 0px; } -.icon16.CRM--Termine { background-position: -816px 0px; } -.icon16.CRM--Wiedervorlage { background-position: -832px 0px; } -.icon16.CRM--Wissens-DB { background-position: -848px 0px; } -.icon16.General-Ledger--Add-AP-Transaction { background-position: -864px 0px; } -.icon16.General-Ledger--Add-AR-Transaction { background-position: -880px 0px; } -.icon16.General-Ledger--Add-Transaction { background-position: -896px 0px; } -.icon16.General-Ledger--DATEV---Export-Assistent { background-position: -912px 0px; } -.icon16.General-Ledger { background-position: -928px 0px; } -.icon16.General-Ledger--Reports--AP-Aging { background-position: -944px 0px; } -.icon16.General-Ledger--Reports--AR-Aging { background-position: -960px 0px; } -.icon16.General-Ledger--Reports--Journal { background-position: -976px 0px; } -.icon16.General-Ledger--Reports { background-position: -992px 0px; } -.icon16.Master-Data--Add-Assembly { background-position: -1008px 0px; } -.icon16.Master-Data--Add-Customer { background-position: -1024px 0px; } -.icon16.Master-Data--Add-License { background-position: -1040px 0px; } -.icon16.Master-Data--Add-Part { background-position: -1056px 0px; } -.icon16.Master-Data--Add-Project { background-position: -1072px 0px; } -.icon16.Master-Data--Add-Service { background-position: -1088px 0px; } -.icon16.Master-Data--Add-Vendor { background-position: -1104px 0px; } -.icon16.Master-Data { background-position: -1120px 0px; } -.icon16.Master-Data--Reports--Assemblies { background-position: -1136px 0px; } -.icon16.Master-Data--Reports--Customers { background-position: -1152px 0px; } -.icon16.Master-Data--Reports--Licenses { background-position: -1168px 0px; } -.icon16.Master-Data--Reports--Parts { background-position: -1184px 0px; } -.icon16.Master-Data--Reports { background-position: -1200px 0px; } -.icon16.Master-Data--Reports--Projects { background-position: -1216px 0px; } -.icon16.Master-Data--Reports--Projecttransactions { background-position: -1232px 0px; } -.icon16.Master-Data--Reports--Services { background-position: -1248px 0px; } -.icon16.Master-Data--Reports--Vendors { background-position: -1264px 0px; } -.icon16.Master-Data--Update-Prices { background-position: -1280px 0px; } -.icon16.MDI-Text-Editor-16x16 { background-position: -1296px 0px; } -.icon16.Neues-Fenster { background-position: -1312px 0px; } -.icon16.Program--Logout { background-position: -1328px 0px; } -.icon16.Program { background-position: -1344px 0px; } -.icon16.Program--Preferences { background-position: -1360px 0px; } -.icon16.Program--Version { background-position: -1376px 0px; } -.icon16.Reports--Balance-Sheet { background-position: -1392px 0px; } -.icon16.Reports--Chart-of-Accounts { background-position: -1408px 0px; } -.icon16.Reports--Income-Statement { background-position: -1424px 0px; } -.icon16.Reports { background-position: -1440px 0px; } -.icon16.Reports--UStVa { background-position: -1456px 0px; } -.icon16.System { background-position: -1472px 0px; } -.icon16.Warehouse { background-position: -1488px 0px; } -.icon16.Warehouse--Produce-Assembly { background-position: -1504px 0px; } +.icon16.ap--add-purchase-order { background-position: -0px 0px; } +.icon16.ap--add-rfq { background-position: -16px 0px; } +.icon16.ap { background-position: -32px 0px; } +.icon16.ap--reports { background-position: -48px 0px; } +.icon16.ap--reports--purchase-orders { background-position: -64px 0px; } +.icon16.ap--reports--rfqs { background-position: -80px 0px; } +.icon16.ar--add-credit-note { background-position: -96px 0px; } +.icon16.ar--add-delivery-order { background-position: -112px 0px; } +.icon16.ar--add-dunning { background-position: -128px 0px; } +.icon16.ar--add-quotation { background-position: -144px 0px; } +.icon16.ar--add-sales-invoice { background-position: -160px 0px; } +.icon16.ar--add-sales-order { background-position: -176px 0px; } +.icon16.ar { background-position: -192px 0px; } +.icon16.ar--reports--delivery-orders { background-position: -208px 0px; } +.icon16.ar--reports--dunnings { background-position: -224px 0px; } +.icon16.ar--reports--invoices--credit-notes---ar-transactions { background-position: -240px 0px; } +.icon16.ar--reports { background-position: -256px 0px; } +.icon16.ar--reports--quotations { background-position: -272px 0px; } +.icon16.ar--reports--sales-orders { background-position: -288px 0px; } +.icon16.batch-printing--packing-lists { background-position: -304px 0px; } +.icon16.batch-printing { background-position: -320px 0px; } +.icon16.batch-printing--purchase-orders { background-position: -336px 0px; } +.icon16.batch-printing--quotations { background-position: -352px 0px; } +.icon16.batch-printing--receipts { background-position: -368px 0px; } +.icon16.batch-printing--rfqs { background-position: -384px 0px; } +.icon16.batch-printing--sales-invoices { background-position: -400px 0px; } +.icon16.batch-printing--sales-orders { background-position: -416px 0px; } +.icon16.cash--payment { background-position: -432px 0px; } +.icon16.cash { background-position: -448px 0px; } +.icon16.cash--receipt { background-position: -464px 0px; } +.icon16.cash--reconciliation { background-position: -480px 0px; } +.icon16.cash--reports--payments { background-position: -496px 0px; } +.icon16.cash--reports { background-position: -512px 0px; } +.icon16.cash--reports--receipts { background-position: -528px 0px; } +.icon16.crm--add--customer { background-position: -544px 0px; } +.icon16.crm--add--person { background-position: -560px 0px; } +.icon16.crm--add--vendor { background-position: -576px 0px; } +.icon16.crm--admin--document-template { background-position: -592px 0px; } +.icon16.crm--admin--label { background-position: -608px 0px; } +.icon16.crm--admin--message { background-position: -624px 0px; } +.icon16.crm--admin { background-position: -640px 0px; } +.icon16.crm--admin--status { background-position: -656px 0px; } +.icon16.crm--admin--user-groups { background-position: -672px 0px; } +.icon16.crm--admin--user { background-position: -688px 0px; } +.icon16.crm--appointments { background-position: -704px 0px; } +.icon16.crm--e-mail { background-position: -720px 0px; } +.icon16.crm--follow-up { background-position: -736px 0px; } +.icon16.crm--help { background-position: -752px 0px; } +.icon16.crm--knowledge { background-position: -768px 0px; } +.icon16.crm--memo { background-position: -784px 0px; } +.icon16.crm--opportunity { background-position: -800px 0px; } +.icon16.crm { background-position: -816px 0px; } +.icon16.crm--search { background-position: -832px 0px; } +.icon16.crm--service { background-position: -848px 0px; } +.icon16.general-ledger--add-ap-transaction { background-position: -864px 0px; } +.icon16.general-ledger--add-ar-transaction { background-position: -880px 0px; } +.icon16.general-ledger--add-transaction { background-position: -896px 0px; } +.icon16.general-ledger--datev---export-assistent { background-position: -912px 0px; } +.icon16.general-ledger { background-position: -928px 0px; } +.icon16.general-ledger--reports--ap-aging { background-position: -944px 0px; } +.icon16.general-ledger--reports--ar-aging { background-position: -960px 0px; } +.icon16.general-ledger--reports--journal { background-position: -976px 0px; } +.icon16.general-ledger--reports { background-position: -992px 0px; } +.icon16.master-data--add-assembly { background-position: -1008px 0px; } +.icon16.master-data--add-customer { background-position: -1024px 0px; } +.icon16.master-data--add-license { background-position: -1040px 0px; } +.icon16.master-data--add-part { background-position: -1056px 0px; } +.icon16.master-data--add-project { background-position: -1072px 0px; } +.icon16.master-data--add-service { background-position: -1088px 0px; } +.icon16.master-data--add-vendor { background-position: -1104px 0px; } +.icon16.master-data { background-position: -1120px 0px; } +.icon16.master-data--reports--assemblies { background-position: -1136px 0px; } +.icon16.master-data--reports--customers { background-position: -1152px 0px; } +.icon16.master-data--reports--licenses { background-position: -1168px 0px; } +.icon16.master-data--reports--parts { background-position: -1184px 0px; } +.icon16.master-data--reports { background-position: -1200px 0px; } +.icon16.master-data--reports--projects { background-position: -1216px 0px; } +.icon16.master-data--reports--projecttransactions { background-position: -1232px 0px; } +.icon16.master-data--reports--services { background-position: -1248px 0px; } +.icon16.master-data--reports--vendors { background-position: -1264px 0px; } +.icon16.master-data--update-prices { background-position: -1280px 0px; } +.icon16.mdi-text-editor-16x16 { background-position: -1296px 0px; } +.icon16.neues-fenster { background-position: -1312px 0px; } +.icon16.program--logout { background-position: -1328px 0px; } +.icon16.program { background-position: -1344px 0px; } +.icon16.program--preferences { background-position: -1360px 0px; } +.icon16.program--version { background-position: -1376px 0px; } +.icon16.reports--balance-sheet { background-position: -1392px 0px; } +.icon16.reports--chart-of-accounts { background-position: -1408px 0px; } +.icon16.reports--income-statement { background-position: -1424px 0px; } +.icon16.reports { background-position: -1440px 0px; } +.icon16.reports--ustva { background-position: -1456px 0px; } +.icon16.system { background-position: -1472px 0px; } +.icon16.warehouse { background-position: -1488px 0px; } +.icon16.warehouse--produce-assembly { background-position: -1504px 0px; } diff --git a/css/icons24.css b/css/icons24.css index fe6ba0a08..87a382e66 100644 --- a/css/icons24.css +++ b/css/icons24.css @@ -1,93 +1,93 @@ .icon24 { background: url(../image/maps/icons24.png) 24px 0px no-repeat; padding: 0; width: 24px; height: 24px; } -.icon24.AP--Add-Purchase-Order { background-position: -0px 0px; } -.icon24.AP--Add-RFQ { background-position: -24px 0px; } -.icon24.AP { background-position: -48px 0px; } -.icon24.AP--Reports { background-position: -72px 0px; } -.icon24.AP--Reports--Purchase-Orders { background-position: -96px 0px; } -.icon24.AP--Reports--RFQs { background-position: -120px 0px; } -.icon24.AR--Add-Dunning { background-position: -144px 0px; } -.icon24.AR--Add-Quotation { background-position: -168px 0px; } -.icon24.AR--Add-Sales-Invoice { background-position: -192px 0px; } -.icon24.AR--Add-Sales-Order { background-position: -216px 0px; } -.icon24.AR { background-position: -240px 0px; } -.icon24.AR--Reports--Dunnings { background-position: -264px 0px; } -.icon24.AR--Reports--Invoices { background-position: -288px 0px; } -.icon24.AR--Reports { background-position: -312px 0px; } -.icon24.AR--Reports--Quotations { background-position: -336px 0px; } -.icon24.AR--Reports--Sales-Orders { background-position: -360px 0px; } -.icon24.Batch-Printing--Packing-Lists { background-position: -384px 0px; } -.icon24.Batch-Printing { background-position: -408px 0px; } -.icon24.Batch-Printing--Purchase-Orders { background-position: -432px 0px; } -.icon24.Batch-Printing--Quotations { background-position: -456px 0px; } -.icon24.Batch-Printing--Receipts { background-position: -480px 0px; } -.icon24.Batch-Printing--RFQs { background-position: -504px 0px; } -.icon24.Batch-Printing--Sales-Invoices { background-position: -528px 0px; } -.icon24.Batch-Printing--Sales-Orders { background-position: -552px 0px; } -.icon24.Cash--Payment { background-position: -576px 0px; } -.icon24.Cash { background-position: -600px 0px; } -.icon24.Cash--Receipt { background-position: -624px 0px; } -.icon24.Cash--Reconciliation { background-position: -648px 0px; } -.icon24.Cash--Reports--Payments { background-position: -672px 0px; } -.icon24.Cash--Reports { background-position: -696px 0px; } -.icon24.Cash--Reports--Receipts { background-position: -720px 0px; } -.icon24.CRM--Admin--Benutzer { background-position: -744px 0px; } -.icon24.CRM--Admin--Dokumentvorlage { background-position: -768px 0px; } -.icon24.CRM--Admin--Etiketten { background-position: -792px 0px; } -.icon24.CRM--Admin--Gruppen { background-position: -816px 0px; } -.icon24.CRM--Admin--Mitteilungen { background-position: -840px 0px; } -.icon24.CRM--Admin { background-position: -864px 0px; } -.icon24.CRM--Admin--Status { background-position: -888px 0px; } -.icon24.CRM--Auftragschance { background-position: -912px 0px; } -.icon24.CRM--eMail { background-position: -936px 0px; } -.icon24.CRM--Hilfe { background-position: -960px 0px; } -.icon24.CRM--Kunden { background-position: -984px 0px; } -.icon24.CRM--Lieferant { background-position: -1008px 0px; } -.icon24.CRM--Notizen { background-position: -1032px 0px; } -.icon24.CRM--Personen { background-position: -1056px 0px; } -.icon24.CRM { background-position: -1080px 0px; } -.icon24.CRM--Schnellsuche { background-position: -1104px 0px; } -.icon24.CRM--Service { background-position: -1128px 0px; } -.icon24.CRM--Termine { background-position: -1152px 0px; } -.icon24.CRM--Wiedervorlage { background-position: -1176px 0px; } -.icon24.CRM--Wissens-DB { background-position: -1200px 0px; } -.icon24.General-Ledger--Add-AP-Transaction { background-position: -1224px 0px; } -.icon24.General-Ledger--Add-AR-Transaction { background-position: -1248px 0px; } -.icon24.General-Ledger--Add-Transaction { background-position: -1272px 0px; } -.icon24.General-Ledger--DATEV---Export-Assistent { background-position: -1296px 0px; } -.icon24.General-Ledger { background-position: -1320px 0px; } -.icon24.General-Ledger--Reports--AP-Aging { background-position: -1344px 0px; } -.icon24.General-Ledger--Reports--AR-Aging { background-position: -1368px 0px; } -.icon24.General-Ledger--Reports--Journal { background-position: -1392px 0px; } -.icon24.General-Ledger--Reports { background-position: -1416px 0px; } +.icon24.ap--add-purchase-order { background-position: -0px 0px; } +.icon24.ap--add-rfq { background-position: -24px 0px; } +.icon24.ap { background-position: -48px 0px; } +.icon24.ap--reports { background-position: -72px 0px; } +.icon24.ap--reports--purchase-orders { background-position: -96px 0px; } +.icon24.ap--reports--rfqs { background-position: -120px 0px; } +.icon24.ar--add-dunning { background-position: -144px 0px; } +.icon24.ar--add-quotation { background-position: -168px 0px; } +.icon24.ar--add-sales-invoice { background-position: -192px 0px; } +.icon24.ar--add-sales-order { background-position: -216px 0px; } +.icon24.ar { background-position: -240px 0px; } +.icon24.ar--reports--dunnings { background-position: -264px 0px; } +.icon24.ar--reports--invoices { background-position: -288px 0px; } +.icon24.ar--reports { background-position: -312px 0px; } +.icon24.ar--reports--quotations { background-position: -336px 0px; } +.icon24.ar--reports--sales-orders { background-position: -360px 0px; } +.icon24.batch-printing--packing-lists { background-position: -384px 0px; } +.icon24.batch-printing { background-position: -408px 0px; } +.icon24.batch-printing--purchase-orders { background-position: -432px 0px; } +.icon24.batch-printing--quotations { background-position: -456px 0px; } +.icon24.batch-printing--receipts { background-position: -480px 0px; } +.icon24.batch-printing--rfqs { background-position: -504px 0px; } +.icon24.batch-printing--sales-invoices { background-position: -528px 0px; } +.icon24.batch-printing--sales-orders { background-position: -552px 0px; } +.icon24.cash--payment { background-position: -576px 0px; } +.icon24.cash { background-position: -600px 0px; } +.icon24.cash--receipt { background-position: -624px 0px; } +.icon24.cash--reconciliation { background-position: -648px 0px; } +.icon24.cash--reports--payments { background-position: -672px 0px; } +.icon24.cash--reports { background-position: -696px 0px; } +.icon24.cash--reports--receipts { background-position: -720px 0px; } +.icon24.crm--add--customer { background-position: -744px 0px; } +.icon24.crm--add--person { background-position: -768px 0px; } +.icon24.crm--add--vendor { background-position: -792px 0px; } +.icon24.crm--admin--document-template { background-position: -816px 0px; } +.icon24.crm--admin--label { background-position: -840px 0px; } +.icon24.crm--admin--message { background-position: -864px 0px; } +.icon24.crm--admin { background-position: -888px 0px; } +.icon24.crm--admin--status { background-position: -912px 0px; } +.icon24.crm--admin--user-groups { background-position: -936px 0px; } +.icon24.crm--admin--user { background-position: -960px 0px; } +.icon24.crm--appointments { background-position: -984px 0px; } +.icon24.crm--email { background-position: -1008px 0px; } +.icon24.crm--follow-up { background-position: -1032px 0px; } +.icon24.crm--help { background-position: -1056px 0px; } +.icon24.crm--knowledge { background-position: -1080px 0px; } +.icon24.crm--memo { background-position: -1104px 0px; } +.icon24.crm--opportunity { background-position: -1128px 0px; } +.icon24.crm { background-position: -1152px 0px; } +.icon24.crm--search { background-position: -1176px 0px; } +.icon24.crm--service { background-position: -1200px 0px; } +.icon24.general-ledger--add-ap-transaction { background-position: -1224px 0px; } +.icon24.general-ledger--add-ar-transaction { background-position: -1248px 0px; } +.icon24.general-ledger--add-transaction { background-position: -1272px 0px; } +.icon24.general-ledger--datev---export-assistent { background-position: -1296px 0px; } +.icon24.general-ledger { background-position: -1320px 0px; } +.icon24.general-ledger--reports--ap-aging { background-position: -1344px 0px; } +.icon24.general-ledger--reports--ar-aging { background-position: -1368px 0px; } +.icon24.general-ledger--reports--journal { background-position: -1392px 0px; } +.icon24.general-ledger--reports { background-position: -1416px 0px; } .icon24.leftarrow_24 { background-position: -1440px 0px; } -.icon24.Master-Data--Add-Assembly { background-position: -1464px 0px; } -.icon24.Master-Data--Add-Customer { background-position: -1488px 0px; } -.icon24.Master-Data--Add-License { background-position: -1512px 0px; } -.icon24.Master-Data--Add-Part { background-position: -1536px 0px; } -.icon24.Master-Data--Add-Project { background-position: -1560px 0px; } -.icon24.Master-Data--Add-Service { background-position: -1584px 0px; } -.icon24.Master-Data--Add-Vendor { background-position: -1608px 0px; } -.icon24.Master-Data { background-position: -1632px 0px; } -.icon24.Master-Data--Reports--Assemblies { background-position: -1656px 0px; } -.icon24.Master-Data--Reports--Customers { background-position: -1680px 0px; } -.icon24.Master-Data--Reports--Licenses { background-position: -1704px 0px; } -.icon24.Master-Data--Reports--Parts { background-position: -1728px 0px; } -.icon24.Master-Data--Reports { background-position: -1752px 0px; } -.icon24.Master-Data--Reports--Projects { background-position: -1776px 0px; } -.icon24.Master-Data--Reports--Projecttransactions { background-position: -1800px 0px; } -.icon24.Master-Data--Reports--Services { background-position: -1824px 0px; } -.icon24.Master-Data--Reports--Vendors { background-position: -1848px 0px; } -.icon24.Neues-Fenster { background-position: -1872px 0px; } -.icon24.Productivity { background-position: -1896px 0px; } -.icon24.Program--Logout { background-position: -1920px 0px; } -.icon24.Program { background-position: -1944px 0px; } -.icon24.Program--Preferences { background-position: -1968px 0px; } -.icon24.Program--Version { background-position: -1992px 0px; } -.icon24.Reports--Balance-Sheet { background-position: -2016px 0px; } -.icon24.Reports--Chart-of-Accounts { background-position: -2040px 0px; } -.icon24.Reports--Income-Statement { background-position: -2064px 0px; } -.icon24.Reports { background-position: -2088px 0px; } -.icon24.Reports--UStVa { background-position: -2112px 0px; } +.icon24.master-data--add-assembly { background-position: -1464px 0px; } +.icon24.master-data--add-customer { background-position: -1488px 0px; } +.icon24.master-data--add-license { background-position: -1512px 0px; } +.icon24.master-data--add-part { background-position: -1536px 0px; } +.icon24.master-data--add-project { background-position: -1560px 0px; } +.icon24.master-data--add-service { background-position: -1584px 0px; } +.icon24.master-data--add-vendor { background-position: -1608px 0px; } +.icon24.master-data { background-position: -1632px 0px; } +.icon24.master-data--reports--assemblies { background-position: -1656px 0px; } +.icon24.master-data--reports--customers { background-position: -1680px 0px; } +.icon24.master-data--reports--licenses { background-position: -1704px 0px; } +.icon24.master-data--reports--parts { background-position: -1728px 0px; } +.icon24.master-data--reports { background-position: -1752px 0px; } +.icon24.master-data--reports--projects { background-position: -1776px 0px; } +.icon24.master-data--reports--projecttransactions { background-position: -1800px 0px; } +.icon24.master-data--reports--services { background-position: -1824px 0px; } +.icon24.master-data--reports--vendors { background-position: -1848px 0px; } +.icon24.neues-fenster { background-position: -1872px 0px; } +.icon24.productivity { background-position: -1896px 0px; } +.icon24.program--logout { background-position: -1920px 0px; } +.icon24.program { background-position: -1944px 0px; } +.icon24.program--preferences { background-position: -1968px 0px; } +.icon24.program--version { background-position: -1992px 0px; } +.icon24.reports--balance-sheet { background-position: -2016px 0px; } +.icon24.reports--chart-of-accounts { background-position: -2040px 0px; } +.icon24.reports--income-statement { background-position: -2064px 0px; } +.icon24.reports { background-position: -2088px 0px; } +.icon24.reports--ustva { background-position: -2112px 0px; } .icon24.rightarrow_24 { background-position: -2136px 0px; } -.icon24.System { background-position: -2160px 0px; } -.icon24.Warehouse { background-position: -2184px 0px; } +.icon24.system { background-position: -2160px 0px; } +.icon24.warehouse { background-position: -2184px 0px; } diff --git a/css/icons32.css b/css/icons32.css index a8d9d0d1c..0628d83d2 100644 --- a/css/icons32.css +++ b/css/icons32.css @@ -1,90 +1,90 @@ .icon32 { background: url(../image/maps/icons32.png) 32px 0px no-repeat; padding: 0; width: 32px; height: 32px; } -.icon32.AP--Add-Purchase-Order { background-position: -0px 0px; } -.icon32.AP--Add-RFQ { background-position: -32px 0px; } -.icon32.AP { background-position: -64px 0px; } -.icon32.AP--Reports { background-position: -96px 0px; } -.icon32.AP--Reports--Purchase-Orders { background-position: -128px 0px; } -.icon32.AP--Reports--RFQs { background-position: -160px 0px; } -.icon32.AR--Add-Dunning { background-position: -192px 0px; } -.icon32.AR--Add-Quotation { background-position: -224px 0px; } -.icon32.AR--Add-Sales-Invoice { background-position: -256px 0px; } -.icon32.AR--Add-Sales-Order { background-position: -288px 0px; } -.icon32.AR { background-position: -320px 0px; } -.icon32.AR--Reports--Dunnings { background-position: -352px 0px; } -.icon32.AR--Reports--Invoices { background-position: -384px 0px; } -.icon32.AR--Reports { background-position: -416px 0px; } -.icon32.AR--Reports--Quotations { background-position: -448px 0px; } -.icon32.AR--Reports--Sales-Orders { background-position: -480px 0px; } -.icon32.Batch-Printing--Packing-Lists { background-position: -512px 0px; } -.icon32.Batch-Printing { background-position: -544px 0px; } -.icon32.Batch-Printing--Purchase-Orders { background-position: -576px 0px; } -.icon32.Batch-Printing--Quotations { background-position: -608px 0px; } -.icon32.Batch-Printing--Receipts { background-position: -640px 0px; } -.icon32.Batch-Printing--RFQs { background-position: -672px 0px; } -.icon32.Batch-Printing--Sales-Invoices { background-position: -704px 0px; } -.icon32.Batch-Printing--Sales-Orders { background-position: -736px 0px; } -.icon32.Cash--Payment { background-position: -768px 0px; } -.icon32.Cash { background-position: -800px 0px; } -.icon32.Cash--Receipt { background-position: -832px 0px; } -.icon32.Cash--Reconciliation { background-position: -864px 0px; } -.icon32.Cash--Reports--Payments { background-position: -896px 0px; } -.icon32.Cash--Reports { background-position: -928px 0px; } -.icon32.Cash--Reports--Receipts { background-position: -960px 0px; } -.icon32.CRM--Admin--Benutzer { background-position: -992px 0px; } -.icon32.CRM--Admin--Dokumentvorlage { background-position: -1024px 0px; } -.icon32.CRM--Admin--Etiketten { background-position: -1056px 0px; } -.icon32.CRM--Admin--Gruppen { background-position: -1088px 0px; } -.icon32.CRM--Admin--Mitteilungen { background-position: -1120px 0px; } -.icon32.CRM--Admin { background-position: -1152px 0px; } -.icon32.CRM--Admin--Status { background-position: -1184px 0px; } -.icon32.CRM--Auftragschance { background-position: -1216px 0px; } -.icon32.CRM--eMail { background-position: -1248px 0px; } -.icon32.CRM--Hilfe { background-position: -1280px 0px; } -.icon32.CRM--Kunden { background-position: -1312px 0px; } -.icon32.CRM--Lieferant { background-position: -1344px 0px; } -.icon32.CRM--Notizen { background-position: -1376px 0px; } -.icon32.CRM--Personen { background-position: -1408px 0px; } -.icon32.CRM { background-position: -1440px 0px; } -.icon32.CRM--Schnellsuche { background-position: -1472px 0px; } -.icon32.CRM--Service { background-position: -1504px 0px; } -.icon32.CRM--Termine { background-position: -1536px 0px; } -.icon32.CRM--Wiedervorlage { background-position: -1568px 0px; } -.icon32.CRM--Wissens-DB { background-position: -1600px 0px; } -.icon32.General-Ledger--Add-AP-Transaction { background-position: -1632px 0px; } -.icon32.General-Ledger--Add-AR-Transaction { background-position: -1664px 0px; } -.icon32.General-Ledger--Add-Transaction { background-position: -1696px 0px; } -.icon32.General-Ledger--DATEV---Export-Assistent { background-position: -1728px 0px; } -.icon32.General-Ledger { background-position: -1760px 0px; } -.icon32.General-Ledger--Reports--AP-Aging { background-position: -1792px 0px; } -.icon32.General-Ledger--Reports--AR-Aging { background-position: -1824px 0px; } -.icon32.General-Ledger--Reports--Journal { background-position: -1856px 0px; } -.icon32.General-Ledger--Reports { background-position: -1888px 0px; } -.icon32.Master-Data--Add-Assembly { background-position: -1920px 0px; } -.icon32.Master-Data--Add-Customer { background-position: -1952px 0px; } -.icon32.Master-Data--Add-License { background-position: -1984px 0px; } -.icon32.Master-Data--Add-Part { background-position: -2016px 0px; } -.icon32.Master-Data--Add-Project { background-position: -2048px 0px; } -.icon32.Master-Data--Add-Service { background-position: -2080px 0px; } -.icon32.Master-Data--Add-Vendor { background-position: -2112px 0px; } -.icon32.Master-Data { background-position: -2144px 0px; } -.icon32.Master-Data--Reports--Assemblies { background-position: -2176px 0px; } -.icon32.Master-Data--Reports--Customers { background-position: -2208px 0px; } -.icon32.Master-Data--Reports--Licenses { background-position: -2240px 0px; } -.icon32.Master-Data--Reports--Parts { background-position: -2272px 0px; } -.icon32.Master-Data--Reports { background-position: -2304px 0px; } -.icon32.Master-Data--Reports--Projects { background-position: -2336px 0px; } -.icon32.Master-Data--Reports--Projecttransactions { background-position: -2368px 0px; } -.icon32.Master-Data--Reports--Services { background-position: -2400px 0px; } -.icon32.Master-Data--Reports--Vendors { background-position: -2432px 0px; } -.icon32.Neues-Fenster { background-position: -2464px 0px; } -.icon32.Program--Logout { background-position: -2496px 0px; } -.icon32.Program { background-position: -2528px 0px; } -.icon32.Program--Preferences { background-position: -2560px 0px; } -.icon32.Program--Version { background-position: -2592px 0px; } -.icon32.Reports--Balance-Sheet { background-position: -2624px 0px; } -.icon32.Reports--Chart-of-Accounts { background-position: -2656px 0px; } -.icon32.Reports--Income-Statement { background-position: -2688px 0px; } -.icon32.Reports { background-position: -2720px 0px; } -.icon32.Reports--UStVa { background-position: -2752px 0px; } -.icon32.System { background-position: -2784px 0px; } -.icon32.Warehouse--Produce-Assembly { background-position: -2816px 0px; } +.icon32.ap--add-purchase-order { background-position: -0px 0px; } +.icon32.ap--add-rfq { background-position: -32px 0px; } +.icon32.ap { background-position: -64px 0px; } +.icon32.ap--reports { background-position: -96px 0px; } +.icon32.ap--reports--purchase-orders { background-position: -128px 0px; } +.icon32.ap--reports--rfqs { background-position: -160px 0px; } +.icon32.ar--add-dunning { background-position: -192px 0px; } +.icon32.ar--add-quotation { background-position: -224px 0px; } +.icon32.ar--add-sales-invoice { background-position: -256px 0px; } +.icon32.ar--add-sales-order { background-position: -288px 0px; } +.icon32.ar { background-position: -320px 0px; } +.icon32.ar--reports--dunnings { background-position: -352px 0px; } +.icon32.ar--reports--invoices { background-position: -384px 0px; } +.icon32.ar--reports { background-position: -416px 0px; } +.icon32.ar--reports--quotations { background-position: -448px 0px; } +.icon32.ar--reports--sales-orders { background-position: -480px 0px; } +.icon32.batch-printing--packing-lists { background-position: -512px 0px; } +.icon32.batch-printing { background-position: -544px 0px; } +.icon32.batch-printing--purchase-orders { background-position: -576px 0px; } +.icon32.batch-printing--quotations { background-position: -608px 0px; } +.icon32.batch-printing--receipts { background-position: -640px 0px; } +.icon32.batch-printing--rfqs { background-position: -672px 0px; } +.icon32.batch-printing--sales-invoices { background-position: -704px 0px; } +.icon32.batch-printing--sales-orders { background-position: -736px 0px; } +.icon32.cash--payment { background-position: -768px 0px; } +.icon32.cash { background-position: -800px 0px; } +.icon32.cash--receipt { background-position: -832px 0px; } +.icon32.cash--reconciliation { background-position: -864px 0px; } +.icon32.cash--reports--payments { background-position: -896px 0px; } +.icon32.cash--reports { background-position: -928px 0px; } +.icon32.cash--reports--receipts { background-position: -960px 0px; } +.icon32.crm--add--customer { background-position: -992px 0px; } +.icon32.crm--add--person { background-position: -1024px 0px; } +.icon32.crm--add--vendor { background-position: -1056px 0px; } +.icon32.crm--admin--document-template { background-position: -1088px 0px; } +.icon32.crm--admin--label { background-position: -1120px 0px; } +.icon32.crm--admin--message { background-position: -1152px 0px; } +.icon32.crm--admin { background-position: -1184px 0px; } +.icon32.crm--admin--status { background-position: -1216px 0px; } +.icon32.crm--admin--user-groups { background-position: -1248px 0px; } +.icon32.crm--admin--user { background-position: -1280px 0px; } +.icon32.crm--appointments { background-position: -1312px 0px; } +.icon32.crm--email { background-position: -1344px 0px; } +.icon32.crm--follow-up { background-position: -1376px 0px; } +.icon32.crm--help { background-position: -1408px 0px; } +.icon32.crm--knowledge { background-position: -1440px 0px; } +.icon32.crm--memo { background-position: -1472px 0px; } +.icon32.crm--opportunity { background-position: -1504px 0px; } +.icon32.crm { background-position: -1536px 0px; } +.icon32.crm--search { background-position: -1568px 0px; } +.icon32.crm--service { background-position: -1600px 0px; } +.icon32.general-ledger--add-ap-transaction { background-position: -1632px 0px; } +.icon32.general-ledger--add-ar-transaction { background-position: -1664px 0px; } +.icon32.general-ledger--add-transaction { background-position: -1696px 0px; } +.icon32.general-ledger--datev---export-assistent { background-position: -1728px 0px; } +.icon32.general-ledger { background-position: -1760px 0px; } +.icon32.general-ledger--reports--ap-aging { background-position: -1792px 0px; } +.icon32.general-ledger--reports--ar-aging { background-position: -1824px 0px; } +.icon32.general-ledger--reports--journal { background-position: -1856px 0px; } +.icon32.general-ledger--reports { background-position: -1888px 0px; } +.icon32.master-data--add-assembly { background-position: -1920px 0px; } +.icon32.master-data--add-customer { background-position: -1952px 0px; } +.icon32.master-data--add-license { background-position: -1984px 0px; } +.icon32.master-data--add-part { background-position: -2016px 0px; } +.icon32.master-data--add-project { background-position: -2048px 0px; } +.icon32.master-data--add-service { background-position: -2080px 0px; } +.icon32.master-data--add-vendor { background-position: -2112px 0px; } +.icon32.master-data { background-position: -2144px 0px; } +.icon32.master-data--reports--assemblies { background-position: -2176px 0px; } +.icon32.master-data--reports--customers { background-position: -2208px 0px; } +.icon32.master-data--reports--licenses { background-position: -2240px 0px; } +.icon32.master-data--reports--parts { background-position: -2272px 0px; } +.icon32.master-data--reports { background-position: -2304px 0px; } +.icon32.master-data--reports--projects { background-position: -2336px 0px; } +.icon32.master-data--reports--projecttransactions { background-position: -2368px 0px; } +.icon32.master-data--reports--services { background-position: -2400px 0px; } +.icon32.master-data--reports--vendors { background-position: -2432px 0px; } +.icon32.neues-fenster { background-position: -2464px 0px; } +.icon32.program--logout { background-position: -2496px 0px; } +.icon32.program { background-position: -2528px 0px; } +.icon32.program--preferences { background-position: -2560px 0px; } +.icon32.program--version { background-position: -2592px 0px; } +.icon32.reports--balance-sheet { background-position: -2624px 0px; } +.icon32.reports--chart-of-accounts { background-position: -2656px 0px; } +.icon32.reports--income-statement { background-position: -2688px 0px; } +.icon32.reports { background-position: -2720px 0px; } +.icon32.reports--ustva { background-position: -2752px 0px; } +.icon32.system { background-position: -2784px 0px; } +.icon32.warehouse--produce-assembly { background-position: -2816px 0px; } diff --git a/doc/dokumentation.xml b/doc/dokumentation.xml index d8dba3df7..5bbc1729f 100644 --- a/doc/dokumentation.xml +++ b/doc/dokumentation.xml @@ -1395,24 +1395,30 @@ ln -s $(pwd)/kivitendo-task-server.service /etc/systemd/system/ Vorlagenverzeichnis anlegen - Im Administrationsbereich lässt sich bei einem Benutzer/Mandanten einer dieser Vorlagensätze als Basis für die zu - druckenden Dokumente auswählen. Rufen Sie dazu die Benutzerverwaltung auf. + Es lässt sich ein initialer Vorlagensatz erstellen. Die LaTeX-System-Abhängigkeiten hierfür kann man prüfen mit: - Wählen Sie dort einen Benutzer aus oder legen Sie einen neuen an. In der Benutzerbearbeiten-Maske müssen Sie zwei Dinge - angeben: + ./scripts/installation_check.pl -lv + + Der Angemmeldete Benutzer muss in einer Gruppe sein, die über das + Recht "Konfiguration -> Mandantenverwaltung" verfügt. Siehe auch . + + Im Userbereich lässt sich unter: + "System -> + Mandantenverwaltung -> Verschiedenes" die Option + "Neue Druckvorlagen aus Vorlagensatz erstellen" auswählen. - : Der Verzeichnisname für den neuen Vorlagensatz. Dieser kann im Rahmen der üblichen - Bedingungen für Verzeichnisnamen frei gewählt werden. : Wählen Sie hier den Vorlagensatz aus, der kopiert werden soll (Standard, f-tex oder RB.) + : Der Verzeichnisname für den neuen Vorlagensatz. Dieser kann im Rahmen der üblichen + Bedingungen für Verzeichnisnamen frei gewählt werden. - Der gleiche Vorlagensatz kann, wenn er mal angelegt ist, bei mehreren Benutzern verwendet werden. - - Die Abhängigkeiten kann man prüfen mit: + Nach dem Speichern wird das Vorlagenverzeichnis angelegt und ist für den aktuellen Mandanten ausgewählt. + Der gleiche Vorlagensatz kann, wenn er mal angelegt ist, bei mehreren Mandanten verwendet werden. + Eventuell muessen Anpassungen (Logo, Erscheinungsbild, etc) noch vorgenommen werden. Den Ordner findet man im Dateisistem unter + ./templates/[Neuer Name] - /scripts/installation_check.pl -l diff --git a/image/icons/16x16/AR--Reports--Invoices, Credit Notes & AR Transactions.png b/image/icons/16x16/AR--Reports--Invoices, Credit Notes & AR Transactions.png new file mode 100644 index 000000000..ca74ae14f Binary files /dev/null and b/image/icons/16x16/AR--Reports--Invoices, Credit Notes & AR Transactions.png differ diff --git a/image/icons/16x16/AR--Reports--Invoices.png b/image/icons/16x16/AR--Reports--Invoices.png deleted file mode 100644 index ca74ae14f..000000000 Binary files a/image/icons/16x16/AR--Reports--Invoices.png and /dev/null differ diff --git a/image/maps/icons16.png b/image/maps/icons16.png index 87ff0b102..dafc5cec1 100644 Binary files a/image/maps/icons16.png and b/image/maps/icons16.png differ diff --git a/image/maps/icons24.png b/image/maps/icons24.png index 4bd12060d..179097f2d 100644 Binary files a/image/maps/icons24.png and b/image/maps/icons24.png differ diff --git a/image/maps/icons32.png b/image/maps/icons32.png index a564f6e77..8ede5685a 100644 Binary files a/image/maps/icons32.png and b/image/maps/icons32.png differ diff --git a/locale/de/all b/locale/de/all index e7c9de414..f4f207dc0 100755 --- a/locale/de/all +++ b/locale/de/all @@ -1925,6 +1925,7 @@ $self->{texts} = { 'Show delete button in purchase orders?' => 'Soll der "Löschen"-Knopf bei Lieferantenaufträgen angezeigt werden?', 'Show delete button in sales delivery orders?' => 'Soll der "Löschen"-Knopf bei Verkaufslieferscheinen angezeigt werden?', 'Show delete button in sales orders?' => 'Soll der "Löschen"-Knopf bei Kundenaufträgen angezeigt werden?', + 'Show delivery plan' => 'Lieferplan anzeigen', 'Show details' => 'Detailsanzeige', 'Show details and reports of parts, services, assemblies' => 'Details und Berichte von Waren, Dienstleistungen und Erzeugnissen anzeigen', 'Show fields used for the best before date?' => 'Felder zur Eingabe des Mindesthaltbarkeitsdatums anzeigen?', @@ -2763,6 +2764,7 @@ $self->{texts} = { 'transferred out' => 'ausgelagert', 'trial_balance' => 'susa', 'unconfigured' => 'unkonfiguriert', + 'uncorrect partnumber ' => 'Unbekannte Teilenummer ', 'up' => 'hoch', 'use program settings' => 'benutze Programmeinstellungen', 'use user config' => 'Verwende Benutzereinstellung', diff --git a/menus/erp.ini b/menus/erp.ini index a096dc6ef..8de2f0cfd 100644 --- a/menus/erp.ini +++ b/menus/erp.ini @@ -165,7 +165,7 @@ module=dn.pl action=search [AR--Reports--Delivery Plan] -ACCESS=sales_order_edit +ACCESS=delivery_plan module=controller.pl action=DeliveryPlan/list diff --git a/scripts/image_maps.pl b/scripts/image_maps.pl index e6a47d95d..f025340ab 100755 --- a/scripts/image_maps.pl +++ b/scripts/image_maps.pl @@ -81,7 +81,12 @@ for (@gd_images) { for (@gd_images) { my $name = fileparse($_->{filename}, ".png"); - $name =~ s/ /-/g; + + # the full grammar for valid css class names is completely bonkers (to put it mildly). + # so instead of trying to punch filenames into those class names, we'll + # just reduce them to a nice minimal set of lower case /[a-z0-9_-]*/ + $name = lc $name; + $name =~ s/[^a-z0-9_-]/-/g; print $file ".$class_for_map.$name { background-position: -$_->{h_offset}px 0px; }\n"; } } diff --git a/scripts/installation_check.pl b/scripts/installation_check.pl index 6f76e3f45..3a69630ba 100755 --- a/scripts/installation_check.pl +++ b/scripts/installation_check.pl @@ -40,6 +40,7 @@ my %check; Getopt::Long::Configure ("bundling"); GetOptions( "v|verbose" => \ my $v, + "V|no-verbose" => \ my $nv, "a|all" => \ $check{a}, "o|optional!" => \ $check{o}, "d|devel!" => \ $check{d}, @@ -49,6 +50,15 @@ GetOptions( "c|color!" => \ ( my $c = 1 ), ); +# verbos is default +if ( $v && $nv ){ + $v = 1; +}elsif ($nv){ + undef $v; +}else{ + $v = 1; +} + # if nothing is requested check "required" my $default_run; if (!defined $check{a} @@ -308,9 +318,13 @@ Probe for LaTeX documentclasses and packages in master templates. Don't probe for LaTeX document classes and packages in master templates. (Useful in combination with --all) -=item C<-v. --verbose> +=item C<-v, --verbose> + +Print additional info for missing dependancies (enabled by default) + +=item C<-V, --no-verbose> -Print additional info for missing dependancies +Disable verbosity =back diff --git a/sql/Pg-upgrade2-auth/delivery_plan_rights.pl b/sql/Pg-upgrade2-auth/delivery_plan_rights.pl new file mode 100644 index 000000000..38b31c844 --- /dev/null +++ b/sql/Pg-upgrade2-auth/delivery_plan_rights.pl @@ -0,0 +1,26 @@ +# @tag: delivery_plan_rights +# @description: Setzt das neue Recht den Lieferplan anzuzeigen +# @depends: release_3_0_0 +package SL::DBUpgrade2::delivery_plan_rights; + +use strict; +use utf8; + +use parent qw(SL::DBUpgrade2::Base); + +use SL::DBUtils; + +sub run { + my ($self) = @_; + + my $groups = $main::auth->read_groups(); + + foreach my $group (values %{$groups}) { + $group->{rights}->{delivery_plan_rights} = $group->{rights}->{sales_order_edit}; + $main::auth->save_group($group); + } + + return 1; +} # end run + +1; diff --git a/sql/Pg-upgrade2/custom_variables_delete_via_trigger_2.pl b/sql/Pg-upgrade2/custom_variables_delete_via_trigger_2.pl new file mode 100644 index 000000000..d97493d4f --- /dev/null +++ b/sql/Pg-upgrade2/custom_variables_delete_via_trigger_2.pl @@ -0,0 +1,109 @@ +# @tag: custom_variables_delete_via_trigger_2 +# @description: Benutzerdefinierte Variablen werden nun via Trigger gelöscht (beim Löschen von Kunden, Lieferanten, Kontaktpersonen, Waren, Dienstleistungen, Erzeugnissen und Projekten). +# @depends: custom_variables_delete_via_trigger + +package SL::DBUpgrade2::custom_variables_delete_via_trigger_2; + +use utf8; +use strict; + +use parent qw(SL::DBUpgrade2::Base); + +sub run { + my ($self) = @_; + + my @queries = ( + #Delete orphaned entries + q|DELETE FROM custom_variables WHERE (sub_module = '' OR sub_module IS NULL) + AND trans_id NOT IN (SELECT id FROM customer UNION SELECT id FROM vendor) + AND (SELECT module FROM custom_variable_configs WHERE id = config_id) = 'CT'|, + q|DELETE FROM custom_variables WHERE (sub_module = '' OR sub_module IS NULL) + AND trans_id NOT IN (SELECT id FROM contacts) + AND (SELECT module FROM custom_variable_configs WHERE id = config_id) = 'Contacts'|, + q|DELETE FROM custom_variables WHERE (sub_module = '' OR sub_module IS NULL) + AND trans_id NOT IN (SELECT id FROM parts) + AND (SELECT module FROM custom_variable_configs WHERE id = config_id) = 'IC'|, + q|DELETE FROM custom_variables WHERE (sub_module = '' OR sub_module IS NULL) + AND trans_id NOT IN (SELECT id FROM project) + AND (SELECT module FROM custom_variable_configs WHERE id = config_id) = 'Projects'|, + + #Create trigger + q|CREATE OR REPLACE FUNCTION delete_cv_custom_variables_trigger() RETURNS trigger AS $$ + BEGIN + DELETE FROM custom_variables WHERE (sub_module = '' OR sub_module IS NULL) + AND trans_id = OLD.id + AND (SELECT module FROM custom_variable_configs WHERE id = config_id) = 'CT'; + + RETURN OLD; + END; + $$ LANGUAGE plpgsql|, + + q|DROP TRIGGER IF EXISTS delete_cv_custom_variables ON customer|, + q|DROP TRIGGER IF EXISTS delete_cv_custom_variables ON vendor|, + + q|CREATE TRIGGER delete_cv_custom_variables + BEFORE DELETE ON customer + FOR EACH ROW EXECUTE PROCEDURE delete_cv_custom_variables_trigger()|, + q|CREATE TRIGGER delete_cv_custom_variables + BEFORE DELETE ON vendor + FOR EACH ROW EXECUTE PROCEDURE delete_cv_custom_variables_trigger()|, + + #Create trigger + q|CREATE OR REPLACE FUNCTION delete_contact_custom_variables_trigger() RETURNS trigger AS $$ + BEGIN + DELETE FROM custom_variables WHERE (sub_module = '' OR sub_module IS NULL) + AND trans_id = OLD.cp_id + AND (SELECT module FROM custom_variable_configs WHERE id = config_id) = 'Contacts'; + + RETURN OLD; + END; + $$ LANGUAGE plpgsql|, + + q|DROP TRIGGER IF EXISTS delete_contact_custom_variables ON contacts|, + + q|CREATE TRIGGER delete_contact_custom_variables + BEFORE DELETE ON contacts + FOR EACH ROW EXECUTE PROCEDURE delete_contact_custom_variables_trigger()|, + + #Create trigger + q|CREATE OR REPLACE FUNCTION delete_part_custom_variables_trigger() RETURNS trigger AS $$ + BEGIN + DELETE FROM custom_variables WHERE (sub_module = '' OR sub_module IS NULL) + AND trans_id = OLD.id + AND (SELECT module FROM custom_variable_configs WHERE id = config_id) = 'IC'; + + RETURN OLD; + END; + $$ LANGUAGE plpgsql|, + + q|DROP TRIGGER IF EXISTS delete_part_custom_variables ON parts|, + + q|CREATE TRIGGER delete_part_custom_variables + BEFORE DELETE ON parts + FOR EACH ROW EXECUTE PROCEDURE delete_part_custom_variables_trigger()|, + + #Create trigger + q|CREATE OR REPLACE FUNCTION delete_project_custom_variables_trigger() RETURNS trigger AS $$ + BEGIN + DELETE FROM custom_variables WHERE (sub_module = '' OR sub_module IS NULL) + AND trans_id = OLD.id + AND (SELECT module FROM custom_variable_configs WHERE id = config_id) = 'Projects'; + + RETURN OLD; + END; + $$ LANGUAGE plpgsql|, + + q|DROP TRIGGER IF EXISTS delete_project_custom_variables ON project|, + + q|CREATE TRIGGER delete_project_custom_variables + BEFORE DELETE ON project + FOR EACH ROW EXECUTE PROCEDURE delete_project_custom_variables_trigger()|, + + ); + + $self->db_query($_) for @queries; + + return 1; +} + +1; diff --git a/templates/webpages/admin/edit_user.html b/templates/webpages/admin/edit_user.html index 94db96b12..5ecd92673 100644 --- a/templates/webpages/admin/edit_user.html +++ b/templates/webpages/admin/edit_user.html @@ -158,7 +158,7 @@ function save_as_new() { $("#user_id").val(""); - submit_with_action("save_user"); + submit_with_action("save_newuser"); } -->