---
# System prepended metadata

title: Flow endpoint affiliate member

---

# Flow endpoint sync order affiliate member

## sync order

```plantuml
participant "cron" as cron
participant "everpro-logistic-client" as elc
database "popaket_logistic" as db0
database "everpro_data" as db1
participant "everpro-user" as eu

cron -> elc : hit endpoint 
elc -> db0 : get orders yesterday (join with shipment_orders_cashback)
note left
query :

select 
so.shipment_order_no, 
so.created_by,
lower(los.description) as status_name,
so.status,
l.logistic_name,
lr.rate_name,
lr.rate_code ,
so.shipment_price,
soc.total_cashback as member_total_cashback,
soc.affiliator_total_cashback,
case 
	when coalesce(so.dispatch_at, 0) <> 0 then  to_timestamp(so.dispatch_at)
	else NULL
end as dispatch_at, 
case 
	when coalesce(so.delivered_at , 0) <> 0 then  to_timestamp(so.delivered_at)
	else NULL
end as delivered_at ,
case 
	when coalesce(so.return_at  , 0) <> 0 then  to_timestamp(so.return_at)
	else NULL
end as return_at 
from shipment_orders so 
join shipment_orders_cashback soc on soc.shipment_order_no = so.shipment_order_no 
join logistic_order_status los on los.id = so.status 
join logistics l on l.id = so.logistic_id 
join logistic_rates lr on lr.id = so.rate_id 
where 
(so.dispatch_at  >= extract(epoch from date_trunc('day', current_timestamp) - interval '1' day) and so.dispatch_at  < extract(epoch FROM date_trunc('day', current_timestamp)) ) or 
(so.delivered_at >= extract(epoch from date_trunc('day', current_timestamp) - interval '1' day) and so.delivered_at < extract(epoch FROM date_trunc('day', current_timestamp)) ) or
(so.return_at  >= extract(epoch from date_trunc('day', current_timestamp) - interval '1' day) and so.return_at  < extract(epoch FROM date_trunc('day', current_timestamp)) ) 
end note
db0 --> elc
elc -> elc : collect created_by from order to array
elc -> eu : get affiliator_id via grpc everpro-user
note left
select r.user_id as affiliator_id, ur.user_id as member_id
from user_referral ur 
join referral r on r.entity_id = ur.referral_id 
where ur.user_id IN (userids)
end note
elc -> db1 : upsert to affiliate_orders
elc -> cron : success response
```

## backfill oktober

```plantuml
participant "cron" as cron
participant "everpro-logistic-client" as elc
database "popaket_logistic" as db0
database "everpro_data" as db1
participant "everpro-user" as eu

cron -> elc : hit endpoint 
elc -> db0 : select shipment_orders where return_at between 1 oktober - 31 oktober dan return_at nya is not null
note left 
query : 

select 
so.shipment_order_no, 
so.created_by,
lower(los.description) as status_name,
so.status,
l.logistic_name,
lr.rate_name,
lr.rate_code ,
so.shipment_price,
so.cashback,
case 
	when coalesce(so.dispatch_at, 0) <> 0 then  to_timestamp(so.dispatch_at)
	else NULL
end as dispatch_at, 
case 
	when coalesce(so.delivered_at , 0) <> 0 then  to_timestamp(so.delivered_at)
	else NULL
end as delivered_at ,
so.delivered_at,
case 
	when coalesce(so.return_at  , 0) <> 0 then  to_timestamp(so.return_at)
	else NULL
end as return_at 
from shipment_orders so 
--join shipment_orders_cashback soc on soc.shipment_order_no = so.shipment_order_no 
join logistic_order_status los on los.id = so.status 
join logistics l on l.id = so.logistic_id 
join logistic_rates lr on lr.id = so.rate_id 
where 
(so.return_at between extract(epoch from '2023-10-01T00:00:00Z'::timestamp) and extract(epoch from '2023-10-31T23:59:59Z'::timestamp) ) 

end note
db0 --> elc
elc -> elc : collect created_by from order as array
elc -> eu : get affiliator_id via grpc everpro-user
note left
select r.user_id as affiliator_id, ur.user_id as member_id
from user_referral ur 
join referral r on r.entity_id = ur.referral_id 
where ur.user_id IN (userids)
end note
elc -> elc : calculate cashback of affiliator 
elc -> elc : calculate commission from formula
note left
    est_commission = cashback affiliator - cashback member
end note
elc -> db1 : upsert to affiliate_orders
elc -> cron : success response
```

## Move data from fct_shipping_affiliate_commission_v2

```plantuml
participant "cron" as cron
participant "everpro-logistic-client" as elc
database "popaket_logistic" as db0
database "everpro_data" as db1
participant "everpro-user" as eu

cron -> elc : hit endpoint 
elc -> db0 : get data from fct_shipping_affiliate_commission_v2 
note left 
query : 

select 
member_user_id,
affiliator_user_id,
shipment_order_no,
dispatched_at,
delivered_at,
logistic_id,
service_name,
rate_code,
actual_courier_cost,
cashback,
est_commission 
from fct_shipping_affiliate_commission_v2 
end note
db0 --> elc
elc -> db0 : get status, status_id and return_at from shipment_orders 
db0 --> elc

elc -> db1 : upsert to affiliate_orders
elc -> cron : success response
```

## API Design

| data | value |
| -------- | -------- |
| url | http://everpro-logistic-client.dev.internal/logistic/private/v1/sync-affiliate-order
| query string | backfill_month_year, is_move_from_old_table |
| response | { "status": "Success", "status_code": 200, "message": "success sync order", "timestamp": "2023-10-25T03:10:15.82194619Z", "data": null }

