2017-08-01 12:30:18 +00:00
|
|
|
|
include "base.thrift"
|
|
|
|
|
include "domain.thrift"
|
2018-12-12 09:12:33 +00:00
|
|
|
|
include "msgpack.thrift"
|
2017-08-01 12:30:18 +00:00
|
|
|
|
|
|
|
|
|
namespace java com.rbkmoney.damsel.payout_processing
|
|
|
|
|
namespace erlang payout_processing
|
|
|
|
|
|
|
|
|
|
typedef base.ID PayoutID
|
|
|
|
|
typedef list<Event> Events
|
|
|
|
|
|
|
|
|
|
typedef base.ID UserID
|
|
|
|
|
|
2018-12-12 09:12:33 +00:00
|
|
|
|
typedef map<string, msgpack.Value> Metadata
|
|
|
|
|
|
2017-08-01 12:30:18 +00:00
|
|
|
|
/**
|
|
|
|
|
* Событие, атомарный фрагмент истории бизнес-объекта, например выплаты
|
|
|
|
|
*/
|
|
|
|
|
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
|
|
|
|
|
}
|
|
|
|
|
|
2018-02-26 12:14:59 +00:00
|
|
|
|
/**
|
2018-03-15 10:03:41 +00:00
|
|
|
|
* Виды операций над денежными средствами
|
2018-02-26 12:14:59 +00:00
|
|
|
|
*/
|
2018-03-15 10:03:41 +00:00
|
|
|
|
enum OperationType {
|
2018-02-26 12:14:59 +00:00
|
|
|
|
payment
|
|
|
|
|
refund
|
|
|
|
|
adjustment
|
2020-05-09 12:39:24 +00:00
|
|
|
|
chargeback
|
2018-02-26 12:14:59 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Расшифровка части суммы вывода
|
|
|
|
|
* Описание части суммы вывода, сгруппированное по виду движения денежных средств
|
|
|
|
|
*/
|
2018-03-15 10:03:41 +00:00
|
|
|
|
struct PayoutSummaryItem {
|
|
|
|
|
1: required domain.Amount amount
|
|
|
|
|
2: required domain.Amount fee
|
|
|
|
|
3: required string currency_symbolic_code
|
|
|
|
|
4: required base.Timestamp from_time
|
|
|
|
|
5: required base.Timestamp to_time
|
|
|
|
|
6: required OperationType operation_type
|
2018-02-26 12:14:59 +00:00
|
|
|
|
/* Количество движений данного вида в выводе */
|
2018-03-15 10:03:41 +00:00
|
|
|
|
7: required i32 count
|
2018-02-26 12:14:59 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Список описаний денежных сумм, из которых состоит сумма вывода
|
|
|
|
|
*/
|
2018-03-15 10:03:41 +00:00
|
|
|
|
typedef list<PayoutSummaryItem> PayoutSummary
|
2018-02-26 12:14:59 +00:00
|
|
|
|
|
2017-08-01 12:30:18 +00:00
|
|
|
|
struct Payout {
|
2018-12-12 09:12:33 +00:00
|
|
|
|
1 : required PayoutID id
|
|
|
|
|
2 : required domain.PartyID party_id
|
|
|
|
|
3 : required domain.ShopID shop_id
|
|
|
|
|
9 : required domain.ContractID contract_id
|
2017-08-01 12:30:18 +00:00
|
|
|
|
/* Время формирования платежного поручения, либо выплаты на карту */
|
2018-12-12 09:12:33 +00:00
|
|
|
|
4 : required base.Timestamp created_at
|
|
|
|
|
5 : required PayoutStatus status
|
2018-12-24 13:36:42 +00:00
|
|
|
|
11: required domain.Amount amount
|
|
|
|
|
12: required domain.Amount fee
|
|
|
|
|
13: required domain.CurrencyRef currency
|
2018-12-12 09:12:33 +00:00
|
|
|
|
6 : required domain.FinalCashFlow payout_flow
|
|
|
|
|
7 : required PayoutType type
|
|
|
|
|
8 : optional PayoutSummary summary
|
|
|
|
|
10: optional Metadata metadata
|
2017-08-01 12:30:18 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Выплата создается в статусе "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, когда удалось отправить в банк */
|
2018-12-12 09:12:33 +00:00
|
|
|
|
struct PayoutPaid {}
|
2017-08-01 12:30:18 +00:00
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Помечается статусом cancelled, когда не удалось отправить в банк,
|
|
|
|
|
* либо когда полностью откатывается из статуса confirmed с изменением
|
|
|
|
|
* балансов на счетах
|
|
|
|
|
*/
|
|
|
|
|
struct PayoutCancelled {
|
|
|
|
|
2: required string details
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Помечается статусом confirmed, когда можно менять балансы на счетах,
|
|
|
|
|
* то есть если выплата confirmed, то балансы уже изменены
|
|
|
|
|
*/
|
2018-12-24 13:36:42 +00:00
|
|
|
|
struct PayoutConfirmed {}
|
2017-08-01 12:30:18 +00:00
|
|
|
|
|
|
|
|
|
/* Типы выплаты */
|
|
|
|
|
union PayoutType {
|
2017-09-22 15:46:40 +00:00
|
|
|
|
2: PayoutAccount bank_account
|
2018-12-12 09:12:33 +00:00
|
|
|
|
3: Wallet wallet
|
2017-08-01 12:30:18 +00:00
|
|
|
|
}
|
|
|
|
|
|
2018-12-12 09:12:33 +00:00
|
|
|
|
struct Wallet {
|
|
|
|
|
1: required domain.WalletID wallet_id
|
2017-08-01 12:30:18 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Вывод на расчетный счет */
|
2018-02-26 12:14:59 +00:00
|
|
|
|
union PayoutAccount {
|
|
|
|
|
1: RussianPayoutAccount russian_payout_account
|
|
|
|
|
2: InternationalPayoutAccount international_payout_account
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
struct RussianPayoutAccount {
|
|
|
|
|
1: required domain.RussianBankAccount bank_account
|
2017-09-04 15:40:55 +00:00
|
|
|
|
2: required string inn
|
|
|
|
|
3: required string purpose
|
2017-09-15 11:09:47 +00:00
|
|
|
|
4: required domain.LegalAgreement legal_agreement
|
2017-08-01 12:30:18 +00:00
|
|
|
|
}
|
|
|
|
|
|
2018-02-26 12:14:59 +00:00
|
|
|
|
struct InternationalPayoutAccount {
|
|
|
|
|
1: required domain.InternationalBankAccount bank_account
|
|
|
|
|
2: required domain.InternationalLegalEntity legal_entity
|
|
|
|
|
3: required string purpose
|
|
|
|
|
4: required domain.LegalAgreement legal_agreement
|
|
|
|
|
}
|
|
|
|
|
|
2017-08-01 12:30:18 +00:00
|
|
|
|
/**
|
|
|
|
|
* Событие об изменении статуса выплаты
|
|
|
|
|
*/
|
|
|
|
|
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 {}
|
2018-12-12 09:12:33 +00:00
|
|
|
|
exception InvalidPayoutTool {}
|
|
|
|
|
exception PayoutNotFound {}
|
2017-08-01 12:30:18 +00:00
|
|
|
|
|
|
|
|
|
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)
|
|
|
|
|
|
|
|
|
|
}
|
2017-08-09 13:48:55 +00:00
|
|
|
|
|
|
|
|
|
/* Когда на счете для вывода недостаточно средств */
|
|
|
|
|
exception InsufficientFunds {}
|
|
|
|
|
/* Когда превышен лимит */
|
|
|
|
|
exception LimitExceeded {}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Диапазон времени
|
|
|
|
|
* from_time - начальное время.
|
2018-01-18 11:55:19 +00:00
|
|
|
|
* to_time - конечное время.
|
2017-08-09 13:48:55 +00:00
|
|
|
|
* Если from > to - диапазон считается некорректным.
|
|
|
|
|
*/
|
|
|
|
|
struct TimeRange {
|
|
|
|
|
1: required base.Timestamp from_time
|
2018-01-18 11:55:19 +00:00
|
|
|
|
2: required base.Timestamp to_time
|
2017-08-09 13:48:55 +00:00
|
|
|
|
}
|
|
|
|
|
|
2018-07-18 14:08:46 +00:00
|
|
|
|
/**
|
|
|
|
|
* Диапазон суммы
|
|
|
|
|
* min - минимальная сумма.
|
|
|
|
|
* max - максимальная сумма.
|
|
|
|
|
* Если min > max - диапазон сумм считается некорректным.
|
|
|
|
|
*/
|
|
|
|
|
struct AmountRange {
|
|
|
|
|
1: optional domain.Amount min
|
|
|
|
|
2: optional domain.Amount max
|
|
|
|
|
}
|
|
|
|
|
|
2018-01-18 11:55:19 +00:00
|
|
|
|
struct ShopParams {
|
|
|
|
|
1: required domain.PartyID party_id
|
|
|
|
|
2: required domain.ShopID shop_id
|
|
|
|
|
}
|
|
|
|
|
|
2018-12-12 09:12:33 +00:00
|
|
|
|
/**
|
|
|
|
|
* Параметры для создания выплаты
|
|
|
|
|
* shop - параметры магазина
|
|
|
|
|
* payout_tool_id - идентификатор платежного инструмента
|
|
|
|
|
* amount - сумма выплаты
|
|
|
|
|
**/
|
|
|
|
|
struct PayoutParams {
|
|
|
|
|
1: required PayoutID payout_id
|
|
|
|
|
2: required ShopParams shop
|
|
|
|
|
3: required domain.PayoutToolID payout_tool_id
|
|
|
|
|
4: required domain.Cash amount
|
|
|
|
|
5: optional Metadata metadata
|
|
|
|
|
}
|
|
|
|
|
|
2018-01-18 11:55:19 +00:00
|
|
|
|
/**
|
|
|
|
|
* Параметры для генерации выплаты
|
|
|
|
|
* time_range - диапазон времени, за который будет сформированы выплаты
|
|
|
|
|
* shop - параметры магазина. Если не указан, то генерируются выплаты за все магазины,
|
|
|
|
|
* имеющие платежи/возвраты/корректировки за указанный time_range
|
|
|
|
|
**/
|
2017-08-09 13:48:55 +00:00
|
|
|
|
struct GeneratePayoutParams {
|
|
|
|
|
1: required TimeRange time_range
|
2018-12-24 13:36:42 +00:00
|
|
|
|
2: required ShopParams shop_params
|
2017-08-09 13:48:55 +00:00
|
|
|
|
}
|
|
|
|
|
|
2017-09-04 15:40:55 +00:00
|
|
|
|
/**
|
|
|
|
|
* Атрибуты поиска выплат
|
|
|
|
|
**/
|
|
|
|
|
struct PayoutSearchCriteria {
|
|
|
|
|
1: optional PayoutSearchStatus status
|
|
|
|
|
/* Диапазон времени создания выплат */
|
|
|
|
|
2: optional TimeRange time_range
|
|
|
|
|
3: optional list<PayoutID> payout_ids
|
2018-07-18 14:08:46 +00:00
|
|
|
|
/* Диапазон суммы выплат */
|
|
|
|
|
4: optional AmountRange amount_range
|
|
|
|
|
5: optional domain.CurrencyRef currency
|
2019-02-21 12:41:14 +00:00
|
|
|
|
6: optional PayoutSearchType type
|
2017-09-04 15:40:55 +00:00
|
|
|
|
}
|
2017-08-09 13:48:55 +00:00
|
|
|
|
|
2017-09-04 15:40:55 +00:00
|
|
|
|
enum PayoutSearchStatus {
|
2018-07-18 14:08:46 +00:00
|
|
|
|
unpaid
|
|
|
|
|
paid
|
|
|
|
|
cancelled
|
2017-09-04 15:40:55 +00:00
|
|
|
|
confirmed
|
|
|
|
|
}
|
2017-08-09 13:48:55 +00:00
|
|
|
|
|
2019-02-21 12:41:14 +00:00
|
|
|
|
enum PayoutSearchType {
|
|
|
|
|
bank_account
|
|
|
|
|
wallet
|
|
|
|
|
}
|
|
|
|
|
|
2018-01-18 11:55:19 +00:00
|
|
|
|
/**
|
|
|
|
|
* Поисковый запрос по выплатам
|
|
|
|
|
* search_criteria - атрибуты поиска выплат
|
|
|
|
|
* from_id (exclusive) - начальный идентификатор, после которого будет формироваться выборка
|
|
|
|
|
* size - размер выборки. Не может быть отрицательным и больше 1000, в случае если не указан,
|
|
|
|
|
* то значение будет равно 1000.
|
|
|
|
|
**/
|
|
|
|
|
struct PayoutSearchRequest {
|
|
|
|
|
1: required PayoutSearchCriteria search_criteria
|
|
|
|
|
2: optional i64 from_id
|
|
|
|
|
3: optional i32 size
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Поисковый ответ по выплатам
|
|
|
|
|
* payouts - информация по выплатам
|
|
|
|
|
* last_id (inclusive) - уникальный идентификатор, соответствующий последнему элементу выборки
|
|
|
|
|
**/
|
|
|
|
|
struct PayoutSearchResponse {
|
2018-12-24 13:36:42 +00:00
|
|
|
|
1: required list<Payout> payouts
|
2018-01-18 11:55:19 +00:00
|
|
|
|
2: required i64 last_id
|
|
|
|
|
}
|
|
|
|
|
|
2017-09-04 15:40:55 +00:00
|
|
|
|
service PayoutManagement {
|
2018-12-12 09:12:33 +00:00
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Создать выплату на определенную сумму и платежный инструмент
|
|
|
|
|
*/
|
2018-12-24 13:36:42 +00:00
|
|
|
|
Payout CreatePayout (1: PayoutParams params) throws (1: InvalidPayoutTool ex1, 2: InsufficientFunds ex2, 3: base.InvalidRequest ex3)
|
2018-12-12 09:12:33 +00:00
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Получить выплату по идентификатору
|
|
|
|
|
*/
|
|
|
|
|
Payout Get (1: PayoutID payout_id) throws (1: PayoutNotFound ex1)
|
|
|
|
|
|
2020-06-15 12:37:03 +00:00
|
|
|
|
Events GetEvents (1: PayoutID payout_id, 2: EventRange range)
|
|
|
|
|
throws (
|
|
|
|
|
1: PayoutNotFound ex1,
|
|
|
|
|
2: EventNotFound ex2,
|
|
|
|
|
3: base.InvalidRequest ex3
|
|
|
|
|
)
|
|
|
|
|
|
2017-08-09 13:48:55 +00:00
|
|
|
|
/********************* Вывод на счет ************************/
|
|
|
|
|
/**
|
2018-03-21 14:53:36 +00:00
|
|
|
|
* Сгенерировать выводы за указанный промежуток времени
|
2017-08-09 13:48:55 +00:00
|
|
|
|
*/
|
2018-01-18 11:55:19 +00:00
|
|
|
|
list<PayoutID> GeneratePayouts (1: GeneratePayoutParams params) throws (1: base.InvalidRequest ex1)
|
2017-08-09 13:48:55 +00:00
|
|
|
|
|
|
|
|
|
/**
|
2018-12-24 13:36:42 +00:00
|
|
|
|
* Подтвердить выплату.
|
2017-08-09 13:48:55 +00:00
|
|
|
|
*/
|
2018-12-24 13:36:42 +00:00
|
|
|
|
void ConfirmPayout (1: PayoutID payout_id) throws (1: base.InvalidRequest ex1)
|
2017-08-09 13:48:55 +00:00
|
|
|
|
|
|
|
|
|
/**
|
2018-12-24 13:36:42 +00:00
|
|
|
|
* Отменить движения по выплате.
|
2017-08-09 13:48:55 +00:00
|
|
|
|
*/
|
2018-12-24 13:36:42 +00:00
|
|
|
|
void CancelPayout (1: PayoutID payout_id, 2: string details) throws (1: base.InvalidRequest ex1)
|
2017-09-04 15:40:55 +00:00
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Возвращает список Payout-ов согласно запросу поиска
|
|
|
|
|
**/
|
2018-01-18 11:55:19 +00:00
|
|
|
|
PayoutSearchResponse GetPayoutsInfo (1: PayoutSearchRequest request) throws (1: base.InvalidRequest ex1)
|
2018-03-21 14:53:36 +00:00
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Сгенерировать отчет по выплатам
|
|
|
|
|
*/
|
|
|
|
|
void GenerateReport(1: set<PayoutID> payout_ids) throws (1: base.InvalidRequest ex1)
|
2017-08-09 13:48:55 +00:00
|
|
|
|
}
|