Merge branch 'master' of github.com:kivitendo/kivitendo-erp
authorJan Büren <jan@kivitendo-premium.de>
Tue, 7 Jan 2014 17:13:39 +0000 (18:13 +0100)
committerJan Büren <jan@kivitendo-premium.de>
Tue, 7 Jan 2014 17:13:39 +0000 (18:13 +0100)
31 files changed:
SL/Auth.pm
SL/Controller/Admin.pm
SL/Controller/DeliveryPlan.pm
SL/DB/CustomVariable.pm
SL/DB/Helper/TransNumberGenerator.pm
SL/DB/Project.pm
SL/DO.pm
SL/Form.pm
SL/IC.pm
SL/IS.pm
SL/Layout/MenuLeft.pm
SL/OE.pm
bin/mozilla/do.pl
bin/mozilla/is.pl
bin/mozilla/rp.pl
css/icons16.css
css/icons24.css
css/icons32.css
doc/dokumentation.xml
image/icons/16x16/AR--Reports--Invoices, Credit Notes & AR Transactions.png [new file with mode: 0644]
image/icons/16x16/AR--Reports--Invoices.png [deleted file]
image/maps/icons16.png
image/maps/icons24.png
image/maps/icons32.png
locale/de/all
menus/erp.ini
scripts/image_maps.pl
scripts/installation_check.pl
sql/Pg-upgrade2-auth/delivery_plan_rights.pl [new file with mode: 0644]
sql/Pg-upgrade2/custom_variables_delete_via_trigger_2.pl [new file with mode: 0644]
templates/webpages/admin/edit_user.html

index 59542d6..13044e7 100644 (file)
@@ -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")],
index 2e55420..179142c 100644 (file)
@@ -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})          || { };
index ee4a292..ebf6fa6 100644 (file)
@@ -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) = @_;
 
index 144acef..6073925 100644 (file)
@@ -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) = @_;
 
index 6cdc281..cc5fc32 100644 (file)
@@ -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};
index ba6f12f..73390d8 100644 (file)
@@ -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,
 );
 
index bc651c8..3d4cb23 100644 (file)
--- 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);
index f0500d3..e115f97 100644 (file)
@@ -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"}) {
index b99ec2a..3b7eb08 100644 (file)
--- 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]++;
index 23b6f80..b00e809 100644 (file)
--- 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 };
     }
   }
 
index 9a47d29..f2e8a05 100644 (file)
@@ -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";
index 0e5c05b..797eb97 100644 (file)
--- 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 };
     }
   }
 
index b722e20..e633b42 100644 (file)
@@ -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);
index cf3ac57..d0e5014 100644 (file)
@@ -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);
index f257b51..302dbc1 100644 (file)
@@ -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}       = "&nbsp;&nbsp;";
   $::form->{bold}          = "<b>";
index f847711..55ec597 100644 (file)
@@ -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; }
index fe6ba0a..87a382e 100644 (file)
@@ -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; }
index a8d9d0d..0628d83 100644 (file)
@@ -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; }
index d8dba3d..5bbc172 100644 (file)
@@ -1395,24 +1395,30 @@ ln -s $(pwd)/kivitendo-task-server.service /etc/systemd/system/</programlisting>
 
       <sect2 id="Vorlagenverzeichnis-anlegen" xreflabel="Vorlagenverzeichnis anlegen">
         <title>Vorlagenverzeichnis anlegen</title>
-        <para>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 <guimenu>Benutzerverwaltung</guimenu> auf.</para>
+        <para>Es lässt sich ein initialer Vorlagensatz erstellen. Die LaTeX-System-Abhängigkeiten hierfür kann man prüfen mit:</para>
 
-        <para>Wählen Sie dort einen Benutzer aus oder legen Sie einen neuen an. In der Benutzerbearbeiten-Maske müssen Sie zwei Dinge
-        angeben:</para>
+        <programlisting>./scripts/installation_check.pl -lv</programlisting>
+
+       <para>Der Angemmeldete Benutzer muss in einer Gruppe sein, die über das
+              Recht "Konfiguration -> Mandantenverwaltung" verfügt. Siehe auch <xref linkend="Gruppen-anlegen"/>.
+        </para>
+        <para>Im Userbereich lässt sich unter:
+        "<guimenu>System</guimenu> -&gt;
+        <guisubmenu>Mandantenverwaltung</guisubmenu> -&gt; <guimenuitem>Verschiedenes</guimenuitem>" die Option
+        "Neue Druckvorlagen aus Vorlagensatz erstellen" auswählen.</para>
 
         <orderedlist>
-          <listitem><para><option>Name</option>: Der Verzeichnisname für den neuen Vorlagensatz. Dieser kann im Rahmen der üblichen
-          Bedingungen für Verzeichnisnamen frei gewählt werden.</para></listitem>
           <listitem><para><option>Vorlagen auswählen</option>: Wählen Sie hier den Vorlagensatz aus, der kopiert werden soll
           (<filename>Standard</filename>, <filename>f-tex</filename> oder <filename>RB</filename>.)</para></listitem>
+          <listitem><para><option>Neuer Name</option>: Der Verzeichnisname für den neuen Vorlagensatz. Dieser kann im Rahmen der üblichen
+          Bedingungen für Verzeichnisnamen frei gewählt werden.</para></listitem>
         </orderedlist>
 
-        <para>Der gleiche Vorlagensatz kann, wenn er mal angelegt ist, bei mehreren Benutzern verwendet werden.</para>
-
-        <para>Die Abhängigkeiten kann man prüfen mit:</para>
+        <para>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
+           <filename>./templates/[Neuer Name]</filename></para>
 
-        <programlisting>/scripts/installation_check.pl -l</programlisting>
 
       </sect2>
       <sect2 id="Vorlagen-Standard">
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 (file)
index 0000000..ca74ae1
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 (file)
index ca74ae1..0000000
Binary files a/image/icons/16x16/AR--Reports--Invoices.png and /dev/null differ
index 87ff0b1..dafc5ce 100644 (file)
Binary files a/image/maps/icons16.png and b/image/maps/icons16.png differ
index 4bd1206..179097f 100644 (file)
Binary files a/image/maps/icons24.png and b/image/maps/icons24.png differ
index a564f6e..8ede568 100644 (file)
Binary files a/image/maps/icons32.png and b/image/maps/icons32.png differ
index e7c9de4..f4f207d 100755 (executable)
@@ -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',
index a096dc6..8de2f0c 100644 (file)
@@ -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
 
index e6a47d9..f025340 100755 (executable)
@@ -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";
   }
 }
index 6f76e3f..3a69630 100755 (executable)
@@ -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 (file)
index 0000000..38b31c8
--- /dev/null
@@ -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 (file)
index 0000000..d97493d
--- /dev/null
@@ -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;
index 94db96b..5ecd926 100644 (file)
 
   function save_as_new() {
     $("#user_id").val("");
-    submit_with_action("save_user");
+    submit_with_action("save_newuser");
   }
    -->
 </script>