ordercloud-python 2026.4.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (114) hide show
  1. ordercloud/__init__.py +37 -0
  2. ordercloud/auth.py +136 -0
  3. ordercloud/client.py +211 -0
  4. ordercloud/config.py +42 -0
  5. ordercloud/errors.py +47 -0
  6. ordercloud/http.py +218 -0
  7. ordercloud/middleware.py +66 -0
  8. ordercloud/models/__init__.py +271 -0
  9. ordercloud/models/address.py +47 -0
  10. ordercloud/models/api_client.py +116 -0
  11. ordercloud/models/approval.py +73 -0
  12. ordercloud/models/assignments.py +402 -0
  13. ordercloud/models/auth_models.py +114 -0
  14. ordercloud/models/bundle.py +31 -0
  15. ordercloud/models/buyer.py +271 -0
  16. ordercloud/models/catalog.py +33 -0
  17. ordercloud/models/category.py +35 -0
  18. ordercloud/models/cost_center.py +27 -0
  19. ordercloud/models/credit_card.py +35 -0
  20. ordercloud/models/delivery.py +277 -0
  21. ordercloud/models/discount.py +63 -0
  22. ordercloud/models/integration.py +76 -0
  23. ordercloud/models/inventory_record.py +53 -0
  24. ordercloud/models/line_item.py +95 -0
  25. ordercloud/models/line_item_types.py +89 -0
  26. ordercloud/models/message_sender.py +80 -0
  27. ordercloud/models/misc.py +280 -0
  28. ordercloud/models/open_id_connect.py +47 -0
  29. ordercloud/models/order.py +477 -0
  30. ordercloud/models/order_return.py +92 -0
  31. ordercloud/models/payment.py +77 -0
  32. ordercloud/models/price_schedule.py +76 -0
  33. ordercloud/models/product.py +227 -0
  34. ordercloud/models/product_collection.py +186 -0
  35. ordercloud/models/promotion.py +297 -0
  36. ordercloud/models/security.py +89 -0
  37. ordercloud/models/shared.py +131 -0
  38. ordercloud/models/shipment.py +150 -0
  39. ordercloud/models/spec.py +67 -0
  40. ordercloud/models/spending_account.py +33 -0
  41. ordercloud/models/subscription.py +125 -0
  42. ordercloud/models/supplier.py +43 -0
  43. ordercloud/models/sync.py +172 -0
  44. ordercloud/models/user.py +207 -0
  45. ordercloud/models/user_group.py +27 -0
  46. ordercloud/models/webhook.py +58 -0
  47. ordercloud/py.typed +0 -0
  48. ordercloud/resources/__init__.py +65 -0
  49. ordercloud/resources/addresses.py +228 -0
  50. ordercloud/resources/admin_addresses.py +128 -0
  51. ordercloud/resources/admin_user_groups.py +185 -0
  52. ordercloud/resources/admin_users.py +150 -0
  53. ordercloud/resources/api_clients.py +308 -0
  54. ordercloud/resources/approval_rules.py +144 -0
  55. ordercloud/resources/base.py +145 -0
  56. ordercloud/resources/bundle_line_items.py +59 -0
  57. ordercloud/resources/bundle_subscription_items.py +54 -0
  58. ordercloud/resources/bundles.py +278 -0
  59. ordercloud/resources/buyer_groups.py +128 -0
  60. ordercloud/resources/buyers.py +164 -0
  61. ordercloud/resources/cart.py +613 -0
  62. ordercloud/resources/catalogs.py +311 -0
  63. ordercloud/resources/categories.py +392 -0
  64. ordercloud/resources/cost_centers.py +222 -0
  65. ordercloud/resources/credit_cards.py +227 -0
  66. ordercloud/resources/delivery_configurations.py +132 -0
  67. ordercloud/resources/discounts.py +201 -0
  68. ordercloud/resources/entity_syncs.py +534 -0
  69. ordercloud/resources/error_configs.py +71 -0
  70. ordercloud/resources/forgotten_credentials.py +74 -0
  71. ordercloud/resources/group_orders.py +28 -0
  72. ordercloud/resources/impersonation_configs.py +132 -0
  73. ordercloud/resources/incrementors.py +128 -0
  74. ordercloud/resources/integration_events.py +203 -0
  75. ordercloud/resources/inventory_integrations.py +65 -0
  76. ordercloud/resources/inventory_records.py +484 -0
  77. ordercloud/resources/line_items.py +262 -0
  78. ordercloud/resources/locales.py +203 -0
  79. ordercloud/resources/me.py +1882 -0
  80. ordercloud/resources/message_senders.py +261 -0
  81. ordercloud/resources/open_id_connects.py +128 -0
  82. ordercloud/resources/order_returns.py +306 -0
  83. ordercloud/resources/order_syncs.py +65 -0
  84. ordercloud/resources/orders.py +689 -0
  85. ordercloud/resources/payments.py +176 -0
  86. ordercloud/resources/price_schedules.py +164 -0
  87. ordercloud/resources/product_collections.py +116 -0
  88. ordercloud/resources/product_facets.py +128 -0
  89. ordercloud/resources/product_syncs.py +76 -0
  90. ordercloud/resources/products.py +454 -0
  91. ordercloud/resources/promotion_integrations.py +65 -0
  92. ordercloud/resources/promotions.py +203 -0
  93. ordercloud/resources/security_profiles.py +222 -0
  94. ordercloud/resources/seller_approval_rules.py +128 -0
  95. ordercloud/resources/shipments.py +256 -0
  96. ordercloud/resources/specs.py +313 -0
  97. ordercloud/resources/spending_accounts.py +227 -0
  98. ordercloud/resources/subscription_integrations.py +65 -0
  99. ordercloud/resources/subscription_items.py +146 -0
  100. ordercloud/resources/subscriptions.py +128 -0
  101. ordercloud/resources/supplier_addresses.py +144 -0
  102. ordercloud/resources/supplier_user_groups.py +210 -0
  103. ordercloud/resources/supplier_users.py +170 -0
  104. ordercloud/resources/suppliers.py +190 -0
  105. ordercloud/resources/tracking_events.py +130 -0
  106. ordercloud/resources/user_groups.py +210 -0
  107. ordercloud/resources/users.py +254 -0
  108. ordercloud/resources/webhooks.py +128 -0
  109. ordercloud/resources/xp_indices.py +77 -0
  110. ordercloud/sync_client.py +170 -0
  111. ordercloud_python-2026.4.1.dist-info/METADATA +552 -0
  112. ordercloud_python-2026.4.1.dist-info/RECORD +114 -0
  113. ordercloud_python-2026.4.1.dist-info/WHEEL +4 -0
  114. ordercloud_python-2026.4.1.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,261 @@
