eCommerce

Online-Shop

MarktplatzBetriebVersion 0.5.0AGPL-3.0-or-latermanifest

Wofür sie gedacht ist ​

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.

Was das Paket leistet und was nicht ​

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.

Moduldetails ​

  • Version: 0.5.0
  • Autor: SpaceCorps
  • Lizenz: AGPL-3.0-or-later
  • Benötigt Kern: ^0.2 (aktuell ist Kern 0.2.0)
  • Reifegrad: Beta
  • Kategorien: Vertrieb

Modelle ​

ecommerce_category ​

A group of listings shown together in the shop

Lesegruppe: ecommerce.user. Schreibgruppe: ecommerce.manager.

FeldArtDatenklassePersonenbezogene DatenGruppeAgenten sehenBeschreibung
nametextnoneneinecommerce.userim KlartextCategory name shown in the shop
slugtextnoneneinecommerce.userim KlartextURL part of the category, lowercase with dashes
descriptiontextnoneneinecommerce.userim KlartextShort text about the category
sequencenumbernoneneinecommerce.userim KlartextOrder among categories, lowest first
publishedboolnoneneinecommerce.userim KlartextWhether the category is visible to shoppers

ecommerce_listing ​

A product as it appears in the online shop

Lesegruppe: ecommerce.user. Schreibgruppe: ecommerce.manager.

FeldArtDatenklassePersonenbezogene DatenGruppeAgenten sehenBeschreibung
product_idref → productnoneneinecommerce.userim KlartextThe product being sold online
titletextnoneneinecommerce.userim KlartextTitle shown in the shop
slugtextnoneneinecommerce.userim KlartextURL part of the product page, lowercase with dashes
summarytextnoneneinecommerce.userim KlartextOne or two sentences shown on product cards
descriptionlongtextnoneneinecommerce.userim KlartextDescription shown on the product page, in Markdown
imageimagenoneneinecommerce.userim KlartextMain picture of the product (PNG, JPEG, WebP or GIF, up to 5 MiB; it is re-encoded and its metadata removed on upload)
image_alttextnoneneinecommerce.userim KlartextText that describes the main picture for people who cannot see it
category_idref → ecommerce_categorynoneneinecommerce.userim KlartextThe category the listing is shown under
pricemoneynoneneinecommerce.userim KlartextShop price including tax (minor currency units, e.g. cents)
compare_at_pricemoneynoneneinecommerce.userim KlartextPrevious price shown crossed out (minor currency units)
currencytextnoneneinecommerce.userim KlartextISO 4217 currency code of the prices, for example EUR; empty means the shop currency from the instance settings
skutextnoneneinecommerce.userim KlartextStock keeping unit shown on the product page
stock_policyselect (always_available, block_when_out, allow_backorder)noneneinecommerce.userim KlartextWhat happens when stock runs out: always_available, block_when_out, allow_backorder
stock_quantitynumbernoneneinecommerce.userim KlartextUnits 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
publishedboolnoneneinecommerce.userim KlartextWhether the listing is visible to shoppers

ecommerce_listing_image ​

An extra picture of a listing for its gallery

Lesegruppe: ecommerce.user. Schreibgruppe: ecommerce.manager.

FeldArtDatenklassePersonenbezogene DatenGruppeAgenten sehenBeschreibung
listing_idref → ecommerce_listingnoneneinecommerce.userim KlartextThe listing the picture belongs to; it is shown only while the listing is published
imageimagenoneneinecommerce.userim KlartextThe picture (PNG, JPEG, WebP or GIF, up to 5 MiB)
alttextnoneneinecommerce.userim KlartextText that describes the picture for people who cannot see it
sequencenumbernoneneinecommerce.userim KlartextOrder in the gallery, lowest first
publishedboolnoneneinecommerce.userim KlartextWhether the picture is shown in the shop

ecommerce_listing_translation ​

A listing translated into another language

Lesegruppe: ecommerce.user. Schreibgruppe: ecommerce.manager.

