eCommerce

Verkkokauppa

MarkkinapaikkaToimintaVersio 0.5.0AGPL-3.0-or-latermanifest

Mihin se on tarkoitettu ​

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.

Mitä paketti tekee ja mitä ei ​

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.

Moduulin tiedot ​

  • Versio: 0.5.0
  • Tekijä: SpaceCorps
  • Lisenssi: AGPL-3.0-or-later
  • Vaatii ytimen: ^0.2 (nykyinen ydin on 0.2.0)
  • Kypsyys: Beta
  • Luokat: Myynti

Mallit ​

ecommerce_category ​

A group of listings shown together in the shop

Lukuryhmä: ecommerce.user. Kirjoitusryhmä: ecommerce.manager.

KenttäTyyppiTietoluokkaHenkilötietoRyhmäAgentit näkevätKuvaus
nametextnoneeiecommerce.userselkoisenaCategory name shown in the shop
slugtextnoneeiecommerce.userselkoisenaURL part of the category, lowercase with dashes
descriptiontextnoneeiecommerce.userselkoisenaShort text about the category
sequencenumbernoneeiecommerce.userselkoisenaOrder among categories, lowest first
publishedboolnoneeiecommerce.userselkoisenaWhether the category is visible to shoppers

ecommerce_listing ​

A product as it appears in the online shop

Lukuryhmä: ecommerce.user. Kirjoitusryhmä: ecommerce.manager.

KenttäTyyppiTietoluokkaHenkilötietoRyhmäAgentit näkevätKuvaus
product_idref → productnoneeiecommerce.userselkoisenaThe product being sold online
titletextnoneeiecommerce.userselkoisenaTitle shown in the shop
slugtextnoneeiecommerce.userselkoisenaURL part of the product page, lowercase with dashes
summarytextnoneeiecommerce.userselkoisenaOne or two sentences shown on product cards
descriptionlongtextnoneeiecommerce.userselkoisenaDescription shown on the product page, in Markdown
imageimagenoneeiecommerce.userselkoisenaMain picture of the product (PNG, JPEG, WebP or GIF, up to 5 MiB; it is re-encoded and its metadata removed on upload)
image_alttextnoneeiecommerce.userselkoisenaText that describes the main picture for people who cannot see it
category_idref → ecommerce_categorynoneeiecommerce.userselkoisenaThe category the listing is shown under
pricemoneynoneeiecommerce.userselkoisenaShop price including tax (minor currency units, e.g. cents)
compare_at_pricemoneynoneeiecommerce.userselkoisenaPrevious price shown crossed out (minor currency units)
currencytextnoneeiecommerce.userselkoisenaISO 4217 currency code of the prices, for example EUR; empty means the shop currency from the instance settings
skutextnoneeiecommerce.userselkoisenaStock keeping unit shown on the product page
stock_policyselect (always_available, block_when_out, allow_backorder)noneeiecommerce.userselkoisenaWhat happens when stock runs out: always_available, block_when_out, allow_backorder
stock_quantitynumbernoneeiecommerce.userselkoisenaUnits 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
publishedboolnoneeiecommerce.userselkoisenaWhether the listing is visible to shoppers

ecommerce_listing_image ​

An extra picture of a listing for its gallery

Lukuryhmä: ecommerce.user. Kirjoitusryhmä: ecommerce.manager.

KenttäTyyppiTietoluokkaHenkilötietoRyhmäAgentit näkevätKuvaus
listing_idref → ecommerce_listingnoneeiecommerce.userselkoisenaThe listing the picture belongs to; it is shown only while the listing is published
imageimagenoneeiecommerce.userselkoisenaThe picture (PNG, JPEG, WebP or GIF, up to 5 MiB)
alttextnoneeiecommerce.userselkoisenaText that describes the picture for people who cannot see it
sequencenumbernoneeiecommerce.userselkoisenaOrder in the gallery, lowest first
publishedboolnoneeiecommerce.userselkoisenaWhether the picture is shown in the shop

ecommerce_listing_translation ​

A listing translated into another language

Lukuryhmä: ecommerce.user. Kirjoitusryhmä: ecommerce.manager.

