update importer to do price tiers and tags
authorTony Cook <tony@develop-help.com>
Fri, 27 Apr 2012 06:10:50 +0000 (16:10 +1000)
committerTony Cook <tony@develop-help.com>
Fri, 27 Apr 2012 06:10:50 +0000 (16:10 +1000)
and briefly document the thing so I don't need to reverse engineer
it each time.

MANIFEST
site/cgi-bin/modules/BSE/ImportTargetArticle.pm
site/cgi-bin/modules/BSE/ImportTargetProduct.pm
site/cgi-bin/modules/BSE/Importer.pm
site/docs/bse_import.pod [new file with mode: 0644]

index 4a425b6..eeb502c 100644 (file)
--- a/MANIFEST
+++ b/MANIFEST
@@ -369,6 +369,7 @@ site/docs/bse-unicode.pod
 site/docs/bse.html
 site/docs/bse.pod
 site/docs/BSE::UI::Affiliate.html
+site/docs/bse_import.pod
 site/docs/bsedbschema.odt
 site/docs/bsedbschema.pdf
 site/docs/bugs.html
index 3cc69af..76af2a3 100644 (file)
@@ -6,7 +6,7 @@ use Articles;
 use Products;
 use OtherParents;
 
-our $VERSION = "1.000";
+our $VERSION = "1.001";
 
 sub new {
   my ($class, %opts) = @_;
@@ -90,6 +90,15 @@ sub make_leaf {
 sub fill_leaf {
   my ($self, $importer, $leaf, %entry) = @_;
 
+  if ($entry{tags}) {
+print "Setting tags $leaf->{id}: $entry{tags}\n";
+    my @tags = split '/', $entry{tags};
+    my $error;
+    unless ($leaf->set_tags(\@tags, \$error)) {
+      die "Error setting tags: $error";
+    }
+  }
+
   return 1;
 }
 
index 9cd8ed4..fe32f06 100644 (file)
@@ -6,8 +6,9 @@ use Articles;
 use Products;
 use BSE::TB::ProductOptions;
 use BSE::TB::ProductOptionValues;
+use BSE::TB::PriceTiers;
 
-our $VERSION = "1.000";
+our $VERSION = "1.001";
 
 sub new {
   my ($class, %opts) = @_;
@@ -26,6 +27,8 @@ sub new {
   defined $map->{retailPrice}
     or die "No retailPrice mapping found\n";
 
+  $self->{price_tiers} = +{ map { $_->id => $_ } BSE::TB::PriceTiers->all };
+
   return $self;
 }
 
@@ -114,6 +117,20 @@ sub fill_leaf {
        );
     }
   }
+
+  my %prices;
+  for my $tier_id (keys %{$self->{price_tiers}}) {
+    my $price = $entry{"tier_price_$tier_id"};
+    if (defined $price && $price =~ /\d/) {
+      $price =~ s/\$//; # in case
+      $price *= 100 if $self->{price_dollar};
+
+      $prices{$tier_id} = $price;
+    }
+  }
+
+  $leaf->set_prices(\%prices);
+
   return $self->SUPER::fill_leaf($importer, $leaf, %entry);
 }
 
index b729a08..936c797 100644 (file)
@@ -2,7 +2,7 @@ package BSE::Importer;
 use strict;
 use Config;
 
-our $VERSION = "1.000";
+our $VERSION = "1.001";
 
 sub new {
   my ($class, %opts) = @_;
@@ -49,7 +49,13 @@ sub new {
     (my $out = $xform) =~ s/^xform_//;
     $map{$out}
       or die "Xform for $out but no mapping\n";
-    my $code = "sub { (local \$_, my \$product) = \@_; \n".$ids{$xform}."\n; return \$_ }";
+    my $code = <<EOS;
+sub { (local \$_, my \$product) = \@_;
+#line 1 "Xform $xform code"
+$ids{$xform};
+return \$_
+}
+EOS
     my $sub = eval $code;
     $sub
       or die "Compilation error for $xform code: $@\n";
diff --git a/site/docs/bse_import.pod b/site/docs/bse_import.pod
new file mode 100644 (file)
index 0000000..355a43f
--- /dev/null
@@ -0,0 +1,168 @@
+=head1 NAME
+
+bse_import.pod - importing products into BSE
+
+=head1 DESCRIPTION
+
+=head1 CONFIGURATION
+
+Section C<< [import profile I<profilename>] >>.
+
+=over
+
+=item *
+
+map_I<fieldname> = input column number (starting from 1)
+
+=item *
+
+set_I<fieldname> = set the given field to a value
+
+=item *
+
+xform_I<fieldname> - code to proceess the column, with $_ set to
+value from map / set, $product set to a hash with the other values
+set.  Result is the value in $_.  Run after map_* and set_*.
+
+=item *
+
+file_path - path_sep (almost always ":") separated list of locations
+to search for image files
+
+=item *
+
+source - type of input format, default and currently only XLS.
+
+=item *
+
+target - type of output record, default Product, can currently be
+Article or Product.
+
+=item *
+
+cat1, cat2, cat3 - catalog names
+
+=back
+
+=head2 XLS source
+
+Configuration:
+
+=over
+
+=item *
+
+sheet - sheet number to import from
+
+=item *
+
+skiprows - number of rows to skip (eg. header rows)
+
+=back
+
+=head2 Article imports
+
+=head3 Configuration
+
+=over
+
+=item *
+
+codes - use the "code_field" to identify the existing article.
+Default false.
+
+=item *
+
+code_field - the name of the input field to identify an existing
+article or title.  Default "product_code" for products, "linkAlias"
+for articles.
+
+=item *
+
+ignore_missing - ignore missing image files.  Default: 1.
+
+=item *
+
+reset_images - reset images for an article being imported.  Default: 0.
+
+=item *
+
+reset_steps - reset step parents for an article being imported.  Default: 0.
+
+=back
+
+=head3 Special article field names
+
+=over
+
+=item *
+
+image1_file .. image10_file - name of an image file found in 
+
+=item *
+
+imageI<N>_alt, imageI<N>_name, imageI<N>_url, imageI<N>_storage - set
+the appropriate fields for an image
+
+=item *
+
+step1 .. step10 - step parent id or linkAlias
+
+=item *
+
+tags - / separated list of article tags
+
+=back
+
+=head2 Product imports
+
+=head3 Configuration
+
+All article config also applies here.
+
+=over
+
+=item *
+
+price_dollar - prices are in dollars (default: 0)
+
+=item *
+
+product_template - template name for products (default: system default)
+
+=item *
+
+catalog_template - template for catalogs (default: system default)
+
+=item *
+
+prodopt_value_sep - separator for product options (default: "!")
+
+=item *
+
+reset_prodopts - reset product options when updating a product (true)
+
+=back
+
+=head3 Special product field names
+
+A mapping for C<retailPrice> is B<required>.
+
+=over
+
+=item *
+
+tier_price_I<N> - price for tier id I<N>
+
+=item *
+
+prodopt1_name .. prodopt5_name - names of product options
+
+=item *
+
+prodopt1_values .. prodopt5_values - values for the product option
+(separated by ! by default, see prodopt_value_sep.
+
+=back
+
+=cut