FeldArtDatenklassePersonenbezogene DatenGruppeAgenten sehenBeschreibung
listing_idref → ecommerce_listingnoneneinecommerce.userim KlartextThe listing this translates
langselect (en, de, fr, pl, fi, sv, es)noneneinecommerce.userim KlartextLanguage of the translation: en, de, fr, pl, fi, sv or es
titletextnoneneinecommerce.userim KlartextTranslated title
summarytextnoneneinecommerce.userim KlartextTranslated card text
descriptionlongtextnoneneinecommerce.userim KlartextTranslated description in Markdown
publishedboolnoneneinecommerce.userim KlartextWhether the translation is shown; it is only reachable while its listing is published

ecommerce_shipping_method ​

A way of delivering orders with its price

Lesegruppe: ecommerce.user. Schreibgruppe: ecommerce.manager.

FeldArtDatenklassePersonenbezogene DatenGruppeAgenten sehenBeschreibung
nametextnoneneinecommerce.userim KlartextName shown at checkout, for example Standard delivery
carriertextnoneneinecommerce.userim KlartextCarrier that delivers, for example DHL
pricemoneynoneneinecommerce.userim KlartextDelivery price (minor currency units)
free_overmoneynoneneinecommerce.userim KlartextOrder total above which delivery is free (minor currency units); empty means never
delivery_daysnumbernoneneinecommerce.userim KlartextUsual number of days until delivery
activeboolnoneneinecommerce.userim KlartextWhether shoppers can choose it

ecommerce_discount_code ​

A code a shopper enters at checkout for a reduction

Lesegruppe: ecommerce.user. Schreibgruppe: ecommerce.manager.

FeldArtDatenklassePersonenbezogene DatenGruppeAgenten sehenBeschreibung
codetextnoneneinecommerce.userim KlartextThe code shoppers type, for example SPRING10
kindselect (percent, fixed)noneneinecommerce.userim KlartextType of reduction: percent or fixed
valuenumbernoneneinecommerce.userim KlartextReduction: basis points for percent (1000 is 10.00 percent), minor currency units for fixed
starts_ondatenoneneinecommerce.userim KlartextFirst day the code works (YYYY-MM-DD)
ends_ondatenoneneinecommerce.userim KlartextLast day the code works (YYYY-MM-DD)
max_usesnumbernoneneinecommerce.userim KlartextHow many times the code may be used in total; empty means unlimited
used_countnumbernoneneinecommerce.userim KlartextHow 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_ordermoneynoneneinecommerce.userim KlartextSmallest order total the code applies to (minor currency units)
per_customer_limitnumbernoneneinecommerce.userim KlartextHow many times one customer (by email address) may use the code; empty means no limit
category_idref → ecommerce_categorynoneneinecommerce.userim KlartextOnly listings of this category get the reduction; empty means the whole order
activeboolnoneneinecommerce.userim KlartextWhether 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)

Lesegruppe: ecommerce.manager. Schreibgruppe: ecommerce.manager.

FeldArtDatenklassePersonenbezogene DatenGruppeAgenten sehenBeschreibung
code_idref → ecommerce_discount_codenoneneinecommerce.managerim KlartextThe discount code
customer_hashtextinternaljaecommerce.managermaskiertHash of the customer's email address, so the per-customer limit can be checked without keeping the address here
countnumbernoneneinecommerce.managerim KlartextUses so far

ecommerce_tax_rate ​

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

Lesegruppe: ecommerce.user. Schreibgruppe: ecommerce.manager.

FeldArtDatenklassePersonenbezogene DatenGruppeAgenten sehenBeschreibung
nametextnoneneinecommerce.userim KlartextName shown on the order, for example VAT
rate_bpnumbernoneneinecommerce.userim KlartextRate in basis points: 1900 is 19.00 percent
countrytextnoneneinecommerce.userim KlartextTwo-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_categorynoneneinecommerce.userim KlartextOnly listings of this category; empty means every listing (and delivery)
includedboolnoneneinecommerce.userim KlartextWhether listing prices already include this tax (the usual way in the EU). If not, the tax is added on top at checkout
activeboolnoneneinecommerce.userim KlartextWhether the rate is applied

ecommerce_order ​

An order placed online

