Projekt

Allgemein

Profil

« Zurück | Weiter » 

Revision c364e43e

Von Peter Schulgin vor etwa 8 Jahren hinzugefügt

  • ID c364e43efab3ac6f0f0c20cd6f8f89a85ab45280
  • Vorgänger b36f0864
  • Nachfolger 96593e93

Revert "Artikel-Klassifizierung"

This reverts commit 5067d7bd31514962af9730b33323b831d87164f8.

Unterschiede anzeigen:

SL/Controller/CsvImport/Part.pm
23 23
use Rose::Object::MakeMethods::Generic
24 24
(
25 25
 scalar                  => [ qw(table makemodel_columns) ],
26
 'scalar --get_set_init' => [ qw(bg_by settings parts_by price_factors_by classification_by units_by partsgroups_by
26
 'scalar --get_set_init' => [ qw(bg_by settings parts_by price_factors_by units_by partsgroups_by
27 27
                                 warehouses_by bins_by
28 28
                                 translation_columns all_pricegroups) ],
29 29
);
......
40 40
                       article_number_policy     => 'update_prices',
41 41
                       shoparticle_if_missing    => '0',
42 42
                       part_type                 => 'part',
43
                       parts_classification      => 0,
44 43
                       default_buchungsgruppe    => ($bugru ? $bugru->id : undef),
45 44
                       apply_buchungsgruppe      => 'all',
46 45
                      );
......
59 58
  return { map { my $col = $_; ( $col => { map { ( $_->$col => $_ ) } @{ $all_bg } } ) } qw(id description) };
60 59
}
61 60

  
62
sub init_classification_by {
63
  my ($self) = @_;
64
  my $all_classifications = SL::DB::Manager::PartsClassification->get_all;
65
  $_->abbreviation($::locale->text($_->abbreviation)) for @{ $all_classifications };
66
  return { map { my $col = $_; ( $col => { map { ( $_->$col => $_ ) } @{ $all_classifications } } ) } qw(id abbreviation) };
67
}
68

  
69 61
sub init_price_factors_by {
70 62
  my ($self) = @_;
71 63

  
......
134 126

  
135 127
  return { map { ( $_ => $self->controller->profile->get($_) ) } qw(apply_buchungsgruppe default_buchungsgruppe article_number_policy
136 128
                                                                    sellprice_places sellprice_adjustment sellprice_adjustment_type
137
                                                                    shoparticle_if_missing part_type classification_id default_unit) };
129
                                                                    shoparticle_if_missing part_type default_unit) };
138 130
}
139 131

  
140 132
sub init_all_cvar_configs {
......
182 174
    $i++;
183 175
  }
184 176

  
185
  $self->add_columns(qw(part_type classification_id)) if $self->settings->{part_type} eq 'mixed';
177
  $self->add_columns(qw(part_type)) if $self->settings->{part_type} eq 'mixed';
186 178
  $self->add_columns(qw(buchungsgruppen_id unit));
187 179
  $self->add_columns(map { "${_}_id" } grep { exists $self->controller->data->[0]->{raw_data}->{$_} } qw (price_factor payment partsgroup warehouse bin));
188 180
  $self->add_columns(qw(shop)) if $self->settings->{shoparticle_if_missing};
......
421 413
  # $bg  ||= SL::DB::Buchungsgruppe->new(inventory_accno_id => 1); # does this case ever occur?
422 414

  
423 415
  my $part_type = $self->settings->{part_type};
424
  if ($part_type eq 'mixed' && $entry->{raw_data}->{part_type}) {
416
  if ($part_type eq 'mixed') {
425 417
    $part_type = $entry->{raw_data}->{part_type} =~ m/^p/i ? 'part'
426 418
               : $entry->{raw_data}->{part_type} =~ m/^s/i ? 'service'
427 419
               : $entry->{raw_data}->{part_type} =~ m/^assem/i ? 'assembly'
428 420
               : $entry->{raw_data}->{part_type} =~ m/^assor/i ? 'assortment'
429
               : $self->settings->{part_type};
430
  }
431
  my $classification_id = $self->settings->{classification_id};
432

  
433
  if ( $entry->{raw_data}->{pclass} && length($entry->{raw_data}->{pclass}) >= 2 ) {
434
      my $abbr1 = substr($entry->{raw_data}->{pclass},0,1);
435
      my $abbr2 = substr($entry->{raw_data}->{pclass},1);
436

  
437
      if ( $self->classification_by->{abbreviation}->{$abbr2} ) {
438
         my $tmp_classification_id = $self->classification_by->{abbreviation}->{$abbr2}->id;
439
         $classification_id = $tmp_classification_id if $tmp_classification_id;
440
      }
441
      if ($part_type eq 'mixed') {
442
          $part_type = $abbr1 eq $::locale->text('Part (typeabbreviation)') ? 'part'
443
                     : $abbr1 eq $::locale->text('Service (typeabbreviation)') ? 'service'
444
                     : $abbr1 eq $::locale->text('Assembly (typeabbreviation)') ? 'assembly'
445
                     : $abbr1 eq $::locale->text('Assortment (typeabbreviation)') ? 'assortment'
446
                     :                                        undef;
447
      }
421
               : undef;
448 422
  }
449 423

  
450 424
  # when saving income_accno_id or expense_accno_id use ids from the selected
......
469 443
  }
470 444

  
471 445
  $entry->{object}->part_type($part_type);
472
  $entry->{object}->classification_id( $classification_id );
473 446

  
474 447
  return 1;
475 448
}
......
726 699

  
727 700
  $self->add_displayable_columns({ name => 'bin_id',             description => $::locale->text('Bin (database ID)')                                    },
728 701
                                 { name => 'bin',                description => $::locale->text('Bin (name)')                                           },
729
                                 { name => 'buchungsgruppen_id', description => $::locale->text('Booking group (database ID)')                          },
730
                                 { name => 'buchungsgruppe',     description => $::locale->text('Booking group (name)')                                 },
702
                                 { name => 'buchungsgruppen_id', description => $::locale->text('Booking group (database ID)')                         },
703
                                 { name => 'buchungsgruppe',     description => $::locale->text('Booking group (name)')                                },
731 704
                                 { name => 'description',        description => $::locale->text('Description')                                          },
732 705
                                 { name => 'drawing',            description => $::locale->text('Drawing')                                              },
733 706
                                 { name => 'ean',                description => $::locale->text('EAN')                                                  },
......
748 721
                                 { name => 'partnumber',         description => $::locale->text('Part Number')                                          },
749 722
                                 { name => 'partsgroup_id',      description => $::locale->text('Partsgroup (database ID)')                             },
750 723
                                 { name => 'partsgroup',         description => $::locale->text('Partsgroup (name)')                                    },
751
                                 { name => 'classification_by',  description => $::locale->text('Article classification')  . ' [3]'                     },
752 724
                                 { name => 'payment_id',         description => $::locale->text('Payment terms (database ID)')                          },
753 725
                                 { name => 'payment',            description => $::locale->text('Payment terms (name)')                                 },
754 726
                                 { name => 'price_factor_id',    description => $::locale->text('Price factor (database ID)')                           },
755 727
                                 { name => 'price_factor',       description => $::locale->text('Price factor (name)')                                  },
756 728
                                 { name => 'rop',                description => $::locale->text('ROP')                                                  },
757 729
                                 { name => 'sellprice',          description => $::locale->text('Sellprice')                                            },
758
                                 { name => 'shop',               description => $::locale->text('Shop article')                                         },
759
                                 { name => 'type',               description => $::locale->text('Article type')  . ' [3]'                               },
730
                                 { name => 'shop',               description => $::locale->text('Shop article')                                          },
731
                                 { name => 'type',               description => $::locale->text('Article type')  . ' [3]'                             },
760 732
                                 { name => 'unit',               description => $::locale->text('Unit (if missing or empty default unit will be used)') },
761 733
                                 { name => 've',                 description => $::locale->text('Verrechnungseinheit')                                  },
762 734
                                 { name => 'warehouse_id',       description => $::locale->text('Warehouse (database ID)')                              },
763
                                 { name => 'warehouse',          description => $::locale->text('Warehouse (name)')                                     },
735
                                 { name => 'warehouse',          description => $::locale->text('Warehouse (name)')                              },
764 736
                                 { name => 'weight',             description => $::locale->text('Weight')                                               },
765 737
                                );
766 738

  
SL/Controller/PartsClassification.pm
1
package SL::Controller::PartsClassification;
2

  
3
use strict;
4

  
5
use parent qw(SL::Controller::Base);
6

  
7
use SL::DB::PartsClassification;
8
use SL::Helper::Flash;
9

  
10
use Rose::Object::MakeMethods::Generic
11
(
12
 scalar => [ qw(parts_classification) ],
13
);
14

  
15
__PACKAGE__->run_before('check_auth');
16
__PACKAGE__->run_before('load_parts_classification', only => [ qw(edit update destroy) ]);
17

  
18
#
19
# actions
20
#
21

  
22
sub action_list {
23
  my ($self) = @_;
24

  
25
  $self->render('parts_classification/list',
26
                title         => $::locale->text('Parts Classifications'),
27
                PARTS_CLASSIFICATIONS => SL::DB::Manager::PartsClassification->get_all_sorted);
28
}
29

  
30
sub action_new {
31
  my ($self) = @_;
32

  
33
  $self->{parts_classification} = SL::DB::PartsClassification->new;
34
  $self->render('parts_classification/form', title => $::locale->text('Create a new parts classification'));
35
}
36

  
37
sub action_edit {
38
  my ($self) = @_;
39
  $self->render('parts_classification/form', title => $::locale->text('Edit parts classification'));
40
}
41

  
42
sub action_create {
43
  my ($self) = @_;
44

  
45
  $self->{parts_classification} = SL::DB::PartsClassification->new;
46
  $self->create_or_update;
47
}
48

  
49
sub action_update {
50
  my ($self) = @_;
51
  $self->create_or_update;
52
}
53

  
54
sub action_destroy {
55
  my ($self) = @_;
56

  
57
  if ( $self->{parts_classification}->id < 5 ) {
58
    flash_later('error', $::locale->text('The basic parts classification cannot be deleted.'));
59
  }
60
  elsif (eval { $self->{parts_classification}->delete; 1; }) {
61
    flash_later('info',  $::locale->text('The parts classification has been deleted.'));
62
  } else {
63
    flash_later('error', $::locale->text('The parts classification is in use and cannot be deleted.'));
64
  }
65

  
66
  $self->redirect_to(action => 'list');
67
}
68

  
69
sub action_reorder {
70
  my ($self) = @_;
71

  
72
  SL::DB::PartsClassification->reorder_list(@{ $::form->{parts_classification_id} || [] });
73

  
74
  $self->render(\'', { type => 'json' });
75
}
76

  
77
#
78
# filters
79
#
80

  
81
sub check_auth {
82
  $::auth->assert('config');
83
}
84

  
85
#
86
# helpers
87
#
88

  
89
sub create_or_update {
90
  my $self   = shift;
91
  my $is_new = !$self->{parts_classification}->id;
92
  my $params = delete($::form->{parts_classification}) || { };
93

  
94
  $self->{parts_classification}->assign_attributes(%{ $params });
95

  
96
  my @errors = $self->{parts_classification}->validate;
97

  
98
  if (@errors) {
99
    flash('error', @errors);
100
    $self->render('parts_classification/form', title => $is_new ? $::locale->text('Create a new parts classification') : $::locale->text('Edit parts classification'));
101
    return;
102
  }
103

  
104
  $self->{parts_classification}->save;
105

  
106
  flash_later('info', $is_new ? $::locale->text('The parts classification has been created.') : $::locale->text('The parts classification has been saved.'));
107
  $self->redirect_to(action => 'list');
108
}
109

  
110
sub load_parts_classification {
111
  my ($self) = @_;
112
  $self->{parts_classification} = SL::DB::PartsClassification->new(id => $::form->{id})->load;
113
}
114

  
115
1;
SL/DB/Helper/Mappings.pm
153 153
  oe                             => 'order',