KenttäTyyppiTietoluokkaHenkilötietoRyhmäAgentit näkevätKuvaus
listing_idref → ecommerce_listingnoneeiecommerce.userselkoisenaThe listing this translates
langselect (en, de, fr, pl, fi, sv, es)noneeiecommerce.userselkoisenaLanguage of the translation: en, de, fr, pl, fi, sv or es
titletextnoneeiecommerce.userselkoisenaTranslated title
summarytextnoneeiecommerce.userselkoisenaTranslated card text
descriptionlongtextnoneeiecommerce.userselkoisenaTranslated description in Markdown
publishedboolnoneeiecommerce.userselkoisenaWhether the translation is shown; it is only reachable while its listing is published

ecommerce_shipping_method ​

A way of delivering orders with its price

Lukuryhmä: ecommerce.user. Kirjoitusryhmä: ecommerce.manager.

KenttäTyyppiTietoluokkaHenkilötietoRyhmäAgentit näkevätKuvaus
nametextnoneeiecommerce.userselkoisenaName shown at checkout, for example Standard delivery
carriertextnoneeiecommerce.userselkoisenaCarrier that delivers, for example DHL
pricemoneynoneeiecommerce.userselkoisenaDelivery price (minor currency units)
free_overmoneynoneeiecommerce.userselkoisenaOrder total above which delivery is free (minor currency units); empty means never
delivery_daysnumbernoneeiecommerce.userselkoisenaUsual number of days until delivery
activeboolnoneeiecommerce.userselkoisenaWhether shoppers can choose it

ecommerce_discount_code ​

A code a shopper enters at checkout for a reduction

Lukuryhmä: ecommerce.user. Kirjoitusryhmä: ecommerce.manager.

KenttäTyyppiTietoluokkaHenkilötietoRyhmäAgentit näkevätKuvaus
codetextnoneeiecommerce.userselkoisenaThe code shoppers type, for example SPRING10
kindselect (percent, fixed)noneeiecommerce.userselkoisenaType of reduction: percent or fixed
valuenumbernoneeiecommerce.userselkoisenaReduction: basis points for percent (1000 is 10.00 percent), minor currency units for fixed
starts_ondatenoneeiecommerce.userselkoisenaFirst day the code works (YYYY-MM-DD)
ends_ondatenoneeiecommerce.userselkoisenaLast day the code works (YYYY-MM-DD)
max_usesnumbernoneeiecommerce.userselkoisenaHow many times the code may be used in total; empty means unlimited
used_countnumbernoneeiecommerce.userselkoisenaHow 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_ordermoneynoneeiecommerce.userselkoisenaSmallest order total the code applies to (minor currency units)
per_customer_limitnumbernoneeiecommerce.userselkoisenaHow many times one customer (by email address) may use the code; empty means no limit
category_idref → ecommerce_categorynoneeiecommerce.userselkoisenaOnly listings of this category get the reduction; empty means the whole order
activeboolnoneeiecommerce.userselkoisenaWhether 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)

Lukuryhmä: ecommerce.manager. Kirjoitusryhmä: ecommerce.manager.

KenttäTyyppiTietoluokkaHenkilötietoRyhmäAgentit näkevätKuvaus
code_idref → ecommerce_discount_codenoneeiecommerce.managerselkoisenaThe discount code
customer_hashtextinternalkylläecommerce.managermaskattuHash of the customer's email address, so the per-customer limit can be checked without keeping the address here
countnumbernoneeiecommerce.managerselkoisenaUses so far

ecommerce_tax_rate ​

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

Lukuryhmä: ecommerce.user. Kirjoitusryhmä: ecommerce.manager.

KenttäTyyppiTietoluokkaHenkilötietoRyhmäAgentit näkevätKuvaus
nametextnoneeiecommerce.userselkoisenaName shown on the order, for example VAT
rate_bpnumbernoneeiecommerce.userselkoisenaRate in basis points: 1900 is 19.00 percent
countrytextnoneeiecommerce.userselkoisenaTwo-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_categorynoneeiecommerce.userselkoisenaOnly listings of this category; empty means every listing (and delivery)
includedboolnoneeiecommerce.userselkoisenaWhether listing prices already include this tax (the usual way in the EU). If not, the tax is added on top at checkout
activeboolnoneeiecommerce.userselkoisenaWhether the rate is applied

ecommerce_order ​