Lesegruppe: ecommerce.user. Schreibgruppe: ecommerce.user.

FeldArtDatenklassePersonenbezogene DatenGruppeAgenten sehenBeschreibung
numbertextnoneneinecommerce.userim KlartextOrder number shown to the shopper. Free text: packages cannot generate sequences; the public checkout makes a random one
customer_emailtextinternaljaecommerce.usermaskiertEmail address of the shopper
customer_nametextinternaljaecommerce.usermaskiertName of the shopper
customer_idref → partynoneneinecommerce.userim KlartextThe matching contact, once the shopper is known
shipping_addresslongtextinternaljaecommerce.usermaskiertDelivery address
billing_addresslongtextinternaljaecommerce.usermaskiertBilling address when different from delivery
shipping_method_idref → ecommerce_shipping_methodnoneneinecommerce.userim KlartextThe chosen way of delivery
discount_code_idref → ecommerce_discount_codenoneneinecommerce.userim KlartextThe discount code used, if any
discount_codetextnoneneinecommerce.userim KlartextThe code the shopper entered, as it is shown on the order
discount_use_idtextinternaljaecommerce.usermaskiertWhich per-customer use counter this order counted against, so it can be given back
countrytextinternaljaecommerce.usermaskiertTwo-letter country code of the delivery address, which decides the tax rate
tax_summarylongtextnoneneinecommerce.userim KlartextThe tax lines of the order as JSON: name, rate in basis points, whether included in the prices, amount
stock_returnedboolnoneneinecommerce.userim KlartextSet when the units of a cancelled, expired or refunded order were put back on the listings, so it happens once
reserved_untilnumbernoneneinecommerce.userim KlartextUnix time until which an unpaid order holds its stock; after that it is cancelled and the stock goes back
payment_methodselect (manual, stripe, fake)noneneinecommerce.userim KlartextHow the shopper chose to pay: manual (bank transfer or invoice), stripe (card) or fake (demo)
placed_ondatenoneneinecommerce.userim KlartextDay the order was placed (YYYY-MM-DD)
currencytextnoneneinecommerce.userim KlartextISO 4217 currency code, for example EUR
subtotalmoneynoneneinecommerce.userim KlartextSum of the lines at listing prices (minor currency units, computed by the shop at checkout)
discount_totalmoneynoneneinecommerce.userim KlartextReduction from the discount code (minor currency units)
shipping_totalmoneynoneneinecommerce.userim KlartextDelivery charge (minor currency units)
tax_totalmoneynoneneinecommerce.userim KlartextAll tax on the order, both the part included in the prices and the part added on top (minor currency units)
totalmoneynoneneinecommerce.userim KlartextAmount the shopper pays: lines, minus the discount, plus delivery, plus tax that was added on top (minor currency units)
payment_referencetextfinancialjaecommerce.userzurückgehaltenReference from the payment provider; never a card number
tracking_referencetextnoneneinecommerce.userim KlartextCarrier tracking number
access_tokentextsecretneinecommerce.userzurückgehaltenSecret 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)noneneinecommerce.userim KlartextFulfilment status: pending, paid, shipped, delivered, cancelled, refunded

ecommerce_order_line ​

One product line of a web order

Lesegruppe: ecommerce.user. Schreibgruppe: ecommerce.user.

FeldArtDatenklassePersonenbezogene DatenGruppeAgenten sehenBeschreibung
order_idref → ecommerce_ordernoneneinecommerce.userim KlartextThe order the line belongs to
product_idref → productnoneneinecommerce.userim KlartextThe product ordered
listing_idref → ecommerce_listingnoneneinecommerce.userim KlartextThe shop listing the line was ordered from
descriptiontextnoneneinecommerce.userim KlartextProduct text as it was when ordered
quantitynumbernoneneinecommerce.userim KlartextUnits ordered
unit_pricemoneynoneneinecommerce.userim KlartextPrice per unit including tax (minor currency units)
subtotalmoneynoneneinecommerce.userim KlartextLine total (minor currency units, entered not computed)
discount_amountmoneynoneneinecommerce.userim KlartextPart of the order discount that falls on this line (minor currency units)
tax_nametextnoneneinecommerce.userim KlartextName of the tax applied to this line
tax_rate_bpnumbernoneneinecommerce.userim KlartextTax rate of this line in basis points
tax_amountmoneynoneneinecommerce.userim KlartextTax 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

