@startuml
hide circle
skinparam linetype ortho
left to right direction

entity "order" as order {
  id : bigint <<PK>> <<NN>> autoincrement
  // Идентификатор записи
  --
  t_shop_order_id : bigint <<NN>>
  // Идентификатор заказа в T-Shop

  created_at : timestamptz <<NN>>
  // Дата и время оформления заказа в формате ISO 8601 UTC
  
  delivery_total : numeric(10,2)
  // Стоимость доставки
  
  expiry_date : timestamptz
  // Дата отмены заказа при бездействии (ISO 8601 UTC)
  
  items_total : numeric(10,2)
  // Платеж покупателя
  
  comment : varchar(256)
  // Комментарий к заказу
  
  status : enum('CANCELLED','PROCESSING','DELIVERY','PICKUP','DELIVERED') <<NN>>
  // Статус заказа
  
  substatus : enum('STARTED','READY_TO_SHIP','SHOP_FAILED','USER_CHANGED_MIND')
  // Этап обработки заказа
  
  updated_at : timestamptz <<NN>>
  // Дата и время последнего обновления заказа в формате ISO 8601 с указанием смещения относительно UTC.
}

entity "sync_log" as sync_log {
  id : bigint <<PK>> <<NN>> autoincrement
  // Идентификатор записи
  --
  last_synced_updated_at : timestamptz  <<NN>>
  // Время последней синхронизации

  retry_policy_attempts : smallint
  // Количество попыток retry policy

  last_error : json
  // JSON запроса и ответа при котором произошла ошибка

  current_page_token : varchar(100)
  // Идентификатор следующей страницы результатов

  status : enum('success','error') <<NN>>
  // Статус синхронизации (success, error)
}

entity "order_status_history" as order_status_history {
  id : bigint <<PK>> <<NN>> autoincrement
  // Идентификатор записи
  --
  order_id : bigint <<NN>>
  // Идентификатор заказа

  status : enum('CANCELLED','PROCESSING','DELIVERY','PICKUP','DELIVERED') <<NN>>
  // Статус заказа
  
  substatus : enum('STARTED','READY_TO_SHIP','SHOP_FAILED','USER_CHANGED_MIND')
  // Этап обработки заказа

  created_at : timestamptz <<NN>>
  // Время создания записи
}

entity "outlet" as outlet {
  id : bigint <<PK>> <<NN>> autoincrement
  // Идентификатор записи
  --
  outlet_code : uuid
  // Идентификатор пункта самовывоза

  outlet_name : varchar(100)
  // Наименование пункта самовывоза
  ===
  // В последствии добавим и другие атрибуты если нужно будет синкать ПВЗ. На данный момент этот функционал в фидах
}

entity "order_buyer" as buyer {
  id : bigint <<PK>> <<NN>> autoincrement
  // Идентификатор записи
  --
  t_shop_order_id : bigint
  // Идентификатор заказа тиньков

  phone : varchar(20) <<NN>>
  // Номер телефона покупателя
  
  email : varchar(255) <<NN>>
  // Почта для отправки чека
  
  first_name : varchar(100) <<NN>>
  // Имя покупателя
  
  last_name : varchar(100) <<NN>>
  // Фамилия покупателя
}

entity "order_delivery" as delivery {
  id : bigint <<PK>> <<NN>> autoincrement
  // Идентификатор записи
  --
  t_shop_order_id : bigint
  // Идентификатор заказа тиньков
  
  lift_price : numeric(10,2)
  // Стоимость подъема на этаж (руб)
  
  lift_type : order_lift_type
  // Тип подъема: NOT_NEEDED, MANUAL, ELEVATOR, CARGO_ELEVATOR, FREE, UNKNOWN
  
  outlet_code : varchar(100)
  // Идентификатор пункта самовывоза магазина
  
  outlet_storage_limit_date : timestamptz
  // Дата хранения в пункте выдачи (только для статуса PICKUP)
  
  service_name : varchar(255)
  // Наименование службы доставки
  
  type : order_delivery_type
  // Способ доставки: DELIVERY, PICKUP, UNKNOWN

  real_delivery_date : timestamptz
  // Фактическая дата доставки (ISO 8601 UTC)
}