154 154
  parts                          => 'part',
155 155
  partsgroup                     => 'parts_group',
156
  parts_classifications          => 'PartsClassification',
157 156
  parts_price_history            => 'PartsPriceHistory',
158 157
  payment_terms                  => 'payment_term',
159 158
  periodic_invoices              => 'periodic_invoice',
SL/DB/Manager/PartsClassification.pm
1
# This file has been auto-generated only because it didn't exist.
2
# Feel free to modify it at will; it will not be overwritten automatically.
3

  
4
package SL::DB::Manager::PartsClassification;
5

  
6
use strict;
7

  
8
use parent qw(SL::DB::Helper::Manager);
9
use SL::DB::Helper::Sorted;
10

  
11
sub object_class { 'SL::DB::PartsClassification' }
12

  
13
__PACKAGE__->make_manager_methods;
14

  
15

  
16
sub get_abbreviation {
17
  my ($class,$id) = @_;
18
  my $obj = $class->get_first(query => [ id => $id ]);
19
  return $obj->abbreviation?$obj->abbreviation:undef;
20
}
21

  
22
1;
SL/DB/MetaSetup/Part.pm
12 12
  bin_id             => { type => 'integer' },
13 13
  bom                => { type => 'boolean', default => 'false' },
14 14
  buchungsgruppen_id => { type => 'integer' },
15
  classification_id  => { type => 'integer', default => '0' },
16 15
  description        => { type => 'text' },
17 16
  drawing            => { type => 'text' },
18 17
  ean                => { type => 'text' },
......
64 63
    key_columns => { buchungsgruppen_id => 'id' },
65 64
  },
66 65

  
67
  classification => {
68
    class       => 'SL::DB::PartsClassification',
69
    key_columns => { classification_id => 'id' },
70
  },
71

  
72 66
  partsgroup => {
73 67
    class       => 'SL::DB::PartsGroup',
74 68
    key_columns => { partsgroup_id => 'id' },
SL/DB/MetaSetup/PartsClassification.pm
1
# This file has been auto-generated. Do not modify it; it will be overwritten
2
# by rose_auto_create_model.pl automatically.
3
package SL::DB::PartsClassification;
4

  
5
use strict;
6

  
7
use parent qw(SL::DB::Object);
8

  
9
__PACKAGE__->meta->table('parts_classifications');
10

  
11
__PACKAGE__->meta->columns(
12
  abbreviation      => { type => 'text' },
13
  description       => { type => 'text' },
14
  id                => { type => 'serial', not_null => 1 },
15
  used_for_purchase => { type => 'boolean', default => 'true' },
16
  used_for_sale     => { type => 'boolean', default => 'true' },
17
);
18

  
19
__PACKAGE__->meta->primary_key_columns([ 'id' ]);
20

  
21
1;
22
;
SL/DB/PartsClassification.pm
1
# This file has been auto-generated only because it didn't exist.
2
# Feel free to modify it at will; it will not be overwritten automatically.
3

  
4
package SL::DB::PartsClassification;
5

  
6
use strict;
7

  
8
use SL::DB::MetaSetup::PartsClassification;
9
use SL::DB::Manager::PartsClassification;
10

  
11
__PACKAGE__->meta->initialize;
12

  
13
sub validate {
14
  my ($self) = @_;
15

  
16
  my @errors;
17
  push @errors, $::locale->text('The description is missing.')  if !$self->description;
18
  push @errors, $::locale->text('The abbreviation is missing.') if !$self->abbreviation;
19

  
20
  return @errors;
21
}
22

  
23

  
24
1;
SL/IC.pm
85 85
    # retrieve assembly items
86 86
    $query =
87 87
      qq|SELECT p.id, p.partnumber, p.description,
88
           p.classification_id,
89 88
           p.sellprice, p.lastcost, p.weight, a.qty, a.bom, p.unit,
90 89
           pg.partsgroup, p.price_factor_id, pfac.factor AS price_factor
91 90
         FROM parts p
......
102 101
      foreach my $key (keys %{$ref}) {
103 102
        $form->{"${key}_$form->{assembly_rows}"} = $ref->{$key};
104 103
      }
105
      $form->{"type_and_classific_$form->{assembly_rows}"} = $::request->presenter->type_abbreviation($ref->{part_type}).
106
                                                             $::request->presenter->classification_abbreviation($ref->{classification_id});
107 104
    }
108 105
    $sth->finish;
109 106

  
......
337 334
         partnumber = ?,
338 335
         description = ?,
339 336
         makemodel = ?,
340
         classification_id = ?,
341 337
         listprice = ?,
342 338
         sellprice = ?,
343 339
         lastcost = ?,
......
371 367
  @values = ($form->{partnumber},
372 368
             $form->{description},
373 369
             $makemodel ? 't' : 'f',
374
             $form->{classification_id},
375 370
             $form->{listprice},
376 371
             $form->{sellprice},
377 372
             $form->{lastcost},
......
647 642

  
648 643
  my $query =
649 644
    qq|SELECT p.id, p.partnumber, p.description, p.sellprice,
650
       p.classification_id,
651 645
       p.weight, p.onhand, p.unit, pg.partsgroup, p.lastcost,
652 646
       p.price_factor_id, pfac.factor AS price_factor, p.notes as longdescription
653 647
       FROM parts p
......
729 723
#  my @other_flags          = qw(onhand); # ToDO: implement these
730 724
#  my @inactive_flags       = qw(l_subtotal short l_linetotal);
731 725

  
732
  my @select_tokens = qw(id factor part_type classification_id);
726
  my @select_tokens = qw(id factor);
733 727
  my @where_tokens  = qw(1=1);
734 728
  my @group_tokens  = ();
735 729
  my @bind_vars     = ();
......
806 800
    insertdate         => 'itime::DATE',
807 801
  );
808 802

  
809
  if ($form->{l_assembly} && $form->{l_lastcost}) {
803
  if (($form->{searchitems} eq 'assembly') && $form->{l_lastcost}) {
810 804
    @simple_l_switches = grep { $_ ne 'lastcost' } @simple_l_switches;
811 805
  }
812 806

  
......
896 890
    push @select_tokens, $_;
897 891
  }
898 892

  
899
  # Oder Bedingungen fuer Ware Dienstleistung Erzeugnis:
900
  if ($form->{l_part} || $form->{l_assembly} || $form->{l_service} || $form->{l_assortment}) {
901
      my @or_tokens = ();
902
      push @or_tokens, "p.part_type = 'service'"    if $form->{l_service};
903
      push @or_tokens, "p.part_type = 'assembly'"   if $form->{l_assembly};
904
      push @or_tokens, "p.part_type = 'part'"       if $form->{l_part};
905
      push @or_tokens, "p.part_type = 'assortment'" if $form->{l_assortment};
906
      push @where_tokens, join ' OR ', map { "($_)" } @or_tokens;
907
  }
908
  else {
909
      # gar keine Teile
910
      push @where_tokens, q|'F' = 'T'|;
911
  }
912

  
913
  if ( $form->{classification_id} > 0 ) {
914
    push @where_tokens, "p.classification_id = ?";
915
    push @bind_vars, $form->{classification_id};
893
  for ($form->{searchitems}) {
894
    push @where_tokens, "p.part_type = 'part'"     if /part/;
895
    push @where_tokens, "p.part_type = 'service'"  if /service/;
896
    push @where_tokens, "p.part_type = 'assembly'" if /assembly/;
916 897
  }
917 898

  
918 899
  for ($form->{itemstatus}) {
......
970 951

  
971 952
  push @select_tokens, @qsooqr_flags, 'quotation', 'cv', 'ioi.id', 'ioi.ioi'  if $bsooqr;
972 953
  push @select_tokens, @deliverydate_flags                                    if $bsooqr && $form->{l_deliverydate};
973
  push @select_tokens, $q_assembly_lastcost                                   if $form->{l_assembly} && $form->{l_lastcost};
954
  push @select_tokens, $q_assembly_lastcost                                   if ($form->{searchitems} eq 'assembly') && $form->{l_lastcost};
974 955
  push @bsooqr_tokens, q|module = 'ir' AND NOT ioi.assemblyitem|              if $form->{bought};
975 956
  push @bsooqr_tokens, q|module = 'is' AND NOT ioi.assemblyitem|              if $form->{sold};
976 957
  push @bsooqr_tokens, q|module = 'oe' AND NOT quotation AND cv = 'customer'| if $form->{ordered};
......
1068 1049
  # post processing for assembly parts lists (bom)
1069 1050
  # for each part get the assembly parts and add them into the partlist.
1070 1051
  my @assemblies;
1071
  if ($form->{l_assembly} && $form->{bom}) {
1052
  if ($form->{searchitems} eq 'assembly' && $form->{bom}) {
1072 1053
    $query =
1073 1054
      qq|SELECT p.id, p.partnumber, p.description, a.qty AS onhand,
1074 1055
           p.unit, p.notes, p.itime::DATE as insertdate,
......
1098 1079
    $form->{parts} = \@assemblies;
1099 1080
  }
1100 1081

  
1101
  if ($form->{l_pricegroups} && SL::DB::Manager::Price->get_all_count() > 0 ) {
1082
  if ($form->{l_pricegroups} ) {
1102 1083
    my $query = <<SQL;
1103 1084
       SELECT parts_id, price, pricegroup_id
1104 1085
       FROM prices
......
1115 1096
      }
1116 1097
      $sth->finish;
1117 1098
    }
1118
  }
1099
  };
1100

  
1119 1101

  
1120 1102
  $main::lxdebug->leave_sub();
1121 1103

  
......
1411 1393
  }
1412 1394

  
1413 1395
  my $query =
1414
    qq|SELECT id, partnumber, description, unit, sellprice,
1415
       classification_id
1396
    qq|SELECT id, partnumber, description, unit, sellprice
1416 1397
       FROM parts
1417 1398
       WHERE $where ORDER BY $order|;
1418 1399

  
......
1425 1406
    }
