Revision e66c12b7
Von Werner Hahn vor mehr als 7 Jahren hinzugefügt
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 |
Auch abrufbar als: Unified diff
Shopmodul: Bilder hochladen geht jetzt
Bestellungen überarbeitet, Teile aus dem ShowareConnector ausgelagert, da diese allgemeingültig auch für andere Connectoren sind
Typo