@startuml hide circle skinparam linetype ortho left to right direction entity "order" as order { id : bigint <> <> autoincrement // Идентификатор записи -- t_shop_order_id : bigint <> // Идентификатор заказа в T-Shop created_at : timestamptz <> // Дата и время оформления заказа в формате 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') <> // Статус заказа substatus : enum('STARTED','READY_TO_SHIP','SHOP_FAILED','USER_CHANGED_MIND') // Этап обработки заказа updated_at : timestamptz <> // Дата и время последнего обновления заказа в формате ISO 8601 с указанием смещения относительно UTC. } entity "sync_log" as sync_log { id : bigint <> <> autoincrement // Идентификатор записи -- last_synced_updated_at : timestamptz <> // Время последней синхронизации retry_policy_attempts : smallint // Количество попыток retry policy last_error : json // JSON запроса и ответа при котором произошла ошибка current_page_token : varchar(100) // Идентификатор следующей страницы результатов status : enum('success','error') <> // Статус синхронизации (success, error) } entity "order_status_history" as order_status_history { id : bigint <> <> autoincrement // Идентификатор записи -- order_id : bigint <> // Идентификатор заказа status : enum('CANCELLED','PROCESSING','DELIVERY','PICKUP','DELIVERED') <> // Статус заказа substatus : enum('STARTED','READY_TO_SHIP','SHOP_FAILED','USER_CHANGED_MIND') // Этап обработки заказа created_at : timestamptz <> // Время создания записи } entity "outlet" as outlet { id : bigint <> <> autoincrement // Идентификатор записи -- outlet_code : uuid // Идентификатор пункта самовывоза outlet_name : varchar(100) // Наименование пункта самовывоза === // В последствии добавим и другие атрибуты если нужно будет синкать ПВЗ. На данный момент этот функционал в фидах } entity "order_buyer" as buyer { id : bigint <> <> autoincrement // Идентификатор записи -- t_shop_order_id : bigint // Идентификатор заказа тиньков phone : varchar(20) <> // Номер телефона покупателя email : varchar(255) <> // Почта для отправки чека first_name : varchar(100) <> // Имя покупателя last_name : varchar(100) <> // Фамилия покупателя } entity "order_delivery" as delivery { id : bigint <> <> 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 <> <> autoincrement // Идентификатор записи -- t_shop_order_id : bigint // Идентификатор заказа тиньков full_address : text <> // Полный адрес доставки (очень полный, до уровня квартиры если есть) apartment : varchar(20) // Квартира или офис block : varchar(20) // Корпус или строение city : varchar(100) <> // Город или населенный пункт country : varchar(100) <> // Страна district : varchar(100) // Район entrance : varchar(10) // Подъезд entryphone : varchar(20) // Код домофона postcode : varchar(20) // Почтовый индекс (для почтовой доставки) floor : varchar(5) // Этаж house : varchar(10) // Дом или владение phone : varchar(20) <> // Телефон получателя заказа street : varchar(255) // Улица recipient : varchar(255) <> // ФИО получателя заказа latitude : double precision <> // Широта адреса доставки longitude : double precision <> // Долгота адреса доставки } entity "order_item" as item { id : bigint <> <> autoincrement // Идентификатор записи -- t_shop_item_id : bigint <> // Идентификатор товара в заказе (позволяет идентифицировать товар в заказе) order_id : bigint <> // Ссылка на заказ count : integer <> // Количество единиц товара product_id : varchar(255) <> // SKU (наш внутренний) offer_name : varchar(500) // Название товара price : numeric(10,2) <> // Цена товара в рублях } ' === СВЯЗИ === 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 order_status_type Статус Описание CANCELLED Отменен PROCESSING В обработке DELIVERY В службе доставки PICKUP В пункте самовывоза DELIVERED Получен покупателем === order_substatus_type Этап Статус Описание STARTED (статус-> PROCESSING Заказ подтвержден, можно обрабатывать READY_TO_SHIP (статус-> PROCESSING Заказ собран, готов к отправке SHOP_FAILED (статус-> CANCELLED Магазин не может выполнить USER_CHANGED_MIND (статус-> CANCELLED Покупатель отменил endnote note top of delivery order_lift_type Тип Описание NOT_NEEDED Не требуется MANUAL Ручной ELEVATOR Лифт CARGO_ELEVATOR Грузовой лифт FREE Любой (при бесплатном подъеме) UNKNOWN Неизвестный тип === order_delivery_type Тип Описание DELIVERY Курьерская доставка PICKUP Самовывоз UNKNOWN Неизвестный тип endnote @enduml