}
undef $update_p->{partNumber}; # we dont need this one
$ret = $self->connector->PATCH('api/product/' . $one_d->{id}, to_json($update_p));
- die "Updating part with " . $part->partnumber . " failed: " . $ret->responseContent() unless (204 == $ret->responseCode());
+ unless (204 == $ret->responseCode()) {
+ die t8('Part Description is too long for this Shopware version. It should have lower than 255 characters.')
+ if $ret->responseContent() =~ m/Diese Zeichenkette ist zu lang. Sie sollte.*255 Zeichen/;
+ die "Updating part with " . $part->partnumber . " failed: " . $ret->responseContent() unless (204 == $ret->responseCode());
+ }
} else {
# create part
# 1. get the correct tax for this product
my ($product_id, $category_tree);
try {
$product_id = from_json($ret->responseContent())->{data}->[0]->{id};
- $category_tree = from_json($ret->responseContent())->{data}->[0]->{categoryTree};
+ $category_tree = from_json($ret->responseContent())->{data}->[0]->{categoryIds};
} catch { die "Malformed JSON Data: $_ " . $ret->responseContent(); };
my $cat;
# if the part is connected to a category at all
sub set_orderstatus {
my ($self, $order_id, $transition) = @_;
- croak "No order ID, should be in format [0-9a-f]{32}" unless $order_id =~ m/^[0-9a-f]{32}$/;
- croak "NO valid transition value" unless $transition =~ m/(open|process|cancel|complete)/;
+ # one state differs
+ $transition = 'complete' if $transition eq 'completed';
+
+ croak "No shop order ID, should be in format [0-9a-f]{32}" unless $order_id =~ m/^[0-9a-f]{32}$/;
+ croak "NO valid transition value" unless $transition =~ m/(open|process|cancel|complete)/;
my $ret;
$ret = $self->connector->POST("/api/_action/order/$order_id/state/$transition");
my $response_code = $ret->responseCode();
sub init_connector {
my ($self) = @_;
- my $client = REST::Client->new(host => $self->config->server);
+ my $protocol = $self->config->server =~ /(^https:\/\/|^http:\/\/)/ ? '' : $self->config->protocol . '://';
+ my $client = REST::Client->new(host => $protocol . $self->config->server);
+
+ $client->getUseragent()->proxy([$self->config->protocol], $self->config->proxy) if $self->config->proxy;
$client->addHeader('Content-Type', 'application/json');
$client->addHeader('charset', 'UTF-8');
$client->addHeader('Accept', 'application/json');
foreach my $pos (@positions) {
$position++;
my $price = $::form->round_amount($pos->{unitPrice}, 2); # unit
- my %pos_columns = ( description => $pos->{product}->{description},
+ my %pos_columns = ( description => $pos->{product}->{name},
partnumber => $pos->{product}->{productNumber},
price => $price,
quantity => $pos->{quantity},
Specific Implementation notes:
=over 4
-=item * Calls sync_all_images with set_cover = 1 and delete_orphaned = 1
+=item Calls sync_all_images with set_cover = 1 and delete_orphaned = 1
-=item * Checks if longdescription should be taken from part or shop_part
+=item Checks if longdescription should be taken from part or shop_part
-=item * Checks if a language with the name 'Englisch' or template_code 'en'
+=item Checks if a language with the name 'Englisch' or template_code 'en'
is available and sets the shopware6 'en-GB' locales for the product
-=back
-
=item C<sync_all_images (set_cover: 0|1, delete_orphaned: 0|1)>
The connecting key for shopware to kivi images is the image name.
More on media and Shopware6 can be found here:
https://shopware.stoplight.io/docs/admin-api/ZG9jOjEyNjI1Mzkw-media-handling
+=back
+
+=over 4
=item C<get_article>
Many error messages are thrown, but at least the more common cases should be localized.
+=item * Multi language support
+
+By guessing the correct german name for the english language some translation for parts can
+also be synced. This should be more clear (language configuration for shops) and the order
+synchronisation should also handle this (longdescription is simply copied from part.notes)
+
=back
=head1 AUTHOR