An order placed online

Lukuryhmä: ecommerce.user. Kirjoitusryhmä: ecommerce.user.

KenttäTyyppiTietoluokkaHenkilötietoRyhmäAgentit näkevätKuvaus
numbertextnoneeiecommerce.userselkoisenaOrder number shown to the shopper. Free text: packages cannot generate sequences; the public checkout makes a random one
customer_emailtextinternalkylläecommerce.usermaskattuEmail address of the shopper
customer_nametextinternalkylläecommerce.usermaskattuName of the shopper
customer_idref → partynoneeiecommerce.userselkoisenaThe matching contact, once the shopper is known
shipping_addresslongtextinternalkylläecommerce.usermaskattuDelivery address
billing_addresslongtextinternalkylläecommerce.usermaskattuBilling address when different from delivery
shipping_method_idref → ecommerce_shipping_methodnoneeiecommerce.userselkoisenaThe chosen way of delivery
discount_code_idref → ecommerce_discount_codenoneeiecommerce.userselkoisenaThe discount code used, if any
discount_codetextnoneeiecommerce.userselkoisenaThe code the shopper entered, as it is shown on the order
discount_use_idtextinternalkylläecommerce.usermaskattuWhich per-customer use counter this order counted against, so it can be given back
countrytextinternalkylläecommerce.usermaskattuTwo-letter country code of the delivery address, which decides the tax rate
tax_summarylongtextnoneeiecommerce.userselkoisenaThe tax lines of the order as JSON: name, rate in basis points, whether included in the prices, amount
stock_returnedboolnoneeiecommerce.userselkoisenaSet when the units of a cancelled, expired or refunded order were put back on the listings, so it happens once
reserved_untilnumbernoneeiecommerce.userselkoisenaUnix time until which an unpaid order holds its stock; after that it is cancelled and the stock goes back
payment_methodselect (manual, stripe, fake)noneeiecommerce.userselkoisenaHow the shopper chose to pay: manual (bank transfer or invoice), stripe (card) or fake (demo)
placed_ondatenoneeiecommerce.userselkoisenaDay the order was placed (YYYY-MM-DD)
currencytextnoneeiecommerce.userselkoisenaISO 4217 currency code, for example EUR
subtotalmoneynoneeiecommerce.userselkoisenaSum of the lines at listing prices (minor currency units, computed by the shop at checkout)
discount_totalmoneynoneeiecommerce.userselkoisenaReduction from the discount code (minor currency units)
shipping_totalmoneynoneeiecommerce.userselkoisenaDelivery charge (minor currency units)
tax_totalmoneynoneeiecommerce.userselkoisenaAll tax on the order, both the part included in the prices and the part added on top (minor currency units)
totalmoneynoneeiecommerce.userselkoisenaAmount the shopper pays: lines, minus the discount, plus delivery, plus tax that was added on top (minor currency units)
payment_referencetextfinancialkylläecommerce.userpidätettyReference from the payment provider; never a card number
tracking_referencetextnoneeiecommerce.userselkoisenaCarrier tracking number
access_tokentextsecreteiecommerce.userpidätettySecret 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)noneeiecommerce.userselkoisenaFulfilment status: pending, paid, shipped, delivered, cancelled, refunded

ecommerce_order_line ​

One product line of a web order

Lukuryhmä: ecommerce.user. Kirjoitusryhmä: ecommerce.user.

KenttäTyyppiTietoluokkaHenkilötietoRyhmäAgentit näkevätKuvaus
order_idref → ecommerce_ordernoneeiecommerce.userselkoisenaThe order the line belongs to
product_idref → productnoneeiecommerce.userselkoisenaThe product ordered
listing_idref → ecommerce_listingnoneeiecommerce.userselkoisenaThe shop listing the line was ordered from
descriptiontextnoneeiecommerce.userselkoisenaProduct text as it was when ordered
quantitynumbernoneeiecommerce.userselkoisenaUnits ordered
unit_pricemoneynoneeiecommerce.userselkoisenaPrice per unit including tax (minor currency units)
subtotalmoneynoneeiecommerce.userselkoisenaLine total (minor currency units, entered not computed)
discount_amountmoneynoneeiecommerce.userselkoisenaPart of the order discount that falls on this line (minor currency units)
tax_nametextnoneeiecommerce.userselkoisenaName of the tax applied to this line
tax_rate_bpnumbernoneeiecommerce.userselkoisenaTax rate of this line in basis points
tax_amountmoneynoneeiecommerce.userselkoisenaTax 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

