eCommerce

Sklep internetowy

MarketplaceOperacjeWersja 0.5.0AGPL-3.0-or-latermanifest

Do czego służy ​

Store the data of an online shop: listings, shipping methods, discount codes and web orders with a fulfilment flow. Refunds need a manager and an approval. A storefront or other client reads and writes this data through the API.

Co pakiet robi, a czego nie robi ​

An online shop: categories, product listings with translations, shipping methods, discount codes, web orders with lines and a fulfilment flow of pending, paid, shipped, delivered, cancelled and refunded. When the instance runs with the public site enabled, visitors browse the published listings and place orders without an account; the server prices every order from the published listing and never trusts the browser. Orders take stock off the listing at checkout, apply discount codes and tax rates on the server, and are paid by bank transfer, by card through Stripe Checkout or in a local demo mode; the payment record, the provider reference and refunds are kept with the order. Refunds need a human approval from a manager; agents may only propose them. Customer name, email and addresses are personal data and are never public. Needs the Products package.

Szczegóły modułu ​

  • Wersja: 0.5.0
  • Autor: SpaceCorps
  • Licencja: AGPL-3.0-or-later
  • Wymaga rdzenia: ^0.2 (aktualny rdzeń to 0.2.0)
  • Dojrzałość: Beta
  • Kategorie: Sprzedaż

Modele ​

ecommerce_category ​

A group of listings shown together in the shop

Grupa odczytu: ecommerce.user. Grupa zapisu: ecommerce.manager.

PoleRodzajKlasa danychDane osoboweGrupaAgenci widząOpis
nametextnonenieecommerce.userjawnieCategory name shown in the shop
slugtextnonenieecommerce.userjawnieURL part of the category, lowercase with dashes
descriptiontextnonenieecommerce.userjawnieShort text about the category
sequencenumbernonenieecommerce.userjawnieOrder among categories, lowest first
publishedboolnonenieecommerce.userjawnieWhether the category is visible to shoppers

ecommerce_listing ​

A product as it appears in the online shop

Grupa odczytu: ecommerce.user. Grupa zapisu: ecommerce.manager.

PoleRodzajKlasa danychDane osoboweGrupaAgenci widząOpis
product_idref → productnonenieecommerce.userjawnieThe product being sold online
titletextnonenieecommerce.userjawnieTitle shown in the shop
slugtextnonenieecommerce.userjawnieURL part of the product page, lowercase with dashes
summarytextnonenieecommerce.userjawnieOne or two sentences shown on product cards
descriptionlongtextnonenieecommerce.userjawnieDescription shown on the product page, in Markdown
imageimagenonenieecommerce.userjawnieMain picture of the product (PNG, JPEG, WebP or GIF, up to 5 MiB; it is re-encoded and its metadata removed on upload)
image_alttextnonenieecommerce.userjawnieText that describes the main picture for people who cannot see it
category_idref → ecommerce_categorynonenieecommerce.userjawnieThe category the listing is shown under
pricemoneynonenieecommerce.userjawnieShop price including tax (minor currency units, e.g. cents)
compare_at_pricemoneynonenieecommerce.userjawniePrevious price shown crossed out (minor currency units)
currencytextnonenieecommerce.userjawnieISO 4217 currency code of the prices, for example EUR; empty means the shop currency from the instance settings
skutextnonenieecommerce.userjawnieStock keeping unit shown on the product page
stock_policyselect (always_available, block_when_out, allow_backorder)nonenieecommerce.userjawnieWhat happens when stock runs out: always_available, block_when_out, allow_backorder
stock_quantitynumbernonenieecommerce.userjawnieUnits on hand, used with the stock policy. Every order takes its units off at checkout, and a cancelled, expired or refunded order puts them back; correct it by hand after a stock count
publishedboolnonenieecommerce.userjawnieWhether the listing is visible to shoppers

ecommerce_listing_image ​

An extra picture of a listing for its gallery

Grupa odczytu: ecommerce.user. Grupa zapisu: ecommerce.manager.

PoleRodzajKlasa danychDane osoboweGrupaAgenci widząOpis
listing_idref → ecommerce_listingnonenieecommerce.userjawnieThe listing the picture belongs to; it is shown only while the listing is published
imageimagenonenieecommerce.userjawnieThe picture (PNG, JPEG, WebP or GIF, up to 5 MiB)
alttextnonenieecommerce.userjawnieText that describes the picture for people who cannot see it
sequencenumbernonenieecommerce.userjawnieOrder in the gallery, lowest first
publishedboolnonenieecommerce.userjawnieWhether the picture is shown in the shop

