sanmar_sdk.standard

SanMar’s own web services, as opposed to its PromoStandards ones.

Each is reached through an attribute of SanMar, such as sanmar.products or sanmar.purchase_orders. They take the SanMar customer number as well as the SanMar.com login.

Submodules

Classes

InventoryService

SanMar's own inventory service.

SkuStock

Stock of one style, color and size, warehouse by warehouse.

WarehouseStock

Stock of one style, color and size at one warehouse.

Address

A postal address on an invoice.

Invoice

One SanMar invoice, with its lines.

InvoiceHeader

The header of one SanMar invoice.

InvoiceLine

One line of a SanMar invoice.

InvoiceService

SanMar's own invoicing service.

Party

Who an invoice is sold to, shipped to, or paid to.

PackingSlip

What is in one box SanMar shipped.

PackingSlipAddress

A postal address on a packing slip.

PackingSlipItem

One item in a box.

PackingSlipParty

Who a box ships from, ships to, or is billed to.

PackingSlipService

SanMar's packing slip service.

PriceQuote

The prices of one style, color and size.

PricingService

SanMar's own pricing service.

FileRequest

SanMar's acknowledgement of a request for a product file.

ProductImages

Links to a product's images and documents.

ProductInfo

One style, color and size, as SanMar's product information service describes it.

ProductInfoService

SanMar's own product information service.

ProductPrices

A product's list and sale prices.

LineAvailability

Whether one line of an order could ship, and from where.

OrderCheck

SanMar's answer to whether an order could ship as it stands.

PurchaseOrderService

SanMar's own purchase order service.

Package Contents

class sanmar_sdk.standard.InventoryService(soap: SoapClient, credentials: Credentials)[source]

Bases: sanmar_sdk._soap.Service

SanMar’s own inventory service.

get(style: str, *, catalog_color: str | None = None, size: str | None = None) → list[SkuStock][source]

Look up stock by warehouse for a style, one catalog color, one size, or both.

The color must be the catalog (mainframe) color, not the display name.

get_quantity(style: str, catalog_color: str, size: str, warehouse: sanmar_sdk.common.Warehouse | int) → int[source]

Look up the stock of one style, catalog color and size at one warehouse.

class sanmar_sdk.standard.SkuStock(/, **data: Any)[source]

Bases: sanmar_sdk.base.Record

Stock of one style, color and size, warehouse by warehouse.

style: str[source]
catalog_color: str = None[source]

The catalog (mainframe) color, which web services and orders expect.

size: str[source]
warehouses: sanmar_sdk.base.OneOrMany[WarehouseStock] = None[source]
property total: int[source]

Stock across every warehouse.

class sanmar_sdk.standard.WarehouseStock(/, **data: Any)[source]

Bases: sanmar_sdk.base.Record

Stock of one style, color and size at one warehouse.

warehouse: sanmar_sdk.common.WarehouseNumber = None[source]
quantity: int = None[source]

Stock at this warehouse, capped by SanMar.

name: str | None = None[source]
class sanmar_sdk.standard.Address(/, **data: Any)[source]

Bases: sanmar_sdk.base.Record

A postal address on an invoice.

address1: str | None = None[source]
address2: str | None = None[source]
address3: str | None = None[source]
city: str | None = None[source]
state: str | None = None[source]
postal_code: str | None = None[source]
country: str | None = None[source]
class sanmar_sdk.standard.Invoice(/, **data: Any)[source]

Bases: sanmar_sdk.base.Record

One SanMar invoice, with its lines.

header: InvoiceHeader = None[source]
lines: sanmar_sdk.base.OneOrMany[InvoiceLine] = None[source]
class sanmar_sdk.standard.InvoiceHeader(/, **data: Any)[source]

Bases: sanmar_sdk.base.Record

The header of one SanMar invoice.

invoice_number: int = None[source]
invoice_date: sanmar_sdk.base.SanMarDate = None[source]
sales_order_number: int | None = None[source]
status: str | None = None[source]

Paid or Unpaid.

is_credit_memo: bool = None[source]
customer_number: int | None = None[source]
po_number: str | None = None[source]
order_date: sanmar_sdk.base.SanMarDate | None = None[source]
due_date: sanmar_sdk.base.SanMarDate | None = None[source]
sold_to: Party | None = None[source]
ship_to: Party | None = None[source]
remit_to: Party | None = None[source]
ship_via: str | None = None[source]
fob: str | None = None[source]

