Use Sidebar LHS to navigate
For global help click here

Importing Articles Process

Table of Contents

Importing General Articles

Importing Stock Articles is required in the following situations

  1. Initial go live
  2. Taking on a new supplier with many products
  3. Supplier updates

The system has a standard layout that can be used to upload from excel

  1. Check your spreadsheet is in the layout attached (note column headings are important)
  2. Ensure all the following has been done already
    1. All the Article Categories in the spreadsheet have already been created in the system
    2. All suppliers have been created in the system - the supplier column contains the supplier code
    3. You have adhered to the field limit for all the fields being uploaded

Order Optimisation Cache

Orders use an optimisation cache that updates automatically as data ages

Administrators can update the cache manually anytime from the sales order screen

Soulfresh Global Pty Ltd 


Import to Test - before importing to live

To avoid a difficult process of removing the articles imported - first test the upload and the results you get in test.

Check some of the transactions you expect to make - sales orders, etc.

More than 7,000 rows (depending on the number of columns) may time out - so aim for about 3,500 at a time

How to import

To import Articles to the system - note you will need the Secure Feature "Is Stock Manager"

Drag the spreadsheet over the Stock Articles Screen

Action - Import Stock Articles

Then check the results.


Importing Articles using supplier specific layouts

If you have suppliers who regularly send you new or updated Article definitions in a particular format - then talk to us.  We can build a specific import routine for the spreadsheet they send you.

To import Articles to the system - note you will need a /wiki/spaces/SI/pages/33054890 with "Stock Manager" from Secure Features

  1. Navigate to "upload supplier Articles"
  2. Choose the supplier name (determines the spreadsheet expected layout and hence import routine to use)
  3. Drag the spreadsheet over the screen - choose load to server
  4. Action - Upload to supplier X
  5. Review the results

Column Headings for Standard Import Spreadsheets

Columns that do not match up with one of the import names will be ignored and the first line on the import result will be a list of the ignored columns

Useful Google Sheet calculations:

  1. Look for a material in the suppliers name (use named ranges) =INDEX(Materialresultlist,MATCH(TRUE,ISNUMBER(SEARCH(Materiallist,B2)),0))
    1. Note ensure the list of materials is sorted longest at the top - then "Shiny Red" will be found before "Red"
    2. Export from the item Profile for Material to find a list of possible values for that material
  2. If the supplier provides the name all in caps = Proper(a2)
    1. may need to adjust Ml to ml etc after


General Information

Measures

supplier relatedPricing RelatedFood RelatedclothingWarehouse related

SKU

  • Limit 20 Characters

packing factor

  • Number <=1
  • 2 decimal places

supplier name item OR supplier name part

  • Text

costprice

  • Default buy price per SKU

serving per pack OR ServingPerPack

size

Name

  • Text
  • Mandatory Field

pack size

  1. Whole Number

Supplier OR manufacturer

  1. Search code for supplier

av cost

Note - user must have Secure Features#CanSeeItemBuyPrice with qualifier > 0 in order to update

Note - a journal will be created for the value of the change unless "allow unjournalled stock adjustments" is ticked in Stock Control Settings

ingredients

sizeseq

description

  • Text

DimUnit

  1. mm, inch, m

their part number OR supplier part number

sellprice

  • Default Sell price per SKU

certification OR lifestyle

gender

short description

  • Text
widthBrand

RRP

  • per SKU

Serving Size

fabric

category

  • Bottom level product category - eg Fish / Fishbowls = Fishbowls
  • Mandatory Field
height

Range

  • Text - limit 50 characters

inner buy price

  • Price break special type of "Inner" - buy price

Claims

manuid

pack size

  • Whole number
  • Number of units in the SKU
depth

Warranty Period

  • Number of months

inner qty OR inner quantitiy

  • Price break special type of "Inner" - price break quantity.
  • Whole Number

NipServe

  1. yearSeasonId

UOM

  • Text describing the unit of measure - eg Carton of 50
  • Limit 20 characters

unit width


carton qty

  • Price break special type of "Carton" - price break quantity
  • Whole Number



unit qty OR unit quantity

  • Each, Each/Bulk, Pack, Other
unit depth

carton buy price

  • Price break special type of "Carton" - buy price



Colour

  • Text - max length 30
unit height

carton sell price

  • Price break special type of "Carton" - sell price



storage

  • donotstock
  • chilled
  • frozen
  • controlled
massunit

pallet qty OR pallet quantity

  • Price break special type of "Pallet" - price break quantity
  • Whole Number



