yandex_pay_api/
orders_capture.rs

1use crate::{
2    orders_id::{CartItemType, Coupon, Discount, Measurements, ShippingMethodType},
3    serde_help::*,
4    *,
5};
6use builder_pattern::Builder;
7use serde::{Deserialize, Serialize};
8
9#[derive(Debug, Clone, Serialize, Deserialize, Builder)]
10#[serde(rename_all = "camelCase")]
11/// <https://pay.yandex.ru/docs/ru/custom/backend/yandex-pay-api/order/merchant_v1_capture-post#body>
12pub struct CaptureOrderRequest {
13    #[default(None)]
14    #[serde(skip_serializing_if = "Option::is_none")]
15    /// Итоговая корзина
16    pub cart: Option<CartWithRequiredTotalWithoutFinalPrice>,
17    #[default(None)]
18    #[serde(skip_serializing_if = "Option::is_none")]
19    /// Идентификатор операции
20    pub external_operation_id: Option<String>,
21    #[default(None)]
22    #[serde(with = "option_string_as_float")]
23    #[serde(skip_serializing_if = "Option::is_none")]
24    /// Сумма к списанию. Если не указана, будет списана итоговая стоимость переданной корзины
25    pub order_amount: Option<f64>,
26    #[default(None)]
27    #[serde(skip_serializing_if = "Option::is_none")]
28    /// Итоговый способ доставки
29    pub shipping: Option<ShippingPrice>,
30}
31
32#[derive(Debug, Clone, Serialize, Deserialize, Builder)]
33#[serde(rename_all = "camelCase")]
34/// <https://pay.yandex.ru/docs/ru/custom/backend/yandex-pay-api/order/merchant_v1_capture-post#shippingprice>
35pub struct ShippingPrice {
36    #[serde(with = "string_as_float")]
37    pub amount: f64,
38    pub method_type: ShippingMethodType,
39}
40
41#[derive(Debug, Clone, Serialize, Deserialize, Builder)]
42#[serde(rename_all = "camelCase")]
43/// <https://pay.yandex.ru/docs/ru/custom/backend/yandex-pay-api/order/merchant_v1_capture-post#cartwithrequiredtotalwithoutfinalprice>
44pub struct CartWithRequiredTotalWithoutFinalPrice {
45    /// Позиции корзины
46    pub items: Vec<CartItemWithoutFinalPriceCamelCase>,
47    /// Итоговая информация о стоимости заказа
48    pub total: CartTotal,
49    #[default(None)]
50    #[serde(skip_serializing_if = "Option::is_none")]
51    /// Внутренний идентификатор корзины Яндекс Пэй
52    pub cart_id: Option<String>,
53    #[serde(skip_serializing_if = "Vec::is_empty")]
54    #[default(vec![])]
55    /// Купоны, применённые к корзине
56    pub coupons: Vec<Coupon>,
57    #[serde(skip_serializing_if = "Vec::is_empty")]
58    #[default(vec![])]
59    /// Скидки, применённые к корзине
60    pub discounts: Vec<Discount>,
61    #[serde(skip_serializing_if = "Option::is_none")]
62    #[default(None)]
63    /// Переданный продавцом идентификатор корзины
64    pub external_id: Option<String>,
65    #[default(None)]
66    #[serde(skip_serializing_if = "Option::is_none")]
67    /// Измерения корзины
68    pub measurements: Option<Measurements>,
69    #[into]
70    #[default(CartVersion::default())]
71    /// Версия корзины
72    pub version: CartVersion,
73}
74
75#[derive(Debug, Clone, Serialize, Deserialize, Default)]
76pub enum CartVersion {
77    #[default]
78    #[serde(rename = "VALID")]
79    /// Версия корзины по умолчанию
80    Valid,
81    #[serde(rename = "SEMIVALID")]
82    SemiValid,
83}
84
85#[derive(Debug, Clone, Serialize, Deserialize, Builder)]
86#[serde(rename_all = "camelCase")]
87/// <https://pay.yandex.ru/docs/ru/custom/backend/yandex-pay-api/order/merchant_v1_capture-post#cartitemwithoutfinalpricecamelcase>
88pub struct CartItemWithoutFinalPriceCamelCase {
89    #[into]
90    /// Id товара в системе продавца
91    pub product_id: String,
92    /// Количество товара в заказе
93    pub quantity: ItemQuantity,
94    /// Описание товара
95    #[serde(skip_serializing_if = "Option::is_none")]
96    #[default(None)]
97    pub description: Option<String>,
98    /// Цена за единицу товара с учётом скидок на позицию
99    #[serde(skip_serializing_if = "Option::is_none")]
100    #[serde(with = "option_string_as_float")]
101    #[default(None)]
102    pub discounted_unit_price: Option<f64>,
103    /// Промо параметры товара
104    #[serde(skip_serializing_if = "Option::is_none")]
105    #[default(None)]
106    pub features: Option<CartItemFeatures>,
107    /// Размеры и вес товара
108    #[serde(skip_serializing_if = "Option::is_none")]
109    #[default(None)]
110    pub measurements: Option<Measurements>,
111    /// Количество баллов Плюса
112    #[serde(skip_serializing_if = "Option::is_none")]
113    #[serde(with = "option_string_as_float")]
114    #[default(None)]
115    pub points_amount: Option<f64>,
116    /// Данные для формирования чека
117    #[serde(skip_serializing_if = "Option::is_none")]
118    #[default(None)]
119    pub receipt: Option<ItemReceipt>,
120    /// Суммарная цена за позицию без учета скидок
121    #[serde(skip_serializing_if = "Option::is_none")]
122    #[serde(with = "option_string_as_float")]
123    #[default(None)]
124    pub subtotal: Option<f64>,
125    /// Наименование товара
126    #[serde(skip_serializing_if = "Option::is_none")]
127    #[default(None)]
128    pub title: Option<String>,
129    /// Тип товара
130    #[serde(skip_serializing_if = "Option::is_none")]
131    #[default(None)]
132    pub item_type: Option<CartItemType>,
133    /// Полная цена за единицу товара без учёта скидки
134    #[serde(skip_serializing_if = "Option::is_none")]
135    #[serde(with = "option_string_as_float")]
136    #[default(None)]
137    pub unit_price: Option<f64>,
138}