entity "order_delivery_address" as address {
  id : bigint <<PK>> <<NN>> autoincrement
  // Идентификатор записи
  --
  t_shop_order_id : bigint
  // Идентификатор заказа тиньков

  full_address : text <<NN>>
  // Полный адрес доставки (очень полный, до уровня квартиры если есть)
  
  apartment : varchar(20)
  // Квартира или офис
  
  block : varchar(20)
  // Корпус или строение
  
  city : varchar(100) <<NN>>
  // Город или населенный пункт
  
  country : varchar(100) <<NN>>
  // Страна
  
  district : varchar(100)
  // Район
  
  entrance : varchar(10)
  // Подъезд
  
  entryphone : varchar(20)
  // Код домофона
  
  postcode : varchar(20)
  // Почтовый индекс (для почтовой доставки)
  
  floor : varchar(5)
  // Этаж
  
  house : varchar(10)
  // Дом или владение
  
  phone : varchar(20) <<NN>>
  // Телефон получателя заказа
  
  street : varchar(255)
  // Улица
  
  recipient : varchar(255) <<NN>>
  // ФИО получателя заказа
  
  latitude : double precision <<NN>>
  // Широта адреса доставки
  
  longitude : double precision <<NN>>
  // Долгота адреса доставки
}

entity "order_item" as item {
  id : bigint <<PK>> <<NN>> autoincrement
  // Идентификатор записи
  --
  t_shop_item_id : bigint <<NN>>
  // Идентификатор товара в заказе (позволяет идентифицировать товар в заказе)

  order_id : bigint <<NN>>
  // Ссылка на заказ
  
  count : integer <<NN>>
  // Количество единиц товара

  product_id : varchar(255) <<NN>>
  // SKU (наш внутренний)
  
  offer_name : varchar(500)
  // Название товара
  
  price : numeric(10,2) <<NN>>
  // Цена товара в рублях
}

' === СВЯЗИ ===
order ||--|| buyer : "1:1\n(обязательно)"
order ||--o| delivery : "1:1\n(необязательно)"
delivery ||--|| address : "1:1\n(необязательно)"
order ||--|{ item : "1:many\n(обязательно)"
outlet ||--o{ delivery : "1:many\n(необязательно)"
order ||--o{ order_status_history : "1:many\n(обязательно)"

note left of order
<u><b>order_status_type</b></u>
<b>Статус</b>       <b>Описание</b>
CANCELLED     Отменен
PROCESSING    В обработке
DELIVERY      В службе доставки
PICKUP        В пункте самовывоза
DELIVERED     Получен покупателем
===
<u><b>order_substatus_type</b></u>
<b>Этап</b>               <b>Статус</b>          <b>Описание</b>
STARTED           (статус-> PROCESSING     Заказ подтвержден, можно обрабатывать
READY_TO_SHIP     (статус-> PROCESSING     Заказ собран, готов к отправке
SHOP_FAILED       (статус-> CANCELLED      Магазин не может выполнить
USER_CHANGED_MIND (статус-> CANCELLED      Покупатель отменил
endnote

note top of delivery
<u><b>order_lift_type</b></u>
<b>Тип              Описание</b>
NOT_NEEDED     Не требуется
MANUAL         Ручной
ELEVATOR       Лифт
CARGO_ELEVATOR Грузовой лифт
FREE           Любой (при бесплатном подъеме)
UNKNOWN        Неизвестный тип
===
<u><b>order_delivery_type</b></u>
<b>Тип        Описание</b>
DELIVERY    Курьерская доставка
PICKUP      Самовывоз
UNKNOWN     Неизвестный тип
endnote


@enduml