name pkg OR name package

netmass

pallet buy price

  • Price break special type of "Pallet" - buy price



Xref OR extref OR ext ref

  • example code in previous system
grossmass

pallet sell price

  • Price break special type of "Pallet" - buy price



eanmeasure

alt buy price

  • Buy price in special circumstances = eg drop ship if different.



Barcodemeasure unit

gst

  • Ex - set Price-GST to ex-GST.

.




custom name

is Repairable

y


Buy/Sell?

  • Buy - Article is only bought but not sold



style group OR productgroup

  • Limit 30 characters


Packing Notes

column name has pack and notes




"Size" and "group" in column name

  • colour size group (same item in sizes and colour ranges)


Cart Status

column name has Cart Status

new = new

top = top

featured = featured

none = hidden 




assembly

  • JIT, Stock, Kit, Recipe


Buy and Sell

Buy = Buy

Sell = Sell

Buy Sell = Buy and Sell

rest = None (none)




color





webdescription

  • html content
  • Example
<ul style="line-height: 20.8px;">_x000D_
	<li>&nbsp; Poly/cotton/Spandex</li>_x000D_
	<li>&nbsp; Roll-up long-sleeve with 1-button tab</li>_x000D_
	<li>&nbsp; Double back yoke</li>_x000D_
	<li>&nbsp; Triple-needle stitching</li>_x000D_
	<li>&nbsp; 2 front pockets with flaps</li>_x000D_
	<li>&nbsp; Available in gray, white or black</li>_x000D_
	<li>&nbsp; Sizes S-2XL</li>_x000D_
</ul>_x000D_






  1. Import/update article from spreadsheet: Case and order of words in column headings is not important.

    1. Cartons Per Layer, Article form, Selling / Shipping / Warranty (new):

      1. Column heading must contain all words ‘sell cartons per layer'.

    2. Layers Per Pallet, Article form, Selling / Shipping / Warranty (new):

      1. Column heading must contain all words 'sell layers per pallet'.

    3. Qty 20 foot, Article form, Supplier Shipping / Purchase Receipting (changed):

      1. Column heading must contain all words 'purchase units per layer'.

    4. Qty 40 foot, Article form, Supplier Shipping / Purchase Receipting (changed):

      1. Column heading must contain all words 'purchase layers per pallet'.







ANY SIMPLE PROFILE TYPE = *Profilename

  • eg - item profile type = Material
    • Column is headed = *Material
    • Values can only be those defined
  • eg - item profile type = Glove Size
    • Column is headed = *Glove Size
    • Values can only be those defined






Carton dimensions and barcode

                        else if (col.Contains("depth") && col.Contains("carton")) iCartonDepth = i;
                        else if (col.Contains("width") && col.Contains("carton")) iCartonWidth = i;
                        else if (col.Contains("height") && col.Contains("carton")) iCartonHeight = i;
                        else if (col.Contains("barcode") && col.Contains("carton")) iCartonBarcode = i;






eg item profile

Importing Packing Notes

The stock Articles must exist in the system (will get error messages for all articles that do not exist) + Users Must have Secure Features#IsStockManager

Columns 

  1. SKU
  2. PackingNotes

Stock > Stock Articles > Drag XLS over the screen > Action > Import PackingNotes.xlsx - SKUs updates only to the article

All items should be imported correctly

  • If not copy the log and make corrections to the import file and import again

Importing Stock Min / Max levels by warehouse

The stock Articles must exist in the system (will get error messages for all articles that do not exist) + Users Must have Secure Features#IsStockManager

Columns 

  1. SKU
  2. Min
  3. Max

