view release on metacpan or search on metacpan
lib/Amazon/MWS/XML/ShippedOrder.pm
Makefile.PL
MANIFEST This list of files
MANIFEST.SKIP
README
t/client.t
t/enumeration.t
t/error-parsing.t
t/errors.t
t/feeds.t
t/job-selection.t
t/jobs.txt
t/manifest.t
t/order-reports.t
t/orders.t
t/pod-coverage.t
t/pod.t
t/product-filtering.t
t/shipping-confirmation.t
t/SubmitFeed.t
t/uploader.t
lib/Amazon/MWS/Uploader.pm view on Meta::CPAN
return unless %codes;
return {
negate => $negate,
codes => \%codes,
};
}
=item force
Same as above, but only for the selected items. An arrayref is
expected here with the B<skus>.
=cut
has force => (is => 'ro',
isa => ArrayRef,
);
has _force_hashref => (is => 'lazy');
lib/Amazon/MWS/Uploader.pm view on Meta::CPAN
is => 'ro',
default => sub {
return SQL::Abstract->new;
}
);
has existing_products => (is => 'lazy');
sub _build_existing_products {
my $self = shift;
my $sth = $self->_exe_query($self->sqla->select(amazon_mws_products => [qw/sku
timestamp_string
status
listed
error_code
/],
{
status => { -not_in => [qw/deleted/] },
shop_id => $self->_unique_shop_id,
}));
my %uploaded;
lib/Amazon/MWS/Uploader.pm view on Meta::CPAN
sku => $p->sku,
shop_id => $self->_unique_shop_id,
);
my %data = (
amws_job_id => $job_id,
status => 'pending',
warnings => '', # clear out
timestamp_string => $p->timestamp_string,
);
my $check = $self
->_exe_query($self->sqla->select(amazon_mws_products => [qw/sku/], { %identifier }));
my $existing = $check->fetchrow_hashref;
$check->finish;
if ($existing) {
$self->_exe_query($self->sqla->update(amazon_mws_products => \%data, \%identifier));
}
else {
$self->_exe_query($self->sqla->insert(amazon_mws_products => { %identifier, %data }));
}
}
}
lib/Amazon/MWS/Uploader.pm view on Meta::CPAN
}
}
else {
die "Argument must be either a scalar with a job name and/or "
. "an hashref with additional filters!";
}
}
if (@named_jobs) {
$additional{amws_job_id} = { -in => \@named_jobs };
}
my ($stmt, @bind) = $self->sqla->select(amazon_mws_jobs => '*',
{
%additional,
aborted => 0,
success => 0,
shop_id => $self->_unique_shop_id,
},
{ -asc => 'job_started_epoch'});
my $pending = $self->_exe_query($stmt, @bind);
my %jobs;
while (my $row = $pending->fetchrow_hashref) {
lib/Amazon/MWS/Uploader.pm view on Meta::CPAN
=cut
sub process_feeds {
my ($self, $row) = @_;
# print Dumper($row);
# upload the feeds one by one and stop if something is blocking
my $job_id = $row->{amws_job_id};
print "Processing job $job_id\n";
# query the feeds table for this job
my ($stmt, @bind) = $self->sqla->select(amazon_mws_feeds => '*',
{
amws_job_id => $job_id,
aborted => 0,
success => 0,
shop_id => $self->_unique_shop_id,
},
['amws_feed_pk']);
my $sth = $self->_exe_query($stmt, @bind);
my $unfinished;
while (my $feed = $sth->fetchrow_hashref) {
last unless $self->upload_feed($feed);
}
$sth->finish;
($stmt, @bind) = $self->sqla->select(amazon_mws_feeds => '*',
{
shop_id => $self->_unique_shop_id,
amws_job_id => $job_id,
});
$sth = $self->_exe_query($stmt, @bind);
my ($total, $success, $aborted) = (0, 0, 0);
# query again and check if we have aborted jobs;
lib/Amazon/MWS/Uploader.pm view on Meta::CPAN
order.
Return the row for this table (as an hashref) if present, nothing
underwise.
=cut
sub order_already_registered {
my ($self, $order) = @_;
die "Bad usage, missing order" unless $order;
my $sth = $self->_exe_query($self->sqla->select(amazon_mws_orders => '*',
{
amazon_order_id => $order->amazon_order_number,
shop_id => $self->_unique_shop_id,
}));
if (my $exists = $sth->fetchrow_hashref) {
$sth->finish;
return $exists;
}
else {
return;
lib/Amazon/MWS/Uploader.pm view on Meta::CPAN
=cut
sub delete_skus {
my ($self, @skus) = @_;
return unless @skus;
print "Trying to purge missing items " . join(" ", @skus) . "\n";
# delete only products which are not in pending status
my $check = $self
->_exe_query($self->sqla
->select('amazon_mws_products', [qw/sku status/],
{
sku => { -in => \@skus },
shop_id => $self->_unique_shop_id,
}));
my %our_skus;
while (my $p = $check->fetchrow_hashref) {
$our_skus{$p->{sku}} = $p->{status};
}
my @checked;
while (@skus) {
lib/Amazon/MWS/Uploader.pm view on Meta::CPAN
if (%update) {
$self->_exe_query($self->sqla->update('amazon_mws_orders',
\%update,
{ amws_job_id => $job_id,
shop_id => $self->_unique_shop_id }));
}
else {
warn "register_order_ack_errors couldn't parse " . Dumper($result);
}
# then get the amazon order number and recheck
my $sth = $self->_exe_query($self->sqla->select('amazon_mws_orders',
[qw/amazon_order_id
shop_order_id
/],
{
amws_job_id => $job_id,
shop_id => $self->_unique_shop_id,
}));
my ($amw_order_number, $shop_order_id) = $sth->fetchrow_array;
if ($sth->fetchrow_array) {
warn "Multiple jobs found for $job_id in amazon_mws_orders!";
lib/Amazon/MWS/Uploader.pm view on Meta::CPAN
=head2 skus_in_job($job_id)
Check the amazon_mws_product for the SKU which were uploaded by the
given job ID.
=cut
sub skus_in_job {
my ($self, $job_id) = @_;
my $sth = $self->_exe_query($self->sqla->select('amazon_mws_products',
[qw/sku/],
{
amws_job_id => $job_id,
shop_id => $self->_unique_shop_id,
}));
my @skus;
while (my $row = $sth->fetchrow_hashref) {
push @skus, $row->{sku};
}
return @skus;
lib/Amazon/MWS/Uploader.pm view on Meta::CPAN
with the order.
To see the status, check shipping_confirmation_ok (already done),
shipping_confirmation_error (faulty), shipping_confirmation_job_id (pending).
=cut
sub order_already_shipped {
my ($self, $order) = @_;
my $condition = $self->_condition_for_shipped_orders($order);
my $sth = $self->_exe_query($self->sqla->select(amazon_mws_orders => '*', $condition));
if (my $row = $sth->fetchrow_hashref) {
die "Multiple results found in amazon_mws_orders for " . Dumper($condition)
if $sth->fetchrow_hashref;
return $row;
}
else {
return;
}
}
lib/Amazon/MWS/Uploader.pm view on Meta::CPAN
This is implemented looking into amazon_mws_orders where there is no
shipping confirmation job id.
The confirmed flag (which means we acknowledged the order) is ignored
to avoid stuck order_ack jobs to prevent the shipping confirmation.
=cut
sub orders_waiting_for_shipping {
my $self = shift;
my $sth = $self->_exe_query($self->sqla->select('amazon_mws_orders',
[qw/amazon_order_id
shop_order_id/],
{
shop_id => $self->_unique_shop_id,
shipping_confirmation_job_id => undef,
# do not stop the unconfirmed to be considered
# confirmed => 1,
}));
my @out;
while (my $row = $sth->fetchrow_hashref) {
lib/Amazon/MWS/Uploader.pm view on Meta::CPAN
=head2 orders_in_shipping_job($job_id)
Lookup the C<amazon_mws_orders> table and return a list of
C<amazon_order_id> for the given shipping confirmation job. INTERNAL.
=cut
sub orders_in_shipping_job {
my ($self, $job_id) = @_;
die unless $job_id;
my $sth = $self->_exe_query($self->sqla->select(amazon_mws_orders => [qw/amazon_order_id/],
{
shipping_confirmation_job_id => $job_id,
shop_id => $self->_unique_shop_id,
}));
my @orders;
while (my $row = $sth->fetchrow_hashref) {
push @orders, $row->{amazon_order_id};
}
return @orders;
}
lib/Amazon/MWS/Uploader.pm view on Meta::CPAN
my %errors = (
status => 'failed',
error_msg => $product{error_msg} || 'shop error',
error_code => $product{error_code} || 1,
timestamp_string => $product{timestamp_string},
);
# check if we have it
my $sth = $self->_exe_query($self->sqla
->select('amazon_mws_products',
[qw/sku/], { %identifier }));
if ($sth->fetchrow_hashref) {
$sth->finish;
print "Updating $product{sku} with error $product{error_msg}\n";
$self->_exe_query($self->sqla->update('amazon_mws_products',
\%errors, \%identifier));
}
else {
print "Inserting $identifier{sku} with error $errors{error_msg}\n";
$self->_exe_query($self->sqla
lib/Amazon/MWS/Uploader.pm view on Meta::CPAN
probably is not even meaningful. It is a big FeedSubmissionInfo with
the past feed submissions.
=cut
sub cancel_feed {
my ($self, $feed) = @_;
die "Missing feed id argument" unless $feed;
# do the api call
my $sth = $self->_exe_query($self->sqla
->select(amazon_mws_feeds => [qw/amws_job_id/],
{
shop_id => $self->_unique_shop_id,
feed_id => $feed,
aborted => 0,
success => 0,
processing_complete => 0,
}));
my $feed_record = $sth->fetchrow_hashref;
if ($feed_record) {
$sth->finish;
lib/Amazon/MWS/Uploader.pm view on Meta::CPAN
Check the order status on Amazon and update the row in the
amazon_mws_orders table.
=cut
sub update_amw_order_status {
my ($self, $order) = @_;
# first, check if it exists
return unless $order;
my $sth = $self->_exe_query($self->sqla->select('amazon_mws_orders',
'*',
{
amazon_order_id => $order,
shop_id => $self->_unique_shop_id,
}));
my $order_ref = $sth->fetchrow_hashref;
die "Multiple rows found for $order!" if $sth->fetchrow_hashref;
print Dumper($order_ref);
my $res = $self->client->GetOrder(AmazonOrderId => [$order]);
my $amazon_order;
lib/Amazon/MWS/Uploader.pm view on Meta::CPAN
=cut
sub get_products_with_error_code {
my ($self, @errcodes) = @_;
my $where = { '>' => 0 };
if (@errcodes) {
$where = { -in => \@errcodes };
}
my $sth = $self->_exe_query($self->sqla
->select('amazon_mws_products', '*',
{
status => { '!=' => 'deleted' },
shop_id => $self->_unique_shop_id,
error_code => $where,
},
[qw/error_code sku/]));
my @records;
while (my $row = $sth->fetchrow_hashref) {
push @records, $row;
}
return @records;
}
sub get_products_with_warnings {
my $self = shift;
my $sth = $self->_exe_query($self->sqla
->select('amazon_mws_products', '*',
{
status => 'ok',
shop_id => $self->_unique_shop_id,
warnings => { '!=' => '' },
},
[qw/sku warnings/]));
my @records;
while (my $row = $sth->fetchrow_hashref) {
push @records, $row;
}
lib/Amazon/MWS/Uploader.pm view on Meta::CPAN
aborted => 1,
success => 1,
},
],
);
if (my $shop_id = $self->shop_id) {
push @and, shop_id => $shop_id;
}
my $sth = $self->_exe_query($self->sqla
->select(amazon_mws_jobs => [qw/amws_job_id shop_id/],
[ -and => \@and ] ));
my @purge_jobs;
my $count = 0;
while (my $where = $sth->fetchrow_hashref) {
if ($limit) {
last if $count++ > $limit;
}
push @purge_jobs, $where;
}
$sth->finish;
lib/Amazon/MWS/XML/Product.pm view on Meta::CPAN
They has to be passed to the constructor
=over 4
=item sku
Mandatory.
=item feeds_needed([qw/product inventory price image variants/])
If set to an arrayref, output only the selected feeds.
=item timestamp_string
An arbitrary string (usually a timestamp) which identifies the
revision of the product.
=item ean
=item asin