Skip to content

Commit 727cd79

Browse files
authoredAug 11, 2022
Add /estimates/ecommerce API support (#70)
1 parent db75f30 commit 727cd79

14 files changed

+528
-12
lines changed
 

‎CHANGELOG.md

+6
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file.
55
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
66
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
77

8+
## [1.24.2] - 2022-08-10
9+
10+
### Added
11+
12+
- Adds `patch.estimates.create_ecommerce_estimate` method
13+
814
## [1.24.0] - 2022-07-22
915

1016
### Added

‎README.md

+8-4
Original file line numberDiff line numberDiff line change
@@ -137,20 +137,24 @@ patch.estimates.create_mass_estimate(mass_g=mass_g, project_id=project_id)
137137

138138
# Create a flight estimate
139139
distance_m = 1_000_000 # Pass in the distance traveled in meters
140-
patch.estimates.create_mass_estimate(distance_m=distance_m)
140+
patch.estimates.create_flight_estimate(distance_m=distance_m)
141141

142-
# Create a shipping estimate
142+
# Create an ecommerce estimate
143143
distance_m = 1_000_000 # Pass in the distance traveled in meters
144144
transportation_method = "rail"
145145
package_mass_g = 5000
146-
patch.estimates.create_mass_estimate(distance_m=distance_m, transportation_method=transportation_method, package_mass_g=package_mass_g)
146+
patch.estimates.create_ecommerce_estimate(
147+
distance_m=distance_m,
148+
transportation_method=transportation_method,
149+
package_mass_g=package_mass_g
150+
)
147151

148152
# Create a vehicle estimate
149153
distance_m = 1_000_000 # Pass in the distance traveled in meters
150154
make = "Toyota"
151155
model = "Corolla"
152156
year = 1995
153-
patch.estimates.create_mass_estimate(distance_m=distance_m, make=make, model=model, year=year)
157+
patch.estimates.create_vehicle_estimate(distance_m=distance_m, make=make, model=model, year=year)
154158

155159
# Create a bitcoin estimate
156160
transaction_value_btc_sats = 1000 # [Optional] Pass in the transaction value in satoshis

‎patch_api/__init__.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515

1616
from __future__ import absolute_import
1717

18-
__version__ = "1.24.1"
18+
__version__ = "1.24.2"
1919

2020
# import ApiClient
2121
from patch_api.api_client import ApiClient

‎patch_api/api/estimates_api.py

+190
Original file line numberDiff line numberDiff line change
@@ -464,6 +464,196 @@ def create_bitcoin_estimate_with_http_info(
464464
collection_formats=collection_formats,
465465
)
466466

467+
def create_ecommerce_estimate(
468+
self, create_ecommerce_estimate_request={}, **kwargs
469+
): # noqa: E501
470+
"""Create an e-commerce estimate given the distance traveled in meters, package weight, and transportation method. # noqa: E501
471+
472+
Creates a e-commerce estimate for the amount of CO2 to be compensated. An order in the `draft` state may be created based on the parameters. # noqa: E501
473+
This method makes a synchronous HTTP request by default. To make an
474+
asynchronous HTTP request, please pass async_req=True
475+
>>> thread = api.create_ecommerce_estimate(create_ecommerce_estimate_request, async_req=True)
476+
>>> result = thread.get()
477+
478+
:param async_req bool: execute request asynchronously
479+
:param CreateEcommerceEstimateRequest create_ecommerce_estimate_request: (required)
480+
:param _preload_content: if False, the urllib3.HTTPResponse object will
481+
be returned without reading/decoding response
482+
data. Default is True.
483+
:param _request_timeout: timeout setting for this request. If one
484+
number provided, it will be total request
485+
timeout. It can also be a pair (tuple) of
486+
(connection, read) timeouts.
487+
:return: EstimateResponse
488+
If the method is called asynchronously,
489+
returns the request thread.
490+
"""
491+
kwargs["_return_http_data_only"] = True
492+
return self.create_ecommerce_estimate_with_http_info(
493+
create_ecommerce_estimate_request, **kwargs
494+
) # noqa: E501
495+
496+
def create_ecommerce_estimate_with_http_info(
497+
self, create_ecommerce_estimate_request, **kwargs
498+
): # noqa: E501
499+
"""Create an e-commerce estimate given the distance traveled in meters, package weight, and transportation method. # noqa: E501
500+
501+
Creates a e-commerce estimate for the amount of CO2 to be compensated. An order in the `draft` state may be created based on the parameters. # noqa: E501
502+
This method makes a synchronous HTTP request by default. To make an
503+
asynchronous HTTP request, please pass async_req=True
504+
>>> thread = api.create_ecommerce_estimate_with_http_info(create_ecommerce_estimate_request, async_req=True)
505+
>>> result = thread.get()
506+
507+
:param async_req bool: execute request asynchronously
508+
:param CreateEcommerceEstimateRequest create_ecommerce_estimate_request: (required)
509+
:param _return_http_data_only: response data without head status code
510+
and headers
511+
:param _preload_content: if False, the urllib3.HTTPResponse object will
512+
be returned without reading/decoding response
513+
data. Default is True.
514+
:param _request_timeout: timeout setting for this request. If one
515+
number provided, it will be total request
516+
timeout. It can also be a pair (tuple) of
517+
(connection, read) timeouts.
518+
:return: tuple(EstimateResponse, status_code(int), headers(HTTPHeaderDict))
519+
If the method is called asynchronously,
520+
returns the request thread.
521+
"""
522+
523+
local_var_params = locals()
524+
525+
all_params = ["create_ecommerce_estimate_request"] # noqa: E501
526+
all_params.append("async_req")
527+
all_params.append("_return_http_data_only")
528+
all_params.append("_preload_content")
529+
all_params.append("_request_timeout")
530+
all_params.append("mass_g")
531+
all_params.append("total_price_cents_usd")
532+
all_params.append("project_id")
533+
all_params.append("metadata")
534+
all_params.append("distance_m")
535+
all_params.append("transportation_method")
536+
all_params.append("package_mass_g")
537+
all_params.append("create_order")
538+
all_params.append("make")
539+
all_params.append("model")
540+
all_params.append("year")
541+
all_params.append("transaction_value_btc_sats")
542+
all_params.append("transaction_value_eth_gwei")
543+
all_params.append("gas_used")
544+
all_params.append("transaction_value_btc_sats")
545+
all_params.append("average_daily_balance_btc_sats")
546+
all_params.append("average_daily_balance_eth_gwei")
547+
all_params.append("timestamp")
548+
all_params.append("origin_airport")
549+
all_params.append("destination_airport")
550+
all_params.append("aircraft_code")
551+
all_params.append("cabin_class")
552+
all_params.append("passenger_count")
553+
all_params.append("state")
554+
all_params.append("country_code")
555+
all_params.append("city")
556+
all_params.append("region")
557+
all_params.append("star_rating")
558+
all_params.append("number_of_nights")
559+
all_params.append("number_of_rooms")
560+
all_params.append("vintage_year")
561+
all_params.append("total_price")
562+
all_params.append("currency")
563+
all_params.append("amount")
564+
all_params.append("unit")
565+
all_params.append("issued_to")
566+
all_params.append("cargo_type")
567+
all_params.append("container_size_code")
568+
all_params.append("destination_country_code")
569+
all_params.append("destination_locode")
570+
all_params.append("destination_postal_code")
571+
all_params.append("emissions_scope")
572+
all_params.append("freight_mass_g")
573+
all_params.append("freight_volume_cubic_m")
574+
all_params.append("fuel_type")
575+
all_params.append("number_of_containers")
576+
all_params.append("origin_country_code")
577+
all_params.append("origin_locode")
578+
all_params.append("origin_postal_code")
579+
all_params.append("truck_weight_t")
580+
all_params.append("vessel_imo")
581+
582+
for key, val in six.iteritems(local_var_params["kwargs"]):
583+
if key not in all_params:
584+
raise ApiTypeError(
585+
"Got an unexpected keyword argument '%s'"
586+
" to method create_ecommerce_estimate" % key
587+
)
588+
local_var_params[key] = val
589+
del local_var_params["kwargs"]
590+
# verify the required parameter 'create_ecommerce_estimate_request' is set
591+
if (
592+
"create_ecommerce_estimate_request" not in local_var_params
593+
or local_var_params["create_ecommerce_estimate_request"] is None
594+
):
595+
raise ApiValueError(
596+
"Missing the required parameter `create_ecommerce_estimate_request` when calling `create_ecommerce_estimate`"
597+
) # noqa: E501
598+
599+
collection_formats = {}
600+
601+
path_params = {}
602+
603+
query_params = []
604+
605+
# do not add duplicate keys to query_params list
606+
existing_keys = []
607+
for param in query_params:
608+
existing_keys.append(param[0])
609+
610+
for key in kwargs:
611+
if key not in existing_keys:
612+
query_params.append([key, kwargs.get(key)])
613+
614+
header_params = {}
615+
616+
form_params = []
617+
local_var_files = {}
618+
619+
body_params = None
620+
if "create_ecommerce_estimate_request" in local_var_params:
621+
body_params = local_var_params["create_ecommerce_estimate_request"]
622+
# HTTP header `Accept`
623+
header_params["Accept"] = self.api_client.select_header_accept(
624+
["application/json"]
625+
) # noqa: E501
626+
627+
# HTTP header `Content-Type`
628+
header_params[
629+
"Content-Type"
630+
] = self.api_client.select_header_content_type( # noqa: E501
631+
["application/json"]
632+
) # noqa: E501
633+
634+
# Authentication setting
635+
auth_settings = ["bearer_auth"] # noqa: E501
636+
637+
return self.api_client.call_api(
638+
"/v1/estimates/ecommerce",
639+
"POST",
640+
path_params,
641+
query_params,
642+
header_params,
643+
body=body_params,
644+
post_params=form_params,
645+
files=local_var_files,
646+
response_type="EstimateResponse", # noqa: E501
647+
auth_settings=auth_settings,
648+
async_req=local_var_params.get("async_req"),
649+
_return_http_data_only=local_var_params.get(
650+
"_return_http_data_only"
651+
), # noqa: E501
652+
_preload_content=local_var_params.get("_preload_content", True),
653+
_request_timeout=local_var_params.get("_request_timeout"),
654+
collection_formats=collection_formats,
655+
)
656+
467657
def create_ethereum_estimate(
468658
self, create_ethereum_estimate_request={}, **kwargs
469659
): # noqa: E501

‎patch_api/api_client.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ def __init__(
9191
self.default_headers[header_name] = header_value
9292
self.cookie = cookie
9393
# Set default User-Agent.
94-
self.user_agent = "patch-python/1.24.1"
94+
self.user_agent = "patch-python/1.24.2"
9595

9696
def __del__(self):
9797
if self._pool:

‎patch_api/configuration.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -341,7 +341,7 @@ def to_debug_report(self):
341341
"OS: {env}\n"
342342
"Python Version: {pyversion}\n"
343343
"Version of the API: v1\n"
344-
"SDK Package Version: 1.24.1".format(
344+
"SDK Package Version: 1.24.2".format(
345345
env=sys.platform, pyversion=sys.version
346346
)
347347
)

‎patch_api/models/__init__.py

+3
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@
2222
from patch_api.models.create_bitcoin_estimate_request import (
2323
CreateBitcoinEstimateRequest,
2424
)
25+
from patch_api.models.create_ecommerce_estimate_request import (
26+
CreateEcommerceEstimateRequest,
27+
)
2528
from patch_api.models.create_ethereum_estimate_request import (
2629
CreateEthereumEstimateRequest,
2730
)

‎patch_api/models/create_air_shipping_estimate_request.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ def __init__(
6262
aircraft_code=None,
6363
aircraft_type="unknown",
6464
freight_mass_g=None,
65-
emissions_scope="wtw",
65+
emissions_scope="ttw",
6666
project_id=None,
6767
create_order=False,
6868
local_vars_configuration=None,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,292 @@
1+
# coding: utf-8
2+
3+
"""
4+
Patch API V1
5+
6+
The core API used to integrate with Patch's service # noqa: E501
7+
8+
The version of the OpenAPI document: v1
9+
Contact: engineering@usepatch.com
10+
Generated by: https://openapi-generator.tech
11+
"""
12+
13+
14+
import pprint
15+
import re # noqa: F401
16+
17+
import six
18+
19+
from patch_api.configuration import Configuration
20+
21+
22+
class CreateEcommerceEstimateRequest(object):
23+
"""NOTE: This class is auto generated by OpenAPI Generator.
24+
Ref: https://openapi-generator.tech
25+
26+
Do not edit the class manually.
27+
"""
28+
29+
"""
30+
Attributes:
31+
openapi_types (dict): The key is attribute name
32+
and the value is attribute type.
33+
attribute_map (dict): The key is attribute name
34+
and the value is json key in definition.
35+
"""
36+
openapi_types = {
37+
"distance_m": "int",
38+
"package_mass_g": "int",
39+
"transportation_method": "str",
40+
"project_id": "str",
41+
"create_order": "bool",
42+
}
43+
44+
attribute_map = {
45+
"distance_m": "distance_m",
46+
"package_mass_g": "package_mass_g",
47+
"transportation_method": "transportation_method",
48+
"project_id": "project_id",
49+
"create_order": "create_order",
50+
}
51+
52+
def __init__(
53+
self,
54+
distance_m=None,
55+
package_mass_g=None,
56+
transportation_method=None,
57+
project_id=None,
58+
create_order=False,
59+
local_vars_configuration=None,
60+
): # noqa: E501
61+
"""CreateEcommerceEstimateRequest - a model defined in OpenAPI""" # noqa: E501
62+
if local_vars_configuration is None:
63+
local_vars_configuration = Configuration()
64+
self.local_vars_configuration = local_vars_configuration
65+
66+
self._distance_m = None
67+
self._package_mass_g = None
68+
self._transportation_method = None
69+
self._project_id = None
70+
self._create_order = None
71+
self.discriminator = None
72+
73+
self.distance_m = distance_m
74+
self.package_mass_g = package_mass_g
75+
self.transportation_method = transportation_method
76+
self.project_id = project_id
77+
self.create_order = create_order
78+
79+
@property
80+
def distance_m(self):
81+
"""Gets the distance_m of this CreateEcommerceEstimateRequest. # noqa: E501
82+
83+
84+
:return: The distance_m of this CreateEcommerceEstimateRequest. # noqa: E501
85+
:rtype: int
86+
"""
87+
return self._distance_m
88+
89+
@distance_m.setter
90+
def distance_m(self, distance_m):
91+
"""Sets the distance_m of this CreateEcommerceEstimateRequest.
92+
93+
94+
:param distance_m: The distance_m of this CreateEcommerceEstimateRequest. # noqa: E501
95+
:type: int
96+
"""
97+
if (
98+
self.local_vars_configuration.client_side_validation and distance_m is None
99+
): # noqa: E501
100+
raise ValueError(
101+
"Invalid value for `distance_m`, must not be `None`"
102+
) # noqa: E501
103+
if (
104+
self.local_vars_configuration.client_side_validation
105+
and distance_m is not None
106+
and distance_m > 400000000
107+
): # noqa: E501
108+
raise ValueError(
109+
"Invalid value for `distance_m`, must be a value less than or equal to `400000000`"
110+
) # noqa: E501
111+
if (
112+
self.local_vars_configuration.client_side_validation
113+
and distance_m is not None
114+
and distance_m < 0
115+
): # noqa: E501
116+
raise ValueError(
117+
"Invalid value for `distance_m`, must be a value greater than or equal to `0`"
118+
) # noqa: E501
119+
120+
self._distance_m = distance_m
121+
122+
@property
123+
def package_mass_g(self):
124+
"""Gets the package_mass_g of this CreateEcommerceEstimateRequest. # noqa: E501
125+
126+
127+
:return: The package_mass_g of this CreateEcommerceEstimateRequest. # noqa: E501
128+
:rtype: int
129+
"""
130+
return self._package_mass_g
131+
132+
@package_mass_g.setter
133+
def package_mass_g(self, package_mass_g):
134+
"""Sets the package_mass_g of this CreateEcommerceEstimateRequest.
135+
136+
137+
:param package_mass_g: The package_mass_g of this CreateEcommerceEstimateRequest. # noqa: E501
138+
:type: int
139+
"""
140+
if (
141+
self.local_vars_configuration.client_side_validation
142+
and package_mass_g is None
143+
): # noqa: E501
144+
raise ValueError(
145+
"Invalid value for `package_mass_g`, must not be `None`"
146+
) # noqa: E501
147+
if (
148+
self.local_vars_configuration.client_side_validation
149+
and package_mass_g is not None
150+
and package_mass_g > 2000000000
151+
): # noqa: E501
152+
raise ValueError(
153+
"Invalid value for `package_mass_g`, must be a value less than or equal to `2000000000`"
154+
) # noqa: E501
155+
if (
156+
self.local_vars_configuration.client_side_validation
157+
and package_mass_g is not None
158+
and package_mass_g < 0
159+
): # noqa: E501
160+
raise ValueError(
161+
"Invalid value for `package_mass_g`, must be a value greater than or equal to `0`"
162+
) # noqa: E501
163+
164+
self._package_mass_g = package_mass_g
165+
166+
@property
167+
def transportation_method(self):
168+
"""Gets the transportation_method of this CreateEcommerceEstimateRequest. # noqa: E501
169+
170+
171+
:return: The transportation_method of this CreateEcommerceEstimateRequest. # noqa: E501
172+
:rtype: str
173+
"""
174+
return self._transportation_method
175+
176+
@transportation_method.setter
177+
def transportation_method(self, transportation_method):
178+
"""Sets the transportation_method of this CreateEcommerceEstimateRequest.
179+
180+
181+
:param transportation_method: The transportation_method of this CreateEcommerceEstimateRequest. # noqa: E501
182+
:type: str
183+
"""
184+
if (
185+
self.local_vars_configuration.client_side_validation
186+
and transportation_method is None
187+
): # noqa: E501
188+
raise ValueError(
189+
"Invalid value for `transportation_method`, must not be `None`"
190+
) # noqa: E501
191+
allowed_values = ["air", "rail", "road", "sea"] # noqa: E501
192+
if (
193+
self.local_vars_configuration.client_side_validation
194+
and transportation_method not in allowed_values
195+
): # noqa: E501
196+
raise ValueError(
197+
"Invalid value for `transportation_method` ({0}), must be one of {1}".format( # noqa: E501
198+
transportation_method, allowed_values
199+
)
200+
)
201+
202+
self._transportation_method = transportation_method
203+
204+
@property
205+
def project_id(self):
206+
"""Gets the project_id of this CreateEcommerceEstimateRequest. # noqa: E501
207+
208+
209+
:return: The project_id of this CreateEcommerceEstimateRequest. # noqa: E501
210+
:rtype: str
211+
"""
212+
return self._project_id
213+
214+
@project_id.setter
215+
def project_id(self, project_id):
216+
"""Sets the project_id of this CreateEcommerceEstimateRequest.
217+
218+
219+
:param project_id: The project_id of this CreateEcommerceEstimateRequest. # noqa: E501
220+
:type: str
221+
"""
222+
223+
self._project_id = project_id
224+
225+
@property
226+
def create_order(self):
227+
"""Gets the create_order of this CreateEcommerceEstimateRequest. # noqa: E501
228+
229+
230+
:return: The create_order of this CreateEcommerceEstimateRequest. # noqa: E501
231+
:rtype: bool
232+
"""
233+
return self._create_order
234+
235+
@create_order.setter
236+
def create_order(self, create_order):
237+
"""Sets the create_order of this CreateEcommerceEstimateRequest.
238+
239+
240+
:param create_order: The create_order of this CreateEcommerceEstimateRequest. # noqa: E501
241+
:type: bool
242+
"""
243+
244+
self._create_order = create_order
245+
246+
def to_dict(self):
247+
"""Returns the model properties as a dict"""
248+
result = {}
249+
250+
for attr, _ in six.iteritems(self.openapi_types):
251+
value = getattr(self, attr)
252+
if isinstance(value, list):
253+
result[attr] = list(
254+
map(lambda x: x.to_dict() if hasattr(x, "to_dict") else x, value)
255+
)
256+
elif hasattr(value, "to_dict"):
257+
result[attr] = value.to_dict()
258+
elif isinstance(value, dict):
259+
result[attr] = dict(
260+
map(
261+
lambda item: (item[0], item[1].to_dict())
262+
if hasattr(item[1], "to_dict")
263+
else item,
264+
value.items(),
265+
)
266+
)
267+
else:
268+
result[attr] = value
269+
270+
return result
271+
272+
def to_str(self):
273+
"""Returns the string representation of the model"""
274+
return pprint.pformat(self.to_dict())
275+
276+
def __repr__(self):
277+
"""For `print` and `pprint`"""
278+
return self.to_str()
279+
280+
def __eq__(self, other):
281+
"""Returns true if both objects are equal"""
282+
if not isinstance(other, CreateEcommerceEstimateRequest):
283+
return False
284+
285+
return self.to_dict() == other.to_dict()
286+
287+
def __ne__(self, other):
288+
"""Returns true if both objects are not equal"""
289+
if not isinstance(other, CreateEcommerceEstimateRequest):
290+
return True
291+
292+
return self.to_dict() != other.to_dict()

‎patch_api/models/create_rail_shipping_estimate_request.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ def __init__(
7171
origin_postal_code=None,
7272
fuel_type="default",
7373
freight_mass_g=None,
74-
emissions_scope="wtw",
74+
emissions_scope="ttw",
7575
project_id=None,
7676
create_order=False,
7777
local_vars_configuration=None,

‎patch_api/models/create_road_shipping_estimate_request.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ def __init__(
7979
origin_postal_code=None,
8080
cargo_type="average_mixed",
8181
container_size_code=None,
82-
emissions_scope="wtw",
82+
emissions_scope="ttw",
8383
freight_mass_g=None,
8484
fuel_type="diesel",
8585
number_of_containers=None,

‎patch_api/models/create_sea_shipping_estimate_request.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ def __init__(
7676
origin_locode=None,
7777
origin_postal_code=None,
7878
container_size_code=None,
79-
emissions_scope="wtw",
79+
emissions_scope="ttw",
8080
freight_mass_g=None,
8181
freight_volume_cubic_m=None,
8282
number_of_containers=None,

‎setup.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
from setuptools import setup, find_packages # noqa: H301
1313

1414
NAME = "patch-api"
15-
VERSION = "1.24.1"
15+
VERSION = "1.24.2"
1616
# To install the library, run the following
1717
#
1818
# python setup.py install

‎test/test_estimates_api.py

+21
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,27 @@ def test_create_hotel_estimate(self):
195195
estimate.data.mass_g, 15_000
196196
) # not setting an exact value since this is changing daily
197197

198+
def test_create_and_retrieve_ecommerce_estimate(self):
199+
"""Test case for create_ecommerce_estimate
200+
201+
Create an estimate based on the shipping distance, transportation method, and package mass # noqa: E501
202+
"""
203+
distance_m = 10000000
204+
package_mass_g = 1000
205+
transportation_method = "sea"
206+
estimate = self.api.create_ecommerce_estimate(
207+
distance_m=distance_m,
208+
package_mass_g=package_mass_g,
209+
transportation_method=transportation_method,
210+
create_order=False,
211+
)
212+
self.assertEqual(estimate.data.order, None)
213+
self.assertEqual(estimate.data.type, "ecommerce")
214+
self.assertGreater(estimate.data.mass_g, 200)
215+
216+
retrieved_estimate = self.api.retrieve_estimate(id=estimate.data.id)
217+
self.assertTrue(retrieved_estimate)
218+
198219
def test_create_air_shipping_estimate_airport_iatas(self):
199220
"""Test case for create_air_shipping_estimate
200221

0 commit comments

Comments
 (0)
Please sign in to comment.