1
+ # GENERATED by tools/codegen — DO NOT EDIT
2
+ # Source: ordercloud-openapi-v3.json
3
+ """OrderCloud MessageSenders API resource."""
4
+
5
+ from __future__ import annotations
6
+ from typing import Any, Optional, Union
7
+
8
+ from ..models.assignments import MessageCCListenerAssignment, MessageSenderAssignment
9
+ from ..models.message_sender import MessageSender
10
+ from ..models.shared import ListPage
11
+ from .base import BaseResource
12
+
13
+ __all__ = ["MessageSendersResource"]
14
+
15
+
16
+ class MessageSendersResource(BaseResource):
17
+ """Operations on OrderCloud MessageSenders."""
18
+
19
+ async def list(
20
+ self,
21
+ *,
22
+ search: Optional[str] = None,
23
+ search_on: Optional[str] = None,
24
+ sort_by: Optional[str] = None,
25
+ page: Optional[int] = None,
26
+ page_size: Optional[int] = None,
27
+ filters: Optional[dict[str, Any]] = None,
28
+ ) -> ListPage[MessageSender]:
29
+ """List message senders
30
+
31
+ Args:
32
+ search: Word or phrase to search for.
33
+ search_on: Comma-delimited list of fields to search on.
34
+ sort_by: Comma-delimited list of fields to sort by.
35
+ page: Page of results to return. When paginating through many items (> page 30), we recommend the "Last ID" method, as outlined in the Advanced Querying documentation.
36
+ page_size: Number of results to return per page.
37
+ filters: An object or dictionary representing key/value pairs to apply as filters. Valid keys are top-level properties of the returned model or 'xp.???'
38
+
39
+ Returns:
40
+ A paginated list of MessageSender objects.
41
+ """
42
+ params = self._build_list_params(
43
+ search=search,
44
+ search_on=search_on,
45
+ sort_by=sort_by,
46
+ page=page,
47
+ page_size=page_size,
48
+ filters=filters,
49
+ )
50
+ resp = await self._http.get("/messagesenders", **params)
51
+ return self._parse_list(resp.json(), MessageSender)
52
+
53
+ async def create(
54
+ self,
55
+ message_sender: Union[MessageSender, dict[str, Any]],
56
+ ) -> MessageSender:
57
+ """Create a message sender
58
+
59
+ Args:
60
+ message_sender: A ``MessageSender`` model or dict. Required fields: Name, MessageTypes, DeliveryConfigID.
61
+
62
+ Returns:
63
+ The MessageSender object.
64
+ """
65
+ resp = await self._http.post("/messagesenders", json=self._serialize(message_sender))
66
+ return MessageSender(**resp.json())
67
+
68
+ async def get(
69
+ self,
70
+ message_sender_id: str,
71
+ ) -> MessageSender:
72
+ """Retrieve a message sender
73
+
74
+ Args:
75
+ message_sender_id: ID of the message sender.
76
+
77
+ Returns:
78
+ The MessageSender object.
79
+ """
80
+ resp = await self._http.get(f"/messagesenders/{message_sender_id}")
81
+ return MessageSender(**resp.json())
82
+
83
+ async def save(
84
+ self,
85
+ message_sender_id: str,
86
+ message_sender: Union[MessageSender, dict[str, Any]],
87
+ ) -> MessageSender:
88
+ """Create or update a message sender
89
+
90
+ Args:
91
+ message_sender_id: ID of the message sender.
92
+ message_sender: A ``MessageSender`` model or dict. Required fields: Name, MessageTypes, DeliveryConfigID.
93
+
94
+ Returns:
95
+ The MessageSender object.
96
+ """
97
+ resp = await self._http.put(
98
+ f"/messagesenders/{message_sender_id}",
99
+ json=self._serialize(message_sender),
100
+ )
101
+ return MessageSender(**resp.json())
102
+
103
+ async def delete(
104
+ self,
105
+ message_sender_id: str,
106
+ ) -> None:
107
+ """Delete a message sender
108
+
109
+ Args:
110
+ message_sender_id: ID of the message sender.
111
+ """
112
+ await self._http.delete(f"/messagesenders/{message_sender_id}")
113
+
114
+ async def patch(
115
+ self,
116
+ message_sender_id: str,
117
+ partial: dict[str, Any],
118
+ ) -> MessageSender:
119
+ """Partially update a message sender
120
+
121
+ Args:
122
+ message_sender_id: ID of the message sender.
123
+ partial: A dict of fields to update.
124
+
125
+ Returns:
126
+ The MessageSender object.
127
+ """
128
+ resp = await self._http.patch(f"/messagesenders/{message_sender_id}", json=partial)
129
+ return MessageSender(**resp.json())
130
+
131
+ async def delete_assignment(
132
+ self,
133
+ message_sender_id: str,
134
+ *,
135
+ buyer_id: Optional[str] = None,
136
+ user_id: Optional[str] = None,
137
+ user_group_id: Optional[str] = None,
138
+ supplier_id: Optional[str] = None,
139
+ ) -> None:
140
+ """Delete a message sender assignment
141
+
142
+ Args:
143
+ message_sender_id: ID of the message sender.
144
+ buyer_id: ID of the buyer.
145
+ user_id: ID of the user.
146
+ user_group_id: ID of the user group.
147
+ supplier_id: ID of the supplier.
148
+ """
149
+ _params: dict[str, Any] = {}
150
+ if buyer_id is not None:
151
+ _params["buyerID"] = buyer_id
152
+ if user_id is not None:
153
+ _params["userID"] = user_id
154
+ if user_group_id is not None:
155
+ _params["userGroupID"] = user_group_id
156
+ if supplier_id is not None:
157
+ _params["supplierID"] = supplier_id
158
+ await self._http.delete(f"/messagesenders/{message_sender_id}/assignments", **_params)
159
+
160
+ async def list_assignments(
161
+ self,
162
+ *,
163
+ buyer_id: Optional[str] = None,
164
+ message_sender_id: Optional[str] = None,
165
+ user_group_id: Optional[str] = None,
166
+ level: Optional[str] = None,
167
+ page: Optional[int] = None,
168
+ page_size: Optional[int] = None,
169
+ supplier_id: Optional[str] = None,
170
+ ) -> ListPage[MessageSenderAssignment]:
171
+ """List message sender assignments
172
+
173
+ Args:
174
+ buyer_id: ID of the buyer.
175
+ message_sender_id: ID of the message sender.
176
+ user_group_id: ID of the user group.
177
+ level: Level of the message sender assignment. Possible values: Group, Company, BuyerGroup.
178
+ page: Page of results to return. When paginating through many items (> page 30), we recommend the "Last ID" method, as outlined in the Advanced Querying documentation.
179
+ page_size: Number of results to return per page.
180
+ supplier_id: ID of the supplier.
181
+
182
+ Returns:
183
+ A paginated list of MessageSenderAssignment objects.
184
+ """
185
+ params = self._build_list_params(
186
+ page=page,
187
+ page_size=page_size,
188
+ )
189
+ if buyer_id is not None:
190
+ params["buyerID"] = buyer_id
191
+ if message_sender_id is not None:
192
+ params["messageSenderID"] = message_sender_id
193
+ if user_group_id is not None:
194
+ params["userGroupID"] = user_group_id
195
+ if level is not None:
196
+ params["level"] = level
197
+ if supplier_id is not None:
198
+ params["supplierID"] = supplier_id
199
+ resp = await self._http.get("/messagesenders/assignments", **params)
200
+ return self._parse_list(resp.json(), MessageSenderAssignment)
201
+
202
+ async def save_assignment(
203
+ self,
204
+ message_sender_assignment: Union[MessageSenderAssignment, dict[str, Any]],
205
+ ) -> None:
206
+ """Create or update a message sender assignment
207
+
208
+ Args:
209
+ message_sender_assignment: A ``MessageSenderAssignment`` model or dict. Required fields: MessageSenderID.
210
+ """
211
+ await self._http.post(
212
+ "/messagesenders/assignments", json=self._serialize(message_sender_assignment)
213
+ )
214
+
215
+ async def list_cc_listener_assignments(
216
+ self,
217
+ *,
218
+ search: Optional[str] = None,
219
+ search_on: Optional[str] = None,
220
+ sort_by: Optional[str] = None,
221
+ page: Optional[int] = None,
222
+ page_size: Optional[int] = None,
223
+ filters: Optional[dict[str, Any]] = None,
224
+ ) -> ListPage[MessageCCListenerAssignment]:
225
+ """List message sender cc listener assignments
226
+
227
+ Args:
228
+ search: Word or phrase to search for.
229
+ search_on: Comma-delimited list of fields to search on.
230
+ sort_by: Comma-delimited list of fields to sort by.
231
+ page: Page of results to return. When paginating through many items (> page 30), we recommend the "Last ID" method, as outlined in the Advanced Querying documentation.
232
+ page_size: Number of results to return per page.
233
+ filters: An object or dictionary representing key/value pairs to apply as filters. Valid keys are top-level properties of the returned model or 'xp.???'
234
+
235
+ Returns:
236
+ A paginated list of MessageCCListenerAssignment objects.
237
+ """
238
+ params = self._build_list_params(
239
+ search=search,
240
+ search_on=search_on,
241
+ sort_by=sort_by,
242
+ page=page,
243
+ page_size=page_size,
244
+ filters=filters,
245
+ )
246
+ resp = await self._http.get("/messagesenders/CCListenerAssignments", **params)
247
+ return self._parse_list(resp.json(), MessageCCListenerAssignment)
248
+
249
+ async def save_cc_listener_assignment(
250
+ self,
251
+ message_cc_listener_assignment: Union[MessageCCListenerAssignment, dict[str, Any]],
252
+ ) -> None:
253
+ """Create or update a message sender cc listener assignment
254
+
255
+ Args:
256
+ message_cc_listener_assignment: A ``MessageCCListenerAssignment`` model or dict. Required fields: MessageSenderAssignment, MessageType.
257
+ """
258
+ await self._http.post(
259
+ "/messagesenders/CCListenerAssignments",
260
+ json=self._serialize(message_cc_listener_assignment),
261
+ )
@@ -0,0 +1,128 @@
1
+ # GENERATED by tools/codegen — DO NOT EDIT
2
+ # Source: ordercloud-openapi-v3.json
3
+ """OrderCloud OpenIdConnects API resource."""
4
+
5
+ from __future__ import annotations
6
+ from typing import Any, Optional, Union
7
+
8
+ from ..models.open_id_connect import OpenIdConnect
9
+ from ..models.shared import ListPage
10
+ from .base import BaseResource
11
+
12
+ __all__ = ["OpenIdConnectsResource"]
13
+
14
+
15
+ class OpenIdConnectsResource(BaseResource):
16
+ """Operations on OrderCloud OpenIdConnects."""
17
+
18
+ async def list(
19
+ self,
20
+ *,
21
+ search: Optional[str] = None,
22
+ search_on: Optional[str] = None,
23
+ sort_by: Optional[str] = None,
24
+ page: Optional[int] = None,
25
+ page_size: Optional[int] = None,
26
+ filters: Optional[dict[str, Any]] = None,
27
+ ) -> ListPage[OpenIdConnect]:
28
+ """List OpenID Connects
29
+
30
+ Args:
31
+ search: Word or phrase to search for.
32
+ search_on: Comma-delimited list of fields to search on.
33
+ sort_by: Comma-delimited list of fields to sort by.
34
+ page: Page of results to return. When paginating through many items (> page 30), we recommend the "Last ID" method, as outlined in the Advanced Querying documentation.
35
+ page_size: Number of results to return per page.
36
+ filters: An object or dictionary representing key/value pairs to apply as filters. Valid keys are top-level properties of the returned model or 'xp.???'
37
+
38
+ Returns:
39
+ A paginated list of OpenIdConnect objects.
40
+ """
41
+ params = self._build_list_params(
42
+ search=search,
43
+ search_on=search_on,
44
+ sort_by=sort_by,
45
+ page=page,
46
+ page_size=page_size,
47
+ filters=filters,
48
+ )
49
+ resp = await self._http.get("/openidconnects", **params)
50
+ return self._parse_list(resp.json(), OpenIdConnect)
51
+
52
+ async def create(
53
+ self,
54
+ open_id_connect: Union[OpenIdConnect, dict[str, Any]],
55
+ ) -> OpenIdConnect:
56
+ """Create an OpenID Connect
57
+
58
+ Args:
59
+ open_id_connect: A ``OpenIdConnect`` model or dict. Required fields: OrderCloudApiClientID, ConnectClientID, ConnectClientSecret, AppStartUrl, AuthorizationEndpoint, TokenEndpoint.
60
+
61
+ Returns:
62
+ The OpenIdConnect object.
63
+ """
64
+ resp = await self._http.post("/openidconnects", json=self._serialize(open_id_connect))
65
+ return OpenIdConnect(**resp.json())
66
+
67
+ async def get(
68
+ self,
69
+ openidconnect_id: str,
70
+ ) -> OpenIdConnect:
71
+ """Retrieve an OpenID Connect
72
+
73
+ Args:
74
+ openidconnect_id: ID of the openidconnect.
75
+
76
+ Returns:
77
+ The OpenIdConnect object.
78
+ """
79
+ resp = await self._http.get(f"/openidconnects/{openidconnect_id}")
80
+ return OpenIdConnect(**resp.json())
81
+
82
+ async def save(
83
+ self,
84
+ openidconnect_id: str,
85
+ open_id_connect: Union[OpenIdConnect, dict[str, Any]],
86
+ ) -> OpenIdConnect:
87
+ """Create or update an OpenID Connect
88
+
89
+ Args:
90
+ openidconnect_id: ID of the openidconnect.
91
+ open_id_connect: A ``OpenIdConnect`` model or dict. Required fields: OrderCloudApiClientID, ConnectClientID, ConnectClientSecret, AppStartUrl, AuthorizationEndpoint, TokenEndpoint.
92
+
93
+ Returns:
94
+ The OpenIdConnect object.
95
+ """
96
+ resp = await self._http.put(
97
+ f"/openidconnects/{openidconnect_id}",
98
+ json=self._serialize(open_id_connect),
99
+ )
100
+ return OpenIdConnect(**resp.json())
101
+
102
+ async def delete(
103
+ self,
104
+ openidconnect_id: str,
105
+ ) -> None:
106
+ """Delete an OpenID Connect
107
+
108
+ Args:
109
+ openidconnect_id: ID of the openidconnect.
110
+ """
111
+ await self._http.delete(f"/openidconnects/{openidconnect_id}")
112
+
113
+ async def patch(
114
+ self,
115
+ openidconnect_id: str,
116
+ partial: dict[str, Any],
117
+ ) -> OpenIdConnect:
118
+ """Partially update an OpenID Connect
119
+
120
+ Args:
121
+ openidconnect_id: ID of the openidconnect.
122
+ partial: A dict of fields to update.
123
+
124
+ Returns:
125
+ The OpenIdConnect object.
126
+ """
127
+ resp = await self._http.patch(f"/openidconnects/{openidconnect_id}", json=partial)
128
+ return OpenIdConnect(**resp.json())
@@ -0,0 +1,306 @@
1
+ # GENERATED by tools/codegen — DO NOT EDIT
2
+ # Source: ordercloud-openapi-v3.json
3
+ """OrderCloud OrderReturns API resource."""
4
+
5
+ from __future__ import annotations
6
+ from typing import Any, Optional, Union
7
+
8
+ from ..models.order import ApprovalInfo
9
+ from ..models.order_return import OrderReturn, OrderReturnApproval
10
+ from ..models.user import User
11
+ from ..models.shared import ListPage
12
+ from .base import BaseResource
13
+
14
+ __all__ = ["OrderReturnsResource"]
15
+
16
+
17
+ class OrderReturnsResource(BaseResource):
18
+ """Operations on OrderCloud OrderReturns."""
19
+
20
+ async def list(
21
+ self,
22
+ *,
23
+ approvable: Optional[bool] = None,
24
+ search: Optional[str] = None,
25
+ search_on: Optional[str] = None,
26
+ sort_by: Optional[str] = None,
27
+ page: Optional[int] = None,
28
+ page_size: Optional[int] = None,
29
+ filters: Optional[dict[str, Any]] = None,
30
+ ) -> ListPage[OrderReturn]:
31
+ """List order returns
32
+
33
+ Args:
34
+ approvable: Only returns orders awaiting the user's approval if true.
35
+ search: Word or phrase to search for.
36
+ search_on: Comma-delimited list of fields to search on.
37
+ sort_by: Comma-delimited list of fields to sort by.
38
+ page: Page of results to return. When paginating through many items (> page 30), we recommend the "Last ID" method, as outlined in the Advanced Querying documentation.
39
+ page_size: Number of results to return per page.
40
+ filters: An object or dictionary representing key/value pairs to apply as filters. Valid keys are top-level properties of the returned model or 'xp.???'
41
+
42
+ Returns:
43
+ A paginated list of OrderReturn objects.
44
+ """
45
+ params = self._build_list_params(
46
+ search=search,
47
+ search_on=search_on,
48
+ sort_by=sort_by,
49
+ page=page,
50
+ page_size=page_size,
51
+ filters=filters,
52
+ )
53
+ if approvable is not None:
54
+ params["approvable"] = approvable
55
+ resp = await self._http.get("/orderreturns", **params)
56
+ return self._parse_list(resp.json(), OrderReturn)
57
+
58
+ async def create(
59
+ self,
60
+ order_return: Union[OrderReturn, dict[str, Any]],
61
+ ) -> OrderReturn:
62
+ """Create an order return
63
+
64
+ Args:
65
+ order_return: A ``OrderReturn`` model or dict. Required fields: OrderID.
66
+
67
+ Returns:
68
+ The OrderReturn object.
69
+ """
70
+ resp = await self._http.post("/orderreturns", json=self._serialize(order_return))
71
+ return OrderReturn(**resp.json())
72
+
73
+ async def get(
74
+ self,
75
+ return_id: str,
76
+ ) -> OrderReturn:
77
+ """Retrieve an order return
78
+
79
+ Args:
80
+ return_id: ID of the return.
81
+
82
+ Returns:
83
+ The OrderReturn object.
84
+ """
85
+ resp = await self._http.get(f"/orderreturns/{return_id}")
86
+ return OrderReturn(**resp.json())
87
+
88
+ async def save(
89
+ self,
90
+ return_id: str,
91
+ order_return: Union[OrderReturn, dict[str, Any]],
92
+ ) -> OrderReturn:
93
+ """Create or update an order return
94
+
95
+ Args:
96
+ return_id: ID of the return.
97
+ order_return: A ``OrderReturn`` model or dict. Required fields: OrderID.
98
+
99
+ Returns:
100
+ The OrderReturn object.
101
+ """
102
+ resp = await self._http.put(
103
+ f"/orderreturns/{return_id}",
104
+ json=self._serialize(order_return),
105
+ )
106
+ return OrderReturn(**resp.json())
107
+
108
+ async def delete(
109
+ self,
110
+ return_id: str,
111
+ ) -> None:
112
+ """Delete an order return
113
+
114
+ Args:
115
+ return_id: ID of the return.
116
+ """
117
+ await self._http.delete(f"/orderreturns/{return_id}")
118
+
119
+ async def patch(
120
+ self,
121
+ return_id: str,
122
+ partial: dict[str, Any],
123
+ ) -> OrderReturn:
124
+ """Partially update an order return
125
+
126
+ Args:
127
+ return_id: ID of the return.
128
+ partial: A dict of fields to update.
129
+
130
+ Returns:
131
+ The OrderReturn object.
132
+ """
133
+ resp = await self._http.patch(f"/orderreturns/{return_id}", json=partial)
134
+ return OrderReturn(**resp.json())
135
+
136
+ async def list_approvals(
137
+ self,
138
+ return_id: str,
139
+ *,
140
+ search: Optional[str] = None,
141
+ search_on: Optional[str] = None,
142
+ sort_by: Optional[str] = None,
143
+ page: Optional[int] = None,
144
+ page_size: Optional[int] = None,
145
+ filters: Optional[dict[str, Any]] = None,
146
+ ) -> ListPage[OrderReturnApproval]:
147
+ """List order return approvals
148
+
149
+ Args:
150
+ return_id: ID of the return.
151
+ search: Word or phrase to search for.
152
+ search_on: Comma-delimited list of fields to search on.
153
+ sort_by: Comma-delimited list of fields to sort by.
154
+ page: Page of results to return. When paginating through many items (> page 30), we recommend the "Last ID" method, as outlined in the Advanced Querying documentation.
155
+ page_size: Number of results to return per page.
156
+ filters: An object or dictionary representing key/value pairs to apply as filters. Valid keys are top-level properties of the returned model or 'xp.???'
157
+
158
+ Returns:
159
+ A paginated list of OrderReturnApproval objects.
160
+ """
161
+ params = self._build_list_params(
162
+ search=search,
163
+ search_on=search_on,
164
+ sort_by=sort_by,
165
+ page=page,
166
+ page_size=page_size,
167
+ filters=filters,
168
+ )
169
+ resp = await self._http.get(f"/orderreturns/{return_id}/approvals", **params)
170
+ return self._parse_list(resp.json(), OrderReturnApproval)
171
+
172
+ async def approve(
173
+ self,
174
+ return_id: str,
175
+ approval_info: Union[ApprovalInfo, dict[str, Any]],
176
+ ) -> OrderReturn:
177
+ """Approve an order return
178
+
179
+ Args:
180
+ return_id: ID of the return.
181
+ approval_info: A ``ApprovalInfo`` model or dict.
182
+
183
+ Returns:
184
+ The OrderReturn object.
185
+ """
186
+ resp = await self._http.post(
187
+ f"/orderreturns/{return_id}/approve", json=self._serialize(approval_info)
188
+ )
189
+ return OrderReturn(**resp.json())
190
+
191
+ async def cancel(
192
+ self,
193
+ return_id: str,
194
+ ) -> OrderReturn:
195
+ """Cancel an order return
196
+
197
+ Args:
198
+ return_id: ID of the return.
199
+
200
+ Returns:
201
+ The OrderReturn object.
202
+ """
203
+ resp = await self._http.post(f"/orderreturns/{return_id}/cancel")
204
+ return OrderReturn(**resp.json())
205
+
206
+ async def complete(
207
+ self,
208
+ return_id: str,
209
+ ) -> OrderReturn:
210
+ """Complete an order return
211
+
212
+ Args:
213
+ return_id: ID of the return.
214
+
215
+ Returns:
216
+ The OrderReturn object.
217
+ """
218
+ resp = await self._http.post(f"/orderreturns/{return_id}/complete")
219
+ return OrderReturn(**resp.json())
220
+
221
+ async def decline(
222
+ self,
223
+ return_id: str,
224
+ approval_info: Union[ApprovalInfo, dict[str, Any]],
225
+ ) -> OrderReturn:
226
+ """Decline an order return
227
+
228
+ Args:
229
+ return_id: ID of the return.
230
+ approval_info: A ``ApprovalInfo`` model or dict.
231
+
232
+ Returns:
233
+ The OrderReturn object.
234
+ """
235
+ resp = await self._http.post(
236
+ f"/orderreturns/{return_id}/decline", json=self._serialize(approval_info)
237
+ )
238
+ return OrderReturn(**resp.json())
239
+
240
+ async def list_eligible_approvers(
241
+ self,
242
+ return_id: str,
243
+ *,
244
+ search: Optional[str] = None,
245
+ search_on: Optional[str] = None,
246
+ sort_by: Optional[str] = None,
247
+ page: Optional[int] = None,
248
+ page_size: Optional[int] = None,
249
+ filters: Optional[dict[str, Any]] = None,
250
+ ) -> ListPage[User]:
251
+ """List order return eligible approvers
252
+
253
+ Args:
254
+ return_id: ID of the return.
255
+ search: Word or phrase to search for.
256
+ search_on: Comma-delimited list of fields to search on.
257
+ sort_by: Comma-delimited list of fields to sort by.
258
+ page: Page of results to return. When paginating through many items (> page 30), we recommend the "Last ID" method, as outlined in the Advanced Querying documentation.
259
+ page_size: Number of results to return per page.
260
+ filters: An object or dictionary representing key/value pairs to apply as filters. Valid keys are top-level properties of the returned model or 'xp.???'
261
+
262
+ Returns:
263
+ A paginated list of User objects.
264
+ """
265
+ params = self._build_list_params(
266
+ search=search,
267
+ search_on=search_on,
268
+ sort_by=sort_by,
269
+ page=page,
270
+ page_size=page_size,
271
+ filters=filters,
272
+ )
273
+ resp = await self._http.get(f"/orderreturns/{return_id}/eligibleapprovers", **params)
274
+ return self._parse_list(resp.json(), User)
275
+
276
+ async def delete_item(
277
+ self,
278
+ return_id: str,
279
+ line_item_id: str,
280
+ ) -> OrderReturn:
281
+ """Delete an order return item
282
+
283
+ Args:
284
+ return_id: ID of the return.
285
+ line_item_id: ID of the line item.
286
+
287
+ Returns:
288
+ The OrderReturn object.
289
+ """
290
+ resp = await self._http.delete(f"/orderreturns/{return_id}/items/{line_item_id}")
291
+ return OrderReturn(**resp.json())
292
+
293
+ async def submit(
294
+ self,
295
+ return_id: str,
296
+ ) -> OrderReturn:
297
+ """Submit an order return
298
+
299
+ Args:
300
+ return_id: ID of the return.
301
+
302
+ Returns:
303
+ The OrderReturn object.
304
+ """
305
+ resp = await self._http.post(f"/orderreturns/{return_id}/submit")
306
+ return OrderReturn(**resp.json())