1426 1407

  
1427 1408
    $j++;
1428
    $form->{"type_and_classific_$j"} = $::request->presenter->type_abbreviation($ref->{part_type}).
1429
                                       $::request->presenter->classification_abbreviation($ref->{classification_id});
1430 1409
    $form->{"id_$j"}          = $ref->{id};
1431 1410
    $form->{"partnumber_$j"}  = $ref->{partnumber};
1432 1411
    $form->{"description_$j"} = $ref->{description};
......
1754 1733
  for my $i (1..$rowcount) {
1755 1734
    my $id = $form->{"${prefix}${i}"};
1756 1735
    next unless $id;
1757
    my $prt = $parts_by_id{$id};
1758
    my $type_abbr = $::request->presenter->type_abbreviation($prt->part_type);
1759
    push @{ $template_arrays{part_type} }, $type_abbr;
1760
    push @{ $template_arrays{type_and_classific}},  $type_abbr.$::request->presenter->classification_abbreviation($prt->classification_id);
1736

  
1737
    push @{ $template_arrays{part_type} },  $parts_by_id{$id}->type;
1761 1738
  }
1762 1739

  
1763
  $main::lxdebug->leave_sub();
1764 1740
  return %template_arrays;
1741
  $main::lxdebug->leave_sub();
1765 1742
}
1766 1743

  
1767 1744
sub normalize_text_blocks {
......
1783 1760
   $main::lxdebug->leave_sub();
1784 1761
}
1785 1762

  
1763

  
1786 1764
1;
SL/IR.pm
1020 1020
        i.description, i.longdescription, i.qty, i.fxsellprice AS sellprice, i.parts_id AS id, i.unit, i.deliverydate, i.project_id, i.serialnumber,
1021 1021
        i.price_factor_id, i.price_factor, i.marge_price_factor, i.discount, i.active_price_source, i.active_discount_source,
1022 1022
        p.partnumber, p.part_type, pr.projectnumber, pg.partsgroup
1023
        ,p.classification_id
1024 1023

  
1025 1024
        FROM invoice i
1026 1025
        JOIN parts p ON (i.parts_id = p.id)
......
1280 1279
         p.notes AS partnotes, p.notes AS longdescription, p.not_discountable,
1281 1280
         p.inventory_accno_id, p.price_factor_id,
1282 1281
         p.ean,
1283
         p.classification_id,
1284 1282

  
1285 1283
         pfac.factor AS price_factor,
1286 1284

  
......
1296 1294
         c3.new_chart_id                  AS expense_new_chart,
1297 1295
         date($transdate) - c3.valid_from AS expense_valid,
1298 1296

  
1299
         pt.used_for_purchase AS used_for_purchase,
1300 1297
         pg.partsgroup
1301 1298

  
1302 1299
       FROM parts p
......
1313 1310
           FROM taxzone_charts tc
1314 1311
           WHERE tc.taxzone_id = '$taxzone_id' and tc.buchungsgruppen_id = p.buchungsgruppen_id) = c3.id)
1315 1312
       LEFT JOIN partsgroup pg ON (pg.id = p.partsgroup_id)
1316
       LEFT JOIN parts_classifications pt ON (pt.id = p.classification_id)
1317 1313
       LEFT JOIN price_factors pfac ON (pfac.id = p.price_factor_id)
1318 1314
       WHERE $where|;
1319 1315
  my $sth = prepare_execute_query($form, $dbh, $query, @values);
......
1332 1328
  map { push @{ $_ }, prepare_query($form, $dbh, $_->[0]) } @translation_queries;
1333 1329

  
1334 1330
  $form->{item_list} = [];
1335
  my $has_wrong_pclass = 0;
1336 1331
  while (my $ref = $sth->fetchrow_hashref("NAME_lc")) {
1337 1332

  
1338 1333
    if ($mm_by_id{$ref->{id}}) {
......
1343 1338
    if (($::form->{"partnumber_$i"} ne '') && ($ref->{ean} eq $::form->{"partnumber_$i"})) {
1344 1339
      push @{ $ref->{matches} ||= [] }, $::locale->text('EAN') . ': ' . $ref->{ean};
1345 1340
    }
1346
    $ref->{type_and_classific} = $::request->presenter->type_abbreviation($ref->{part_type}).
1347
                                 $::request->presenter->classification_abbreviation($ref->{classification_id});
1348 1341

  
1349
    if (! $ref->{used_for_purchase} ) {
1350
       $has_wrong_pclass = 2;
1351
       next;
1352
    }
1353 1342
    # In der Buchungsgruppe ist immer ein Bestandskonto verknuepft, auch wenn
1354 1343
    # es sich um eine Dienstleistung handelt. Bei Dienstleistungen muss das
1355 1344
    # Buchungskonto also aus dem Ergebnis rausgenommen werden.
......
1419 1408
  $sth->finish();
1420 1409
  $_->[1]->finish for @translation_queries;
1421 1410

  
1422
  $form->{is_wrong_pclass} = $has_wrong_pclass;
1423 1411
  foreach my $item (@{ $form->{item_list} }) {
1424 1412
    my $custom_variables = CVar->get_custom_variables(module   => 'IC',
1425 1413
                                                      trans_id => $item->{id},
1426 1414
                                                      dbh      => $dbh,
1427 1415
                                                     );
1428
    $form->{is_wrong_pclass} = 0; # one correct type
1416

  
1429 1417
    map { $item->{"ic_cvar_" . $_->{name} } = $_->{value} } @{ $custom_variables };
1430 1418
  }
1431 1419

  
SL/IS.pm
2003 2003
           i.project_id, i.serialnumber, i.pricegroup_id, i.ordnumber, i.donumber, i.transdate, i.cusordnumber, i.subtotal, i.lastcost,
2004 2004
           i.price_factor_id, i.price_factor, i.marge_price_factor, i.active_price_source, i.active_discount_source,
2005 2005
           p.partnumber, p.part_type, p.notes AS partnotes, p.formel, p.listprice,
2006
           p.classification_id,
2007 2006
           pr.projectnumber, pg.partsgroup, prg.pricegroup
2008 2007

  
2009 2008
         FROM invoice i
......
2301 2300
         p.id, p.partnumber, p.description, p.sellprice,
2302 2301
         p.listprice, p.part_type, p.lastcost,
2303 2302
         p.ean, p.notes,
2304
         p.classification_id,
2305 2303

  
2306 2304
         c1.accno AS inventory_accno,
2307 2305
         c1.new_chart_id AS inventory_new_chart,
......
2321 2319
         p.price_factor_id, p.weight,
2322 2320

  
2323 2321
         pfac.factor AS price_factor,
2324
         pt.used_for_sale AS used_for_sale,
2322

  
2325 2323
         pg.partsgroup
2326 2324

  
2327 2325
       FROM parts p
......
2338 2336
           FROM taxzone_charts tc
2339 2337
           WHERE tc.buchungsgruppen_id = p.buchungsgruppen_id and tc.taxzone_id = ${taxzone_id}) = c3.id)
2340 2338
       LEFT JOIN partsgroup pg ON (pg.id = p.partsgroup_id)
2341
       LEFT JOIN parts_classifications pt ON (pt.id = p.classification_id)
2342 2339
       LEFT JOIN price_factors pfac ON (pfac.id = p.price_factor_id)
2343 2340
       WHERE $where|;
2344 2341
  my $sth = prepare_execute_query($form, $dbh, $query, @values);
......
2356 2353
                                   LIMIT 1| ] );
2357 2354
  map { push @{ $_ }, prepare_query($form, $dbh, $_->[0]) } @translation_queries;
2358 2355

  
2359
  my $has_wrong_pclass = 0;
2360 2356
  while (my $ref = $sth->fetchrow_hashref('NAME_lc')) {
2361 2357

  
2362 2358
    if ($mm_by_id{$ref->{id}}) {
......
2368 2364
      push @{ $ref->{matches} ||= [] }, $::locale->text('EAN') . ': ' . $ref->{ean};
2369 2365
    }
2370 2366

  
2371
    $ref->{type_and_classific} = $::request->presenter->type_abbreviation($ref->{part_type}).
2372
                                 $::request->presenter->classification_abbreviation($ref->{classification_id});
2373
    if (! $ref->{used_for_sale} ) {
2374
        $has_wrong_pclass = 1;
2375
        next;
2376
    }
2377 2367
    # In der Buchungsgruppe ist immer ein Bestandskonto verknuepft, auch wenn
2378 2368
    # es sich um eine Dienstleistung handelt. Bei Dienstleistungen muss das
2379 2369
    # Buchungskonto also aus dem Ergebnis rausgenommen werden.
......
2457 2447
  $sth->finish;
2458 2448
  $_->[1]->finish for @translation_queries;
2459 2449

  
2460
  $form->{is_wrong_pclass} = $has_wrong_pclass;
2461 2450
  foreach my $item (@{ $form->{item_list} }) {
2462 2451
    my $custom_variables = CVar->get_custom_variables(module   => 'IC',
2463 2452
                                                      trans_id => $item->{id},
2464 2453
                                                      dbh      => $dbh,
2465 2454
                                                     );
2466
    $form->{is_wrong_pclass} = 0; # one correct type
2455

  
2467 2456
    map { $item->{"ic_cvar_" . $_->{name} } = $_->{value} } @{ $custom_variables };
2468 2457
  }
2458

  
2469 2459
  $main::lxdebug->leave_sub();
2470 2460
}
2471 2461

  
SL/OE.pm
1094 1094
           c3.accno AS expense_accno,   c3.new_chart_id AS expense_new_chart,   date($transdate) - c3.valid_from as expense_valid,
1095 1095
           oe.ordnumber AS ordnumber_oe, oe.transdate AS transdate_oe, oe.cusordnumber AS cusordnumber_oe,
1096 1096
           p.partnumber, p.part_type, p.listprice, o.description, o.qty,
1097
           p.classification_id,
1098 1097
           o.sellprice, o.parts_id AS id, o.unit, o.discount, p.notes AS partnotes, p.part_type,
1099 1098
           o.reqdate, o.project_id, o.serialnumber, o.ship, o.lastcost,
1100 1099
           o.ordnumber, o.transdate, o.cusordnumber, o.subtotal, o.longdescription,
SL/Presenter/Part.pm
3 3
use strict;
4 4

  
5 5
use SL::DB::Part;
6
use SL::DB::Manager::PartsClassification;
7 6

  
8 7
use Exporter qw(import);
9
our @EXPORT = qw(part_picker part select_classification classification_abbreviation type_abbreviation type_and_classification);
8
our @EXPORT = qw(part_picker part);
10 9

  
11 10
use Carp;
12 11

  
......
47 46
  $self->html_tag('span', $ret, class => 'part_picker');
