Projekt

Allgemein

Profil

« Zurück | Weiter » 

Revision e66c12b7

Von Werner Hahn vor mehr als 6 Jahren hinzugefügt

  • ID e66c12b7e3ce2719f30d316255c116a62542b4a5
  • Vorgänger f9ef6e9a
  • Nachfolger 8d8d23b3

Shopmodul: Bilder hochladen geht jetzt
Bestellungen überarbeitet, Teile aus dem ShowareConnector ausgelagert, da diese allgemeingültig auch für andere Connectoren sind
Typo

Unterschiede anzeigen:

SL/Controller/Shop.pm
38 38

  
39 39
  my $is_new = !$self->shop->id;
40 40
  $self->_setup_form_action_bar;
41
  $self->render('shops/form', title       => ($is_new ? t8('Add shop') : t8('Edit shop')));
41
  $self->render('shops/form', title => ($is_new ? t8('Add shop') : t8('Edit shop')));
42 42
}
43 43

  
44 44
sub action_save {
45 45
  my ($self) = @_;
46 46

  
47
  my $is_new = !$self->shop->id;
48 47
  $self->create_or_update;
49 48
}
50 49

  
......
54 53
  if ( eval { $self->shop->delete; 1; } ) {
55 54
    flash_later('info',  $::locale->text('The shop has been deleted.'));
56 55
  } else {
57
    flash_later('error', $::locale->text('The shop has been used and cannot be deleted.'));
56
    flash_later('error', $::locale->text('The shop is in use and cannot be deleted.'));
58 57
  };
59 58
  $self->redirect_to(action => 'list');
60 59
}
......
63 62
  my ($self) = @_;
64 63

  
65 64
  SL::DB::Shop->reorder_list(@{ $::form->{shop_id} || [] });
66
  $self->render(\'', { type => 'json' });
65
  $self->render(\'', { type => 'json' }); # ' emacs happy again
67 66
}
68 67

  
69
sub action_check_connectivity {
68
sub check_connectivity {
70 69
  my ($self) = @_;
71 70

  
72 71
  my $ok = 0;
......
75 74
  my $version = $shop->connector->get_version;
76 75
  $ok       = $version->{success};
77 76

  
78
  if($ok) {
79
    flash_later('ok', t8('The connection to the webshop is success. Version: #1 -- Revision: #2', $version->{data}->{version}, $version->{data}->{revision}));
77
  if ($ok) {
78
    flash_later('ok', t8('The connection to the webshop was successful. Version: #1 -- Revision: #2', $version->{data}->{version}, $version->{data}->{revision}));
80 79
    return;
81
  }else{
80
  } else {
82 81
    return $version;
83 82
  }
84 83
}
......
88 87
}
89 88

  
90 89
sub init_shop {
91
  SL::DB::Manager::Shop->find_by_or_create(id => $::form->{id} || 0)
92
                              ->assign_attributes(%{ $::form->{shop} });
90
  SL::DB::Manager::Shop->find_by_or_create(id => $::form->{id} || 0)->assign_attributes(%{ $::form->{shop} });
93 91
}
94 92

  
95 93
#
......
98 96

  
99 97
sub create_or_update {
100 98
  my ($self) = @_;
99

  
101 100
  my $is_new = !$self->shop->id;
102 101

  
103 102
  my @errors = $self->shop->validate;
......
108 107
    return;
109 108
  }
110 109

  
111
  my $version = $self->action_check_connectivity();
110
  my $version = $self->check_connectivity();
112 111
  if ($version) {
113 112
    flash('error', t8('The connection to the webshop is not success. Message: #1 -- URL: #2 -- Datatype: #3', $version->{message}, $version->{data}->{version}, $version->{data}->{revision}));
114 113
    $self->load_types();
......
129 128
  require SL::ShopConnector::ALL;
130 129
  $self->connectors(SL::ShopConnector::ALL->connectors);
131 130

  
132
  $self->price_types( [ { id => "brutto", name => t8('brutto')}, { id => "netto", name => t8('netto') } ] );
131
  $self->price_types( [ { id => "brutto", name => t8('brutto') },
132
                        { id => "netto",  name => t8('netto')  } ] );
133 133

  
134
  $self->protocols( [ { id => "http", name => t8('http') }, { id => "https", name => t8('https') } ] );
134
  $self->protocols(   [ { id => "http",  name => t8('http') },
135
                        { id => "https", name => t8('https') } ] );
135 136

  
136 137
  my $pricesources;
137
  push( @{ $pricesources } , { id => "master_data/sellprice", name => t8("Master Data")." - ".t8("Sellprice") },
138
                             { id => "master_data/listprice", name => t8("Master Data")." - ".t8("Listprice") },
139
                             { id => "master_data/lastcost",  name => t8("Master Data")." - ".t8("Lastcost") }
140
                             );
138
  push(@{ $pricesources } , { id => "master_data/sellprice", name => t8("Master Data") . " - " . t8("Sellprice") },
139
                            { id => "master_data/listprice", name => t8("Master Data") . " - " . t8("Listprice") },
140
                            { id => "master_data/lastcost",  name => t8("Master Data") . " - " . t8("Lastcost")  });
141 141
  my $pricegroups = SL::DB::Manager::Pricegroup->get_all;
142 142
  foreach my $pg ( @$pricegroups ) {
143
    push( @{ $pricesources } , { id => "pricegroup/".$pg->id, name => t8("Pricegroup") . " - " . $pg->pricegroup} );
143
    push( @{ $pricesources } , { id => "pricegroup/" . $pg->id, name => t8("Pricegroup") . " - " . $pg->pricegroup} );
144 144
  };
145 145

  
146
  $self->price_sources( $pricesources );
146
  $self->price_sources($pricesources);
147 147

  
148 148
  #Buchungsgruppen for calculate the tax for an article
149 149
  my $taxkey_ids;
150 150
  my $taxzones = SL::DB::Manager::TaxZone->get_all_sorted();
151 151

  
152
  foreach my $tz( @$taxzones ) {
153
    push( @{ $taxkey_ids }, { id => $tz->id, name => $tz->description } );
152
  foreach my $tz (@$taxzones) {
153
    push  @{ $taxkey_ids }, { id => $tz->id, name => $tz->description };
154 154
  }
155 155
  $self->taxzone_id( $taxkey_ids );
156

  
157 156
};
158 157

  
159 158
sub _setup_form_action_bar {
......
171 170
          t8('Delete'),
172 171
          submit => [ '#form', { action => "Shop/delete" } ],
173 172
        ],
174
        ],
175
        action => [
176
          t8('Cancel'),
177
          submit => [ '#form', { action => "Shop/list" } ],
178
        ],
173
      ],
174
      action => [
175
        t8('Cancel'),
176
        submit => [ '#form', { action => "Shop/list" } ],
177
      ],
179 178
    );
180 179
  }
181 180
}
......
185 184

  
186 185
  for my $bar ($::request->layout->get('actionbar')) {
187 186
    $bar->add(
188
        link => [
189
          t8('Add'),
190
          link => $self->url_for(action => 'edit'),
191
        ],
192
    );
193
  }
187
      link => [
188
        t8('Add'),
189
        link => $self->url_for(action => 'edit'),
190
      ],
191
    )
192
  };
194 193
}
195 194

  
196 195
1;
SL/Controller/ShopOrder.pm
32 32
  foreach my $shop_config ( @{ $active_shops } ) {
33 33
    my $shop = SL::Shop->new( config => $shop_config );
34 34
    my $new_orders = $shop->connector->get_new_orders;
35
    push @{ $orders_fetched },@{ $new_orders };
35
#    push @{ $orders_fetched },@{ $new_orders };
36 36
  };
37
  flash_later('info', t8('#1 shoporders has been fetched', scalar(@{$orders_fetched})-1));
37
  $main::lxdebug->dump(0, 'WH:OF ',$orders_fetched);
38

  
39
#  flash('info', t8('#1 shoporders has been fetched', scalar(@{$orders_fetched})-1));
38 40
  $self->action_list;
39 41
}
40 42

  
......
68 70
sub action_show {
69 71
  my ( $self ) = @_;
70 72
  my $id = $::form->{id} || {};
71
  my $shop_order = SL::DB::Manager::ShopOrder->find_by( id => $id , with_objects => ['kivi_customer'] );
73
  my $shop_order = SL::DB::ShopOrder->new( id => $id )->load( with => ['kivi_customer'] );
72 74
  die "can't find shoporder with id $id" unless $shop_order;
73 75

  
74
  # Only Customers which are not found will be applied
75
  my $name = $shop_order->billing_lastname ne '' ? "%" . $shop_order->billing_firstname . "%" . $shop_order->billing_lastname . "%" : '';
76
  my $lastname = $shop_order->billing_lastname ne '' ? "%" . $shop_order->billing_lastname . "%" : '';
77
  my $company = $shop_order->billing_company ne '' ? "%" . $shop_order->billing_company . "%" : '';
78
  my $street = $shop_order->billing_street ne '' ?  $shop_order->billing_street : '';
79
  # Fuzzysearch for street to find e.g. "Dorfstrasse - Dorfstr. - Dorfstraße"
80
  my $dbh = $::form->get_standard_dbh();
81
  my $fs_query = "SELECT id FROM customer WHERE ( ( (    name ILIKE ?
82
                                                      OR name ILIKE ?
83
                                                    )
84
                                                    AND zipcode ILIKE ?
85
                                                  )
86
                                                  OR ( street % ?
87
                                                       AND zipcode ILIKE ?
88
                                                     )
89
                                                  OR email ILIKE ?
90
                                                )";
91
  my @values = ($lastname, $company, $shop_order->billing_zipcode, $street, $shop_order->billing_zipcode, $shop_order->billing_email);
92
  my @c_ids = selectall_array_query($::form, $dbh, $fs_query, @values);
93

  
94
  my $proposals = SL::DB::Manager::Customer->get_all(
95
       query => [ id => [ @c_ids ], ],
96
  );
76
  my $proposals = $shop_order->check_for_existing_customers;