The shipping point, such as SPARKS NV.

terms: str | None = None[source]
department: str | None = None[source]
total_cases: int | None = None[source]
total_weight: int | None = None[source]
subtotal: decimal.Decimal | None = None[source]
sales_tax: decimal.Decimal | None = None[source]
shipping_and_handling: decimal.Decimal | None = None[source]
total: decimal.Decimal | None = None[source]
freight_savings: decimal.Decimal | None = None[source]
class sanmar_sdk.standard.InvoiceLine(/, **data: Any)[source]

Bases: sanmar_sdk.base.Record

One line of a SanMar invoice.

style: str | None = None[source]
catalog_color: str | None = None[source]

The color as SanMar’s order system records it, which is the catalog (mainframe) color.

size: str | None = None[source]
description: str | None = None[source]
quantity: int = None[source]
unit_price: decimal.Decimal | None = None[source]
amount: decimal.Decimal | None = None[source]
unique_key: str | None = None[source]
class sanmar_sdk.standard.InvoiceService(soap: SoapClient, credentials: Credentials)[source]

Bases: sanmar_sdk._soap.Service

SanMar’s own invoicing service.

get(invoice_number: int) → Invoice[source]

Fetch one invoice by its number.

Raises:

NotFoundError – If SanMar has no invoice with that number.

by_purchase_order(po_number: str) → list[Invoice][source]

Fetch the invoices for one purchase order.

SanMar matches at most the first 13 characters of a PO number here.

by_invoice_date(start: datetime.date, end: datetime.date) → list[Invoice][source]

Fetch the invoices dated between two days, inclusive, up to three months apart.

by_order_date(order_date: datetime.date) → list[Invoice][source]

Fetch the invoices for orders placed on one day.

unpaid() → list[Invoice][source]

Fetch every unpaid invoice.

since_last_call() → list[Invoice][source]

Fetch the invoices added since this was last called.

The first call returns the last three months. Each call moves SanMar’s marker, so the invoices it returns are not returned again.

headers_by_purchase_order(po_number: str) → list[InvoiceHeader][source]

Fetch the invoice headers for one purchase order.

headers_by_invoice_date(start: datetime.date, end: datetime.date) → list[InvoiceHeader][source]

Fetch the invoice headers dated between two days, inclusive, up to a year apart.

headers_by_order_date(order_date: datetime.date) → list[InvoiceHeader][source]

Fetch the invoice headers for orders placed on one day.

unpaid_headers() → list[InvoiceHeader][source]

Fetch the headers of every unpaid invoice.

class sanmar_sdk.standard.Party(/, **data: Any)[source]

Bases: sanmar_sdk.base.Record

Who an invoice is sold to, shipped to, or paid to.

name: str | None = None[source]
address: Address = None[source]
class sanmar_sdk.standard.PackingSlip(/, **data: Any)[source]

Bases: sanmar_sdk.base.Record

What is in one box SanMar shipped.

license_plate: str = None[source]
ship_date: sanmar_sdk.base.SanMarDate | None = None[source]
box_number: int | None = None[source]

Which box of the shipment this is.

box_count: int | None = None[source]

How many boxes the shipment has.

order_date: sanmar_sdk.base.SanMarDate | None = None[source]
order_number: int | None = None[source]

SanMar’s sales order number.

invoice_number: int | None = None[source]
po_number: str | None = None[source]
ship_from: PackingSlipParty | None = None[source]
ship_to: PackingSlipParty | None = None[source]
bill_to: PackingSlipParty | None = None[source]
weight: float | None = None[source]
weight_unit: str | None = None[source]
carrier: str | None = None[source]
shipping_method: str | None = None[source]
tracking_number: str | None = None[source]
items: sanmar_sdk.base.OneOrMany[PackingSlipItem] = None[source]
class sanmar_sdk.standard.PackingSlipAddress(/, **data: Any)[source]

Bases: sanmar_sdk.base.Record

A postal address on a packing slip.

line1: str | None = None[source]
line2: str | None = None[source]
line3: str | None = None[source]
city: str | None = None[source]
state: str | None = None[source]
postal_code: str | None = None[source]
country: str | None = None[source]
residential: bool | None = None[source]
class sanmar_sdk.standard.PackingSlipItem(/, **data: Any)[source]

Bases: sanmar_sdk.base.Record

One item in a box.

unique_key: str | None = None[source]

SanMar’s identifier for this style, color and size.

style: str | None = None[source]
catalog_color: str | None = None[source]

