# Home delivery

{% hint style="info" %}
Implementation is **OPTIONAL**
{% endhint %}

### General flow

Client flow

* add products into shopping cart
* choose delivery method and time
* authorize the payment

Merchant flow

* confirm or reject order
* process order and update order status

{% hint style="warning" %}
**The payment will be settled after merchant has been sent out the order !** This process is needed because merchant may not be able to fully fill the order due the out of stock products.
{% endhint %}

{% hint style="info" %}
The authorized payment **will be released** when merchant reject the order or authorization will be expired. Authorization expiration time is set by the card network.
{% endhint %}

### Configuration

**Configure home delivery via Smarts manager UI.**  Smarts supports 3 delivery methods: **courier, parcel, pickup by myself.** Home delivery can be fully customized. You can set delivery price, reaction time for each store, availability time and dates, location and much more.

**Implement required SDK methods for home delivery**

{% hint style="info" %}
**Smarts Worker App can be used to manage home delivery orders. (optional)**
{% endhint %}

### Implementation

You only need to create a new class, implement **`PickupAdapter`** interface and fill all required methods.  API endpoints for home delivery are created automatically and secured with token.&#x20;

It is important to add `@Component` annotation on top of the class. There is no restriction for class name or location in your project. Our SDK will find your implementation based on the interface (DI).

```java
import ee.smarts.common.v1.Entities.pickup.Order;
import ee.smarts.starter.adapter.PickupAdapter;
import org.springframework.stereotype.Component;

@Component
public class PickupAdapterImpl implements PickupAdapter {

    @Override
    public void onUpdate(Order order) {
      // implement this method. Will used when order was update in Smarts system
      // or via Smarts Worker App
    }

    @Override
    public void onCreate(Order order) {
      // implement this method. listener for new Orders
    }
}
```

Use SmartsPickupExchange to update order status or get information from Smarts.

```java
import ee.smarts.common.global.type.ShipmentStatus;
import ee.smarts.common.v1.Entities.pickup.Order;
import ee.smarts.common.v1.Exceptions.PermissionDeniedException;
import ee.smarts.starter.services.pickup.SmartsPickupExchange;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;

@Component
@RequiredArgsConstructor
public class PickupOrderServiceImpl {

    private final SmartsPickupExchange pickupExchange;

    void testCommunicationWithSmarts() throws PermissionDeniedException {
        Order order0 = pickupExchange.updateOrderStatus("INSTITUTION_ID", "ORDER_ID", ShipmentStatus.ASSEMBLE_READY);

        Order order1 = pickupExchange.findOrderById("INSTITUTION_ID", "ORDER_ID");
        Order order2 = pickupExchange.findOrderByInstitutionInvoiceId("INSTITUTION_ID", "INSTITUTION_INVOICE_ID");
        Order order3 = pickupExchange.findOrderBySmartsInvoiceId("INSTITUTION_ID", "SMARTS_INVOICE_ID");

    }
}
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://developer.smarts.ee/integration/spring-boot-starter/home-delivery.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