48 47
}
49 48

  
50
#
51
# Must be addapted to new type table
52
#
53
sub type_abbreviation {
54
  my ($self, $part_type) = @_;
55
  $main::lxdebug->message(LXDebug->DEBUG2(),"parttype=".$part_type);
56
  return $::locale->text('Assembly (typeabbreviation)')   if $part_type eq 'assembly';
57
  return $::locale->text('Part (typeabbreviation)')       if $part_type eq 'part';
58
  return $::locale->text('Assortment (typeabbreviation)') if $part_type eq 'assortment';
59
  return $::locale->text('Service (typeabbreviation)');
60
}
61

  
62
#
63
# Translations for Abbreviations:
64
#
65
# $::locale->text('None (typeabbreviation)')
66
# $::locale->text('Purchase (typeabbreviation)')
67
# $::locale->text('Sales (typeabbreviation)')
68
# $::locale->text('Merchandise (typeabbreviation)')
69
# $::locale->text('Production (typeabbreviation)')
70
#
71
# and for descriptions
72
# $::locale->text('Purchase')
73
# $::locale->text('Sales')
74
# $::locale->text('Merchandise')
75
# $::locale->text('Production')
76

  
77
sub classification_abbreviation {
78
  my ($self, $id) = @_;
79
  $main::lxdebug->message(LXDebug->DEBUG2(),"classif=".$id);
80
  return $::locale->text(SL::DB::Manager::PartsClassification->get_abbreviation($id));
81
}
82

  
83
sub select_classification {
84
  my ($self, $name, %attributes) = @_;
85
  $attributes{value_key} = 'id';
86
  $attributes{title_key} = 'description';
87
  my $collection = SL::DB::Manager::PartsClassification->get_all_sorted();
88
  $_->description($::locale->text($_->description)) for @{ $collection };
89
  return $self->select_tag( $name, $collection, %attributes );
90
}
91

  
92 49
1;
93 50

  
94 51
__END__
SL/WH.pm
368 368
    push @filter_vars, like($filter{description});
369 369
  }
370 370

  
371
  if ($filter{classification_id}) {
372
    push @filter_ary, "p.classification_id = ?";
373
    push @filter_vars, $filter{classification_id};
374
  }
375

  
376 371
  if ($filter{chargenumber}) {
377 372
    push @filter_ary, "i1.chargenumber ILIKE ?";
378 373
    push @filter_vars, like($filter{chargenumber});
......
431 426
     "qty"                  => "ABS(SUM(i1.qty))",
432 427
     "partnumber"           => "p.partnumber",
433 428
     "partdescription"      => "p.description",
434
     "classification_id"    => "p.classification_id",
435
     "assembly"             => "p.assembly",
436
     "inventory_accno_id"   => "p.inventory_accno_id",
437 429
     "bindescription"       => "b.description",
438 430
     "chargenumber"         => "i1.chargenumber",
439 431
     "bestbefore"           => "i1.bestbefore",
......
465 457
     "warehouse_from"       => "'$filter{na}'",
466 458
     };
467 459

  
468
  $form->{l_classification_id}  = 'Y';
469
  $form->{l_assembly}           = 'Y';
470
  $form->{l_inventory_accno_id} = 'Y';
471 460
  $form->{l_invoice_id} = $form->{l_oe_id} if $form->{l_oe_id};
472 461

  
473 462
  # build the select clauses.
......
625 614
#  - warehouse_id - will return matches with this warehouse_id only
626 615
#  - partnumber   - will return only matches where the given string is a substring of the partnumber
627 616
#  - partsid      - will return matches with this parts_id only
628
#  - classification_id - will return matches with this parts with this classification only
629 617
#  - description  - will return only matches where the given string is a substring of the description
630 618
#  - chargenumber - will return only matches where the given string is a substring of the chargenumber
631 619
#  - bestbefore   - will return only matches with this bestbefore date
......
677 665
    push @filter_vars, like($filter{partnumber});
678 666
  }
679 667

  
680
  if ($filter{classification_id}) {
681
    push @filter_ary, "p.classification_id = ?";
682
    push @filter_vars, $filter{classification_id};
683
  }
684

  
685 668
  if ($filter{description}) {
686 669
    push @filter_ary,  "p.description ILIKE ?";
687 670
    push @filter_vars, like($filter{description});
......
754 737
     "warehouseid"          => "i.warehouse_id",
755 738
     "partnumber"           => "p.partnumber",
756 739
     "partdescription"      => "p.description",
757
     "classification_id"    => "p.classification_id",
758
     "assembly"             => "p.assembly",
759
     "inventory_accno_id"   => "p.inventory_accno_id",
760 740
     "bindescription"       => "b.description",
761 741
     "binid"                => "b.id",
762 742
     "chargenumber"         => "i.chargenumber",
......
767 747
     "partunit"             => "p.unit",
768 748
     "stock_value"          => "p.lastcost / COALESCE(pfac.factor, 1)",
769 749
  );
770
  $form->{l_classification_id}  = 'Y';
771
  $form->{l_assembly}           = 'Y';
772
  $form->{l_inventory_accno_id} = 'Y';
773 750
  my $select_clause = join ', ', map { +/^l_/; "$select_tokens{$'} AS $'" }
774 751
        ( grep( { !/qty/ and /^l_/ and $form->{$_} eq 'Y' } keys %$form),
775 752
          qw(l_parts_id l_qty l_partunit) );
bin/mozilla/ic.pl
100 100
  $form->{lastsort}     = ""; # memory for which table was sort at last time
101 101
  $form->{ndxs_counter} = 0;  # counter for added entries to top100
102 102

  
103
  # for seach all possibibilities, is_service only used as UNLESS so == 0
104
  my %is_xyz     = ("is_part" => 1, "is_service" => 0, "is_assembly" =>1 );
103
  my %is_xyz     = map { +"is_$_" => ($form->{searchitems} eq $_) } qw(part service assembly);
105 104

  
106 105
  $form->{title} = (ucfirst $form->{searchitems}) . "s";
107
  $form->{title} =~ s/ys$/ies/;
108 106
  $form->{title} = $locale->text($form->{title});
107
  $form->{title} = $locale->text('Assemblies') if ($is_xyz{is_assembly});
109 108

  
110 109
  $form->{CUSTOM_VARIABLES}                  = CVar->get_configs('module' => 'IC');
111 110
  ($form->{CUSTOM_VARIABLES_FILTER_CODE},
......
234 233
#  searchitems=part revers=0 lastsort=''
235 234
#
236 235
# filter:
237
# partnumber ean description partsgroup classification serialnumber make model drawing microfiche
236
# partnumber ean description partsgroup serialnumber make model drawing microfiche
238 237
# transdatefrom transdateto
239 238
#
240 239
# radio:
......
301 300
    'unit'               => { 'text' => $locale->text('Unit'), },
302 301
    'weight'             => { 'text' => $locale->text('Weight'), },
303 302
    'shop'               => { 'text' => $locale->text('Shop article'), },
304
    'type_and_classific' => { 'text' => $locale->text('Type'), },
305 303
    'projectnumber'      => { 'text' => $locale->text('Project Number'), },
306 304
    'projectdescription' => { 'text' => $locale->text('Project Description'), },
307 305
  );
......
426 424
    $form->{l_linetotallastcost}  = $form->{searchitems} eq 'assembly' && !$form->{bom} ? "" : 'Y' if  $form->{l_lastcost};
427 425
    $form->{l_linetotallistprice} = "Y" if $form->{l_listprice};
428 426
  }
429
  $form->{"l_type_and_classific"} = "Y";
