Overview
As you’d expect, orders on an online system show what users have purchased. Orders are linked to Carts and although you would generally only have one Order per cart, the system will support multiple if your store requires it.| Field | Description | 
|---|---|
| id | |
| user_id | If this is not a guest order, this will have the users id | 
| customer_id | Can be null, stores customer | 
| cart_id | The related cart | 
| channel_id | Which channel this was purchased through | 
| status | A status that makes sense to you as the store owner | 
| reference | Your store’s own reference | 
| customer_reference | If you want customers to add their own reference, it goes here. | 
| sub_total | The sub total minus any discounts, excl. tax | 
| discount_breakdown | A json field for the discount breakdown e.g. [{"discount_id": 1, "lines": [{"id": 1, "qty": 1}]], "total": 200}] | 
| discount_total | Any discount amount excl. tax | 
| shipping_breakdown | A json field for the shipping breakdown e.g. [{"name": "Standard Delivery", "identifier": "STD", "price": 123}] | 
| shipping_total | The shipping total with tax | 
| tax_breakdown | A json field for the tax breakdown e.g. [{"description": "VAT", "identifier" : "vat", "value": 123, "percentage": 20, "currency_code": "GBP"}] | 
| tax_total | The total amount of tax applied | 
| total | The grand total with tax | 
| notes | Any additional order notes | 
| currency_code | The code of the currency the order was placed in | 
| compare_currency_code | The code of the default currency at the time | 
| exchange_rate | The exchange rate between currency_code and compare_currency_code | 
| placed_at | The datetime the order was considered placed. | 
| meta | Any additional meta info you wish to store | 
| created_at | |
| updated_at | 
Create an order
You can either create an order directly, or the recommended way is via aCart model.
allowMultipleOrders- Generally carts will only have one draft order associated, however if you want to allow carts to have multiple, you can passtruehere.orderIdToUpdate- You can optionally pass the ID of an order to update instead of attempting to create a new order, this must be a draft order i.e. a nullplaced_atand related to the cart.
Lunar\Actions\Carts\CreateOrder, you are free to override this in the
config file config/cart.php
Validating a cart before creation.
If you also want to check before you attempt this if the cart is ready to create an order, you can call the helper method:ValidateCartForOrderCreation class which lunar provides and throw any validation
exceptions with helpful messages if the cart isn’t ready to create an order.
You can specify you’re own class to handle this in config/cart.php.
Order Reference Generating
By default Lunar will generate a new order reference for you when you create an order from a cart. The format for this is:{0..0} indicates the order id will be padded until the length is 8 digits (not including the prefix)
The prefix is optional and defined in the lunar/orders.php config file, which gives access to a number of settings you can change.
Custom Generators
If your store has a specific requirement for how references are generated, you can easily swap out the Lunar one for your own:config/lunar/orders.php
null
Here’s the underlying class for the custom generator:
Modifying Orders
If you need to programmatically change the Order values or add in new behaviour, you will want to extend the Order system. You can find out more in the Extending Lunar section for Order Modifiers.Order Lines
| Field | Description | 
|---|---|
| id | |
| order_id | |
| purchasable_type | Morph reference for the purchasable item e.g. product_variant | 
| purchasable_id | |
| type | Whether digital,physical etc | 
| description | A description of the line item | 
| option | If this was a variant, the option info is here | 
| identifier | Something to identify the purchasable item, usually an sku | 
| unit_price | The unit price of the line | 
| unit_quantity | The line unit quantity, usually this is 1 | 
| quantity | The amount of this item purchased | 
| sub_total | The sub total minus any discounts, excl. tax | 
| discount_total | Any discount amount excl. tax | 
| tax_breakdown | A json field for the tax breakdown e.g. [{"description": "VAT", "identifier" : "vat", "value": 123, "percentage": 20, "currency_code": "GBP"}] | 
| tax_total | The total amount of tax applied | 
| total | The grand total with tax | 
| notes | Any additional order notes | 
| meta | Any additional meta info you wish to store | 
| created_at | |
| updated_at | 
Create an order line
If you are using the 
createOrder method on a cart, this is all handled for you automatically.Order Addresses
An order can have many addresses, typically you would just have one for billing and one for shipping.If you are using the 
createOrder method on a cart, this is all handled for you automatically.Shipping Options
A Shipping Tables addon is planned to make setting up shipping in the admin hub easy for most scenarios.
Lunar\DataTypes\ShippingOption objects.
Adding the shipping option to the cart
Once the user has selected the shipping option they want, you will need to add this to the cart so it can calculate the new totals.Transactions
| Field | Description | 
|---|---|
| id | |
| success | Whether the transaction was successful | 
| refund | true if this was a refund | 
| driver | The payment driver used e.g. stripe | 
| amount | An integer amount | 
| reference | The reference returned from the payment Provider. Used to identify the transaction with them. | 
| status | A string representation of the status, unlinked to Lunar e.g. settled | 
| notes | Any relevant notes for the transaction | 
| card_type | e.g. visa | 
| last_four | Last 4 digits of the card | 
| meta | Any additional meta info you wish to store | 
| created_at | |
| updated_at | 
Create a transaction
Just because an order has a transaction does not mean it has been placed. Lunar determines whether an order is
considered placed when the 
placed_at column has a datetime, regardless if any transactions exist or not.Payments
We will be looking to add support for the most popular payment providers, so keep an eye out here as we will list them all out. In the meantime, you can absolutely still get a storefront working, at the end of the day Lunar doesn’t really mind what payment provider you use or plan to use. In terms of an order, all it’s worried about is whether or not theplaced_at column is populated on the orders table,
the rest is completely up to you how you want to handle that. We have some helper utilities to make such things easier
for you as laid out above.
And as always, if you have any questions you can reach out on our Discord!
Order Status
Theplaced_at field determines whether an Order is considered draft or placed. The Order model has two helper methods
to determine the status of an Order.
Order Notifications
Lunar allows you to specify what Laravel mailers/notifications should be available for sending when you update an order’s status. These are configured in thelunar/orders config file and are defined like so:
awaiting-payment. You can then choose the email addresses which the email should be sent to and also add an
additional email address if required.
Once updated, Lunar will keep a render of the email sent out in the activity log so you have a clear history of what’s
been sent out.
These email notifications do not get sent out automatically if you update the status outside of the hub.
Mailer template
When building out the template for your mailer, you should assume you have access to the$order model. When the status
is updated this is passed through to the view data for the mailer, along with any additional content entered.
Since you may not always have additional content when sending out the mailer, you should check the existence first.
Here’s an example of what the template could look like:
Order Invoice PDF
By default when you click “Download PDF” in the hub when viewing an order, you will get a basic PDF generated for you to download. You can publish the view that powers this to create your own PDF template.resources/vendor/lunarpanel/pdf/order.blade.php, where you will be able to freely
customise the PDF you want displayed on download.