Lukuryhmä: ecommerce.user. Kirjoitusryhmä: ecommerce.manager.

KenttäTyyppiTietoluokkaHenkilötietoRyhmäAgentit näkevätKuvaus
order_idref → ecommerce_ordernoneeiecommerce.userselkoisenaThe order being paid
providerselect (manual, stripe, fake)noneeiecommerce.userselkoisenaWho takes the payment: manual (bank transfer or invoice), stripe (Stripe Checkout) or fake (local demo)
external_idtextfinancialeiecommerce.userpidätettyThe provider's reference for this payment, for example a Stripe Checkout Session id. Never a card number
checkout_urltextfinancialeiecommerce.userpidätettyWhere 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)noneeiecommerce.userselkoisenaPayment status: open (waiting for the shopper), succeeded, failed, expired, cancelled, refunded
amountmoneynoneeiecommerce.userselkoisenaAmount to pay, set by the server from the order (minor currency units)
currencytextnoneeiecommerce.userselkoisenaISO 4217 currency code of the amount
refund_idtextfinancialeiecommerce.userpidätettyThe provider's reference for the refund, once the payment was refunded
refunded_amountmoneynoneeiecommerce.userselkoisenaAmount returned to the shopper (minor currency units)
event_idslongtextnoneeiecommerce.userselkoisenaIds of the provider events already applied, as JSON, so a repeated notification changes nothing

Työnkulut ​

ecommerce_order ​

ToimintoSiirtääKuka voi suorittaaHyväksyntä
ecommerce_order.mark_paidstate: pending → paidecommerce.userei
ecommerce_order.shipstate: paid → shippedecommerce.userei
ecommerce_order.deliverstate: shipped → deliveredecommerce.userei
ecommerce_order.cancelstate: pending → cancelledecommerce.userei
ecommerce_order.refundstate: paid → refundedecommerce.managerkyllä
ecommerce_order.refund_deliveredstate: delivered → refundedecommerce.managerkyllä

ecommerce_payment ​

ToimintoSiirtääKuka voi suorittaaHyväksyntä
ecommerce_payment.mark_failedstate: open → failedecommerce.managerei
ecommerce_payment.cancelstate: open → cancelledecommerce.managerei

Käyttöoikeusryhmät ​

Tämän sovelluksen käyttämät ryhmät:

  • ecommerce.manager
  • ecommerce.user

Hyväksyntävaiheet ​

Vaiheet, joita agentti voi vain ehdottaa:

  • ecommerce_order.refund
  • ecommerce_order.refund_delivered

Mitä agentit voivat ja eivät voi tehdä ​

Agentti voi lukea, hakea, luoda ja päivittää tämän sovelluksen tietueita sekä suorittaa toiminnot, jotka eivät vaadi hyväksyntää, tunnisteensa käyttöoikeusryhmien rajoissa.

Se voi vain ehdottaa näitä vaiheita, ja ihmisen on hyväksyttävä ne: 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.

Henkilötiedot maskataan paikkamerkeiksi: 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.

Nämä kentät pidätetään agenteilta kokonaan: ecommerce_order.payment_reference, ecommerce_order.access_token, ecommerce_payment.external_id, ecommerce_payment.checkout_url, ecommerce_payment.refund_id.

Riippuvuudet ​

Jokainen riippuvuus kertoo hyväksymänsä versiot. Sisäänrakennetut sovellukset versioituvat ytimen mukana, joten niitä koskeva vaatimus tarkistetaan ytimen versiota vasten.

Kun tämä sovellus asennetaan moduulikaupasta, myös puuttuvat riippuvuudet asennetaan yhdessä suunnitelmassa, jonka vahvistat kerran.

Asennus ​

Asenna se Customize-sovelluksesta (Marketplace) tai komentoriviltä:

bash
obop modules install-from ecommerce

Vaatii tietokannan ja ylläpitäjän oikeudet.

Tee oma ​

Moduulioppaassa näytetään, miten tällaiset sovellukset kirjoitetaan