ecommerce_listing_translation ​

A listing translated into another language

Grupa odczytu: ecommerce.user. Grupa zapisu: ecommerce.manager.

PoleRodzajKlasa danychDane osoboweGrupaAgenci widząOpis
listing_idref → ecommerce_listingnonenieecommerce.userjawnieThe listing this translates
langselect (en, de, fr, pl, fi, sv, es)nonenieecommerce.userjawnieLanguage of the translation: en, de, fr, pl, fi, sv or es
titletextnonenieecommerce.userjawnieTranslated title
summarytextnonenieecommerce.userjawnieTranslated card text
descriptionlongtextnonenieecommerce.userjawnieTranslated description in Markdown
publishedboolnonenieecommerce.userjawnieWhether the translation is shown; it is only reachable while its listing is published

ecommerce_shipping_method ​

A way of delivering orders with its price

Grupa odczytu: ecommerce.user. Grupa zapisu: ecommerce.manager.

PoleRodzajKlasa danychDane osoboweGrupaAgenci widząOpis
nametextnonenieecommerce.userjawnieName shown at checkout, for example Standard delivery
carriertextnonenieecommerce.userjawnieCarrier that delivers, for example DHL
pricemoneynonenieecommerce.userjawnieDelivery price (minor currency units)
free_overmoneynonenieecommerce.userjawnieOrder total above which delivery is free (minor currency units); empty means never
delivery_daysnumbernonenieecommerce.userjawnieUsual number of days until delivery
activeboolnonenieecommerce.userjawnieWhether shoppers can choose it

ecommerce_discount_code ​

A code a shopper enters at checkout for a reduction

Grupa odczytu: ecommerce.user. Grupa zapisu: ecommerce.manager.

PoleRodzajKlasa danychDane osoboweGrupaAgenci widząOpis
codetextnonenieecommerce.userjawnieThe code shoppers type, for example SPRING10
kindselect (percent, fixed)nonenieecommerce.userjawnieType of reduction: percent or fixed
valuenumbernonenieecommerce.userjawnieReduction: basis points for percent (1000 is 10.00 percent), minor currency units for fixed
starts_ondatenonenieecommerce.userjawnieFirst day the code works (YYYY-MM-DD)
ends_ondatenonenieecommerce.userjawnieLast day the code works (YYYY-MM-DD)
max_usesnumbernonenieecommerce.userjawnieHow many times the code may be used in total; empty means unlimited
used_countnumbernonenieecommerce.userjawnieHow many times it has been used. The shop counts a use when the order is placed and gives it back when the order is cancelled or never paid
minimum_ordermoneynonenieecommerce.userjawnieSmallest order total the code applies to (minor currency units)
per_customer_limitnumbernonenieecommerce.userjawnieHow many times one customer (by email address) may use the code; empty means no limit
category_idref → ecommerce_categorynonenieecommerce.userjawnieOnly listings of this category get the reduction; empty means the whole order
activeboolnonenieecommerce.userjawnieWhether the code can be used

ecommerce_discount_use ​

How many times one customer has used one discount code (the customer is kept as a hash, never as an email address)

Grupa odczytu: ecommerce.manager. Grupa zapisu: ecommerce.manager.

PoleRodzajKlasa danychDane osoboweGrupaAgenci widząOpis
code_idref → ecommerce_discount_codenonenieecommerce.managerjawnieThe discount code
customer_hashtextinternaltakecommerce.managerzamaskowaneHash of the customer's email address, so the per-customer limit can be checked without keeping the address here
countnumbernonenieecommerce.managerjawnieUses so far

ecommerce_tax_rate ​

A tax rate the shop applies to listings, computed on the server

Grupa odczytu: ecommerce.user. Grupa zapisu: ecommerce.manager.

PoleRodzajKlasa danychDane osoboweGrupaAgenci widząOpis
nametextnonenieecommerce.userjawnieName shown on the order, for example VAT
rate_bpnumbernonenieecommerce.userjawnieRate in basis points: 1900 is 19.00 percent
countrytextnonenieecommerce.userjawnieTwo-letter country code (for example DE) of the delivery address this rate is for; empty means every country that has no rate of its own
category_idref → ecommerce_categorynonenieecommerce.userjawnieOnly listings of this category; empty means every listing (and delivery)
includedboolnonenieecommerce.userjawnieWhether listing prices already include this tax (the usual way in the EU). If not, the tax is added on top at checkout
activeboolnonenieecommerce.userjawnieWhether the rate is applied

ecommerce_order ​

