# 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");

    }
}
```