Lesegruppe: ecommerce.user. Schreibgruppe: ecommerce.manager.

FeldArtDatenklassePersonenbezogene DatenGruppeAgenten sehenBeschreibung
order_idref → ecommerce_ordernoneneinecommerce.userim KlartextThe order being paid
providerselect (manual, stripe, fake)noneneinecommerce.userim KlartextWho takes the payment: manual (bank transfer or invoice), stripe (Stripe Checkout) or fake (local demo)
external_idtextfinancialneinecommerce.userzurückgehaltenThe provider's reference for this payment, for example a Stripe Checkout Session id. Never a card number
checkout_urltextfinancialneinecommerce.userzurückgehaltenWhere 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)noneneinecommerce.userim KlartextPayment status: open (waiting for the shopper), succeeded, failed, expired, cancelled, refunded
amountmoneynoneneinecommerce.userim KlartextAmount to pay, set by the server from the order (minor currency units)
currencytextnoneneinecommerce.userim KlartextISO 4217 currency code of the amount
refund_idtextfinancialneinecommerce.userzurückgehaltenThe provider's reference for the refund, once the payment was refunded
refunded_amountmoneynoneneinecommerce.userim KlartextAmount returned to the shopper (minor currency units)
event_idslongtextnoneneinecommerce.userim KlartextIds of the provider events already applied, as JSON, so a repeated notification changes nothing

Workflows ​

ecommerce_order ​

AktionBewegtWer sie ausführen darfFreigabe
ecommerce_order.mark_paidstate: pending → paidecommerce.usernein
ecommerce_order.shipstate: paid → shippedecommerce.usernein
ecommerce_order.deliverstate: shipped → deliveredecommerce.usernein
ecommerce_order.cancelstate: pending → cancelledecommerce.usernein
ecommerce_order.refundstate: paid → refundedecommerce.managerja
ecommerce_order.refund_deliveredstate: delivered → refundedecommerce.managerja

ecommerce_payment ​

AktionBewegtWer sie ausführen darfFreigabe
ecommerce_payment.mark_failedstate: open → failedecommerce.managernein
ecommerce_payment.cancelstate: open → cancelledecommerce.managernein

Berechtigungsgruppen ​

Von dieser App verwendete Gruppen:

  • ecommerce.manager
  • ecommerce.user

Freigabeschritte ​

Schritte, die ein Agent nur vorschlagen kann:

  • ecommerce_order.refund
  • ecommerce_order.refund_delivered

Was Agenten tun können und was nicht ​

Ein Agent kann Datensätze dieser App lesen, durchsuchen, anlegen und aktualisieren sowie Aktionen ausführen, die keine Freigabe brauchen, und zwar innerhalb der Berechtigungsgruppen seines Tokens.

Diese Schritte kann er nur vorschlagen, und eine Person muss sie freigeben: 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.

Personenbezogene Daten werden als Platzhalter maskiert: 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.

Diese Felder werden Agenten vollständig vorenthalten: ecommerce_order.payment_reference, ecommerce_order.access_token, ecommerce_payment.external_id, ecommerce_payment.checkout_url, ecommerce_payment.refund_id.

Abhängigkeiten ​

Jede Abhängigkeit nennt die Versionen, die sie akzeptiert. Integrierte Apps werden mit dem Kern versioniert; eine Anforderung an sie wird daher gegen die Kernversion geprüft.

Beim Installieren dieser App aus dem Marktplatz werden fehlende Abhängigkeiten mitinstalliert, in einem Plan, der einmal bestätigt wird.

Installation ​

Installieren Sie sie in der App Customize (Marktplatz) oder über die Kommandozeile:

bash
obop modules install-from ecommerce

Erfordert eine Datenbank und Administratorrechte.

Selbst bauen ​

Der Modulleitfaden zeigt, wie Apps wie diese geschrieben werden