430 427

  
431
   if ($form->{l_service} && !$form->{l_assembly} && !$form->{l_part}) {
428
  if ($form->{searchitems} eq 'service') {
432 429

  
433 430
    # remove bin, weight and rop from list
434 431
    map { $form->{"l_$_"} = "" } qw(bin weight rop);
......
475 472
  IC->all_parts(\%myconfig, \%$form);
476 473

  
477 474
  my @columns = qw(
478
    partnumber type_and_classific description notes partsgroup bin onhand rop soldtotal unit listprice
475
    partnumber description notes partsgroup bin onhand rop soldtotal unit listprice
479 476
    linetotallistprice sellprice linetotalsellprice lastcost linetotallastcost
480 477
    priceupdate weight image drawing microfiche invnumber ordnumber quonumber
481 478
    transdate name serialnumber deliverydate ean projectnumber projectdescription
......
508 505

  
509 506
  my @hidden_variables = (
510 507
    qw(l_subtotal l_linetotal searchitems itemstatus bom l_pricegroups insertdatefrom insertdateto),
511
    qw(l_type_and_classific classification_id),
512 508
    @itemstatus_keys,
513 509
    @callback_keys,
514 510
    map({ "cvar_$_->{name}" } @searchable_custom_variables),
......
535 531
    'part'     => $locale->text('part_list'),
536 532
    'service'  => $locale->text('service_list'),
537 533
    'assembly' => $locale->text('assembly_list'),
538
    'article'  => $locale->text('article_list'),
539 534
  );
540 535

  
541 536
  $report->set_options('raw_top_info_text'     => $form->parse_html_template('ic/generate_report_top', { options => \@options }),
542 537
                       'raw_bottom_info_text'  => $form->parse_html_template('ic/generate_report_bottom'),
543 538
                       'output_format'         => 'HTML',
544 539
                       'title'                 => $form->{title},
545
                       'attachment_basename'   => 'article_list' . strftime('_%Y%m%d', localtime time),
540
                       'attachment_basename'   => $attachment_basenames{$form->{searchitems}} . strftime('_%Y%m%d', localtime time),
546 541
  );
547 542
  $report->set_options_from_form();
548 543
  $locale->set_numberformat_wo_thousands_separator(\%myconfig) if lc($report->{options}->{output_format}) eq 'csv';
......
652 647
    map { $row->{$_}{link} = $ref->{$_} } qw(drawing microfiche);
653 648

  
654 649
    $row->{notes}{data} = SL::HTML::Util->strip($ref->{notes});
655
    $row->{type_and_classific}{data} = $::request->presenter->type_abbreviation($ref->{part_type}).
656
                                       $::request->presenter->classification_abbreviation($ref->{classification_id});
657 650

  
658 651
    $report->add_data($row);
659 652

  
......
665 658
         (!$next_ref->{assemblyitem} && ($same_item ne $next_ref->{ $form->{sort} })))) {
666 659
      my $row = { map { $_ => { 'class' => 'listsubtotal', } } @columns };
667 660

  
668
      if ( !$form->{l_assembly} || !$form->{bom}) {
661
      if (($form->{searchitems} ne 'assembly') || !$form->{bom}) {
669 662
        $row->{soldtotal}->{data} = $form->format_amount(\%myconfig, $subtotals{soldtotal});
670 663
      }
671 664

  
......
703 696
  my ($column_index, $subtotalonhand, $subtotalsellprice, $subtotallastcost, $subtotallistprice) = @_;
704 697

  
705 698
  map { $column_data{$_} = "<td>&nbsp;</td>" } @{ $column_index };
706
  $$subtotalonhand = 0 if ($form->{l_assembly} && $form->{bom});
699
  $$subtotalonhand = 0 if ($form->{searchitems} eq 'assembly' && $form->{bom});
707 700

  
708 701
  $column_data{onhand} =
709 702
      "<th class=listsubtotal align=right>"
......
945 938
  my (@column_index);
946 939
  my ($nochange, $callback, $previousform, $linetotal, $line_purchase_price, $href);
947 940

  
948
  @column_index = qw(runningnumber qty unit bom partnumber type_and_classific description partsgroup lastcost total);
941
  @column_index = qw(runningnumber qty unit bom partnumber description partsgroup lastcost total);
949 942

  
950 943
  if ($form->{previousform}) {
951 944
    $nochange     = 1;
952
    @column_index = qw(qty unit bom partnumber type_and_classific description partsgroup total);
945
    @column_index = qw(qty unit bom partnumber description partsgroup total);
953 946
  } else {
954 947

  
955 948
    # change callback
......
972 965
  }
973 966

  
974 967
  my %header = (
975
   runningnumber      => { text =>  $locale->text('No.'),              nowrap => 1, width => '5%',  align => 'left',},
976
   qty                => { text =>  $locale->text('Qty'),              nowrap => 1, width => '10%', align => 'left',},
977
   unit               => { text =>  $locale->text('Unit'),             nowrap => 1, width => '5%',  align => 'left',},
978
   partnumber         => { text =>  $locale->text('Part Number'),      nowrap => 1, width => '20%', align => 'left',},
979
   type_and_classific => { text =>  $locale->text('Typ'),              nowrap => 1, width => '5%' , align => 'left',},
980
   description        => { text =>  $locale->text('Part Description'), nowrap => 1, width => '50%', align => 'left',},
981
   lastcost           => { text =>  $locale->text('Purchase Prices'),  nowrap => 1, width => '45%', align => 'right',},
982
   total              => { text =>  $locale->text('Sale Prices'),      nowrap => 1,                 align => 'right',},
983
   bom                => { text =>  $locale->text('BOM'),                                           align => 'center',},
984
   partsgroup         => { text =>  $locale->text('Group'),                                         align => 'left',},
968
   runningnumber => { text =>  $locale->text('No.'),              nowrap => 1, width => '5%',  align => 'left',},
969
   qty           => { text =>  $locale->text('Qty'),              nowrap => 1, width => '10%', align => 'left',},
970
   unit          => { text =>  $locale->text('Unit'),             nowrap => 1, width => '5%',  align => 'left',},
971
   partnumber    => { text =>  $locale->text('Part Number'),      nowrap => 1, width => '20%', align => 'left',},
972
   description   => { text =>  $locale->text('Part Description'), nowrap => 1, width => '50%', align => 'left',},
973
   lastcost      => { text =>  $locale->text('Purchase Prices'),  nowrap => 1, width => '50%', align => 'right',},
974
   total         => { text =>  $locale->text('Sale Prices'),      nowrap => 1,                 align => 'right',},
975
   bom           => { text =>  $locale->text('BOM'),                                           align => 'center',},
976
   partsgroup    => { text =>  $locale->text('Group'),                                         align => 'left',},
985 977
  );
986 978

  
987 979
  my @ROWS;
......
999 991
    $linetotal           = $form->format_amount(\%myconfig, $linetotal, 2);
1000 992
    $line_purchase_price = $form->format_amount(\%myconfig, $line_purchase_price, 2);
1001 993
    $href                = build_std_url("action=edit", qq|id=$form->{"id_$i"}|, "rowcount=$numrows", "currow=$i", "previousform=$previousform");
1002
    map { $row{$_}{data} = "" } qw(qty unit partnumber typ_and_class description bom partsgroup runningnumber);
994
    map { $row{$_}{data} = "" } qw(qty unit partnumber description bom partsgroup runningnumber);
1003 995

  
1004 996
    # last row
1005 997
    if (($i >= 1) && ($i == $numrows)) {
......
1019 1011
        $row{qty}{align}          = 'right';
1020 1012
      } else {
1021 1013
        $row{partnumber}{data}    = qq|$form->{"partnumber_$i"}|;
1022
        $row{partnumber}{link}    = $href;
1014
        $row{partnumber}{link}     = $href;
1023 1015
        $row{qty}{data}           = qq|<input name="qty_$i" size=5 value="$form->{"qty_$i"}">|;
1024 1016
        $row{runningnumber}{data} = qq|<input name="runningnumber_$i" size=3 value="$i">|;
1025 1017
        $row{bom}{data}   = sprintf qq|<input name="bom_$i" type=checkbox class=checkbox value=1 %s>|,
1026 1018
                                       $form->{"bom_$i"} ? 'checked' : '';
1027 1019
      }
1028
      # type impl $row{type_and_classific}{data} = $::request->presenter->type_abbreviation($form->{"type_$i"}).
1029
      $row{type_and_classific}{data} = $::request->presenter->type_abbreviation($form->{"assembly_$i"},$form->{"inventory_accno_id_$i"}).
1030
                                       $::request->presenter->classification_abbreviation($form->{"classification_id_$i"});
1031 1020
      push @row_hiddens,        qw(unit description partnumber partsgroup);
1032 1021
      $row{unit}{data}        = $form->{"unit_$i"};
1033 1022
      #Bei der Artikelbeschreibung und Warengruppe können Sonderzeichen verwendet
bin/mozilla/io.pl
159 159

  
160 160
  # column_index
161 161
  my @header_sort = qw(
162
    runningnumber partnumber type_and_classific description ship ship_missing qty price_factor
162
    runningnumber partnumber description ship ship_missing qty price_factor
163 163
    unit weight price_source sellprice discount linetotal
164 164
    bin stock_in_out
165 165
  );
......
169 169
  my %column_def = (
170 170
    runningnumber => { width => 5,     value => $locale->text('No.'),                  display => 1, },
171 171
    partnumber    => { width => 8,     value => $locale->text('Number'),               display => 1, },
172
    type_and_classific
173
                  => { width => 2,     value => $locale->text('Type'),                 display => 1, },
174 172
    description   => { width => 30,    value => $locale->text('Part Description'),     display => 1, },
175 173
    ship          => { width => 5,     value => $locale->text('Delivered'),            display => $is_s_p_order, },
176 174
    ship_missing  => { width => 5,     value => $locale->text('Not delivered'),        display => $show_ship_missing, },
......
297 295
    my $rows            = $form->numtextrows($form->{"description_$i"}, 30, 6);
298 296

  
299 297
    # quick delete single row
300
    $column_data{runningnumber}  = q|<a onclick= "$('#partnumber_| . $i . q|').val(''); $('#update_button').click();">| .
298
    $column_data{runningnumber} .= q|<a onclick= "$('#partnumber_| . $i . q|').val(''); $('#update_button').click();">| .
301 299
                                   q|<img height="10px" width="10px" src="image/cross.png" alt="| . $locale->text('Remove') . q|"></a> |;
302 300
    $column_data{runningnumber} .= $cgi->textfield(-name => "runningnumber_$i", -id => "runningnumber_$i", -size => 5,  -value => $i);    # HuT
303 301

  
304 302

  
305 303
    $column_data{partnumber}    = $cgi->textfield(-name => "partnumber_$i",    -id => "partnumber_$i",    -size => 12, -value => $form->{"partnumber_$i"});
306
   # type impl $column_data{type_and_classific} = $::request->presenter->type_abbreviation(($form->{"type_$i"}).
307
    $column_data{type_and_classific} = $::request->presenter->type_abbreviation($form->{"assembly_$i"},$form->{"inventory_accno_id_$i"}).
308
                                       $::request->presenter->classification_abbreviation($form->{"classification_id_$i"}) if $form->{"id_$i"};
309 304
    $column_data{description} = (($rows > 1) # if description is too large, use a textbox instead
310 305
                                ? $cgi->textarea( -name => "description_$i", -id => "description_$i", -default => $form->{"description_$i"}, -rows => $rows, -columns => 30)
311 306
                                : $cgi->textfield(-name => "description_$i", -id => "description_$i",   -value => $form->{"description_$i"}, -size => 30))
......
670 665
    map { $amount += ($form->{"${_}_base"} * $form->{"${_}_rate"}) } split / /, $form->{"taxaccounts_$i"} if !$form->{taxincluded};
671 666

  
672 667
    $form->{creditremaining} -= $amount;
668

  
673 669
    $form->{"runningnumber_$i"} = $i;
674 670

  
675 671
    # format amounts
bin/mozilla/wh.pl
677 677
  $form->{report_generator_output_format} = 'HTML' if !$form->{report_generator_output_format};
678 678

  
679 679
  my %filter;
680
  my @columns = qw(trans_id date warehouse_from bin_from warehouse_to bin_to partnumber type_and_classific partdescription chargenumber bestbefore trans_type comment qty unit partunit employee oe_id projectnumber);
680
  my @columns = qw(trans_id date warehouse_from bin_from warehouse_to bin_to partnumber partdescription chargenumber bestbefore trans_type comment qty employee oe_id projectnumber);
681 681

  
682 682
  # filter stuff
683
  map { $filter{$_} = $form->{$_} if ($form->{$_}) } qw(warehouse_id bin_id classification_id partnumber description chargenumber bestbefore);
683
  map { $filter{$_} = $form->{$_} if ($form->{$_}) } qw(warehouse_id bin_id partnumber description chargenumber bestbefore);
684 684

  
685 685
  $filter{qty_op} = WH->convert_qty_op($form->{qty_op});
686 686
  if ($filter{qty_op}) {
......
696 696

  
697 697
  my @hidden_variables = map { "l_${_}" } @columns;
698 698
  push @hidden_variables, qw(warehouse_id bin_id partnumber description chargenumber bestbefore qty_op qty qty_unit fromdate todate);
699
  push @hidden_variables, qw(classification_id);
700 699

  
701 700
  my %column_defs = (
702 701
    'date'            => { 'text' => $locale->text('Date'), },
......
708 707
    'bin_from'        => { 'text' => $locale->text('Bin From'), },
709 708
    'bin_to'          => { 'text' => $locale->text('Bin To'), },
710 709
    'partnumber'      => { 'text' => $locale->text('Part Number'), },
711
    'type_and_classific'
712
                      => { 'text' => $locale->text('Type'), },
713 710
    'partdescription' => { 'text' => $locale->text('Part Description'), },
714 711
    'chargenumber'    => { 'text' => $locale->text('Charge Number'), },
715 712
    'bestbefore'      => { 'text' => $locale->text('Best Before'), },
......
728 725
  my %column_alignment = map { $_ => 'right' } qw(qty);
729 726

  
730 727
  map { $column_defs{$_}->{visible} = $form->{"l_${_}"} ? 1 : 0 } @columns;
731
  $column_defs{type_and_classific}->{visible} = 1;
732
  $column_defs{type_and_classific}->{link} ='';
733 728

  
734 729
  $report->set_columns(%column_defs);
735 730
  $report->set_column_order(@columns);
......
768 763
   my $idx       = 0;
769 764

  
770 765
  foreach my $entry (@contents) {
771
    # type impl $entry->{type_and_classific} = $::request->presenter->type_abbreviation($entry->{type}).
772
    $entry->{type_and_classific} = $::request->presenter->type_abbreviation($entry->{assembly},$entry->{inventory_accno_id}).
773
                                   $::request->presenter->classification_abbreviation($entry->{classification_id});
774 766
    $entry->{qty}        = $form->format_amount_units('amount'     => $entry->{qty},
775 767
                                                      'part_unit'  => $entry->{partunit},
776 768
                                                      'conv_units' => 'convertible');
......
860 852
  my $sort_col     = $form->{sort};
861 853

  
862 854
  my %filter;
863
  my @columns = qw(warehousedescription bindescription partnumber type_and_classific partdescription chargenumber bestbefore comment qty partunit stock_value);
855
  my @columns = qw(warehousedescription bindescription partnumber partdescription chargenumber bestbefore qty stock_value);
864 856

  
865 857
  # filter stuff
866
  map { $filter{$_} = $form->{$_} if ($form->{$_}) } qw(warehouse_id bin_id classification_id partnumber description chargenumber bestbefore date include_invalid_warehouses);
858
  map { $filter{$_} = $form->{$_} if ($form->{$_}) } qw(warehouse_id bin_id partstypes_id partnumber description chargenumber bestbefore date include_invalid_warehouses);
867 859

  
868 860
  # show filter stuff also in report
869 861
  my @options;
870
  my $currentdate = $form->current_date(\%myconfig);
871
  push @options, $locale->text('Printdate') . " : ".$locale->date(\%myconfig, $currentdate, 1);
872

  
873 862
  # dispatch all options
874 863
  my $dispatch_options = {
875 864
   warehouse_id   => sub { push @options, $locale->text('Warehouse') . " : " .
......
877 866
   bin_id         => sub { push @options, $locale->text('Bin') . " : " .
878 867
                                            SL::DB::Manager::Bin->find_by(id => $form->{bin_id})->description},
879 868
   partnumber     => sub { push @options, $locale->text('Partnumber')     . " : $form->{partnumber}"},
880
   classification_id => sub { push @options, $locale->text('Parts Classification'). " : ".
881
     SL::DB::Manager::PartsClassification->get_first(where => [ id => $form->{classification_id} ] )->description; },
882 869
   description    => sub { push @options, $locale->text('Description')    . " : $form->{description}"},
883 870
   chargenumber   => sub { push @options, $locale->text('Charge Number')  . " : $form->{chargenumber}"},
884 871
   bestbefore     => sub { push @options, $locale->text('Best Before')    . " : $form->{bestbefore}"},
872
   date           => sub { push @options, $locale->text('Date')           . " : $form->{date}"},
885 873
   include_invalid_warehouses    => sub { push @options, $locale->text('Include invalid warehouses ')},
886 874
  };
887 875
  foreach (keys %filter) {
888 876
   $dispatch_options->{$_}->() if $dispatch_options->{$_};
889 877
  }
890
  push @options, $locale->text('Stock Qty for Date') . " " . $locale->date(\%myconfig, $form->{date}?$form->{date}:$currentdate, 1);
891

  
892 878
  # / end show filter stuff also in report
893 879

  
894 880
  $filter{qty_op} = WH->convert_qty_op($form->{qty_op});
......
909 895
  my @hidden_variables = map { "l_${_}" } @columns;
910 896
  push @hidden_variables, qw(warehouse_id bin_id partnumber partstypes_id description chargenumber bestbefore qty_op qty qty_unit partunit l_warehousedescription l_bindescription);
911 897
  push @hidden_variables, qw(include_empty_bins subtotal include_invalid_warehouses date);
912
  push @hidden_variables, qw(classification_id);
913 898

  
914 899
  my %column_defs = (
915 900
    'warehousedescription' => { 'text' => $locale->text('Warehouse'), },
916 901
    'bindescription'       => { 'text' => $locale->text('Bin'), },
917 902
    'partnumber'           => { 'text' => $locale->text('Part Number'), },
918
    'type_and_classific'   => { 'text' => $locale->text('Type'), },
919 903
    'partdescription'      => { 'text' => $locale->text('Part Description'), },
920 904
    'chargenumber'         => { 'text' => $locale->text('Charge Number'), },
921 905
    'bestbefore'           => { 'text' => $locale->text('Best Before'), },
......
932 916

  
933 917
  map { $column_defs{$_}->{visible} = $form->{"l_${_}"} ? 1 : 0 } @columns;
934 918

  
935
  $column_defs{type_and_classific}->{visible} = 1;
936
  $column_defs{type_and_classific}->{link} ='';
937

  
938 919
  $report->set_columns(%column_defs);
939 920
  $report->set_column_order(@columns);
940 921

  
......
969 950
  my $last_nr  = $first_nr + $pages->{per_page};
970 951

  
971 952
  foreach my $entry (@contents) {
972

  
973
    # type impl $entry->{type_and_classific} = $::request->presenter->type_abbreviation($entry->{type}).
974
    $entry->{type_and_classific} = $::request->presenter->type_abbreviation($entry->{assembly},$entry->{inventory_accno_id}).
975
                                   $::request->presenter->classification_abbreviation($entry->{classification_id});
976 953
    map { $subtotals{$_} += $entry->{$_} } @subtotals_columns;
977 954
    $total_stock_value   += $entry->{stock_value} * 1;
978 955
    $entry->{qty}         = $form->format_amount(\%myconfig, $entry->{qty});
doc/changelog
4 4

  
5 5
2016-xx-xx - Release 3.4.x Unstable
6 6

  
7
große Features:
8

  
9
- Artikel-Klassifizierung
10
    
11
    Die Klassifizierung von Artikeln
12
    Sie dient einer weiteren Gliederung um zum Beispiel den Einkauf vom Verkauf zu trennen, etc.
13
    
14
    Gekennzeichnet durch eine Beschreibung (z.B. "Einkauf") und ein Kürzel (z.B. "E")
15
    Flexibel änderbar und erweiterbar.
16
    
17
    - Neue Datenbanktablle und Rose-Objekte, sowie Controller zum Bearbeiten der Tabelle
18
    
19
    - Zwei-Zeichen Abkürzung:
20
    
21
    Der Typ des Artikel und die Klassifizierung werden durch zwei Buchstaben dargestellt.
22
    Der erste Buchstabe  ist eine Lokalisierung des Typs des Artikel ('P','A','S') ,
23
    deutch 'W', 'E', und 'D' für Ware Erzeugnis oder Dienstleistung, ggf. weitere Typen.
24
    Der zweite Buchstabe ist eine Lokalisierung der Klassifizierungsabkürzung (abbreviation).
25
    
26
    Die Abkürzungen sind aus dem Part Presenter abholbar:
27
    -  SL::Presenter::Part->type_abbreviation($assembly,inventory_accno_id) bzw
28
        bei neuer Type Implementierung SL::Presenter::Part->type_abbreviation($type_id)
29
    -  SL::Presenter::Part->classification_abbreviation($classification_id)
30
    
31
    Wenn im ERP-Dokument nach einer Artikelnummer oder Beschreibung gesucht wird,
32
    diese in den Stammdaten vorhanden ist,
33
    aber der Artikeltyp leer oder falsch ist, bzw im Typ for_purchase bzw for_sale nicht gesetzt ist,
34
    wird die Fehlermeldung "Gesuchter Artikel ist nicht für den Einkauf bzw Verkauf" gemeldet
35
    
36
    Anpassung des CSV Import,
37
    nun wird alternativ zur 'type'-Spalte die 'pclass'-Spalte mit zwei Buchstaben geparsed und entsprechend
38
    classification_id,assembly sowie inventory_accno_id gesetzt (oder type_id falls neue Implementierung eingebaut).
39

  
40 7
kleinere neue Features und Detailverbesserungen:
41 8

  
42 9
  - SEPA Überweisungen zusätzlich Kunden- oder Lieferantennummer im Verwendungszweck vorbelegen
locale/de/all
297 297
  'Article'                     => 'Artikel',
298 298
  'Article Code'                => 'Artikelkürzel',
299 299
  'Article Code missing!'       => 'Artikelkürzel fehlt',
300
  'Article classification'      => 'Artikel-Klassifizierung',
301 300
  'Article type'                => 'Artikeltyp',
302 301
  'Articles'                    => 'Artikel',
303 302
  'As a result, the saved onhand values of the present goods can be stored into a warehouse designated by you, or will be reset for a proper warehouse tracking' => 'Als Konsequenz k&ouml;nnen die gespeicherten Mengen entweder in ein Lager &uuml;berf&uuml;hrt werden, oder f&uuml;r eine frische Lagerverwaltung resettet werden.',
304 303
  'Assemblies'                  => 'Erzeugnisse',
304
  'Assemblies can not be imported (yet). But the type column is used for sanity checks on price updates in order to prevent that articles with the wrong type will be updated.' => 'Erzeugnisse können (noch) nicht importiert werden. Aber die Typ-Spalte wird für Plausibilitätsprüfungen bei Preisaktualisierungen verwendet, um zu verhindern, dass Artikel vom falschen Typ aktualisiert werden.',
305 305
  'Assembly'                    => 'Erzeugnis',
306
  'Assembly (typeabbreviation)' => 'E',
307 306
  'Assembly Description'        => 'Erzeugnis-Beschreibung',
308 307
  'Assembly Number'             => 'Erzeugnis-Nummer',
309 308
  'Assembly Number missing!'    => 'Erzeugnisnummer fehlt!',
......
664 663
  'Create a new delivery term'  => 'Neue Lieferbedingungen anlegen',
665 664
  'Create a new department'     => 'Eine neue Abteilung erfassen',
666 665
  'Create a new group'          => 'Neue Benutzergruppe erfassen',
667
  'Create a new parts classification' => 'Erzeuge eine neue Artikel-Klassifizierung',
668 666
  'Create a new payment term'   => 'Neue Zahlungsbedingungen anlegen',
669 667
  'Create a new predefined text' => 'Einen neuen vordefinierten Textblock anlegen',
670 668
  'Create a new price rule'     => 'Neue Preisregel anlegen',
......
1111 1109
  'Edit general settings'       => 'Grundeinstellungen bearbeiten',
1112 1110
  'Edit greetings'              => 'Anreden bearbeiten',
1113 1111
  'Edit note'                   => 'Notiz bearbeiten',
1114
  'Edit parts classification'   => 'Bearbeite eine Artikel-Klassifizierung',
1115 1112
  'Edit payment term'           => 'Zahlungsbedingungen bearbeiten',
1116 1113
  'Edit picture'                => 'Bild bearbeiten',
1117 1114
  'Edit predefined text'        => 'Vordefinierten Textblock bearbeiten',
......
1448 1445
  'If all of the following match' => 'Wenn alle der folgenden Bedingungen zutreffen',
1449 1446
  'If amounts differ more than "Maximal amount difference" (see settings), this item is marked as invalid.' => 'Weichen die Beträge mehr als die "maximale Betragsabweichung" (siehe Einstellungen) ab, so wird diese Position als ungültig markiert.',
1450 1447
  'If checked the taxkey will not be exported in the DATEV Export, but only IF chart taxkeys differ from general ledger taxkeys' => 'Falls angehakt wird der DATEV-Steuerschlüssel bei Buchungen auf dieses Konto nicht beim DATEV-Export mitexportiert, allerdings nur wenn zusätzlich der Konto-Steuerschlüssel vom Buchungs (Hauptbuch) Steuerschlüssel abweicht',
1451
  'If column \'pclass\' is present the article type is then irrelevant or used as default ' => 'Falls Spalte \'pclass\' existiert, wird dies nur als default genommen',
1452 1448
  'If configured this bin will be preselected for all new parts. Also this bin will be used as the master default bin, if default transfer out with master bin is activated.' => 'Falls konfiguriert, wird dieses Lager mit Lagerplatz für neu angelegte Waren vorausgewählt.',
1453 1449
  'If disabled purchase delivery orders can only be created by conversion from existing requests for quotations and purchase orders.' => 'Falls deaktiviert, so können Einkaufslieferscheine nur durch Umwandlung aus bestehenden Preisanfragen und Lieferantenaufträgen angelegt werden.',
1454 1450
  'If disabled purchase invoices can only be created by conversion from existing requests for quotations, purchase orders and purchase delivery orders.' => 'Falls deaktiviert, so können Einkaufsrechnungen nur durch Umwandlung aus bestehenden Preisanfragen, Lieferantenaufträgen und Einkaufslieferscheinen angelegt werden.',
......
1460 1456
  'If enabled purchase and sales records cannot be saved if no transaction description has been entered.' => 'Wenn angeschaltet, so können Einkaufs- und Verkaufsbelege nicht gespeichert werden, solange keine Vorgangsbezeichnung eingegeben wurde.',
1461 1457
  'If left empty the default sender from the kivitendo configuration will be used (key \'email_from\' in section \'periodic_invoices\'; current value: #1).' => 'Falls leer, so wird der Standardabsender aus der kivitendo-Konfiguration genutzt (Schlüssel »email_from« in Abschnitt »periodic_invoices«; aktueller Wert: #1).',
1462 1458
  'If missing then the start date will be used.' => 'Falls es fehlt, so wird die erste Rechnung für das Startdatum erzeugt.',
1463
  'If the article type is set to \'mixed\' then a column called \'type\' or called \'pclass\' must be present.' => 'Falls der Artikeltyp auf \'mixed\' eingestellt muß entwder die Spale \'type\' oder die Spalte \'pclass\' vorhanden sein',
1459
  'If the article type is set to \'mixed\' then a column called \'type\' must be present.' => 'Falls der Artikeltyp auf \'gemischt\' gestellt wird, muss eine Spalte namens \'type\' vorhanden sein.',
1464 1460
  'If the automatic creation of invoices for fees and interest is switched on for a dunning level then the following accounts will be used for the invoice.' => 'Wenn das automatische Erstellen einer Rechnung &uuml;ber Mahngeb&uuml;hren und Zinsen f&uuml;r ein Mahnlevel aktiviert ist, so werden die folgenden Konten f&uuml;r die Rechnung benutzt.',
1465 1461
  'If the database user listed above does not have the right to create a database then enter the name and password of the superuser below:' => 'Falls der oben genannte Datenbankbenutzer nicht die Berechtigung zum Anlegen neuer Datenbanken hat, so k&ouml;nnen Sie hier den Namen und das Passwort des Datenbankadministratoraccounts angeben:',
1466 1462
  'If the default transfer out always succeed use this bin for negative stock quantity.' => 'Standardlagerplatz für Auslagern ohne Prüfung auf Bestand',
......
1577 1573
  'It will simply set the taxkey to 0 (meaning "no taxes") which is the correct value for such inventory transactions.' => 'Es wird einfach die Steuerschlüssel auf  0 setzen, was "keine Steuer" bedeutet und für solche Warenbestandsbuchungen der richtige Wert ist.',
1578 1574
  'Italy'                       => 'Italien',
1579 1575
  'Item deleted!'               => 'Artikel gelöscht!',
1580
  'Item does not exists in File' => 'Gesuchter Artikel nicht in den Stammdaten vorhanden.',
1581 1576
  'Item mode'                   => 'Artikelmodus',
1582 1577
  'Item multi selection with qty' => 'Artikel-Mehrfachauswahl mit Menge',
1578
  'Item not on file!'           => 'Dieser Artikel ist nicht in der Datenbank!',
1583 1579
  'Item values'                 => 'Artikelwerte',
1584 1580
  'Item variables'              => 'Artikelvariablen',
1585 1581
  'Jahresverkehrszahlen neu'    => 'Jahresverkehrszahlen neu',
......
1740 1736
  'Media \'#1\' is not supported yet/anymore.' => 'Das Medium \'#1\' wird noch nicht oder nicht mehr unterstützt.',
1741 1737
  'Medium Number'               => 'Datentr&auml;gernummer',
1742 1738
  'Memo'                        => 'Memo',
1743
  'Merchandise'                 => 'Handelsware',
1744
  'Merchandise (typeabbreviation)' => 'H',
1745 1739
  'Message'                     => 'Nachricht',
1746 1740
  'Method'                      => 'Verfahren',
1747 1741
  'Microfiche'                  => 'Mikrofilm',
......
1758 1752
  'Missing taxkeys in invoices with taxes.' => 'Fehlende Steuerschl&uuml;ssel in Rechnungen mit Steuern',
1759 1753
  'Missing transport cost: #1  Are you sure?' => 'Fehlender Transportkosten-Artikel #1 Trotzdem speichern?',
1760 1754
  'Mitarbeiter'                 => 'Mitarbeiter',
1761
  'Mixed (requires column "type" or "pclass")' => 'Gemischt (Spalte "type" oder "pclass" notwendig',
1755
  'Mixed (requires column "type")' => 'Gemischt (erfordert Spalte "type")',
1762 1756
  'Mobile'                      => 'Mobiltelefon',
1763 1757
  'Mobile1'                     => 'Mobil 1',
1764 1758
  'Mobile2'                     => 'Mobil 2',
......
1796 1790
  'New Password'                => 'Neues Passwort',
1797 1791
  'New Purchase Price Rule'     => 'Neue Einkaufspreisregel',
1798 1792
  'New Sales Price Rule'        => 'Neue Verkaufspreisregel',
1793
  'New assembly'                => 'Neues Erzeugnis',
1799 1794
  'New client #1: The database configuration fields "host", "port", "name" and "user" must not be empty.' => 'Neuer Mandant #1: Die Datenbankkonfigurationsfelder "Host", "Port" und "Name" dürfen nicht leer sein.',
1800 1795
  'New client #1: The name must be unique and not empty.' => 'Neuer Mandant #1: Der Name darf nicht leer und muss eindeutig sein.',
1801 1796
  'New contact'                 => 'Neue Ansprechperson',
......
1807 1802
  'New row, description'        => 'Neue Zeile, Artikelbeschreibung',
1808 1803
  'New row, partnumber'         => 'Neue Zeile, Nummer',
1809 1804
  'New sales order'             => 'Neuer Auftrag',
1805
  'New service'                 => 'Neue Dienstleistung',
1810 1806
  'New shipto'                  => 'Neue Lieferadresse',
1811 1807
  'New vendor'                  => 'Neuer Lieferant',
1812 1808
  'New window/tab'              => 'Neues Fenster/Tab',
......
1852 1848
  'No or an unknown authenticantion module specified in "config/kivitendo.conf".' => 'Es wurde kein oder ein unbekanntes Authentifizierungsmodul in "config/kivitendo.conf" angegeben.',
1853 1849
  'No part was found matching the search parameters.' => 'Es wurde kein Artikel gefunden, auf den die Suchparameter zutreffen.',
1854 1850
  'No part was selected.'       => 'Es wurde kein Artikel ausgewählt',
1855
  'No parts classification has been created yet.' => 'Keine Artikel-Klassifizierung erzeugt.',
1856 1851
  'No payment term has been created yet.' => 'Es wurden noch keine Zahlungsbedingungen angelegt.',
1857 1852
  'No picture has been uploaded' => 'Es wurde kein Bild hochgeladen',
1858 1853
  'No picture uploaded yet'     => 'Noch kein Bild hochgeladen',
......
1895 1890
  'None'                        => 'Kein',
1896 1891
  'None (PriceSource Discount)' => 'Freier Rabatt',
1897 1892
  'None (PriceSource)'          => 'Freier Preis',
1898
  'None (typeabbreviation)'     => '-',
1899 1893
  'Normal'                      => 'Normal',
1900 1894
  'Normal users cannot log in.' => 'Normale Benutzer können sich nicht anmelden.',
1901 1895
  'Normalize Customer / Vendor names' => 'Normalisierung Kunden- / Lieferantennamen',
......
2018 2012
  'POSTED'                      => 'Gebucht',
2019 2013
  'POSTED AS NEW'               => 'Als neu gebucht',
2020 2014
  'PRINTED'                     => 'Gedruckt',
2021
  'PType'                       => 'Typ',
2022 2015
  'Package name'                => 'Paketname',
2023 2016
  'Packing Lists'               => 'Lieferschein',
2024 2017
  'Page'                        => 'Seite',
......
2028 2021
  'Part'                        => 'Ware',
2029 2022
  'Part "#1" has chargenumber or best before date set. So it cannot be transfered automatically.' => 'Bei Artikel "#1" ist eine Chargenummer oder ein Mindesthaltbarkeitsdatum vergeben. Deshalb kann dieser Artikel nicht automatisch ausgelagert werden.',
2030 2023
  'Part (database ID)'          => 'Artikel (Datenbank-ID)',
2031
  'Part (typeabbreviation)'     => 'W',
2032
  'Part Classification'         => 'Artikel-Klassifizierung',
2033 2024
  'Part Description'            => 'Artikelbeschreibung',
2034 2025
  'Part Description missing!'   => 'Artikelbezeichnung fehlt!',
2035 2026
  'Part Notes'                  => 'Bemerkungen',
2036 2027
  'Part Number'                 => 'Artikelnummer',
2037 2028
  'Part Number missing!'        => 'Artikelnummer fehlt!',
2038
  'Part Unit'                   => 'Einheit des Artikels',
2029
  'Part Unit'                   => 'Artikeleinheit',
2039 2030
  'Part picker'                 => 'Artikelauswahl',
2040 2031
  'Part_br_Description'         => 'Beschreibung',
2041 2032
  'Partial invoices'            => 'Teilrechnungen',
......
2043 2034
  'Partnumber must not be set to empty!' => 'Die Artikelnummer darf nicht auf leer ge&auml;ndert werden.',
2044 2035
  'Partnumber not unique!'      => 'Artikelnummer bereits vorhanden!',
2045 2036
  'Parts'                       => 'Waren',
2046
  'Parts Classification'        => 'Artikel-Klassifizierung',
2047
  'Parts Classifications'       => 'Artikel-Klassifizierung',
2048 2037
  'Parts Inventory'             => 'Warenliste',
2049 2038
  'Parts Master Data'           => 'Artikelstammdaten',
2050 2039
  'Parts must have an entry type.' => 'Waren m&uuml;ssen eine Buchungsgruppe haben.',
......
2195 2184
  'Print template base file name' => 'Druckvorlagen-Basisdateiname',
2196 2185
  'Print templates'             => 'Druckvorlagen',
2197 2186
  'Print templates to use'      => 'Zu verwendende Druckvorlagen',
2198
  'Printdate'                   => '',
2199 2187
  'Printer'                     => 'Drucker',
2200 2188
  'Printer Command'             => 'Druckbefehl',
2201 2189
  'Printer Description'         => 'Druckerbeschreibung',
......
2209 2197
  'Private Phone'               => 'Privates Tel.',
2210 2198
  'Problem'                     => 'Problem',
2211 2199
  'Produce Assembly'            => 'Erzeugnis fertigen',
2212
  'Production'                  => 'Produktion',
2213
  'Production (typeabbreviation)' => 'P',
2214 2200
  'Productivity'                => 'Produktivität',
2215 2201
  'Profit determination'        => 'Gewinnermittlung',
2216 2202
  'Proforma Invoice'            => 'Proformarechnung',
......
2234 2220
  'Proposal'                    => 'Vorschlag',
2235 2221
  'Proposals'                   => 'Vorschläge',
2236 2222
  'Prozentual/Absolut'          => 'Prozentual/Absolut',
2237
  'Purchase'                    => 'Einkauf',
2238
  'Purchase (typeabbreviation)' => 'E',
2239 2223
  'Purchase Delivery Order'     => 'Einkaufslieferschein',
2240 2224
  'Purchase Delivery Orders'    => 'Einkaufslieferscheine',
2241 2225
  'Purchase Delivery Orders deleteable' => 'Einkaufslieferscheine löschbar',
......
2438 2422
  'Saldo neu'                   => 'Saldo neu',
2439 2423
  'Saldo per'                   => 'Saldo per',
2440 2424
  'Sale Prices'                 => 'Verkaufspreise',
2441
  'Sales'                       => 'Verkauf',
2442
  'Sales (typeabbreviation)'    => 'V',
2443 2425
  'Sales Delivery Order'        => 'Verkaufslieferschein',
2444 2426
  'Sales Delivery Orders'       => 'Verkaufslieferscheine',
2445 2427
  'Sales Delivery Orders deleteable' => 'Verkaufslieferscheine löschbar',
......
2562 2544
  'Serial No.'                  => 'Seriennummer',
2563 2545
  'Serial Number'               => 'Seriennummer',
2564 2546
  'Service'                     => 'Dienstleistung',
2565
  'Service (typeabbreviation)'  => 'D',
2566 2547
  'Service Items'               => 'Dienstleistungen',
2567 2548
  'Service Number missing!'     => 'Dienstleistungsnummer fehlt!',
2568 2549
  'Service, assembly or part'   => 'Dienstleistung, Erzeugnis oder Ware',
......
2816 2797
  'That export does not exist.' => 'Dieser Export existiert nicht.',
2817 2798
  'That is why kivitendo could not find a default currency.' => 'Daher konnte kivitendo keine Standardwährung finden.',
2818 2799
  'The \'name\' is the field shown to the user during login.' => 'Der \'Name\' ist derjenige, der dem Benutzer beim Login angezeigt wird.',
2819
  'The \'pclass\' column has the same abbreviation like a part export. The first letter is for the type Part,Assembly or Service, the second(and third) for Part Classification' => 'Die Spalte \'pclass\' besteht aus zwei Buchstaben entsprechend dem Export. Der erste Buchstabe ist für \'W\'=Ware \'E\'=Erzeugnis oder \'D\' für Dienstleistung, der zweite steht für den Artikeltyp, z.B. E,V,H,P oder - ',
2820 2800
  'The \'tag\' field must only consist of alphanumeric characters or the carachters - _ ( )' => 'Das Feld \'tag\' darf nur aus alphanumerischen Zeichen und den Zeichen - _ ( ) bestehen.',
2821 2801
  'The AP transaction #1 has been deleted.' => 'Die Kreditorenbuchung #1 wurde gelöscht.',
2822 2802
  'The AR transaction #1 has been deleted.' => 'Die Debitorenbuchung #1 wurde gelöscht.',
......
2833 2813
  'The SEPA export has been created.' => 'Der SEPA-Export wurde erstellt',
2834 2814
  'The SEPA strings have been saved.' => 'Die bei SEPA-Überweisungen verwendeten Begriffe wurden gespeichert.',
2835 2815
  'The WebDAV feature has been used.' => 'Das WebDAV-Feature wurde benutzt.',
2836
  'The abbreviation is missing.' => 'Abkürzung fehlt',
2837 2816
  'The acceptance status has been created.' => 'Der Abnahmestatus wurde angelegt.',
2838 2817
  'The acceptance status has been deleted.' => 'Der Abnahmestatus wurde gelöscht.',
2839 2818
  'The acceptance status has been saved.' => 'Der Abnahmestatus wurde gespeichert.',
......
2868 2847
  'The base unit does not exist.' => 'Die Basiseinheit existiert nicht.',
2869 2848
  'The base unit relations must not contain loops (e.g. by saying that unit A\'s base unit is B, B\'s base unit is C and C\'s base unit is A) in row %d.' => 'Die Beziehungen der Einheiten d&uuml;rfen keine Schleifen beinhalten (z.B. wenn gesagt wird, dass Einheit As Basiseinheit B, Bs Basiseinheit C und Cs Basiseinheit A ist) in Zeile %d.',
2870 2849
  'The basic client tables have not been created for this client\'s database yet.' => 'Die grundlegenden Mandantentabellen wurden in der für diesen Mandanten konfigurierten Datenbank noch nicht angelegt.',
2871
  'The basic parts classification cannot be deleted.' => '',
2872 2850
  'The body is missing.'        => 'Der Text fehlt',
2873 2851
  'The booking group has been created.' => 'Die Buchungsgruppe wurde erstellt.',
2874 2852
  'The booking group has been deleted.' => 'Die Buchungsgruppe wurde gelöscht.',
......
2938 2916
  'The discounted amount will be shown in documents.' => 'Der Rabattbetrag wird in Belegen ausgewiesen.',
2939 2917
  'The document has been changed by another user. No mail was sent. Please reopen it in another window and copy the changes to the new window' => 'Die Daten wurden bereits von einem anderen Benutzer verändert. Deshalb ist das Dokument ungültig und es wurde keine E-Mail verschickt. Bitte öffnen Sie das Dokument erneut in einem extra Fenster und übertragen Sie die Daten',
2940 2918
  'The document has been changed by another user. Please reopen it in another window and copy the changes to the new window' => 'Die Daten wurden bereits von einem anderen Benutzer verändert. Deshalb ist das Dokument ungültig. Bitte öffnen Sie das Dokument erneut in einem extra Fenster und übertragen Sie die Daten',
2941
  'The documents have been sent to the printer \'#1\'.' => 'Die Dokumente sind zum Drucker \'#1\' geschickt',
2919
  'The documents have been sent to the printer \'#1\'.' => 'Die Dokumente wurden an den Drucker \'#1\' geschickt.',
2942 2920
  'The dunning process started' => 'Der Mahnprozess ist gestartet.',
2943 2921
  'The dunnings have been printed.' => 'Die Mahnung(en) wurden gedruckt.',
2944 2922
  'The email has been sent.'    => 'Die E-Mail wurde verschickt.',
......
2999 2977
  'The order has been deleted'  => 'Der Auftrag wurde gelöscht.',
3000 2978
  'The order has been saved'    => 'Der Auftrag wurde gespeichert.',
3001 2979
  'The package name is invalid.' => 'Der Paketname ist ungültig.',
3002
  'The parts classification has been created.' => 'Die Artikel-Klassifizierung ist erzeugt',
3003
  'The parts classification has been deleted.' => 'Die Artikel-Klassifizierung ist gelöscht',
3004
  'The parts classification has been saved.' => 'Die Artikel-Klassifizierung ist gespeichert',
3005
  'The parts classification is in use and cannot be deleted.' => 'Die Artikel-Klassifizierung ist in Verwendung, kann deshalb nicht gelöscht werden.',
3006 2980
  'The parts for this delivery order have already been transferred in.' => 'Die Artikel dieses Lieferscheins wurden bereits eingelagert.',
3007 2981
  'The parts for this delivery order have already been transferred out.' => 'Die Artikel dieses Lieferscheins wurden bereits ausgelagert.',
3008 2982
  'The parts have been removed.' => 'Die Waren wurden aus dem Lager entnommen.',
......
3306 3280
  'Trial Balance'               => 'Summen- und Saldenliste',
3307 3281
  'Trial balance between %s and %s' => 'Summen- und Saldenlisten vom %s bis zum %s',
3308 3282
  'Trying to call a sub without a name' => 'Es wurde versucht, eine Unterfunktion ohne Namen aufzurufen.',
3309
  'Typ'                         => 'Typ',
3310 3283
  'Type'                        => 'Typ',
3311 3284
  'Type can be either \'part\', \'service\' or \'assembly\'.' => 'Der Typ kann entweder \'part\' (für Waren), \'service\' (für Dienstleistungen) oder \'assembly\' (für Erzeugnisse) enthalten.',
3312 3285
  'Type of Business'            => 'Kunden-/Lieferantentyp',
3313 3286
  'Type of Customer'            => 'Kundentyp',
3314 3287
  'Type of Vendor'              => 'Lieferantentyp',
3315
  'TypeAbbreviation'            => 'Typ-Abkürzung',
3316 3288
  'Types of Business'           => 'Kunden-/Lieferantentypen',
3317 3289
  'USTVA'                       => 'USTVA',
3318 3290
  'USTVA 2004'                  => 'USTVA 2004',
......
3387 3359
  'Use linked items'            => 'Verknüpfte Positionen verwenden',
3388 3360
  'Use master default bin for Default Transfer, if no default bin for the part is configured' => 'Standardlagerplatz für Ein- / Auslagern über Standard-Lagerplatz, falls für die Ware kein expliziter Lagerplatz konfiguriert ist',
3389 3361
  'Useable for…'                => 'Benutzbar für…',
3390
  'Used for Purchase'           => 'im Einkauf verwenden',
3391
  'Used for Sale'               => 'im Verkauf verwenden',
3392 3362
  'User'                        => 'Benutzer',
3393 3363
  'User Config'                 => 'Einstellungen',
3394 3364
  'User Preferences'            => 'Benutzereinstellungen',
......
3453 3423
  'WHJournal'                   => 'Lagerbuchungen',
... Dieser Diff wurde abgeschnitten, weil er die maximale Anzahl anzuzeigender Zeilen überschreitet.

Auch abrufbar als: Unified diff