damsel/proto/payout_processing.thrift
2017-08-01 15:30:18 +03:00

256 lines
8.9 KiB
Thrift
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

include "base.thrift"
include "domain.thrift"
namespace java com.rbkmoney.damsel.payout_processing
namespace erlang payout_processing
typedef base.ID PayoutID
typedef list<Event> Events
typedef base.ID UserID
struct UserInfo {
1: required UserID id
2: required UserType type
}
/* Временная замена ролям пользователей для разграничения доступа и лога аудита */
union UserType {
1: InternalUser internal_user
2: ExternalUser external_user
3: ServiceUser service_user
}
struct InternalUser {}
struct ExternalUser {}
struct ServiceUser {}
/**
* Событие, атомарный фрагмент истории бизнес-объекта, например выплаты
*/
struct Event {
/**
* Идентификатор события.
* Монотонно возрастающее целочисленное значение, таким образом на множестве
* событий задаётся отношение полного порядка (total order)
*/
1: required base.EventID id
/**
* Время создания события
*/
2: required base.Timestamp created_at
/**
* Идентификатор бизнес-объекта, источника события
*/
3: required EventSource source
/**
* Содержание события, состоящее из списка (возможно пустого)
* изменений состояния бизнес-объекта, источника события
*/
4: required EventPayload payload
}
/**
* Источник события, идентификатор бизнес-объекта, который породил его в
* процессе выполнения определённого бизнес-процесса
*/
union EventSource {
/* Идентификатор выплаты, которая породила событие */
1: PayoutID payout_id
}
/**
* Один из возможных вариантов содержания события
*/
union EventPayload {
/* Набор изменений, порождённых выплатой */
1: list<PayoutChange> payout_changes
}
/**
* Один из возможных вариантов события, порождённого выплатой
*/
union PayoutChange {
1: PayoutCreated payout_created
2: PayoutStatusChanged payout_status_changed
}
/**
* Событие о создании новой выплаты
*/
struct PayoutCreated {
/* Данные созданной выплаты */
1: required Payout payout
/* Кто инициировал выплату */
2: required UserInfo initiator
}
struct Payout {
1: required PayoutID id
2: required domain.PartyID party_id
3: required domain.ShopID shop_id
/* Время формирования платежного поручения, либо выплаты на карту */
4: required base.Timestamp created_at
5: required PayoutStatus status
6: required domain.FinalCashFlow payout_flow
7: required PayoutType payout_type
}
/**
* Выплата создается в статусе "unpaid", затем может перейти либо в "paid", если
* банк подтвердил, что принял ее в обработку (считаем, что она выплачена,
* а она и будет выплачена в 99% случаев), либо в "cancelled", если не получилось
* доставить выплату до банка.
*
* Из статуса "paid" выплата может перейти либо в "confirmed", если есть подтверждение
* оплаты, либо в "cancelled", если была получена информация о неуспешном переводе.
*
* Может случиться так, что уже подтвержденную выплату нужно отменять, и тогда выплата
* может перейти из статуса "confirmed" в "cancelled".
*/
union PayoutStatus {
1: PayoutUnpaid unpaid
2: PayoutPaid paid
3: PayoutCancelled cancelled
4: PayoutConfirmed confirmed
}
/* Создается в статусе unpaid */
struct PayoutUnpaid {}
/* Помечается статусом paid, когда удалось отправить в банк */
struct PayoutPaid {
1: required PaidDetails details
}
/* Детали выплаты, которые появляются после того, как выплата успешно отправлена */
union PaidDetails {
1: CardPaidDetails card_details
2: AccountPaidDetails account_details
}
struct CardPaidDetails {
1: required string mask_pan
2: required ProviderDetails provider_details
}
struct ProviderDetails {
1: required string name
2: required string transaction_id
}
struct AccountPaidDetails {}
/**
* Помечается статусом cancelled, когда не удалось отправить в банк,
* либо когда полностью откатывается из статуса confirmed с изменением
* балансов на счетах
*/
struct PayoutCancelled {
1: required UserInfo user_info
2: required string details
}
/**
* Помечается статусом confirmed, когда можно менять балансы на счетах,
* то есть если выплата confirmed, то балансы уже изменены
*/
struct PayoutConfirmed {
1: required UserInfo user_info
}
/* Типы выплаты */
union PayoutType {
1: CardPayout card_payout
2: AccountPayout account_payout
}
/* Выплата на карту */
struct CardPayout {
/* Идентификатор запроса на выплату */
1: required string request_id
/* Токен карты для cds */
2: optional domain.Token card_token
}
/* Вывод на расчетный счет */
struct AccountPayout {
/* Расчетный счет */
1: required string account
/* Корреспондентский счет */
2: required string bank_corr_account
/* БИК */
3: required string bank_bik
/* ИНН организации */
4: required string inn
/* Назначение платежа */
5: required string purpose
}
/**
* Событие об изменении статуса выплаты
*/
struct PayoutStatusChanged {
/* Новый статус выплаты */
1: required PayoutStatus status
}
/**
* Диапазон для выборки событий
*/
struct EventRange {
/**
* Идентификатор события, за которым должны следовать попадающие в выборку
* события.
*
* Если `after` не указано, в выборку попадут события с начала истории; если
* указано, например, `42`, то в выборку попадут события, случившиеся _после_
* события `42`.
*/
1: optional base.EventID after
/**
* Максимальное количество событий в выборке.
*
* В выборку может попасть количество событий, _не больше_ указанного в
* `limit`. Если в выборку попало событий _меньше_, чем значение `limit`,
* был достигнут конец текущей истории.
*
* _Допустимые значения_: неотрицательные числа
*/
2: required i32 limit
}
exception NoLastEvent {}
exception EventNotFound {}
service EventSink {
/**
* Получить последовательный набор событий из истории системы, от более
* ранних к более поздним, из диапазона, заданного `range`. Результат
* выполнения запроса может содержать от `0` до `range.limit` событий.
*
* Если в `range.after` указан идентификатор неизвестного события, то есть
* события, не наблюдаемого клиентом ранее в известной ему истории,
* бросится исключение `EventNotFound`.
*/
Events GetEvents (1: EventRange range)
throws (1: EventNotFound ex1, 2: base.InvalidRequest ex2)
/**
* Получить идентификатор наиболее позднего известного на момент исполнения
* запроса события
*/
base.EventID GetLastEventID ()
throws (1: NoLastEvent ex1)
}