97 77

  
98 78
  $self->render('shop_order/show',
99 79
                title       => t8('Shoporder'),
......
128 108
  die "Can't load shop_order form form->import_id" unless $self->shop_order;
129 109

  
130 110
  my $order = $self->shop_order->convert_to_sales_order(customer => $customer, employee => $employee);
131

  
111
  ## price_tax_calculator
132 112
  if ($order->{error}){
133 113
    flash_later('error',@{$order->{errors}});
134 114
  $self->redirect_to(controller => "ShopOrder", action => 'show', id => $self->shop_order->id);
SL/DB/ShopOrder.pm
140 140
  return $customers;
141 141
}
142 142

  
143
#auslagern in eigene subroutine, da auch für andere connectoren genutzt werden muss
144
sub get_customer{
145
  my ($self, %params) = @_;
146

  
147
  my $customer_proposals = $self->check_for_existing_customers;
148
  my $name = $self->billing_firstname . " " . $self->billing_lastname;
149
my $customer;
150
  if(!scalar(@{$customer_proposals})){
151
    my %address = ( 'name'                  => $name,
152
                    'department_1'          => $self->billing_company,
153
                    'department_2'          => $self->billing_department,
154
                    'street'                => $self->billing_street,
155
                    'zipcode'               => $self->billing_zipcode,
156
                    'city'                  => $self->billing_city,
157
                    'email'                 => $self->billing_email,
158
                    'country'               => $self->billing_country,
159
                    'greeting'              => $self->billing_greeting,
160
                    'fax'                   => $self->billing_fax,
161
                    'phone'                 => $self->billing_phone,
162
                    'ustid'                 => $self->billing_vat,
163
                    'taxincluded_checked'   => $self->config->pricetype eq "brutto" ? 1 : 0,
164
                    'taxincluded'           => $self->config->pricetype eq "brutto" ? 1 : 0,
165
                    'pricegroup_id'         => (split '\/',$self->config->price_source)[0] eq "pricegroup" ?  (split '\/',$self->config->price_source)[1] : undef,
166
                    'taxzone_id'            => $self->config->taxzone_id,
167
                    'currency'              => $::instance_conf->get_currency_id,
168
                    #'payment_id'            => 7345,# TODO hardcoded
169
                  );
170
    $customer = SL::DB::Customer->new(%address);
171

  
172
    $customer->save;
173
    my $snumbers = "customernumber_" . $customer->customernumber;
174
    SL::DB::History->new(
175
                      trans_id    => $customer->id,
176
                      snumbers    => $snumbers,
177
                      employee_id => SL::DB::Manager::Employee->current->id,
178
                      addition    => 'SAVED',
179
                      what_done   => 'Shopimport',
180
                    )->save();
181

  
182
  }elsif(scalar(@{$customer_proposals}) == 1){
183
    # hier überprüfen ob Kundendaten wirklich übereinstimmen auc auf ungültig überprüfen
184
    $customer = $customer_proposals->[0];
185
  }else{
186
    # hier überprüfen ob Kundendaten wirklich übereinstimmen und ob es nur einen datensatz gibt auc auf ungültig überprüfen
187
    $customer = SL::DB::Manager::Customer->find_by( name    => $name,
188
                                                       street  => $self->billing_street,
189
                                                       zipcode => $self->billing_zipcode,
190
                                                       email   => $self->billing_email,
191
                                                     );
192

  
193
  }
194
  return \$customer;
195
}
196
## EOF AUslagern
143 197
sub compare_to {
144 198
  my ($self, $other) = @_;
145 199

  
SL/Shop.pm
7 7
use SL::DB::Part;
8 8

  
9 9
# __PACKAGE__->run_before('check_auth');
10
# bb: warum auskommentiert - kann dann wohl weg, oder?
10 11

  
11 12
use Rose::Object::MakeMethods::Generic (
12 13
  'scalar'                => [ qw(config) ],
SL/ShopConnector/Base.pm
7 7
  scalar => [ qw(config) ],
8 8
);
9 9

  
10
sub get_order { die 'get_order needs to be implemented' }
10
sub get_order      { die 'get_order needs to be implemented' }
11 11

  
12 12
sub get_new_orders { die 'get_order needs to be implemented' }
13 13

  
14
sub update_part { die 'update_part needs to be implemented' }
14
sub update_part    { die 'update_part needs to be implemented' }
15 15

  
16
sub get_article { die 'get_article needs to be implemented' }
16
sub get_article    { die 'get_article needs to be implemented' }
17 17

  
18 18
sub get_categories { die 'get_order needs to be implemented' }
19 19

  
20
sub get_version { die 'get_order needs to be implemented' }
20
sub get_version    { die 'get_order needs to be implemented' }
21

  
21 22
1;
22 23

  
23 24
__END__
SL/ShopConnector/Shopware.pm
11 11
use SL::DB::ShopOrder;
12 12
use SL::DB::ShopOrderItem;
13 13
use SL::DB::History;
14
use DateTime::Format::Strptime;
14 15
use SL::DB::File;
15 16
use Data::Dumper;
16 17
use Sort::Naturally ();
......
23 24
  'scalar --get_set_init' => [ qw(connector url) ],
24 25
);
25 26

  
27
sub get_order_max {
28
  my ($self) = @_;
29
  my %params = ( sort  => { property  => 'number',
30
                            direction => 'DESC',
31
                          },
32
               );
33
  my $url       = $self->url;
34
  my $data      = $self->connector->get($url . "api/orders?limit=1", %params);
35
  my $data_json = $data->content;
36
  $main::lxdebug->dump(0, 'WH:MAX1 ', $data->content);
37

  
38
  my $import    = SL::JSON::decode_json($data_json);
39
  $main::lxdebug->dump(0, 'WH:MAX ', $import->{data});
40
  $main::lxdebug->dump(0, 'WH:MAX3 ', $import->{data}->{number});
41

  
42
}
43

  
26 44
sub get_new_orders {
27 45
  my ($self, $id) = @_;
28 46

  
29 47
  my $url       = $self->url;
30 48
  my $ordnumber = $self->config->last_order_number + 1;
31 49
  my $otf       = $self->config->orders_to_fetch;
32

  
33
  my $i;
34
  for ($i=1;$i<=$otf;$i++) {
50
  my $of        = 0;
51
  $self->get_order_max;
52
  for(1 .. $otf) {
35 53

  
36 54
    my $data      = $self->connector->get($url . "api/orders/$ordnumber?useNumberAsId=true");
37 55
    my $data_json = $data->content;
38 56
    my $import    = SL::JSON::decode_json($data_json);
57

  
39 58
    if ($import->{success}){
59
      my $shop_order = $self->map_data_to_shoporder($import);
40 60

  
41
      # Mapping to table shoporders. See http://community.shopware.com/_detail_1690.html#GET_.28Liste.29
42
      my %columns = (
43
        amount                  => $import->{data}->{invoiceAmount},
44
        billing_city            => $import->{data}->{billing}->{city},
45
        billing_company         => $import->{data}->{billing}->{company},
46
        billing_country         => $import->{data}->{billing}->{country}->{name},
47
        billing_department      => $import->{data}->{billing}->{department},
48
        billing_email           => $import->{data}->{customer}->{email},
49
        billing_fax             => $import->{data}->{billing}->{fax},
50
        billing_firstname       => $import->{data}->{billing}->{firstName},
51
        #billing_greeting        => ($import->{data}->{billing}->{salutation} eq 'mr' ? 'Herr' : 'Frau'),
52
        billing_lastname        => $import->{data}->{billing}->{lastName},
53
        billing_phone           => $import->{data}->{billing}->{phone},
54
        billing_street          => $import->{data}->{billing}->{street},
55
        billing_vat             => $import->{data}->{billing}->{vatId},
56
        billing_zipcode         => $import->{data}->{billing}->{zipCode},
57
        customer_city           => $import->{data}->{billing}->{city},
58
        customer_company        => $import->{data}->{billing}->{company},
59
        customer_country        => $import->{data}->{billing}->{country}->{name},
60
        customer_department     => $import->{data}->{billing}->{department},
61
        customer_email          => $import->{data}->{customer}->{email},
62
        customer_fax            => $import->{data}->{billing}->{fax},
63
        customer_firstname      => $import->{data}->{billing}->{firstName},
64
        #customer_greeting       => ($import->{data}->{billing}->{salutation} eq 'mr' ? 'Herr' : 'Frau'),
65
        customer_lastname       => $import->{data}->{billing}->{lastName},
66
        customer_phone          => $import->{data}->{billing}->{phone},
67
        customer_street         => $import->{data}->{billing}->{street},
68
        customer_vat            => $import->{data}->{billing}->{vatId},
69
        customer_zipcode        => $import->{data}->{billing}->{zipCode},
70
        customer_newsletter     => $import->{data}->{customer}->{newsletter},
71
        delivery_city           => $import->{data}->{shipping}->{city},
72
        delivery_company        => $import->{data}->{shipping}->{company},
73
        delivery_country        => $import->{data}->{shipping}->{country}->{name},
74
        delivery_department     => $import->{data}->{shipping}->{department},
75
        delivery_email          => "",
76
        delivery_fax            => $import->{data}->{shipping}->{fax},
77
        delivery_firstname      => $import->{data}->{shipping}->{firstName},
78
        #delivery_greeting       => ($import->{data}->{shipping}->{salutation} eq 'mr' ? 'Herr' : 'Frau'),
79
        delivery_lastname       => $import->{data}->{shipping}->{lastName},
80
        delivery_phone          => $import->{data}->{shipping}->{phone},
81
        delivery_street         => $import->{data}->{shipping}->{street},
82
        delivery_vat            => $import->{data}->{shipping}->{vatId},
83
        delivery_zipcode        => $import->{data}->{shipping}->{zipCode},
84
        host                    => $import->{data}->{shop}->{hosts},
85
        netamount               => $import->{data}->{invoiceAmountNet},
86
        order_date              => $import->{data}->{orderTime},
87
        payment_description     => $import->{data}->{payment}->{description},
88
        payment_id              => $import->{data}->{paymentId},
89
        remote_ip               => $import->{data}->{remoteAddress},
90
        sepa_account_holder     => $import->{data}->{paymentIntances}->{accountHolder},
91
        sepa_bic                => $import->{data}->{paymentIntances}->{bic},
92
        sepa_iban               => $import->{data}->{paymentIntances}->{iban},
93
        shipping_costs          => $import->{data}->{invoiceShipping},
94
        shipping_costs_net      => $import->{data}->{invoiceShippingNet},
95
        shop_c_billing_id       => $import->{data}->{billing}->{customerId},
96
        shop_c_billing_number   => $import->{data}->{billing}->{number},
97
        shop_c_delivery_id      => $import->{data}->{shipping}->{id},
98
        shop_customer_id        => $import->{data}->{customerId},
99
        shop_customer_number    => $import->{data}->{billing}->{number},
100
        shop_customer_comment   => $import->{data}->{customerComment},
101
        shop_data               => "",
102
        shop_id                 => $self->config->id,
103
        shop_ordernumber        => $import->{data}->{number},
104
        shop_trans_id           => $import->{data}->{id},
105
        tax_included            => $self->config->pricetype eq "brutto" ? 1 : 0,
106
      );
107
      my $shop_order = SL::DB::ShopOrder->new(%columns);
108 61
      $shop_order->save;
62
      $of ++;
109 63
      my $id = $shop_order->id;
110 64

  
111 65
      my @positions = sort { Sort::Naturally::ncmp($a->{"partnumber"}, $b->{"partnumber"}) } @{ $import->{data}->{details} };
......
128 82
        $position++;
129 83
      }
130 84
      $shop_order->{positions} = $position-1;
131

  
132
      # Only Customers which are not found will be applied
133
      my $name = $shop_order->billing_lastname ne '' ? $shop_order->billing_firstname . " " . $shop_order->billing_lastname : '';
134
      my $lastname = $shop_order->billing_lastname ne '' ? "%" . $shop_order->billing_lastname . "%" : '';
135
      my $company  = $shop_order->billing_company ne '' ? "%" . $shop_order->billing_company . "%" : '';
136
      my $street   = $shop_order->billing_street ne '' ?  $shop_order->billing_street : '';
137
      # Fuzzysearch for street to find e.g. "Dorfstrasse - Dorfstr. - Dorfstraße"
138
      my $dbh      = $::form->get_standard_dbh();
139
      my $fs_query = "SELECT id FROM customer WHERE ( ( (    name ILIKE ?
140
                                                          OR name ILIKE ?
141
                                                        )
142
                                                        AND zipcode ILIKE ?
143
                                                      )
144
                                                      OR ( street % ?
145
                                                           AND zipcode ILIKE ?
146
                                                         )
147
                                                      OR email ILIKE ?
148
                                                    )";
149
      my @values = ($lastname, $company, $shop_order->billing_zipcode, $street, $shop_order->billing_zipcode, $shop_order->billing_email);
150
      my @c_ids  = selectall_array_query($::form, $dbh, $fs_query, @values);
151

  
152
      if(!scalar(@c_ids)){
153

  
154
        my %address = ( 'name'                  => $shop_order->billing_firstname . " " . $shop_order->billing_lastname,
155
                        'department_1'          => $shop_order->billing_company,
156
                        'department_2'          => $shop_order->billing_department,
157
                        'street'                => $shop_order->billing_street,
158
                        'zipcode'               => $shop_order->billing_zipcode,
159
                        'city'                  => $shop_order->billing_city,
160
                        'email'                 => $shop_order->billing_email,
161
                        'country'               => $shop_order->billing_country,
162
                        'greeting'              => $shop_order->billing_greeting,
163
                        'contact'               => ($shop_order->billing_greeting eq "Herr" ? "Sehr geehrter Herr $lastname" : "Sehr geehrte Frau $lastname"),
164
                        'fax'                   => $shop_order->billing_fax,
165
                        'phone'                 => $shop_order->billing_phone,
166
                        'ustid'                 => $shop_order->billing_vat,
167
                        'taxincluded_checked'   => $self->config->pricetype eq "brutto" ? 1 : 0,
168
                        'taxincluded'           => $self->config->pricetype eq "brutto" ? 1 : 0,
169
                        'pricegroup_id'         => (split '\/',$self->config->price_source)[0] eq "pricegroup" ?  (split '\/',$self->config->price_source)[1] : undef,
170
                        'taxzone_id'            => $self->config->taxzone_id,
171
                        'currency'              => 1,   # TODO hardcoded
172
                        #'payment_id'            => 7345,# TODO hardcoded
173
                      );
174
        my $customer = SL::DB::Customer->new(%address);
175

  
176
        $customer->save;
177
        my $snumbers = "customernumber_" . $customer->customernumber;
178
        SL::DB::History->new(
179
                          trans_id    => $customer->id,
180
                          snumbers    => $snumbers,
181
                          employee_id => SL::DB::Manager::Employee->current->id,
182
                          addition    => 'SAVED',
183
                          what_done   => 'Shopimport',
184
                        )->save();
185
        $shop_order->{kivi_customer_id} = $customer->id;
85
      my $customer = $shop_order->get_customer;
86
      if(ref($customer) eq "SL::DB::Customer"){
87
        $shop_order->kivi_customer_id($customer->id);
186 88
        $shop_order->save;
187

  
188
      }elsif(scalar(@c_ids) == 1){
189
        my $customer = SL::DB::Manager::Customer->get_first( query => [
190
                                                                  id      => $c_ids[0],
191
                                                                  email   => $shop_order->billing_email,
192
                                                                  street  => $shop_order->billing_street,
193
                                                                  zipcode => $shop_order->billing_zipcode,
194
                                                                  city    => $shop_order->billing_city,
195
                                                                  name    => $name,
196
                                                                ]);
197

  
198
        if(ref $customer){
199
          $shop_order->{kivi_customer_id} = $customer->id;
200
          $shop_order->save;
201
        }
202
      }else{
203
        my $customer = SL::DB::Manager::Customer->get_first( query => [   #or => [id      => \@c_ids ],
204
                                                                        name    => $name,
205
                                                                        street  => $shop_order->billing_street,
206
                                                                        zipcode => $shop_order->billing_zipcode,
207
                                                                        email   => $shop_order->billing_email,
208
                                                                      ]
209
                                                           );
210

  
211
        if(ref $customer){
212
          $shop_order->{kivi_customer_id} = $customer->id;
213
          $shop_order->save;
214
        }
215 89
      }
216 90

  
217 91
      my $attributes->{last_order_number} = $ordnumber;
......
221 95
    }
222 96
  }