The color as SanMar’s warehouse records it, which is the catalog (mainframe) color.

size: str | None = None[source]
description: str | None = None[source]
quantity: int = None[source]
gtin: str | None = None[source]
class sanmar_sdk.standard.PackingSlipParty(/, **data: Any)[source]

Bases: sanmar_sdk.base.Record

Who a box ships from, ships to, or is billed to.

name: str | None = None[source]
address: PackingSlipAddress = None[source]
contact_name: str | None = None[source]
class sanmar_sdk.standard.PackingSlipService(soap: SoapClient, credentials: Credentials)[source]

Bases: sanmar_sdk._soap.Service

SanMar’s packing slip service.

get(license_plate: str) → PackingSlip[source]

Look up what is in the box with the given license plate number.

License plate numbers start with LP, L, S or R, such as LP000123456789.

Raises:

NotFoundError – If SanMar has no box with that number, or the box was shipped to someone else.

class sanmar_sdk.standard.PriceQuote(/, **data: Any)[source]

Bases: sanmar_sdk.base.Record

The prices of one style, color and size.

style: str[source]
catalog_color: str = None[source]

The catalog (mainframe) color, which web services and orders expect.

size: str[source]
inventory_key: int = None[source]
size_index: int = None[source]
piece_price: sanmar_sdk.base.Price = None[source]

The price per piece for five pieces or fewer of one style and color.

case_price: sanmar_sdk.base.Price = None[source]

The price per piece when buying by the case.

sale_price: sanmar_sdk.base.Price = None[source]
sale_start_date: sanmar_sdk.base.SanMarDate | None = None[source]
sale_end_date: sanmar_sdk.base.SanMarDate | None = None[source]
my_price: sanmar_sdk.base.Price = None[source]

This account’s price.

incentive_price: sanmar_sdk.base.Price = None[source]
class sanmar_sdk.standard.PricingService(soap: SoapClient, credentials: Credentials)[source]

Bases: sanmar_sdk._soap.Service

SanMar’s own pricing service.

get(style: str, *, catalog_color: str | None = None, size: str | None = None) → list[PriceQuote][source]

Price a style, optionally narrowed to one catalog color, one size, or both.

get_by_key(key: sanmar_sdk.common.SkuKey) → list[PriceQuote][source]

Price one style, color and size by its inventory key and size index.

get_many(queries: collections.abc.Sequence[sanmar_sdk.common.StyleQuery | sanmar_sdk.common.SkuKey]) → list[PriceQuote][source]

Price several lookups in one call.

class sanmar_sdk.standard.FileRequest(/, **data: Any)[source]

Bases: sanmar_sdk.base.Record

SanMar’s acknowledgement of a request for a product file.

SanMar writes the file to its SFTP server about 20 minutes later. Brand and category file names end with the date SanMar wrote them, so they are matched by pattern; read one with sanmar_sdk.ftp.SanMarFTP.find() and product_information().

folder: str[source]
file_pattern: str[source]

The file’s name, or a shell-style pattern where SanMar dates it.

message: str | None = None[source]
class sanmar_sdk.standard.ProductImages(/, **data: Any)[source]

Bases: sanmar_sdk.base.Record

Links to a product’s images and documents.

product: str | None = None[source]
thumbnail: str | None = None[source]
color_product: str | None = None[source]
color_product_thumbnail: str | None = None[source]
color_square: str | None = None[source]
color_swatch: str | None = None[source]
front_model: str | None = None[source]
back_model: str | None = None[source]
side_model: str | None = None[source]
three_quarter_model: str | None = None[source]
front_flat: str | None = None[source]
back_flat: str | None = None[source]
spec_sheet: str | None = None[source]
class sanmar_sdk.standard.ProductInfo(/, **data: Any)[source]

Bases: sanmar_sdk.base.Record

One style, color and size, as SanMar’s product information service describes it.

style: str = None[source]
catalog_color: str = None[source]

The catalog (mainframe) color, which web services and orders expect.

size: str = None[source]
unique_key: str = None[source]

SanMar’s identifier for this style, color and size, and the PromoStandards part id.

inventory_key: int = None[source]
size_index: int = None[source]
color_name: str | None = None[source]

The full color name, for display only.

title: str | None = None[source]
description: str | None = None[source]
brand: str | None = None[source]
category: str | None = None[source]
status: str | None = None[source]

Coming Soon, New, Active, Regular, or Discontinued.

