From e90fd57ca33743d8b28167e53307bac8274d9a72 Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Sun, 14 Aug 2016 20:39:16 +0200 Subject: [PATCH] Update concept documentation and add a graph on order states --- doc/development/concepts.rst | 83 +++++++++++++++++++---------------- doc/images/order_states.png | Bin 0 -> 32448 bytes doc/images/order_states.puml | 18 ++++++++ 3 files changed, 63 insertions(+), 38 deletions(-) create mode 100644 doc/images/order_states.png create mode 100644 doc/images/order_states.puml diff --git a/doc/development/concepts.rst b/doc/development/concepts.rst index c23858082..7bbceabd1 100644 --- a/doc/development/concepts.rst +++ b/doc/development/concepts.rst @@ -9,67 +9,74 @@ The components The project pretix is split into several components. The main three of them are: -**pretix.base** - Pretixbase is the foundation below all other components. It is primarily +**base** + This is the foundation below all other components. It is primarily responsible for the data structures and database communication. It also hosts several utilities which are used by multiple other components. -**pretix.control** - Pretixcontrol is the web-based backend software which allows organizers to +**control** + This is the web-based backend software which allows organizers to create and manage their events, items, orders and tickets. -**pretix.presale** - Pretixpresale is the ticket-shop itself, containing all of the parts visible to the +**presale** + This is the ticket-shop itself, containing all of the parts visible to the end user. Users and events ^^^^^^^^^^^^^^^^ -Pretix is all about **events**, which are defined as something happening somewhere. +pretix is all about **events**, which are defined as something happening somewhere. Every event is managed by the **organizer**, an abstract entity running the event. -Pretix has a concept of **users** that is used for all people who have to log in to the +pretix has a concept of **users** that is used for all people who have to log in to the control panel to manage one or more events. No user is required to place an order. Items and variations ^^^^^^^^^^^^^^^^^^^^ -The purpose of pretix is to sell **items** (which belong to **events**) to **users**. -An **item** is a abstract thing, popular examples being an event ticket or a piece of -merchandise, like 'T-shirt'. An **item** can have multiple **variations**. For example, -the **item** 'T-Shirt' could have the **variations** 'S', 'M' and 'L'. - -Questions -^^^^^^^^^ +The purpose of pretix is to sell products, e.g. tickets or merchandise for an event. Internally, +those products are called **items**. An item can have multiple **variations**. For example, +the item 'T-Shirt' could have the **variations** 'S', 'M' and 'L'. An item can be extended using **questions**. Questions enable items to be extended by additional information which can be entered by the user. Examples of possible questions include 'name' or 'age'. -Restriction by number -""""""""""""""""""""" +Quotas +^^^^^^ -The restriction by number is a special case, as it is the only (planned) restriction type demanding -special care in the implementation to never sell more tickets than allowed, even under heavy load. +Every item needs to belong to one or more **quotas**. The quota contains the information on how many +times an item can be sold. A quota can have a limited amount of tickets (e.g. if you have a room that +fits a defined maximum number of persons) or it can be unlimited. In the former case, the quota can be +available or sold out, in the latter case it is always treated as available. -* There is a concept of **quotas**. A quota is basically a number of items combined with information - about how many of them are still available. -* Every time a user places a item in the cart, a **cart position** is created, reducing the number of - available items in the pool by one. The position is valid for a fixed time (e.g. 30 minutes), but not - instantly deleted after those 30 minutes (we'll get to that). -* Every time a user places a binding order, the **cart position** object is replaced by an **order position** - object which behaves much the same as the cart position. It reduces the number of available items and is valid - for a fixed time, this time for the configured payment term (e.g. 14 days). -* If the order is being paid, the **order** becomes permanent. -* Once there are no available tickets left and user A wants to buy a ticket, they can do so, as long as - there are *expired* cart position in the system. In this case, user A gets a new cart position. Now there are - more cart positions than available tickets and therefore we have to remove one of the expired cart positions. - We will choose to delete the cart position of the user who tries *last* to use his cart position. -* The same goes for orders which are not paid within the configured time frame. This policy allows the organizer to - sell as many items as possible. Moreover, it guarantees the users to get their items if they check out within the validity - period of their positions and pay within the validity period of their orders. It does not guarantee them anything - any longer, but it tries to be *as tolerant as possible* to users who are paying after their payment - period or click checkout after the expiry of their position. -* The same quota can apply to multiple items and one item can be affected by multiple quotas. +If an item is assigned to multiple quotas, it can only be bought if *all of them* still are available. +If multiple items are assigned to the same quota, the quota will be counted as sold out as soon as the +*sum* of the two items exceeds the quota limit. +The availability of a quota is currently calculated by substracting the following numbers from the quota +limit: + +* The number of orders placed for an item that are either already paid or within their granted payment period +* The number of non-expired items currently in the shopping cart of users +* The number of vouchers defined as "quota blocking" (see blow) + +The quota system tries very hard to be as friendly as possible to your event attendees while still making sure +your limit is never exceeded. For example, when the payment period of an order expires without the order being +paid for, the quota will be freed to allow new persons to buy a ticket. However, if you then receive a payment +for the expired order, it will be accepted – unless the quota has sold out in the meantime. + +Vouchers +^^^^^^^^ + +A voucher is an object that can be used to grant a single user something special, e.g. a reduced price for a +product or reserved quota space. + +Orders +^^^^^^ + +If a customer completes the checkout process, an **Order** will be created containing all the entered information. +An order can be in one of currently five states that are listed in the diagram below: + +.. image:: /images/order_states.png diff --git a/doc/images/order_states.png b/doc/images/order_states.png new file mode 100644 index 0000000000000000000000000000000000000000..8297351b938c5fa5decd29fba79e8af9c1ee8f5d GIT binary patch literal 32448 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 JD*5We{{w})KCJ)% literal 0 HcmV?d00001 diff --git a/doc/images/order_states.puml b/doc/images/order_states.puml new file mode 100644 index 000000000..53b0e0a20 --- /dev/null +++ b/doc/images/order_states.puml @@ -0,0 +1,18 @@ +@startuml + +Pending: Order is expecting payment\nOrder reduces quotas +Expired: Payment period is over\nOrder does not affect quotas +Paid: Order was successful\nOrder reduces quotas +Cancelled: Order has been cancelled\nOrder does not affect quotas +Refunded: Order has been refunded\nOrder does not affect quotas + +[*] --> Pending: customer\nplaces order +Pending --> Paid: successful payment +Pending --> Expired: automatically\nor manually\non admin action +Expired --> Paid: if payment is received\nonly if quota left +Expired --> Cancelled +Paid --> Refunded: manually on\nadmin action\nor if an external\npayment provider\nnotifies about a\npayment refund +Pending --> Cancelled: on admin or\ncustomer action +Paid -> Pending: manually on admin action + +@enduml