An order placed online

Grupa odczytu: ecommerce.user. Grupa zapisu: ecommerce.user.

PoleRodzajKlasa danychDane osoboweGrupaAgenci widząOpis
numbertextnonenieecommerce.userjawnieOrder number shown to the shopper. Free text: packages cannot generate sequences; the public checkout makes a random one
customer_emailtextinternaltakecommerce.userzamaskowaneEmail address of the shopper
customer_nametextinternaltakecommerce.userzamaskowaneName of the shopper
customer_idref → partynonenieecommerce.userjawnieThe matching contact, once the shopper is known
shipping_addresslongtextinternaltakecommerce.userzamaskowaneDelivery address
billing_addresslongtextinternaltakecommerce.userzamaskowaneBilling address when different from delivery
shipping_method_idref → ecommerce_shipping_methodnonenieecommerce.userjawnieThe chosen way of delivery
discount_code_idref → ecommerce_discount_codenonenieecommerce.userjawnieThe discount code used, if any
discount_codetextnonenieecommerce.userjawnieThe code the shopper entered, as it is shown on the order
discount_use_idtextinternaltakecommerce.userzamaskowaneWhich per-customer use counter this order counted against, so it can be given back
countrytextinternaltakecommerce.userzamaskowaneTwo-letter country code of the delivery address, which decides the tax rate
tax_summarylongtextnonenieecommerce.userjawnieThe tax lines of the order as JSON: name, rate in basis points, whether included in the prices, amount
stock_returnedboolnonenieecommerce.userjawnieSet when the units of a cancelled, expired or refunded order were put back on the listings, so it happens once
reserved_untilnumbernonenieecommerce.userjawnieUnix time until which an unpaid order holds its stock; after that it is cancelled and the stock goes back
payment_methodselect (manual, stripe, fake)nonenieecommerce.userjawnieHow the shopper chose to pay: manual (bank transfer or invoice), stripe (card) or fake (demo)
placed_ondatenonenieecommerce.userjawnieDay the order was placed (YYYY-MM-DD)
currencytextnonenieecommerce.userjawnieISO 4217 currency code, for example EUR
subtotalmoneynonenieecommerce.userjawnieSum of the lines at listing prices (minor currency units, computed by the shop at checkout)
discount_totalmoneynonenieecommerce.userjawnieReduction from the discount code (minor currency units)
shipping_totalmoneynonenieecommerce.userjawnieDelivery charge (minor currency units)
tax_totalmoneynonenieecommerce.userjawnieAll tax on the order, both the part included in the prices and the part added on top (minor currency units)
totalmoneynonenieecommerce.userjawnieAmount the shopper pays: lines, minus the discount, plus delivery, plus tax that was added on top (minor currency units)
payment_referencetextfinancialtakecommerce.userwstrzymaneReference from the payment provider; never a card number
tracking_referencetextnonenieecommerce.userjawnieCarrier tracking number
access_tokentextsecretnieecommerce.userwstrzymaneSecret link token that lets the shopper who placed a public order see its confirmation page. Nobody can read it back
stateselect (pending, paid, shipped, delivered, cancelled, refunded)nonenieecommerce.userjawnieFulfilment status: pending, paid, shipped, delivered, cancelled, refunded

ecommerce_order_line ​

One product line of a web order

Grupa odczytu: ecommerce.user. Grupa zapisu: ecommerce.user.

PoleRodzajKlasa danychDane osoboweGrupaAgenci widząOpis
order_idref → ecommerce_ordernonenieecommerce.userjawnieThe order the line belongs to
product_idref → productnonenieecommerce.userjawnieThe product ordered
listing_idref → ecommerce_listingnonenieecommerce.userjawnieThe shop listing the line was ordered from
descriptiontextnonenieecommerce.userjawnieProduct text as it was when ordered
quantitynumbernonenieecommerce.userjawnieUnits ordered
unit_pricemoneynonenieecommerce.userjawniePrice per unit including tax (minor currency units)
subtotalmoneynonenieecommerce.userjawnieLine total (minor currency units, entered not computed)
discount_amountmoneynonenieecommerce.userjawniePart of the order discount that falls on this line (minor currency units)
tax_nametextnonenieecommerce.userjawnieName of the tax applied to this line
tax_rate_bpnumbernonenieecommerce.userjawnieTax rate of this line in basis points
tax_amountmoneynonenieecommerce.userjawnieTax on this line, included in the prices or added on top (minor currency units)

ecommerce_payment ​

A payment for a web order: which provider, its reference, the amount and what became of it. The shop never sees card data