Admin > Stock Warehouses > List (choose the warehouse> > Drag XLS over the warehouse > Action > Import items min/max to the warehouse

All items should be imported correctly

  • If not copy the log and make corrections to the import file and import again

Importing Packs as a single row - both carton and each at the same time

Packs are a special type of Assembly - a SKU that breaks into a related smaller quantity.

  1. A carton/sleeve cannot be included in an 'updates only' import as this is only updating existing items
  2. Assembly must be "Pack"
  3. The line must have a carton qty.
  4. The SKU and the SKU suffixed with -S must not already be in the system.
  5. The name must be prefixed with INNER, SLEEVE, SINGLE or SINGLE UNIT.
  6. There will be no price breaks set up.
  7. If any of the above rules are not met then the line will be processed but not as a carton/sleeve.

All of the columns entered will be saved in the sleeve item except:

  1. Assembly will be No.
  2. SKU will be suffixed with -S, unless it already has a -S suffix.
  3. There will be no price breaks, i.e. inner, carton and pallet qty and buy and sell prices will be ignored.

The same information will be saved in the carton item except:

  1. Assembly will be Pack.
  2. SKU suffix of -S will be removed if present.
  3. Name prefix of INNER, SLEEVE, SINGLE or SINGLE UNIT will be removed.
  4. Default sell price will be carton sell price.
  5. Default buy price will be carton buy price.
  6. Average cost will av cost multiplied by carton quantity.
  7. Pack size will pack size multiplied by carton quantity.
  8. There will be no RRP or alternate buy price.
  9. Assembly component quantity will be carton qty.
  10. There will be no price breaks, i.e. inner and pallet qty and buy and sell prices will be ignored.

Price Breaks that are not a special type

Importing price breaks that are not a special type requires a separate sheet - import into prices tab

  1. SKU
  2. Qty
  3. sellprice

Importing Symptom Prices

Provide a spreadsheet with five columns

  1. SKU code of the Repair Item
  2. Symptom (must match the Symptom Description in the Symptom Master List)
  3. Likely Price - lower price
  4. Alternate Price - higher price
  5. Wholesale Price - price to charge the Stores


Drag the Excel File onto the Symptoms Page


Importing Stock Images

Provide a spreadsheet with two columns

  1. SKU code in the system
  2. URL for the related image

Importing Stock Min / Max levels by warehouse

The stock Articles must exist in the system (will get error messages for all articles that do not exist) + Users Must have Secure Features#IsStockManager

Columns 

  1. SKU
  2. Min
  3. Max

Adnmin - Stock - Warehouses - List - choose the warehouse > Drag XLS over the warehouse

Action > Import items min/max to the warehouse

All items should be imported correctly

If not copy the log and make corrections to the import file and import again

For those interested - this is what the code looks like.

  foreach (var c in excel.Columns)
 {
 if (c != null)
 {
 string col = c.ToLower();
 if (col.StartsWith("*"))
 {
 string profile = col.Substring(1);
 int? profileId = ItemProfile.GetByName(Session, profile, ItemProfile.Usages.ItemForSale);
 if (profileId.HasValue)
 {
 iProfiles.Add(i, profileId.Value);
 }
 else
 {
 Session.TextLog.add("Unknown custom profile " + col);
 }
 }
 else if (col == "category") iCat = i;
 else if (col.StartsWith("manufactur") || col == "supplier") iSupplier = i;
 else if (col == "brand") iBrand = i;
 else if (col == "range") iRange = i;
 else if (col == "name") iName = i;
 else if (col == "status") iStatus = i;
 else if (col == "uom") iUOM = i;
 else if (col.Contains("image") && col.Contains("url")) iImage = i;
 else if (col.Contains("warranty") && col.Contains("month")) iWarrantyMonths = i;
 else if (col.Contains("purchase") && col.Contains("multiple")) iPurchaseMultiple = i;
 else if (col.Contains("unit") && (col.Contains("qty") || col.Contains("quantity"))) iQtyUnit = i;
 else if (col.Contains("buy") && col.Contains("sell")) iBuySell = i;
 else if (col == "sku") iSKU = i;
 else if (col == "colour") iColour = i;
 else if (col == "size") iSize = i;
 else if (col.Contains("group") && (col.Contains("size") || col.Contains("colour"))) iGroup = i;
 else if (col.Contains("storage")) iStorage = i;
 else if ((col.Contains("style") && (col.Contains("group") || col.Length < 10)) || col == "productgroup") iStyleGroup = i;
 else if (col == "description") iDesc = i;
 else if (col.Contains("short") && col.Contains("description")) iShortDesc = i;
 else if (col.Contains("web") && col.Contains("description")) iWebDescription = i;
 else if ((col.Contains("web") || col.Contains("html")) && col.Contains("features")) iWebFeatures = i;
 else if (col.Contains("purchasing") && col.Contains("notes")) iPurchasingNotes = i;
 else if (col.Contains("sellprice")) iSellPrice = i;
 else if (col == "costprice" || col == "defaultbuyprice") iCostPrice = i;
 else if (col.Contains("cost") && col.StartsWith("av")) iavgCost = i;
 else if (col.Contains("price") && col.StartsWith("alt") && col.Contains("buy")) iAltBuyPrice = i;
 else if (col.Contains("rrp")) iRRP = i;
 else if (col.Contains("gst")) iGSTMode = i;
 else if ((col.Contains("their") || col.Contains("supplier")) && col.Contains("part") && col.Contains("number")) iSupplierRef = i;
 else if (col.Contains("supplier") && col.Contains("name") && (col.Contains("item") || col.Contains("part"))) iSupplierPartName = i;
 else if (col == "extref" || col == "ext ref" || col == "xref" || col.StartsWith("import")) iExtRef = i;
 else if (col == "dimunit") iDimUnit = i;
 else if (col == "width") iWidth = i;
 else if (col == "height") iHeight = i;
 else if (col.Contains("depth") && col.Contains("unit")) iUnitDepth = i;
 else if (col.Contains("width") && col.Contains("unit")) iUnitWidth = i;
 else if (col.Contains("height") && col.Contains("unit")) iUnitHeight = i;
 else if (col == "depth") iDepth = i;
 else if (col == "massunit") iMassUnit = i;
 else if (col == "netmass") iNetMass = i;
 else if (col == "grossmass") iGrossMass = i;
 else if (col.Contains("measure"))
 {
 if (col.Contains("unit")) iMeasureUnit = i; else iMeasure = i;
 }
 else if (col.Contains("sell") && col.Contains("rate")) iSellrate = i;
 else if (col == "barcode") iBarcode = i;
 else if (col == "assembly") iAssembly = i;
 else if (col.Contains("repair")) iRepairable = i;
 else if (col.Contains("serving") && col.Contains("size")) iServingSize = i;
 else if (col.Contains("name") && (col.Contains("pkg") || col.Contains("package"))) iPackageName = i;
 else if (col.Contains("size") && col.Contains("pack")) iPacksize = i;
 else if (col.Contains("packing") && col.Contains("factor")) iPackingFactor = i;
 else if (col.Contains("serving") && col.Contains("per") && col.Contains("pack")) iServPerPack = i;
 else if (col.StartsWith("ingredients")) iIngredients = i;
 else if (col.StartsWith("certification") || col.StartsWith("lifestyle"))
 {
 certifications.Add(i, col.Replace("certification", string.Empty));
 }
 else if (col.StartsWith("claims"))
 {
 dietaryClaims.Add(i, col.Replace("claims", string.Empty));
 }
 else if (col.StartsWith("nip") && !col.Contains("serve"))
 {
 int p = col.IndexOf("(");
 if (p > 0)
 {
 col = col.Substring(0, p - 1);
 }
 string text = col.Replace("nip", string.Empty).Replace(":", string.Empty).Trim();
 int nipId = ArticleNIPItem.IdForText(Session, text);
 if (nipId > 0) iNIP.Add(i, nipId); else Session.TextLog.add("No NIP item found for " + text);
 }
 else if (col.StartsWith("inner"))
 {
 if (col.Contains("qty") || col.Contains("quantity"))
 {
 iInnerQty = i;
 }
 else if (col.Contains("sell"))
 {
 iInnerSellPrice = i;
 }
 else
 {
 iInnerBuyPrice = i;
 }
 }
 else if (col.StartsWith("carton"))
 {
 if (col.Contains("qty") || col.Contains("quantity"))
 {
 iCartonQty = i;
 }
 else if (col.Contains("sell"))
 {
 iCartonSellPrice = i;
 }
 else
 {
 iCartonBuyPrice = i;
 }
 }
 else if (col.StartsWith("pallet"))
 {
 if (col.Contains("qty") || col.Contains("quantity"))
 {
 iPalletQty = i;
 }
 else
 {
 iPalletBuyPrice = i;
 }
 else if (col.Contains("depth") && col.Contains("carton")) iCartonDepth = i;
                        else if (col.Contains("width") && col.Contains("carton")) iCartonWidth = i;
                        else if (col.Contains("height") && col.Contains("carton")) iCartonHeight = i;
                        else if (col.Contains("barcode") && col.Contains("carton")) iCartonBarcode = i;
 }
 else
 {
 Session.TextLog.add("Column ignored: " + c);
 }
 }
 i++;
 }


  File Modified

JPEG File uploading stock articles.jpg

09, Mar, 2016 by P Sawkins

JPEG File import from uploaded excel.jpg

09, Mar, 2016 by P Sawkins

JPEG File Glove size.jpg

27, Jun, 2017 by P Sawkins

JPEG File import from remote url.jpg

23, Nov, 2017 by P Sawkins

PNG File Capture.PNG

16, Mar, 2018 by John Loden

PNG File upload import of min max settings.png

18, Apr, 2018 by P Sawkins



For information about SaaSplications go to http://saasplications.com.au