available_sizes: str | None = None[source]
keywords: sanmar_sdk.base.CommaSeparated = None[source]
case_size: int | None = None[source]
piece_weight: decimal.Decimal | None = None[source]

Approximate weight per piece in pounds.

images: ProductImages = None[source]
prices: ProductPrices = None[source]
class sanmar_sdk.standard.ProductInfoService(soap: SoapClient, credentials: Credentials)[source]

Bases: sanmar_sdk._soap.Service

SanMar’s own product information service.

get(style: str, *, catalog_color: str | None = None, size: str | None = None) → list[ProductInfo][source]

Look up a style, optionally narrowed to one catalog color, one size, or both.

Returns one entry per matching style, color and size. The color must be the catalog (mainframe) color.

get_many(queries: collections.abc.Sequence[sanmar_sdk.common.StyleQuery]) → list[ProductInfo][source]

Look up several styles in one call.

request_bulk_file() → FileRequest[source]

Ask SanMar to write a file of its whole catalog. SanMar allows this once a month.

request_delta_file() → FileRequest[source]

Ask SanMar to write a file of what changed since the last bulk or delta file.

SanMar allows this once a day. The next delta starts from this one, so calling it consumes the changes it reports.

request_brand_file(brand: str) → FileRequest[source]

Ask SanMar to write a file of one brand’s products, such as OGIO.

request_category_file(category: str) → FileRequest[source]

Ask SanMar to write a file of one category’s products, such as Caps.

class sanmar_sdk.standard.ProductPrices(/, **data: Any)[source]

Bases: sanmar_sdk.base.Record

A product’s list and sale prices.

piece_price: sanmar_sdk.base.Price = None[source]

The price per piece for five pieces or fewer of one style and color.

case_price: sanmar_sdk.base.Price = None[source]

The price per piece when buying by the case.

piece_sale_price: sanmar_sdk.base.Price = None[source]
case_sale_price: sanmar_sdk.base.Price = None[source]
sale_start_date: sanmar_sdk.base.SanMarDate | None = None[source]
sale_end_date: sanmar_sdk.base.SanMarDate | None = None[source]
map_price: sanmar_sdk.base.Price = None[source]

The minimum advertised price.

price_code: str | None = None[source]

The suggested retail pricing code. A/P is 50%, B/Q 45%, C/R 40%, D/S 35%, E/T 30%.

price_text: str | None = None[source]

Which sizes the price applies to.

class sanmar_sdk.standard.LineAvailability(/, **data: Any)[source]

Bases: sanmar_sdk.base.Record

Whether one line of an order could ship, and from where.

style: str | None = None[source]
catalog_color: str | None = None[source]
size: str | None = None[source]
inventory_key: int | None = None[source]
size_index: int | None = None[source]
quantity: int[source]
warehouse: sanmar_sdk.common.WarehouseNumber | None = None[source]

The warehouse SanMar would ship this line from.

error: bool = None[source]
message: str | None = None[source]

SanMar’s explanation, such as which warehouse has the stock.

property available: bool[source]

Whether the requested quantity is in stock.

matches(item: sanmar_sdk.common.SkuKey | sanmar_sdk.common.StyleColorSize) → bool[source]

Whether this line is for the given item.

class sanmar_sdk.standard.OrderCheck(/, **data: Any)[source]

Bases: sanmar_sdk.base.Record

SanMar’s answer to whether an order could ship as it stands.

available: bool[source]

Whether every line is in stock.

message: str | None = None[source]
lines: sanmar_sdk.base.OneOrMany[LineAvailability] = None[source]
line_for(item: sanmar_sdk.common.SkuKey | sanmar_sdk.common.StyleColorSize) → LineAvailability | None[source]

Find the line for an item, or None if the order has no line for it.

class sanmar_sdk.standard.PurchaseOrderService(soap: SoapClient, credentials: Credentials)[source]

Bases: sanmar_sdk._soap.Service

SanMar’s own purchase order service.

check(order: sanmar_sdk.orders.PurchaseOrder) → OrderCheck[source]

Ask whether an order could ship, and from where, without placing it.

Being out of stock is an answer, not an error: see OrderCheck.available and each line’s message.

submit(order: sanmar_sdk.orders.PurchaseOrder) → str[source]

Place an order. Returns SanMar’s confirmation message.

SanMar ships each line from the warehouses its shipping option for the account picks, unless a line names one. Check an order first with check() if the account splits orders across warehouses.