Grupa odczytu: ecommerce.user. Grupa zapisu: ecommerce.manager.

PoleRodzajKlasa danychDane osoboweGrupaAgenci widząOpis
order_idref → ecommerce_ordernonenieecommerce.userjawnieThe order being paid
providerselect (manual, stripe, fake)nonenieecommerce.userjawnieWho takes the payment: manual (bank transfer or invoice), stripe (Stripe Checkout) or fake (local demo)
external_idtextfinancialnieecommerce.userwstrzymaneThe provider's reference for this payment, for example a Stripe Checkout Session id. Never a card number
checkout_urltextfinancialnieecommerce.userwstrzymaneWhere the shopper pays, kept so the payment page can send them back to it while the payment is open
stateselect (open, succeeded, failed, expired, cancelled, refunded)nonenieecommerce.userjawniePayment status: open (waiting for the shopper), succeeded, failed, expired, cancelled, refunded
amountmoneynonenieecommerce.userjawnieAmount to pay, set by the server from the order (minor currency units)
currencytextnonenieecommerce.userjawnieISO 4217 currency code of the amount
refund_idtextfinancialnieecommerce.userwstrzymaneThe provider's reference for the refund, once the payment was refunded
refunded_amountmoneynonenieecommerce.userjawnieAmount returned to the shopper (minor currency units)
event_idslongtextnonenieecommerce.userjawnieIds of the provider events already applied, as JSON, so a repeated notification changes nothing

Przepływy pracy ​

ecommerce_order ​

AkcjaPrzenosiKto może uruchomićZatwierdzenie
ecommerce_order.mark_paidstate: pending → paidecommerce.usernie
ecommerce_order.shipstate: paid → shippedecommerce.usernie
ecommerce_order.deliverstate: shipped → deliveredecommerce.usernie
ecommerce_order.cancelstate: pending → cancelledecommerce.usernie
ecommerce_order.refundstate: paid → refundedecommerce.managertak
ecommerce_order.refund_deliveredstate: delivered → refundedecommerce.managertak

ecommerce_payment ​

AkcjaPrzenosiKto może uruchomićZatwierdzenie
ecommerce_payment.mark_failedstate: open → failedecommerce.managernie
ecommerce_payment.cancelstate: open → cancelledecommerce.managernie

Grupy uprawnień ​

Grupy używane przez tę aplikację:

  • ecommerce.manager
  • ecommerce.user

Kroki zatwierdzania ​

Kroki, które agent może tylko zaproponować:

  • ecommerce_order.refund
  • ecommerce_order.refund_delivered

Co agenci mogą, a czego nie mogą ​

Agent może odczytywać, wyszukiwać, tworzyć i aktualizować rekordy tej aplikacji oraz uruchamiać akcje niewymagające zatwierdzenia, w ramach grup uprawnień swojego tokenu.

Te kroki może tylko zaproponować, a człowiek musi je zatwierdzić: ecommerce_order.refund, ecommerce_order.refund_delivered, ecommerce_category.delete, ecommerce_listing.delete, ecommerce_listing_image.delete, ecommerce_listing_translation.delete, ecommerce_shipping_method.delete, ecommerce_discount_code.delete, ecommerce_discount_use.delete, ecommerce_tax_rate.delete, ecommerce_order.delete, ecommerce_order_line.delete, ecommerce_payment.delete.

Dane osobowe są maskowane jako tokeny zastępcze: ecommerce_discount_use.customer_hash, ecommerce_order.customer_email, ecommerce_order.customer_name, ecommerce_order.shipping_address, ecommerce_order.billing_address, ecommerce_order.discount_use_id, ecommerce_order.country.

Te pola są całkowicie wstrzymane i niedostępne dla agentów: ecommerce_order.payment_reference, ecommerce_order.access_token, ecommerce_payment.external_id, ecommerce_payment.checkout_url, ecommerce_payment.refund_id.

Zależności ​

Każda zależność podaje akceptowane wersje. Aplikacje wbudowane są wersjonowane razem z rdzeniem, więc wymaganie wobec nich sprawdza się względem wersji rdzenia.

Instalacja tej aplikacji z marketplace instaluje też brakujące zależności, w jednym planie potwierdzanym raz.

Instalacja ​

Zainstaluj ją w aplikacji Customize (Marketplace) lub z wiersza poleceń:

bash
obop modules install-from ecommerce

Wymaga bazy danych i uprawnień administratora.

Zbuduj własną ​

Przewodnik po modułach pokazuje, jak pisze się takie aplikacje