223 97
  my $shop           = $self->config->description;
224
  my @fetched_orders = ($shop,$i);
225
  return \@fetched_orders;
226
};
98
  my %fetched_orders = (shop_id => $self->config->id, number_of_orders => $of);
99
  return \%fetched_orders;
100
}
101

  
102
sub map_data_to_shoporder {
103
  my ($self, $import) = @_;
104
  my $parser = DateTime::Format::Strptime->new( pattern   => '%Y-%m-%dT%H:%M:%S',
105
                                                  locale    => 'de_DE',
106
                                                  time_zone => 'local'
107
                                                );
108
  my $orderdate = $parser->parse_datetime($import->{data}->{orderTime});
109
  # Mapping to table shoporders. See http://community.shopware.com/_detail_1690.html#GET_.28Liste.29
110
  my %columns = (
111
    amount                  => $import->{data}->{invoiceAmount},
112
    billing_city            => $import->{data}->{billing}->{city},
113
    billing_company         => $import->{data}->{billing}->{company},
114
    billing_country         => $import->{data}->{billing}->{country}->{name},
115
    billing_department      => $import->{data}->{billing}->{department},
116
    billing_email           => $import->{data}->{customer}->{email},
117
    billing_fax             => $import->{data}->{billing}->{fax},
118
    billing_firstname       => $import->{data}->{billing}->{firstName},
119
    #billing_greeting        => ($import->{data}->{billing}->{salutation} eq 'mr' ? 'Herr' : 'Frau'),
120
    billing_lastname        => $import->{data}->{billing}->{lastName},
121
    billing_phone           => $import->{data}->{billing}->{phone},
122
    billing_street          => $import->{data}->{billing}->{street},
123
    billing_vat             => $import->{data}->{billing}->{vatId},
124
    billing_zipcode         => $import->{data}->{billing}->{zipCode},
125
    customer_city           => $import->{data}->{billing}->{city},
126
    customer_company        => $import->{data}->{billing}->{company},
127
    customer_country        => $import->{data}->{billing}->{country}->{name},
128
    customer_department     => $import->{data}->{billing}->{department},
129
    customer_email          => $import->{data}->{customer}->{email},
130
    customer_fax            => $import->{data}->{billing}->{fax},
131
    customer_firstname      => $import->{data}->{billing}->{firstName},
132
    #customer_greeting       => ($import->{data}->{billing}->{salutation} eq 'mr' ? 'Herr' : 'Frau'),
133
    customer_lastname       => $import->{data}->{billing}->{lastName},
134
    customer_phone          => $import->{data}->{billing}->{phone},
135
    customer_street         => $import->{data}->{billing}->{street},
136
    customer_vat            => $import->{data}->{billing}->{vatId},
137
    customer_zipcode        => $import->{data}->{billing}->{zipCode},
138
    customer_newsletter     => $import->{data}->{customer}->{newsletter},
139
    delivery_city           => $import->{data}->{shipping}->{city},
140
    delivery_company        => $import->{data}->{shipping}->{company},
141
    delivery_country        => $import->{data}->{shipping}->{country}->{name},
142
    delivery_department     => $import->{data}->{shipping}->{department},
143
    delivery_email          => "",
144
    delivery_fax            => $import->{data}->{shipping}->{fax},
145
    delivery_firstname      => $import->{data}->{shipping}->{firstName},
146
    #delivery_greeting       => ($import->{data}->{shipping}->{salutation} eq 'mr' ? 'Herr' : 'Frau'),
147
    delivery_lastname       => $import->{data}->{shipping}->{lastName},
148
    delivery_phone          => $import->{data}->{shipping}->{phone},
149
    delivery_street         => $import->{data}->{shipping}->{street},
150
    delivery_vat            => $import->{data}->{shipping}->{vatId},
151
    delivery_zipcode        => $import->{data}->{shipping}->{zipCode},
152
    host                    => $import->{data}->{shop}->{hosts},
153
    netamount               => $import->{data}->{invoiceAmountNet},
154
    order_date              => $orderdate,
155
    payment_description     => $import->{data}->{payment}->{description},
156
    payment_id              => $import->{data}->{paymentId},
157
    remote_ip               => $import->{data}->{remoteAddress},
158
    sepa_account_holder     => $import->{data}->{paymentIntances}->{accountHolder},
159
    sepa_bic                => $import->{data}->{paymentIntances}->{bic},
160
    sepa_iban               => $import->{data}->{paymentIntances}->{iban},
161
    shipping_costs          => $import->{data}->{invoiceShipping},
162
    shipping_costs_net      => $import->{data}->{invoiceShippingNet},
163
    shop_c_billing_id       => $import->{data}->{billing}->{customerId},
164
    shop_c_billing_number   => $import->{data}->{billing}->{number},
165
    shop_c_delivery_id      => $import->{data}->{shipping}->{id},
166
    shop_customer_id        => $import->{data}->{customerId},
167
    shop_customer_number    => $import->{data}->{billing}->{number},
168
    shop_customer_comment   => $import->{data}->{customerComment},
169
    shop_id                 => $self->config->id,
170
    shop_ordernumber        => $import->{data}->{number},
171
    shop_trans_id           => $import->{data}->{id},
172
    tax_included            => $self->config->pricetype eq "brutto" ? 1 : 0,
173
  );
174
  my $shop_order = SL::DB::ShopOrder->new(%columns);
175
  return $shop_order;
176
}
227 177

  
228 178
sub get_categories {
229 179
  my ($self) = @_;
......
257 207
    return SL::JSON::decode_json($data_json);
258 208
  }else{
259 209
    my %return = ( success => 0,
260
                   data  => { version => $url . ": " . $status_line, revision => $type },
210
                   data    => { version => $url . ": " . $status_line, revision => $type },
261 211
                   message => "Server not found or wrong data type",
262 212
                );
263 213
    return \%return;
......
291 241
  my @upload_img = ();
292 242
  foreach my $img (@{ $images }) {
293 243
    my $file               = SL::File->get(id => $img->file->id );
294
    my $file_path          = $file->get_file;
295 244
    my ($path, $extension) = (split /\./, $file->file_name);
296 245
    my $content            = File::Slurp::read_file($file->get_file);
297

  
298
    my $temp ={ ( link        => 'data:' . $file->mime_type . ';base64,' . MIME::Base64::encode($content),
246
    my $temp ={ ( link        => 'data:' . $file->mime_type . ';base64,' . MIME::Base64::encode($content, ""), #$content, # MIME::Base64::encode($content),
299 247
                  description => $img->file->title,
300 248
                  position    => $img->position,
301 249
                  extension   => $extension,
......
315 263
#  }
316 264

  
317 265
  # get the right price
266
  # TODO In extra Helper??
318 267
  my ( $price_src_str, $price_src_id ) = split(/\//,$shop_part->active_price_source);
319 268
  require SL::DB::Part;
320 269
  my $price;
......
401 350

  
402 351
  my $dataString = SL::JSON::to_json(\%shop_data);
403 352
  $dataString    = encode_utf8($dataString);
353

  
404 354
  my $upload_content;
405 355
  my $upload;
406 356
  if($import->{success}){
......
454 404
  );
455 405

  
456 406
  return $ua;
407

  
457 408
}
458 409

  
459 410
1;
doc/dokumentation.xml
143 143
        <title>Benötigte Perl-Pakete installieren</title>
144 144

  
145 145
        <para>Zum Betrieb von kivitendo werden zwingend ein Webserver (meist
146
        Apache) und ein Datenbankserver (PostgreSQL) in einer aktuellen Version
147
        (s.a. Liste der unterstützten Betriebssysteme) benötigt.</para>
146
        Apache) und ein Datenbankserver (PostgreSQL) in einer aktuellen
147
        Version (s.a. Liste der unterstützten Betriebssysteme)
148
        benötigt.</para>
148 149

  
149 150
        <para>Zusätzlich benötigt kivitendo einige Perl-Pakete, die nicht
150 151
        Bestandteil einer Standard-Perl-Installation sind. Um zu überprüfen,
......
303 304
            <para><literal>Text::Iconv</literal></para>
304 305
          </listitem>
305 306

  
306
           <listitem>
307
          <listitem>
307 308
            <para><literal>Text::Unidecode</literal></para>
308 309
          </listitem>
309 310

  
......
319 320
            <para><literal>YAML</literal></para>
320 321
          </listitem>
321 322
        </itemizedlist>
322
        <para>Seit Version größer v3.5.0 sind die folgenden Pakete hinzugekommen:
323
        <literal>Text::Unidecode</literal></para>
323

  
324
        <para>Seit Version größer v3.5.0 sind die folgenden Pakete
325
        hinzugekommen: <literal>Text::Unidecode</literal></para>
324 326

  
325 327
        <para>Seit Version v3.4.0 sind die folgenden Pakete hinzugekommen:
326 328
        <literal>Algorithm::CheckDigits</literal><literal>PBKDF2::Tiny</literal></para>
......
428 430
          <programlisting>cpan Rose::Db::Object</programlisting>
429 431
        </sect3>
430 432
      </sect2>
433

  
431 434
      <sect2>
432 435
        <title>Andere Pakete installieren</title>
433 436

  
......
448 451

  
449 452
        <para>OpenSuSE: <programlisting>zypper install poppler-tools</programlisting></para>
450 453
      </sect2>
451

  
452 454
    </sect1>
453 455

  
454 456
    <sect1 id="Manuelle-Installation-des-Programmpaketes"
......
512 514
git clone https://github.com/kivitendo/kivitendo-erp.git
513 515
cd kivitendo-erp/
514 516
git checkout `git tag -l | egrep -ve "(beta|rc)" | tail -1`</programlisting>
515
        Erläuterung: Der Befehl wechselt zur letzten Stable-Version (git tag -l listet
516
       alle Tags auf, das egrep schmeisst alle Einträge mit beta oder rc raus und
517
       das tail gibt davon den obersten Treffer zurück).
518

  
517
        Erläuterung: Der Befehl wechselt zur letzten Stable-Version (git tag
518
        -l listet alle Tags auf, das egrep schmeisst alle Einträge mit beta
519
        oder rc raus und das tail gibt davon den obersten Treffer zurück).
519 520
        Sehr sinnvoll ist es, direkt im Anschluss einen eigenen Branch zu
520 521
        erzeugen, um bspw. seine eigenen Druckvorlagen-Anpassungen damit zu
521 522
        verwalten. Hierfür reicht ein simples <programlisting>  git checkout -b meine_eigenen_änderungen</programlisting>
......
523 524
        url="http://www-cs-students.stanford.edu/~blynn/gitmagic/index.html">
524 525
        Git Magic</ulink>).</para>
525 526

  
526
<para>
527
        Ein beispielhafter Workflow für Druckvorlagen-Anpassungen von 3.4.1 nach 3.5:
528
        <programlisting>
527
        <para>Ein beispielhafter Workflow für Druckvorlagen-Anpassungen von
528
        3.4.1 nach 3.5: <programlisting>
529 529
$ git clone https://github.com/kivitendo/kivitendo-erp.git
530 530
$ cd kivitendo-erp/
531 531
$ git checkout release-3.4.1     # das ist der aktuelle release, den wir wollen
......
682 682
[system]
683 683
default_manager = german</programlisting>
684 684

  
685
		<para>Für kivitendo Installationen in der Schweiz sollte hier <varname>german</varname>
686
		durch <varname>swiss</varname> ersetzt werden.</para>
687
		<para>Die Einstellung <varname>default_manager = swiss</varname> bewirkt:</para>
688
		<itemizedlist>
689
            <listitem>
690
              <para>Beim Erstellen einer neuen Datenbank in der kivitendo Administration
691
              werden automatisch die Standard-Werte für die Schweiz voreingestellt:
692
              Währung CHF, 5er-Rundung, Schweizer KMU-Kontenplan, Sollversteuerung,
693
              Aufwandsmethode, Bilanzierung (die Werte können aber manuell angepasst werden).</para>
694
			</listitem>
695
			<listitem>
696
				<para>Einstellen der Standardkonten für Rundungserträge und -aufwendungen
697
			(unter Mandantenkonfiguration → Standardkonten veränderbar)</para>
698
			</listitem>
699
			<listitem>
700
				<para>das verwendete Zahlenformat wird auf <varname>1'000.00</varname> eingestellt
701
				 (unter Programm → Benutzereinstellungen veränderbar)</para>
702
			</listitem>
703
			<listitem>
704
				<para>DATEV-Automatik und UStVA werden nicht angezeigt, Erfolgsrechnung
705
				ersetzt GUV ( unter Mandantenkonfiguration → Features veränderbar)</para>
706
			</listitem>
707
		</itemizedlist>
685
        <para>Für kivitendo Installationen in der Schweiz sollte hier
686
        <varname>german</varname> durch <varname>swiss</varname> ersetzt
687
        werden.</para>
688

  
689
        <para>Die Einstellung <varname>default_manager = swiss</varname>
690
        bewirkt:</para>
691

  
692
        <itemizedlist>
693
          <listitem>
694
            <para>Beim Erstellen einer neuen Datenbank in der kivitendo
695
            Administration werden automatisch die Standard-Werte für die
696
            Schweiz voreingestellt: Währung CHF, 5er-Rundung, Schweizer
697
            KMU-Kontenplan, Sollversteuerung, Aufwandsmethode, Bilanzierung
698
            (die Werte können aber manuell angepasst werden).</para>
699
          </listitem>
700

  
701
          <listitem>
702
            <para>Einstellen der Standardkonten für Rundungserträge und
703
            -aufwendungen (unter Mandantenkonfiguration → Standardkonten
704
            veränderbar)</para>
705
          </listitem>
706

  
707
          <listitem>
708
            <para>das verwendete Zahlenformat wird auf
709
            <varname>1'000.00</varname> eingestellt (unter Programm →
710
            Benutzereinstellungen veränderbar)</para>
711
          </listitem>
712

  
713
          <listitem>
714
            <para>DATEV-Automatik und UStVA werden nicht angezeigt,
715
            Erfolgsrechnung ersetzt GUV ( unter Mandantenkonfiguration →
716
            Features veränderbar)</para>
717
          </listitem>
718
        </itemizedlist>
708 719

  
709 720
        <para>Nutzt man wiederkehrende Rechnungen, kann man unter
710 721
        <varname>[periodic_invoices]</varname> den Login eines Benutzers
......
1038 1049
            <programlisting>
1039 1050
  Order Deny,Allow
1040 1051
  Deny from All </programlisting>
1041

  
1042 1052
          </warning>
1043 1053

  
1044 1054
          <para>Seit mod_fcgid-Version 2.3.6 gelten sehr kleine Grenzen für
......
1098 1108
        Konfigurationsmöglichkeiten sprengen allerdings den Rahmen dieser
1099 1109
        Anleitung, hier ein Hinweis auf einen entsprechenden <ulink
1100 1110
        url="http://redmine.kivitendo-premium.de/boards/1/topics/142">Foreneintrag
1101
        (Stand Sept. 2015)</ulink> und einen aktuellen (Stand Mai 2017)
1102
        <ulink url="https://mozilla.github.io/server-side-tls/ssl-config-generator/">
1111
        (Stand Sept. 2015)</ulink> und einen aktuellen (Stand Mai 2017) <ulink
1112
        url="https://mozilla.github.io/server-side-tls/ssl-config-generator/">
1103 1113
        SSL-Konfigurations-Generator</ulink>.</para>
1104 1114
      </sect2>
1105 1115
    </sect1>
......
1121 1131
      Servers integriert werden muss, damit er automatisch gestartet wird.
1122 1132
      Dies kann kivitendo nicht für Sie erledigen.</para>
1123 1133

  
1124
      <para>Da der Taskserver als Perlscript läuft, wird Arbeitsspeicher,
1125
      der einmal benötigt wurde, nicht mehr an das Betriebssystem zurückgegeben,
1134
      <para>Da der Taskserver als Perlscript läuft, wird Arbeitsspeicher, der
1135
      einmal benötigt wurde, nicht mehr an das Betriebssystem zurückgegeben,
1126 1136
      solange der Taskserver läuft. Dies kann dazu führen, dass ein länger
1127 1137
      laufender Taskserver mit der Zeit immer mehr Arbeitsspeicher für sich
1128
      beansprucht. Es ist deshalb sinnvoll, dass der Taskserver in regelmässigen
1129
      Abständen neu gestartet wird.</para>
1138
      beansprucht. Es ist deshalb sinnvoll, dass der Taskserver in
1139
      regelmässigen Abständen neu gestartet wird.</para>
1130 1140

  
1131 1141
      <sect2 id="Konfiguration-des-Task-Servers">
1132 1142
        <title>Verfügbare und notwendige Konfigurationsoptionen</title>
......
1191 1201
        anstelle eines symbolischen Links verwendet werden können.</para>
1192 1202

  
1193 1203
        <sect3>
1194
          <title>SystemV-basierende Systeme (z.B. ältere Debian, ältere OpenSUSE,
1195
          ältere Fedora)</title>
1204
          <title>SystemV-basierende Systeme (z.B. ältere Debian, ältere
1205
          OpenSUSE, ältere Fedora)</title>
1196 1206

  
1197 1207
          <para>Kopieren Sie die Datei
1198 1208
          <filename>scripts/boot/system-v/kivitendo-task-server</filename>
......
1241 1251
          <title>systemd-basierende Systeme (z.B. neure openSUSE, neuere
1242 1252
          Fedora, neuere Ubuntu und neuere Debians)</title>
1243 1253

  
1244
          <para>Kopieren Sie die Datei <filename>scripts/boot/systemd/kivitendo-task-server.service</filename> nach
1245
          <filename>/etc/systemd/system/</filename>. Passen Sie in der kopierten Datei den Pfad zum Task-Server an (Zeilen
1246
          <literal>ExecStart=....</literal> und <literal>ExecStop=...</literal>).</para>
1254
          <para>Kopieren Sie die Datei
1255
          <filename>scripts/boot/systemd/kivitendo-task-server.service</filename>
1256
          nach <filename>/etc/systemd/system/</filename>. Passen Sie in der
1257
          kopierten Datei den Pfad zum Task-Server an (Zeilen
1258
          <literal>ExecStart=....</literal> und
1259
          <literal>ExecStop=...</literal>).</para>
1247 1260

  
1248
          <para>Machen Sie anschließend das Script systemd bekannt, und binden Sie es in den Boot-Prozess ein. Dazu führen Sie die folgenden
1249
          Befehl aus:</para>
1261
          <para>Machen Sie anschließend das Script systemd bekannt, und binden
1262
          Sie es in den Boot-Prozess ein. Dazu führen Sie die folgenden Befehl
1263
          aus:</para>
1250 1264

  
1251 1265
          <programlisting>systemctl daemon-reload
1252 1266
systemctl enable kivitendo-task-server.service</programlisting>
1253 1267

  
1254
          <para>Wenn Sie den Task-Server jetzt sofort starten möchten, anstatt den Server neu zu starten, so können Sie das mit dem
1255
          folgenden Befehl tun:</para>
1268
          <para>Wenn Sie den Task-Server jetzt sofort starten möchten, anstatt
1269
          den Server neu zu starten, so können Sie das mit dem folgenden
1270
          Befehl tun:</para>
1256 1271

  
1257 1272
          <programlisting>systemctl start kivitendo-task-server.service</programlisting>
1258 1273
        </sect3>
......
2234 2249
        und nicht nur Teile davon, da dies sonst oft zu einer odt-Datei führt,
2235 2250
        die vom Parser nicht korrekt gelesen werden kann.</para>
2236 2251

  
2237
        <para>Mahnungen können unter folgenden Einschränkungen mit den odt-Vorlagen
2238
        im Vorlagensatz rev-odt erzeugt werden:</para>
2252
        <para>Mahnungen können unter folgenden Einschränkungen mit den
2253
        odt-Vorlagen im Vorlagensatz rev-odt erzeugt werden:</para>
2239 2254

  
2240 2255
        <itemizedlist>
2241 2256
          <listitem>
2242 2257
            <para>als Druckoption steht nur 'PDF(OpenDocument/OASIS)' zur
2243
            Verfügung, das heisst, die Mahnungen werden als PDF-Datei ausgegeben.
2244
            </para>
2258
            Verfügung, das heisst, die Mahnungen werden als PDF-Datei
2259
            ausgegeben.</para>
2245 2260
          </listitem>
2246 2261

  
2247 2262
          <listitem>
......
2254 2269
        <para>Mehrere Mahnungen für eine Kundin / einen Kunden werden zu einer
2255 2270
        PDF-Datei zusammengefasst</para>
2256 2271

  
2257
        <para>Die Vorlagen zahlungserinnerung.odt sowie mahnung.odt sind für das
2258
        Erstellen einer Zahlungserinnerung bzw. Mahnung selbst vorgesehen, die
2259
        Vorlage mahnung_invoice.odt für das Erstellen einer Rechnung über die
2260
        verrechneten Mahngebühren und Verzugszinsen.</para>
2272
        <para>Die Vorlagen zahlungserinnerung.odt sowie mahnung.odt sind für
2273
        das Erstellen einer Zahlungserinnerung bzw. Mahnung selbst vorgesehen,
2274
        die Vorlage mahnung_invoice.odt für das Erstellen einer Rechnung über
2275
        die verrechneten Mahngebühren und Verzugszinsen.</para>
2261 2276

  
2262 2277
        <para>Zur Zeit gibt es in kivitendo noch keine Möglichkeit,
2263 2278
        odt-Vorlagen bei Briefen und Pflichtenheften einzusetzen.
......
2358 2373
      <title>OpenDocument-Vorlagen</title>
2359 2374

  
2360 2375
      <para>kivitendo unterstützt die Verwendung von Vorlagen im
2361
      OpenDocument-Format, wie es LibreOffice oder OpenOffice (ab Version 2) erzeugen.
2362
      kivitendo kann dabei sowohl neue OpenDocument-Dokumente als auch aus
2363
      diesen direkt PDF-Dateien erzeugen. Um die Unterstützung von
2376
      OpenDocument-Format, wie es LibreOffice oder OpenOffice (ab Version 2)
2377
      erzeugen. kivitendo kann dabei sowohl neue OpenDocument-Dokumente als
2378
      auch aus diesen direkt PDF-Dateien erzeugen. Um die Unterstützung von
2364 2379
      OpenDocument-Vorlagen zu aktivieren muss in der Datei
2365 2380
      <filename>config/kivitendo.conf</filename> die Variable
2366 2381
      <literal>opendocument</literal> im Abschnitt
......
2369 2384

  
2370 2385
      <para>Während die Erzeugung von reinen OpenDocument-Dateien keinerlei
2371 2386
      weitere Software benötigt, wird zur Umwandlung dieser Dateien in PDF
2372
      LibreOffice oder OpenOffice benötigt. Soll dieses Feature genutzt werden, so muss
2373
      neben LibreOffice oder OpenOffice auch der “X virtual frame buffer”
2374
      (xvfb) installiert werden. Bei Debian ist er im Paket “xvfb” enthalten.
2375
      Andere Distributionen enthalten ihn in anderen Paketen.</para>
2387
      LibreOffice oder OpenOffice benötigt. Soll dieses Feature genutzt
2388
      werden, so muss neben LibreOffice oder OpenOffice auch der “X virtual
2389
      frame buffer” (xvfb) installiert werden. Bei Debian ist er im Paket
2390
      “xvfb” enthalten. Andere Distributionen enthalten ihn in anderen
2391
      Paketen.</para>
2376 2392

  
2377 2393
      <para>Nach der Installation müssen in der Datei
2378 2394
      <filename>config/kivitendo.conf</filename> im Abschnitt
2379
      <literal>applications</literal> zwei weitere Variablen
2380
      angepasst werden:</para>
2381
      <para><literal>openofficeorg_writer</literal> muss den
2382
      vollständigen Pfad zu LibreOffice oder OpenOffice enthalten.
2383
      Dabei dürfen keine Anführungszeichen eingesetzt werden.</para>
2395
      <literal>applications</literal> zwei weitere Variablen angepasst
2396
      werden:</para>
2397

  
2398
      <para><literal>openofficeorg_writer</literal> muss den vollständigen
2399
      Pfad zu LibreOffice oder OpenOffice enthalten. Dabei dürfen keine
2400
      Anführungszeichen eingesetzt werden.</para>
2401

  
2384 2402
      <para>Beispiel für Debian oder Ubuntu:</para>
2403

  
2385 2404
      <programlisting>openofficeorg_writer = /usr/bin/libreoffice</programlisting>
2405

  
2386 2406
      <para><literal>xvfb</literal> muss den Pfad zum “X virtual frame buffer”
2387 2407
      enthalten.</para>
2388 2408

  
2389 2409
      <para>Zusätzlich gibt es zwei verschiedene Arten, wie kivitendo mit
2390
      LibreOffice bzw. OpenOffice kommuniziert. Die erste Variante, die benutzt
2391
      wird, wenn die Variable <literal>$openofficeorg_daemon</literal> gesetzt
2392
      ist, startet ein LibreOffice oder OpenOffice, das auch nach der Umwandlung
2393
      des Dokumentes gestartet bleibt. Bei weiteren Umwandlungen wird dann diese
2394
      laufende Instanz benutzt. Der Vorteil ist, dass die Zeit zur Umwandlung
2395
      deutlich reduziert wird, weil nicht für jedes Dokument ein LibreOffice bzw.
2396
      OpenOffice gestartet werden muss. Der Nachteil ist, dass diese Methode
2397
      Python und die Python-UNO-Bindings benötigt, die Bestandteil von LibreOffice
2398
      bzw. OpenOffice sind.</para>
2410
      LibreOffice bzw. OpenOffice kommuniziert. Die erste Variante, die
2411
      benutzt wird, wenn die Variable <literal>$openofficeorg_daemon</literal>
2412
      gesetzt ist, startet ein LibreOffice oder OpenOffice, das auch nach der
2413
      Umwandlung des Dokumentes gestartet bleibt. Bei weiteren Umwandlungen
2414
      wird dann diese laufende Instanz benutzt. Der Vorteil ist, dass die Zeit
2415
      zur Umwandlung deutlich reduziert wird, weil nicht für jedes Dokument
2416
      ein LibreOffice bzw. OpenOffice gestartet werden muss. Der Nachteil ist,
2417
      dass diese Methode Python und die Python-UNO-Bindings benötigt, die
2418
      Bestandteil von LibreOffice bzw. OpenOffice sind.</para>
2399 2419

  
2400 2420
      <note>
2401 2421
        <para>Für die Verbindung zu LibreOffice bzw. OpenOffice wird
2402 2422
        normalerweise der Python-Interpreter
2403
        <filename>/usr/bin/python</filename> benutzt.
2404
        Sollte dies nicht der richtige sein, so kann man mit zwei
2405
        Konfigurationsvariablen entscheiden, welcher Python-Interpreter
2406
        genutzt wird. Mit der Option <literal>python_uno</literal> aus dem
2407
        Abschnitt <literal>applications</literal> wird der Interpreter selber
2423
        <filename>/usr/bin/python</filename> benutzt. Sollte dies nicht der
2424
        richtige sein, so kann man mit zwei Konfigurationsvariablen
2425
        entscheiden, welcher Python-Interpreter genutzt wird. Mit der Option
2426
        <literal>python_uno</literal> aus dem Abschnitt
2427
        <literal>applications</literal> wird der Interpreter selber
2408 2428
        festgelegt; sie steht standardmäßig auf dem eben erwähnten Wert
2409 2429
        <literal>/usr/bin/python</literal>.</para>
2410 2430

  
......
2421 2441
      </note>
2422 2442

  
2423 2443
      <para>Ist <literal>$openofficeorg_daemon</literal> nicht gesetzt, so
2424
      wird für jedes Dokument LibreOffice bzw. OpenOffice neu gestartet
2425
      und die Konvertierung mit Hilfe eines Makros durchgeführt. Dieses
2426
      Makro muss in der Dokumentenvorlage enthalten sein und
2444
      wird für jedes Dokument LibreOffice bzw. OpenOffice neu gestartet und
2445
      die Konvertierung mit Hilfe eines Makros durchgeführt. Dieses Makro muss
2446
      in der Dokumentenvorlage enthalten sein und
2427 2447
      “Standard.Conversion.ConvertSelfToPDF()” heißen. Die Beispielvorlage
2428
      ‘<literal>templates/print/rev-odt/invoice.odt</literal>’
2429
      enthält ein solches Makro, das in jeder anderen Dokumentenvorlage
2430
      ebenfalls enthalten sein muss.</para>
2448
      ‘<literal>templates/print/rev-odt/invoice.odt</literal>’ enthält ein
2449
      solches Makro, das in jeder anderen Dokumentenvorlage ebenfalls
2450
      enthalten sein muss.</para>
2431 2451

  
2432
      <para>Als letztes muss herausgefunden werden, welchen Namen
2433
      OpenOffice bzw. LibreOffice dem Verzeichnis mit den Benutzereinstellungen
2434
      gibt. Unter Debian ist dies momentan
2435
      <literal>~/.config/libreoffice</literal>. kivitendo verwendet das
2436
      Verzeichnis <literal>users/.openoffice.org2</literal>.
2437
      Eventuell muss dieses Verzeichnis umbenannt werden.</para>
2452
      <para>Als letztes muss herausgefunden werden, welchen Namen OpenOffice
2453
      bzw. LibreOffice dem Verzeichnis mit den Benutzereinstellungen gibt.
2454
      Unter Debian ist dies momentan <literal>~/.config/libreoffice</literal>.
2455
      kivitendo verwendet das Verzeichnis
2456
      <literal>users/.openoffice.org2</literal>. Eventuell muss dieses
2457
      Verzeichnis umbenannt werden.</para>
2438 2458

  
2439 2459
      <para>Dieses Verzeichnis, wie auch das komplette
2440 2460
      <literal>users</literal>-Verzeichnis, muss vom Webserver beschreibbar
2441 2461
      sein. Dieses wurde bereits erledigt (siehe <xref
2442
      linkend="Manuelle-Installation-des-Programmpaketes"/>), kann aber
2443
      erneut überprüft werden, wenn die Konvertierung nach PDF
2444
      fehlschlägt.</para>
2462
      linkend="Manuelle-Installation-des-Programmpaketes"/>), kann aber erneut
2463
      überprüft werden, wenn die Konvertierung nach PDF fehlschlägt.</para>
2445 2464

  
2446 2465
      <sect2>
2447 2466
        <title>OpenDocument (odt) Druckvorlagen mit Makros</title>
......
2482 2501
            </listitem>
2483 2502

  
2484 2503
            <listitem>
2485
              <para>Druckerbeschreibung → aussagekräftiger Text: wird in
2486
              der Auftrags- bzw. Rechnungsmaske als Auswahl angezeigt (z.B.
2487
              mit Einzahlungsschein Bank xy)</para>
2504
              <para>Druckerbeschreibung → aussagekräftiger Text: wird in der
2505
              Auftrags- bzw. Rechnungsmaske als Auswahl angezeigt (z.B. mit
2506
              Einzahlungsschein Bank xy)</para>
2488 2507
            </listitem>
2489 2508

  
2490 2509
            <listitem>
2491
              <para>Druckbefehl → beliebiger Text (hat für das Erzeugen
2492
              von Aufträgen oder Rechnungen als odt-Datei keine Bedeutung,
2493
              darf aber nicht leer sein)</para>
2510
              <para>Druckbefehl → beliebiger Text (hat für das Erzeugen von
2511
              Aufträgen oder Rechnungen als odt-Datei keine Bedeutung, darf
2512
              aber nicht leer sein)</para>
2494 2513
            </listitem>
2495 2514

  
2496 2515
            <listitem>
2497
              <para>Vorlagenkürzel → besr bzw. selbst gewähltes
2498
              Vorlagensuffix (muss genau der Zeichenfolge entsprechen, die
2499
              zwischen "invoice_" bzw. "sales_order_" und ".odt"
2500
              steht.)</para>
2516
              <para>Vorlagenkürzel → besr bzw. selbst gewähltes Vorlagensuffix
2517
              (muss genau der Zeichenfolge entsprechen, die zwischen
2518
              "invoice_" bzw. "sales_order_" und ".odt" steht.)</para>
2501 2519
            </listitem>
2502 2520

  
2503 2521
            <listitem>
......
2516 2534

  
2517 2535
          <itemizedlist>
2518 2536
            <listitem>
2519
              <para>Programm → Benutzereinstellungen →
2520
              Druckoptionen</para>
2537
              <para>Programm → Benutzereinstellungen → Druckoptionen</para>
2521 2538
            </listitem>
2522 2539

  
2523 2540
            <listitem>
......
2529 2546
            </listitem>
2530 2547

  
2531 2548
            <listitem>
2532
              <para>Standarddrucker → gewünschte Druckerbeschreibung
2533
              auswählen (z.B. mit Einzahlungsschein Bank xy)</para>
2549
              <para>Standarddrucker → gewünschte Druckerbeschreibung auswählen
2550
              (z.B. mit Einzahlungsschein Bank xy)</para>
2534 2551
            </listitem>
2535 2552

  
2536 2553
            <listitem>
......
2606 2623
                  </listitem>
2607 2624

  
2608 2625
                  <listitem>
2609
					<para>DDDEND: muss am Ende der Zeile vorhanden sein</para>
2610
				  </listitem>
2626
                    <para>DDDEND: muss am Ende der Zeile vorhanden sein</para>
2627
                  </listitem>
2611 2628
                </itemizedlist></para>
2612 2629
            </listitem>
2613 2630

  
......
2655 2672

  
2656 2673
          <itemizedlist>
2657 2674
            <listitem>
2658
              <para>Extras → Optionen → Sicherheit →
2659
              Makrosicherheit</para>
2675
              <para>Extras → Optionen → Sicherheit → Makrosicherheit</para>
2660 2676
            </listitem>
2661 2677

  
2662 2678
            <listitem>
......
2668 2684

  
2669 2685
            <listitem>
2670 2686
              <para>Beim Öffnen einer odt-Rechnung oder eines odt-Auftrags bei
2671
              der entsprechenden Nachfrage "Makros ausführen" auswählen.
2672
              </para>
2687
              der entsprechenden Nachfrage "Makros ausführen"
2688
              auswählen.</para>
2673 2689

  
2674 2690
              <para><emphasis role="bold">Wichtig</emphasis>: die Makros sind
2675 2691
              so eingestellt, dass sie beim Öffnen der Vorlagen selbst nicht
......
2688 2704
      <sect2 id="booking.dates">
2689 2705
        <title>Datum bei Buchungen</title>
2690 2706

  
2691
        <para>Seit der Version 3.5 werden für Buchungen in kivitendo einheitlich
2692
        folgende Bezeichnungen verwendet:</para>
2707
        <para>Seit der Version 3.5 werden für Buchungen in kivitendo
2708
        einheitlich folgende Bezeichnungen verwendet:</para>
2693 2709

  
2694 2710
        <itemizedlist>
2695 2711
          <listitem>
2696
            <para><option>Erfassungsdatum</option> (en: <option>Entry Date</option>,
2697
            code: <option>Gldate</option>)</para>
2712
            <para><option>Erfassungsdatum</option> (en: <option>Entry
2713
            Date</option>, code: <option>Gldate</option>)</para>
2698 2714

  
2699
            <para>bezeichnet das Datum, an dem die Buchung in kivitendo erfasst wurde.
2700
            </para>
2715
            <para>bezeichnet das Datum, an dem die Buchung in kivitendo
2716
            erfasst wurde.</para>
2701 2717
          </listitem>
2702 2718

  
2703 2719
          <listitem>
2704
            <para><option>Buchungsdatum</option> (en: <option>Booking Date</option>,
2705
            code: <option>Transdate</option>)</para>
2720
            <para><option>Buchungsdatum</option> (en: <option>Booking
2721
            Date</option>, code: <option>Transdate</option>)</para>
2706 2722

  
2707
            <para>bezeichnet das buchhaltungstechnisch für eine Buchung relevante
2708
            Datum</para>
2723
            <para>bezeichnet das buchhaltungstechnisch für eine Buchung
2724
            relevante Datum</para>
2709 2725

  
2710 2726
            <para>Das <option>Rechnungsdatum</option> bei Verkaufs- und
2711 2727
            Einkaufsrechnungen entspricht dem Buchungsdatum. Das heisst, in
2712 2728
            Berichten wie dem Buchungsjournal, in denen eine Spalte
2713
            <option>Buchungsdatum</option> angezeigt werden kann, erscheint hier
2714
            im Fall von Rechnungen das Rechnungsdatum.</para>
2729
            <option>Buchungsdatum</option> angezeigt werden kann, erscheint
2730
            hier im Fall von Rechnungen das Rechnungsdatum.</para>
2715 2731
          </listitem>
2716 2732

  
2717 2733
          <listitem>
2718
            <para>Bezieht sich ein verbuchter Beleg auf einen Zeitpunkt, der nicht mit
2719
            dem Buchungsdatum übereinstimmt, so kann dieses Datum momentan in kivitendo
2720
            nur unter Bemerkungen erfasst werden.</para>
2734
            <para>Bezieht sich ein verbuchter Beleg auf einen Zeitpunkt, der
2735
            nicht mit dem Buchungsdatum übereinstimmt, so kann dieses Datum
2736
            momentan in kivitendo nur unter Bemerkungen erfasst werden.</para>
2721 2737

  
2722
            <para>Möglicherweise wird für solche Fälle in einer späteren Version von
2723
            kivitendo ein dritter Datumswert für Buchungen erstellt. (Beispiel:
2724
            Einkaufsbeleg stammt aus einem früheren Jahr, das bereits
2725
            buchhaltungstechnisch abgeschlossen wurde, und muss deshalb später
2726
            verbucht werden.)</para>
2738
            <para>Möglicherweise wird für solche Fälle in einer späteren
2739
            Version von kivitendo ein dritter Datumswert für Buchungen
2740
            erstellt. (Beispiel: Einkaufsbeleg stammt aus einem früheren Jahr,
2741
            das bereits buchhaltungstechnisch abgeschlossen wurde, und muss
2742
            deshalb später verbucht werden.)</para>
2727 2743
          </listitem>
2728 2744
        </itemizedlist>
2729 2745
      </sect2>
......
2814 2830
        eingestellt werden.</para>
2815 2831

  
2816 2832
        <para>Für die Schweiz sind folgende Einstellungen üblich:
2817
		<itemizedlist>
2833
        <itemizedlist>
2818 2834
            <listitem>
2819
				<para>Sollversteuerung</para>
2835
              <para>Sollversteuerung</para>
2820 2836
            </listitem>
2837

  
2821 2838
            <listitem>
2822
				<para>Aufwandsmethode</para>
2823
			</listitem>
2824
			<listitem>
2825
				<para>Bilanzierung</para>
2826
			</listitem>
2827
		</itemizedlist>
2828
		Diese Einstellungen werden automatisch beim Erstellen einer neuen
2829
		Datenbank vorausgewählt, wenn in <filename>config/kivitendo.conf</filename> unter
2830
		<varname>[system]</varname> <literal>default_manager = swiss</literal> eingestellt ist.
2831
        </para>
2839
              <para>Aufwandsmethode</para>
2840
            </listitem>
2841

  
2842
            <listitem>
2843
              <para>Bilanzierung</para>
2844
            </listitem>
2845
          </itemizedlist> Diese Einstellungen werden automatisch beim
2846
        Erstellen einer neuen Datenbank vorausgewählt, wenn in
2847
        <filename>config/kivitendo.conf</filename> unter
2848
        <varname>[system]</varname> <literal>default_manager = swiss</literal>
2849
        eingestellt ist.</para>
2832 2850

  
2833 2851
        <para>Beim Upgrade bestehender Mandanten wird eur ausgelesen und die
2834 2852
        Variablen werden so gesetzt, daß sich an der Funktionalität nichts
......
2907 2925

  
2908 2926
        <para>Die folgenden Schritte sind notwendig, um das Konto manuell
2909 2927
        anzulegen und zu konfigurieren. Zuerst wird in
2910
        <guimenu>System</guimenu> →
2911
        <guisubmenu>Kontenübersicht</guisubmenu> → <guimenuitem>Konto
2912
        erfassen</guimenuitem> das Konto angelegt.</para>
2928
        <guimenu>System</guimenu> → <guisubmenu>Kontenübersicht</guisubmenu> →
2929
        <guimenuitem>Konto erfassen</guimenuitem> das Konto angelegt.</para>
2913 2930

  
2914 2931
        <screenshot>
2915 2932
          <screeninfo>Konto 3804 erfassen</screeninfo>
......
2940 2957

  
2941 2958
        <para>Als Drittes wird ein neuer Eintrag mit Steuerschlüssel 13 für
2942 2959
        Konto 3804 (19%) angelegt. Dazu unter <guimenu>System</guimenu> →
2943
        <guisubmenu>Steuern</guisubmenu> →
2944
        <guimenuitem>Erfassen</guimenuitem> auswählen und die Werte aus dem
2945
        Screenshot übernehmen.</para>
2960
        <guisubmenu>Steuern</guisubmenu> → <guimenuitem>Erfassen</guimenuitem>
2961
        auswählen und die Werte aus dem Screenshot übernehmen.</para>
2946 2962

  
2947 2963
        <screenshot>
2948 2964
          <screeninfo>Steuerschlüssel 13 für 3804 (19%) anlegen</screeninfo>
......
3045 3061
    </sect1>
3046 3062

  
3047 3063
    <sect1 id="config.erfolgsrechnung">
3048
	  <title>Erfolgsrechnung</title>
3049

  
3050
	  <para>Seit der Version 3.4.1 existiert in kivitendo der Bericht <emphasis role="bold">
3051
	  Erfolgsrechnung</emphasis>.</para>
3052

  
3053
	  <para>Die Erfolgsrechnung kann in der Mandantenkonfiguration unter Features
3054
	  an- oder abgeschaltet werden. Mit der Einstellung <varname>default_manager = swiss
3055
	  </varname> in der <filename>config/kivitendo.conf</filename> wird beim neu Erstellen
3056
	  einer Datenbank automatisch die Anzeige der Erfolgsrechnung im Menü <guimenu>Berichte
3057
	  </guimenu> ausgewählt und ersetzt dort die GUV.</para>
3058

  
3059
	  <para>Im Gegensatz zur GUV werden bei der Erfolgsrechnung sämtliche Aufwands- und
3060
	  Erlöskonten einzeln aufgelistet (analog zur Bilanz), sortiert nach ERTRAG und AUFWAND.</para>
3061

  
3062
	  <para>Bei den Konteneinstellungen muss bei jedem Konto, das in der Erfolgsrechnung
3063
	  erscheinen soll, unter <varname>Sonstige Einstellungen/Erfolgsrechnung</varname>
3064
	  entweder <literal>01.Ertrag</literal> oder <literal>06.Aufwand</literal>  ausgewählt
3065
	  werden.</para>
3066

  
3067
	  <para>Wird bei einem Erlöskonto <literal>06.Aufwand</literal> ausgewählt,
3068
	  so wird dieses Konto als Aufwandsminderung unter AUFWAND aufgelistet.</para>
3069

  
3070
	  <para>Wird bei einem Aufwandskonto <literal>01.Ertrag</literal> ausgewählt,
3071
	  so wird dieses Konto als Ertragsminderung unter ERTRAG aufgelistet.</para>
3072

  
3073
	  <para>Soll bei einer bereits bestehenden Buchhaltung in Zukunft zusätzlich
3074
	  die Erfolgsrechnung als Bericht verwendet werden, so müssen die Einstellungen
3075
	  zu allen Erlös- und Aufwandskonten unter <varname>Sonstige
3076
	  Einstellungen/Erfolgsrechnung</varname> überprüft und allenfalls neu gesetzt werden.</para>
3064
      <title>Erfolgsrechnung</title>
3065

  
3066
      <para>Seit der Version 3.4.1 existiert in kivitendo der Bericht
3067
      <emphasis role="bold"> Erfolgsrechnung</emphasis>.</para>
3068

  
3069
      <para>Die Erfolgsrechnung kann in der Mandantenkonfiguration unter
3070
      Features an- oder abgeschaltet werden. Mit der Einstellung
3071
      <varname>default_manager = swiss </varname> in der
3072
      <filename>config/kivitendo.conf</filename> wird beim neu Erstellen einer
3073
      Datenbank automatisch die Anzeige der Erfolgsrechnung im Menü
3074
      <guimenu>Berichte </guimenu> ausgewählt und ersetzt dort die GUV.</para>
3075

  
3076
      <para>Im Gegensatz zur GUV werden bei der Erfolgsrechnung sämtliche
3077
      Aufwands- und Erlöskonten einzeln aufgelistet (analog zur Bilanz),
3078
      sortiert nach ERTRAG und AUFWAND.</para>
3079

  
3080
      <para>Bei den Konteneinstellungen muss bei jedem Konto, das in der
3081
      Erfolgsrechnung erscheinen soll, unter <varname>Sonstige
3082
      Einstellungen/Erfolgsrechnung</varname> entweder
3083
      <literal>01.Ertrag</literal> oder <literal>06.Aufwand</literal>
3084
      ausgewählt werden.</para>
3085

  
3086
      <para>Wird bei einem Erlöskonto <literal>06.Aufwand</literal>
3087
      ausgewählt, so wird dieses Konto als Aufwandsminderung unter AUFWAND
3088
      aufgelistet.</para>
3089

  
3090
      <para>Wird bei einem Aufwandskonto <literal>01.Ertrag</literal>
3091
      ausgewählt, so wird dieses Konto als Ertragsminderung unter ERTRAG
3092
      aufgelistet.</para>
3093

  
3094
      <para>Soll bei einer bereits bestehenden Buchhaltung in Zukunft
3095
      zusätzlich die Erfolgsrechnung als Bericht verwendet werden, so müssen
3096
      die Einstellungen zu allen Erlös- und Aufwandskonten unter
3097
      <varname>Sonstige Einstellungen/Erfolgsrechnung</varname> überprüft und
3098
      allenfalls neu gesetzt werden.</para>
3077 3099
    </sect1>
3078 3100

  
3079 3101
    <sect1 id="config.rounding">
3080
	  <title>Rundung in Verkaufsbelegen</title>
3102
      <title>Rundung in Verkaufsbelegen</title>
3081 3103

  
3082
	  <para>In der Schweiz hat die kleinste aktuell benutzte Münze den Wert von 5 Rappen (0.05 CHF).</para>
3104
      <para>In der Schweiz hat die kleinste aktuell benutzte Münze den Wert
3105
      von 5 Rappen (0.05 CHF).</para>
3083 3106

  
3084
	  <para>Auch wenn im elektronischen Zahlungsverkehr Beträge mit einer Genauigkeit
3085
	  von 0.01 CHF verwendet werden können, ist es trotzdem nach wie vor üblich,
3086
	  Rechnungen mit auf 0.05 CHF gerundeten Beträgen auszustellen.</para>
3107
      <para>Auch wenn im elektronischen Zahlungsverkehr Beträge mit einer
3108
      Genauigkeit von 0.01 CHF verwendet werden können, ist es trotzdem nach
3109
      wie vor üblich, Rechnungen mit auf 0.05 CHF gerundeten Beträgen
3110
      auszustellen.</para>
3087 3111

  
3088
	  <para>In kivitendo kann seit der Version 3.4.1 die Einstellung für eine solche
3089
	  Rundung pro Mandant / Datenbank festgelegt werden.</para>
3112
      <para>In kivitendo kann seit der Version 3.4.1 die Einstellung für eine
3113
      solche Rundung pro Mandant / Datenbank festgelegt werden.</para>
3090 3114

  
3091
	  <para>Die Einstellung wird beim Erstellen der Datenbank bei <literal>Genauigkeit</literal>
3092
	  festgelegt. Sie kann anschliessend über das Webinterface von kivitendo nicht mehr
3093
	  verändert werden.</para>
3115
      <para>Die Einstellung wird beim Erstellen der Datenbank bei
3116
      <literal>Genauigkeit</literal> festgelegt. Sie kann anschliessend über
3117
      das Webinterface von kivitendo nicht mehr verändert werden.</para>
3094 3118

  
3095
	  <para>Abhängig vom Wert für <varname>default_manager</varname> in
3096
	  <filename>config/kivitendo.conf</filename> werden dabei folgende
3097
	  Werte voreingestellt:</para>
3098
	  <itemizedlist>
3119
      <para>Abhängig vom Wert für <varname>default_manager</varname> in
3120
      <filename>config/kivitendo.conf</filename> werden dabei folgende Werte
3121
      voreingestellt:</para>
3122

  
3123
      <itemizedlist>
3099 3124
        <listitem>
3100 3125
          <para>0.05 (default_manager = swiss)</para>
3101 3126
        </listitem>
3127

  
3102 3128
        <listitem>
3103 3129
          <para>0.01 (default_manager = german)</para>
3104 3130
        </listitem>
3105 3131
      </itemizedlist>
3132

  
3106 3133
      <para>Der Wert wird in der Datenbank in der Tabelle <varname>defaults
3107 3134
      </varname>in der Spalte <varname>precision</varname> gespeichert.</para>
3108 3135

  
3109 3136
      <para>In allen Verkaufsangeboten, Verkaufsaufträgen, Verkaufsrechnungen
3110
      und Verkaufsgutschriften wird der Endbetrag inkl. MWST gerundet,
3111
      wenn dieser nicht der eingestellten Genauigkeit entspricht.</para>
3137
      und Verkaufsgutschriften wird der Endbetrag inkl. MWST gerundet, wenn
3138
      dieser nicht der eingestellten Genauigkeit entspricht.</para>
3112 3139

  
3113 3140
      <para>Beim Buchen einer Verkaufsrechnung wird der Rundungsbetrag
3114 3141
      automatisch auf die in der Mandantenkonfiguration festgelegten
3115
      Standardkonten für Rundungserträge bzw. Rundungsaufwendungen gebucht.</para>
3142
      Standardkonten für Rundungserträge bzw. Rundungsaufwendungen
3143
      gebucht.</para>
3116 3144

  
3117
      <para>(Die berechnete MWST wird durch den Rundungsbetrag nicht mehr verändert.)</para>
3145
      <para>(Die berechnete MWST wird durch den Rundungsbetrag nicht mehr
3146
      verändert.)</para>
3118 3147

  
3119 3148
      <para>Die in den Druckvorlagen zur Verfügung stehenden Variablen
3120 3149
      <varname>quototal</varname>, <varname>ordtotal</varname> bzw.
3121 3150
      <varname>invtotal</varname> enthalten den gerundeten Betrag.</para>
3122 3151

  
3123
      <para><emphasis role="bold">Achtung:</emphasis> Werden Verkaufsbelege
3124
      in anderen Währungen als der Standardwährung erstellt, so muss in
3125
      kivitendo ab Version 3.4.1 die Genauigkeit 0.01 verwendet werden.</para>
3126
      <para>Das heisst, Firmen in der Schweiz, die teilweise Verkaufsrechnungen
3127
      in Euro oder anderen Währungen erstellen wollen, müssen beim Erstellen
3128
      der Datenbank als Genauigkeit 0.01 wählen und können zur Zeit die
3129
      5er Rundung noch nicht nutzen.</para>
3152
      <para><emphasis role="bold">Achtung:</emphasis> Werden Verkaufsbelege in
3153
      anderen Währungen als der Standardwährung erstellt, so muss in kivitendo
3154
      ab Version 3.4.1 die Genauigkeit 0.01 verwendet werden.</para>
3155

  
3156
      <para>Das heisst, Firmen in der Schweiz, die teilweise
3157
      Verkaufsrechnungen in Euro oder anderen Währungen erstellen wollen,
3158
      müssen beim Erstellen der Datenbank als Genauigkeit 0.01 wählen und
3159
      können zur Zeit die 5er Rundung noch nicht nutzen.</para>
3130 3160
    </sect1>
3131 3161

  
3132 3162
    <sect1 id="config.client">
......
3642 3672
        linkend="dokumentenvorlagen-und-variablen.tag-style"/>).</para>
3643 3673

  
3644 3674
        <para>kivitendo unterstützt LaTeX-, HTML- und OpenDocument-Vorlagen.
3645
        Sofern es nicht ausdrücklich eingeschränkt wird, gilt das im
3646
        Folgenden gesagte für alle Vorlagenarten.</para>
3675
        Sofern es nicht ausdrücklich eingeschränkt wird, gilt das im Folgenden
3676
        gesagte für alle Vorlagenarten.</para>
3647 3677

  
3648 3678
        <para>Insgesamt sind technisch gesehen eine ganze Menge mehr Variablen
3649 3679
        verfügbar als hier aufgelistet werden. Die meisten davon können
......
4937 4967
              <term><varname>rounding</varname></term>
4938 4968

  
4939 4969
              <listitem>
4940
                <para>Betrag, um den <varname>invtotal</varname> gerundet wurde
4941
                (kann positiv oder negativ sein)</para>
4970
                <para>Betrag, um den <varname>invtotal</varname> gerundet
4971
                wurde (kann positiv oder negativ sein)</para>
4942 4972
              </listitem>
4943 4973
            </varlistentry>
4944 4974

  
......
5415 5445
        <sect3 id="dokumentenvorlagen-und-variablen.dunning-allgemein">
5416 5446
          <title>Allgemeine Variablen in Mahnungen</title>
5417 5447

  
5418
          <para>Die Variablen des Bearbeiters, bzw. Verkäufers stehen wie gewohnt als
5419
          <varname>employee_...</varname> bzw. <varname>salesman_...</varname> zur Verfügung.
5420
          Werden mehrere Rechnungen in einer Mahnung zusammengefasst, so werden
5421
          die Metadaten (Bearbeiter, Abteilung, etc) der ersten angemahnten Rechnung
5422
          im Ausdruck genommen.</para>
5423
          <para>Die Adressdaten des Kunden stehen als Variablen <varname>name</varname>,
5424
          <varname>street</varname>, <varname>zipcode</varname>,
5425
          <varname>city</varname>, <varname>country</varname>,
5426
          <varname>department_1</varname>, <varname>department_2</varname>,
5427
          und <varname>email</varname> zur Verfügung. Der Ansprechpartner <varname>cp_...</varname>
5428
          steht auch zu Verfügung, wird allerdings auch nur von der ersten angemahnten Rechnung (s.o.)
5429
          genommen.</para>
5448
          <para>Die Variablen des Bearbeiters, bzw. Verkäufers stehen wie
5449
          gewohnt als <varname>employee_...</varname> bzw.
5450
          <varname>salesman_...</varname> zur Verfügung. Werden mehrere
5451
          Rechnungen in einer Mahnung zusammengefasst, so werden die Metadaten
5452
          (Bearbeiter, Abteilung, etc) der ersten angemahnten Rechnung im
5453
          Ausdruck genommen.</para>
5454

  
5455
          <para>Die Adressdaten des Kunden stehen als Variablen
5456
          <varname>name</varname>, <varname>street</varname>,
5457
          <varname>zipcode</varname>, <varname>city</varname>,
5458
          <varname>country</varname>, <varname>department_1</varname>,
5459
          <varname>department_2</varname>, und <varname>email</varname> zur
5460
          Verfügung. Der Ansprechpartner <varname>cp_...</varname> steht auch
5461
          zu Verfügung, wird allerdings auch nur von der ersten angemahnten
5462
          Rechnung (s.o.) genommen.</para>
5430 5463

  
5431 5464
          <para>Weitere Variablen beinhalten:</para>
5432 5465

  
......
6284 6317
    </sect1>
6285 6318

  
6286 6319
    <sect1 id="features.warehouse">
6287

  
6288

  
6289 6320
      <title>Mandantenkonfiguration Lager</title>
6290 6321

  
6291
      <para>
6292
       Die Lagerverwaltung in kivitendo funktioniert standardmässig wie folgt: Wird ein Lager mit einem Lagerplatz angelegt, so gibt es die
... Dieser Diff wurde abgeschnitten, weil er die maximale Anzahl anzuzeigender Zeilen überschreitet.

Auch abrufbar als: Unified diff