Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 42d4578

Browse files
committedSep 17, 2024·
Add colissimo_fr transporter with api v2
1 parent 9529a4a commit 42d4578

27 files changed

+16989
-2
lines changed
 

‎roulier/carriers/__init__.py

+1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from . import laposte_fr
2+
from . import colissimo_fr
23
from .gls_fr import rest as gls_fr_rest
34
from .gls_fr import glsbox as gls_fr_glsbox
45
from . import chronopost_fr
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
from . import carrier
+230
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,230 @@
1+
# Copyright 2024 Akretion (http://www.akretion.com).
2+
# @author Florian Mounier <florian.mounier@akretion.com>
3+
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
4+
import logging
5+
import base64
6+
import json
7+
import requests
8+
from requests_toolbelt import MultipartDecoder
9+
from ...carrier import Carrier, action
10+
from ...exception import CarrierError
11+
from .schema import (
12+
ColissimoFrLabelInput,
13+
ColissimoFrLabelOutput,
14+
ColissimoFrPackingSlipInput,
15+
ColissimoFrPackingSlipOutput,
16+
ColissimoFrGetDocumentsInput,
17+
ColissimoFrGetDocumentInput,
18+
ColissimoFrCreateUpdateDocumentInput,
19+
ColissimoFrDocumentOutput,
20+
ColissimoFrDocumentsOutput,
21+
ColissimoFrCreateUpdateDocumentOutput,
22+
)
23+
24+
25+
_logger = logging.getLogger(__name__)
26+
27+
28+
def int_maybe(value):
29+
try:
30+
return int(value)
31+
except ValueError:
32+
return value
33+
34+
35+
class ColissimoFr(Carrier):
36+
__key__ = "colissimo_fr"
37+
__url__ = "https://ws.colissimo.fr/sls-ws/SlsServiceWSRest/2.0"
38+
__doc_url__ = "https://ws.colissimo.fr/api-document/rest"
39+
__auth_url__ = "https://ws.colissimo.fr/widget-colissimo/rest"
40+
__ref__ = "https://www.colissimo.fr/doc-colissimo/redoc-sls/en"
41+
42+
def _raise_for_status(self, response):
43+
try:
44+
response.raise_for_status()
45+
except requests.exceptions.HTTPError as e:
46+
try:
47+
json = response.json()
48+
if "error" in json:
49+
msg = [{"id": 0, "message": json["error"]}]
50+
elif "errors" in json:
51+
msg = [
52+
{
53+
"id": int_maybe(error.get("code", 0)),
54+
"message": error["message"],
55+
}
56+
for error in json["errors"]
57+
]
58+
elif "messages" in json:
59+
msg = [
60+
{
61+
"id": int_maybe(error["id"]),
62+
"message": error["messageContent"],
63+
}
64+
for error in json["messages"]
65+
if error["type"] == "ERROR"
66+
]
67+
elif "errorCode" in json and json["errorCode"] != "000":
68+
msg = [
69+
{
70+
"id": int_maybe(json["errorCode"]),
71+
"message": json["errorLabel"],
72+
}
73+
]
74+
else:
75+
raise
76+
except Exception:
77+
msg = response.text
78+
79+
raise CarrierError(response, msg) from e
80+
81+
return response
82+
83+
def _raise_for_error_code(self, response):
84+
if "errorCode" in response and response["errorCode"] != "000":
85+
raise CarrierError(
86+
response,
87+
[
88+
{
89+
"id": int_maybe(response["errorCode"]),
90+
"message": response["errorLabel"],
91+
}
92+
],
93+
)
94+
95+
def request(self, method, json, url=None):
96+
headers = {}
97+
if json and "apiKey" in json:
98+
json = json.copy()
99+
headers["apiKey"] = json.pop("apiKey")
100+
101+
response = requests.post(
102+
f"{url or self.__url__}/{method}", json=json, headers=headers
103+
)
104+
self._raise_for_status(response)
105+
return response
106+
107+
def doc_request(self, method, json, files=None):
108+
kwargs = {}
109+
if files:
110+
kwargs["headers"] = json.pop("credential")
111+
kwargs["data"] = json
112+
kwargs["files"] = files
113+
else:
114+
kwargs["json"] = json
115+
116+
response = requests.post(f"{self.__doc_url__}/{method}", **kwargs)
117+
self._raise_for_status(response)
118+
return response
119+
120+
def validate(self, params):
121+
response = self.request("checkGenerateLabel", params)
122+
_logger.debug("Validation response: %s", response.text)
123+
return response.text
124+
125+
def _parse_response(self, response):
126+
parsed = {}
127+
decoder = MultipartDecoder.from_response(response)
128+
for part in decoder.parts:
129+
content_id = part.headers.get(b"Content-ID", b"").decode("utf-8")
130+
content_type = part.headers.get(b"Content-Type", b"").decode("utf-8")
131+
132+
content = part.content
133+
134+
# Process each part based on its content type
135+
if "application/json" in content_type:
136+
parsed[content_id] = json.loads(content.decode("utf-8"))
137+
elif (
138+
"application/pdf" in content_type
139+
or "application/octet-stream" in content_type
140+
):
141+
parsed[content_id] = content
142+
else:
143+
_logger.warning(
144+
"Unknown content type: %s for id : %s", content_type, content_id
145+
)
146+
return parsed
147+
148+
@action
149+
def get_label(self, input: ColissimoFrLabelInput) -> ColissimoFrLabelOutput:
150+
params = input.params()
151+
self.validate(params)
152+
response = self.request("generateLabel", params)
153+
154+
result = self._parse_response(response)
155+
return ColissimoFrLabelOutput.from_params(result, input)
156+
157+
@action
158+
def get_packing_slip(
159+
self, input: ColissimoFrPackingSlipInput
160+
) -> ColissimoFrPackingSlipOutput:
161+
162+
params = input.params()
163+
164+
if input.packing_slip_number:
165+
raise NotImplementedError(
166+
"Fetching packing slip by number does not seem to "
167+
"be supported by the REST API"
168+
)
169+
# Getting the auth token
170+
params["login"] = params.pop("contractNumber")
171+
response = self.request("authenticate.rest", params, url=self.__auth_url__)
172+
self._raise_for_status(response)
173+
response = response.json()
174+
headers = {"token": response["token"]}
175+
# partnerClientCode
176+
response = requests.get(
177+
f"{self.__url__}/SlsInternalService/getBordereauByNumber/{input.packing_slip_number}",
178+
headers=headers,
179+
)
180+
self._raise_for_status(response)
181+
result = self._parse_response(response)
182+
else:
183+
response = self.request("generateBordereauByParcelsNumbers", params)
184+
result = self._parse_response(response)
185+
186+
return ColissimoFrPackingSlipOutput.from_params(result)
187+
188+
@action
189+
def get_documents(
190+
self, input: ColissimoFrGetDocumentsInput
191+
) -> ColissimoFrDocumentsOutput:
192+
params = input.params()
193+
response = self.doc_request("documents", params)
194+
result = response.json()
195+
self._raise_for_error_code(result)
196+
return ColissimoFrDocumentsOutput.from_params(result)
197+
198+
@action
199+
def get_document(
200+
self, input: ColissimoFrGetDocumentInput
201+
) -> ColissimoFrDocumentOutput:
202+
params = input.params()
203+
response = self.doc_request("document", params)
204+
return ColissimoFrDocumentOutput.from_params(response.content)
205+
206+
@action
207+
def create_document(
208+
self, input: ColissimoFrCreateUpdateDocumentInput
209+
) -> ColissimoFrCreateUpdateDocumentOutput:
210+
params = input.params()
211+
212+
with open(input.service.document_path, "rb") as file:
213+
files = {"file": (params["filename"], file.read())}
214+
215+
response = self.doc_request("storedocument", params, files)
216+
result = response.json()
217+
return ColissimoFrCreateUpdateDocumentOutput.from_params(result)
218+
219+
@action
220+
def update_document(
221+
self, input: ColissimoFrCreateUpdateDocumentInput
222+
) -> ColissimoFrCreateUpdateDocumentOutput:
223+
params = input.params()
224+
225+
with open(input.service.document_path, "rb") as file:
226+
files = {"file": (params["filename"], file.read())}
227+
228+
response = self.doc_request("updatedocument", params, files)
229+
result = response.json()
230+
return ColissimoFrCreateUpdateDocumentOutput.from_params(result)

‎roulier/carriers/colissimo_fr/schema.py

+667
Large diffs are not rendered by default.

‎roulier/carriers/colissimo_fr/tests/__init__.py

Whitespace-only changes.

‎roulier/carriers/colissimo_fr/tests/cassettes/test_colissimo/test_COM_product.yaml

+3,013
Large diffs are not rendered by default.

‎roulier/carriers/colissimo_fr/tests/cassettes/test_colissimo/test_DOM_product.yaml

+1,017
Large diffs are not rendered by default.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
interactions:
2+
- request:
3+
body: '{"outputFormat": {"x": 0, "y": 0, "outputPrintingType": "PDF_10x15_300dpi",
4+
"dematerialized": false, "returnType": null, "printCoDDocument": false}, "letter":
5+
{"service": {"productCode": "DOM", "depositDate": "2025-01-01", "mailBoxPicking":
6+
false, "mailBoxPickingDate": null, "vatCode": null, "vatPercentage": null, "vatAmount":
7+
null, "transportationAmount": null, "totalAmount": null, "orderNumber": null,
8+
"commercialName": null, "returnTypeChoice": null, "reseauPostal": null}, "parcel":
9+
{"pickupLocationId": null, "parcelNumber": null, "insuranceAmount": null, "insuranceValue":
10+
null, "recommendationLevel": null, "weight": 1.2, "nonMachinable": false, "returnReceipt":
11+
false, "instructions": null, "ftd": false, "ddp": false, "disabledDeliveryBlockingCode":
12+
null, "cod": false, "codamount": null, "codcurrency": null}, "sender": {"senderParcelRef":
13+
null, "address": {"companyName": null, "lastName": "Akretion", "firstName":
14+
null, "line0": "Batiment B", "line1": null, "line2": "27 rue Henri Rolland",
15+
"line3": null, "countryCode": "FR", "city": "Villeurbanne", "zipCode": "69100",
16+
"phoneNumber": null, "mobileNumber": "+33482538457", "doorCode1": null, "doorCode2":
17+
null, "intercom": null, "email": null, "language": "FR", "stateOrProvinceCode":
18+
null}}, "addressee": {"addresseeParcelRef": null, "codeBarForReference": null,
19+
"serviceInfo": null, "promotionCode": null, "address": {"companyName": null,
20+
"lastName": "Hugo", "firstName": "Victor", "line0": null, "line1": null, "line2":
21+
"6 Place des Vosges", "line3": null, "countryCode": "FR", "city": "Paris", "zipCode":
22+
"99999", "phoneNumber": null, "mobileNumber": "+33600000000", "doorCode1": null,
23+
"doorCode2": null, "intercom": null, "email": "hugo.victor@example.com", "language":
24+
"FR", "stateOrProvinceCode": null}}, "codSenderAddress": null, "customsDeclarations":
25+
null}, "fields": null}'
26+
headers:
27+
Accept:
28+
- '*/*'
29+
Accept-Encoding:
30+
- gzip, deflate
31+
Connection:
32+
- keep-alive
33+
Content-Length:
34+
- '1849'
35+
Content-Type:
36+
- application/json
37+
User-Agent:
38+
- python-requests/2.32.3
39+
method: POST
40+
uri: https://ws.colissimo.fr/sls-ws/SlsServiceWSRest/2.0/checkGenerateLabel
41+
response:
42+
body:
43+
string: '{"messages":[{"id":"30213","type":"ERROR","messageContent":"Le code
44+
pays ou le code postal du destinataire est incorrect pour le code produit
45+
fourni","replacementValues":[]}]}'
46+
headers:
47+
Access-Control-Allow-Origin:
48+
- '*'
49+
Connection:
50+
- close
51+
Content-Type:
52+
- application/json;charset=UTF-8
53+
Date:
54+
- Tue, 17 Sep 2024 14:52:56 GMT
55+
P3P:
56+
- policyref="/w3c/p3p.xml", CP="NOI DSP COR NID CUR ADM DEV OUR BUS"
57+
Server:
58+
- Apache
59+
Transfer-Encoding:
60+
- chunked
61+
Vary:
62+
- User-Agent
63+
X-Robots-Tag:
64+
- noindex
65+
status:
66+
code: 400
67+
message: ''
68+
version: 1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
interactions:
2+
- request:
3+
body: '{"outputFormat": {"x": 0, "y": 0, "outputPrintingType": "PDF_10x15_300dpi",
4+
"dematerialized": false, "returnType": null, "printCoDDocument": false}, "letter":
5+
{"service": {"productCode": "DOM", "depositDate": "2025-01-01", "mailBoxPicking":
6+
false, "mailBoxPickingDate": null, "vatCode": null, "vatPercentage": null, "vatAmount":
7+
null, "transportationAmount": null, "totalAmount": null, "orderNumber": null,
8+
"commercialName": null, "returnTypeChoice": null, "reseauPostal": null}, "parcel":
9+
{"pickupLocationId": null, "parcelNumber": null, "insuranceAmount": null, "insuranceValue":
10+
null, "recommendationLevel": null, "weight": 1.2, "nonMachinable": false, "returnReceipt":
11+
false, "instructions": null, "ftd": false, "ddp": false, "disabledDeliveryBlockingCode":
12+
null, "cod": false, "codamount": null, "codcurrency": null}, "sender": {"senderParcelRef":
13+
null, "address": {"companyName": null, "lastName": "Akretion", "firstName":
14+
null, "line0": "Batiment B", "line1": null, "line2": "27 rue Henri Rolland",
15+
"line3": null, "countryCode": "FR", "city": "Villeurbanne", "zipCode": "9999",
16+
"phoneNumber": null, "mobileNumber": "+33482538457", "doorCode1": null, "doorCode2":
17+
null, "intercom": null, "email": null, "language": "FR", "stateOrProvinceCode":
18+
null}}, "addressee": {"addresseeParcelRef": null, "codeBarForReference": null,
19+
"serviceInfo": null, "promotionCode": null, "address": {"companyName": null,
20+
"lastName": "Hugo", "firstName": "Victor", "line0": null, "line1": null, "line2":
21+
"6 Place des Vosges", "line3": null, "countryCode": "FR", "city": "Paris", "zipCode":
22+
"21000", "phoneNumber": null, "mobileNumber": "+33600000000", "doorCode1": null,
23+
"doorCode2": null, "intercom": null, "email": "hugo.victor@example.com", "language":
24+
"FR", "stateOrProvinceCode": null}}, "codSenderAddress": null, "customsDeclarations":
25+
null}, "fields": null}'
26+
headers:
27+
Accept:
28+
- '*/*'
29+
Accept-Encoding:
30+
- gzip, deflate
31+
Connection:
32+
- keep-alive
33+
Content-Length:
34+
- '1848'
35+
Content-Type:
36+
- application/json
37+
User-Agent:
38+
- python-requests/2.32.3
39+
method: POST
40+
uri: https://ws.colissimo.fr/sls-ws/SlsServiceWSRest/2.0/checkGenerateLabel
41+
response:
42+
body:
43+
string: "{\"messages\":[{\"id\":\"30108\",\"type\":\"ERROR\",\"messageContent\":\"Le
44+
code postal de l'exp\xE9diteur ne correspond pas au pays\",\"replacementValues\":[]}]}"
45+
headers:
46+
Access-Control-Allow-Origin:
47+
- '*'
48+
Connection:
49+
- close
50+
Content-Type:
51+
- application/json;charset=UTF-8
52+
Date:
53+
- Tue, 17 Sep 2024 14:52:56 GMT
54+
P3P:
55+
- policyref="/w3c/p3p.xml", CP="NOI DSP COR NID CUR ADM DEV OUR BUS"
56+
Server:
57+
- Apache
58+
Transfer-Encoding:
59+
- chunked
60+
Vary:
61+
- User-Agent
62+
X-Robots-Tag:
63+
- noindex
64+
status:
65+
code: 400
66+
message: ''
67+
version: 1

‎roulier/carriers/colissimo_fr/tests/cassettes/test_colissimo/test_DOS_product.yaml

+1,019
Large diffs are not rendered by default.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
interactions:
2+
- request:
3+
body: '{"outputFormat": {"x": 0, "y": 0, "outputPrintingType": "PDF_10x15_300dpi",
4+
"dematerialized": false, "returnType": null, "printCoDDocument": false}, "letter":
5+
{"service": {"productCode": "INVALID_PRODUCT", "depositDate": "2025-01-01",
6+
"mailBoxPicking": false, "mailBoxPickingDate": null, "vatCode": null, "vatPercentage":
7+
null, "vatAmount": null, "transportationAmount": null, "totalAmount": null,
8+
"orderNumber": null, "commercialName": null, "returnTypeChoice": null, "reseauPostal":
9+
null}, "parcel": {"pickupLocationId": null, "parcelNumber": null, "insuranceAmount":
10+
null, "insuranceValue": null, "recommendationLevel": null, "weight": 1.2, "nonMachinable":
11+
false, "returnReceipt": false, "instructions": null, "ftd": false, "ddp": false,
12+
"disabledDeliveryBlockingCode": null, "cod": false, "codamount": null, "codcurrency":
13+
null}, "sender": {"senderParcelRef": null, "address": {"companyName": null,
14+
"lastName": "Akretion", "firstName": null, "line0": "Batiment B", "line1": null,
15+
"line2": "27 rue Henri Rolland", "line3": null, "countryCode": "FR", "city":
16+
"Villeurbanne", "zipCode": "69100", "phoneNumber": null, "mobileNumber": "+33482538457",
17+
"doorCode1": null, "doorCode2": null, "intercom": null, "email": null, "language":
18+
"FR", "stateOrProvinceCode": null}}, "addressee": {"addresseeParcelRef": null,
19+
"codeBarForReference": null, "serviceInfo": null, "promotionCode": null, "address":
20+
{"companyName": null, "lastName": "Hugo", "firstName": "Victor", "line0": null,
21+
"line1": null, "line2": "6 Place des Vosges", "line3": null, "countryCode":
22+
"FR", "city": "Paris", "zipCode": "75004", "phoneNumber": null, "mobileNumber":
23+
"+33600000000", "doorCode1": null, "doorCode2": null, "intercom": null, "email":
24+
"hugo.victor@example.com", "language": "FR", "stateOrProvinceCode": null}},
25+
"codSenderAddress": null, "customsDeclarations": null}, "fields": null}'
26+
headers:
27+
Accept:
28+
- '*/*'
29+
Accept-Encoding:
30+
- gzip, deflate
31+
Connection:
32+
- keep-alive
33+
Content-Length:
34+
- '1861'
35+
Content-Type:
36+
- application/json
37+
User-Agent:
38+
- python-requests/2.32.3
39+
method: POST
40+
uri: https://ws.colissimo.fr/sls-ws/SlsServiceWSRest/2.0/checkGenerateLabel
41+
response:
42+
body:
43+
string: "{\"messages\":[{\"id\":\"30109\",\"type\":\"ERROR\",\"messageContent\":\"Le
44+
pays ou code postal exp\xE9diteur ne permet pas d\u2019effectuer un envoi\",\"replacementValues\":[]}]}"
45+
headers:
46+
Access-Control-Allow-Origin:
47+
- '*'
48+
Connection:
49+
- close
50+
Content-Type:
51+
- application/json;charset=UTF-8
52+
Date:
53+
- Tue, 17 Sep 2024 14:52:54 GMT
54+
P3P:
55+
- policyref="/w3c/p3p.xml", CP="NOI DSP COR NID CUR ADM DEV OUR BUS"
56+
Server:
57+
- Apache
58+
Transfer-Encoding:
59+
- chunked
60+
Vary:
61+
- User-Agent
62+
X-Robots-Tag:
63+
- noindex
64+
status:
65+
code: 400
66+
message: ''
67+
version: 1

‎roulier/carriers/colissimo_fr/tests/cassettes/test_colissimo/test_colissimo_label.yaml

+1,023
Large diffs are not rendered by default.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,160 @@
1+
interactions:
2+
- request:
3+
body: '{"outputFormat": {"x": 0, "y": 0, "outputPrintingType": "ZPL_10x15_300dpi",
4+
"dematerialized": false, "returnType": null, "printCoDDocument": false}, "letter":
5+
{"service": {"productCode": "COL", "depositDate": "2025-01-01", "mailBoxPicking":
6+
false, "mailBoxPickingDate": null, "vatCode": null, "vatPercentage": null, "vatAmount":
7+
null, "transportationAmount": null, "totalAmount": null, "orderNumber": null,
8+
"commercialName": null, "returnTypeChoice": null, "reseauPostal": null}, "parcel":
9+
{"pickupLocationId": null, "parcelNumber": null, "insuranceAmount": null, "insuranceValue":
10+
null, "recommendationLevel": null, "weight": 1.2, "nonMachinable": false, "returnReceipt":
11+
false, "instructions": null, "ftd": false, "ddp": false, "disabledDeliveryBlockingCode":
12+
null, "cod": false, "codamount": null, "codcurrency": null}, "sender": {"senderParcelRef":
13+
null, "address": {"companyName": null, "lastName": "Akretion", "firstName":
14+
null, "line0": "Batiment B", "line1": null, "line2": "27 rue Henri Rolland",
15+
"line3": null, "countryCode": "FR", "city": "Villeurbanne", "zipCode": "69100",
16+
"phoneNumber": null, "mobileNumber": "+33482538457", "doorCode1": null, "doorCode2":
17+
null, "intercom": null, "email": null, "language": "FR", "stateOrProvinceCode":
18+
null}}, "addressee": {"addresseeParcelRef": null, "codeBarForReference": null,
19+
"serviceInfo": null, "promotionCode": null, "address": {"companyName": null,
20+
"lastName": "Hugo", "firstName": "Victor", "line0": null, "line1": null, "line2":
21+
"6 Place des Vosges", "line3": null, "countryCode": "FR", "city": "Paris", "zipCode":
22+
"75004", "phoneNumber": null, "mobileNumber": "+33600000000", "doorCode1": null,
23+
"doorCode2": null, "intercom": null, "email": "hugo.victor@example.com", "language":
24+
"FR", "stateOrProvinceCode": null}}, "codSenderAddress": null, "customsDeclarations":
25+
null}, "fields": null}'
26+
headers:
27+
Accept:
28+
- '*/*'
29+
Accept-Encoding:
30+
- gzip, deflate
31+
Connection:
32+
- keep-alive
33+
Content-Length:
34+
- '1849'
35+
Content-Type:
36+
- application/json
37+
User-Agent:
38+
- python-requests/2.32.3
39+
method: POST
40+
uri: https://ws.colissimo.fr/sls-ws/SlsServiceWSRest/2.0/checkGenerateLabel
41+
response:
42+
body:
43+
string: "{\"messages\":[{\"id\":\"0\",\"type\":\"INFOS\",\"messageContent\":\"La
44+
requ\xEAte a \xE9t\xE9 trait\xE9e avec succ\xE8s\",\"replacementValues\":[]}]}"
45+
headers:
46+
Access-Control-Allow-Origin:
47+
- '*'
48+
Connection:
49+
- Keep-Alive
50+
Content-Type:
51+
- application/json;charset=UTF-8
52+
Date:
53+
- Tue, 17 Sep 2024 14:52:54 GMT
54+
Keep-Alive:
55+
- timeout=15, max=200
56+
P3P:
57+
- policyref="/w3c/p3p.xml", CP="NOI DSP COR NID CUR ADM DEV OUR BUS"
58+
Server:
59+
- Apache
60+
Transfer-Encoding:
61+
- chunked
62+
Vary:
63+
- User-Agent
64+
X-Robots-Tag:
65+
- noindex
66+
status:
67+
code: 200
68+
message: ''
69+
- request:
70+
body: '{"outputFormat": {"x": 0, "y": 0, "outputPrintingType": "ZPL_10x15_300dpi",
71+
"dematerialized": false, "returnType": null, "printCoDDocument": false}, "letter":
72+
{"service": {"productCode": "COL", "depositDate": "2025-01-01", "mailBoxPicking":
73+
false, "mailBoxPickingDate": null, "vatCode": null, "vatPercentage": null, "vatAmount":
74+
null, "transportationAmount": null, "totalAmount": null, "orderNumber": null,
75+
"commercialName": null, "returnTypeChoice": null, "reseauPostal": null}, "parcel":
76+
{"pickupLocationId": null, "parcelNumber": null, "insuranceAmount": null, "insuranceValue":
77+
null, "recommendationLevel": null, "weight": 1.2, "nonMachinable": false, "returnReceipt":
78+
false, "instructions": null, "ftd": false, "ddp": false, "disabledDeliveryBlockingCode":
79+
null, "cod": false, "codamount": null, "codcurrency": null}, "sender": {"senderParcelRef":
80+
null, "address": {"companyName": null, "lastName": "Akretion", "firstName":
81+
null, "line0": "Batiment B", "line1": null, "line2": "27 rue Henri Rolland",
82+
"line3": null, "countryCode": "FR", "city": "Villeurbanne", "zipCode": "69100",
83+
"phoneNumber": null, "mobileNumber": "+33482538457", "doorCode1": null, "doorCode2":
84+
null, "intercom": null, "email": null, "language": "FR", "stateOrProvinceCode":
85+
null}}, "addressee": {"addresseeParcelRef": null, "codeBarForReference": null,
86+
"serviceInfo": null, "promotionCode": null, "address": {"companyName": null,
87+
"lastName": "Hugo", "firstName": "Victor", "line0": null, "line1": null, "line2":
88+
"6 Place des Vosges", "line3": null, "countryCode": "FR", "city": "Paris", "zipCode":
89+
"75004", "phoneNumber": null, "mobileNumber": "+33600000000", "doorCode1": null,
90+
"doorCode2": null, "intercom": null, "email": "hugo.victor@example.com", "language":
91+
"FR", "stateOrProvinceCode": null}}, "codSenderAddress": null, "customsDeclarations":
92+
null}, "fields": null}'
93+
headers:
94+
Accept:
95+
- '*/*'
96+
Accept-Encoding:
97+
- gzip, deflate
98+
Connection:
99+
- keep-alive
100+
Content-Length:
101+
- '1849'
102+
Content-Type:
103+
- application/json
104+
User-Agent:
105+
- python-requests/2.32.3
106+
method: POST
107+
uri: https://ws.colissimo.fr/sls-ws/SlsServiceWSRest/2.0/generateLabel
108+
response:
109+
body:
110+
string: "\r\n--uuid:8702a2a4-612c-4609-8a0c-1338fa8e3bad\r\nContent-Type: application/json;charset=UTF-8\r\nContent-Transfer-Encoding:
111+
binary\r\nContent-ID: <jsonInfos>\r\n\r\n{\"messages\":[{\"id\":\"0\",\"type\":\"INFOS\",\"messageContent\":\"La
112+
requ\xEAte a \xE9t\xE9 trait\xE9e avec succ\xE8s\",\"replacementValues\":[]}],\"labelXmlV2Reponse\":null,\"labelV2Response\":{\"parcelNumber\":\"9V34574221677\",\"parcelNumberPartner\":\"0075004119V34574221678022501\",\"pdfUrl\":null,\"fields\":{\"field\":[{\"key\":\"NETWORK_NAME\",\"value\":\"\"},{\"key\":\"PARTNER_NAME\",\"value\":\"\"},{\"key\":\"PARTNER_CAB\",\"value\":\"\"},{\"key\":\"CN23_THERMIQUE\",\"value\":\"\"}],\"customField\":[{\"key\":\"NETWORK_NAME\",\"value\":\"\"},{\"key\":\"PARTNER_NAME\",\"value\":\"\"},{\"key\":\"PARTNER_CAB\",\"value\":\"\"},{\"key\":\"CN23_THERMIQUE\",\"value\":\"\"}]}}}\r\n--uuid:8702a2a4-612c-4609-8a0c-1338fa8e3bad\r\nContent-Type:
113+
application/octet-stream\r\nContent-Transfer-Encoding: binary\r\nContent-ID:
114+
<label>\r\n\r\n\uFEFF\x10CT~~CD,~CC^~CT~\n^XA\n^PW1181\n^LS0000\n^LT0000\n^FO1056,0^GFA,06656,06656,00016,:Z64:\neJztl02SpCAQhSFcuOQIHIW+GXbMYq7FUTiCSxeEtAIi+fCnLbuqZyIqd190F+bLl5kiY+/436PxU4wrtzP7fRbw/zLyx8JqZsfswjow7wkPK4fj+2bYYR7Yto6yWDik740Ydzim3ym/wyLK074r5MxsCjnjlFXJbmJb8MAz64V7IqfmgcgDFvMzSjnAcrEgycksFnnJsizHR4HIWV4SmOUlTu6FpIi8xFlOEgjM4ykhyyFwl7McgpyVXeA16y3mRdYF6/V8k7MIBQ1ZxiKt+fmV9cp2i9XKZovlyt0WRz/6+djCH6sWv6KfVtbsNvsB+yUVHHntt1gaXrONnEqZ+zsIGCvWhIt5SesB50vuzePCMM843+3ePlh4d58kQRbYLJwE5cB9lhZCDtx/4cSevePXQo8EuV96MUabezuGALtknpXMrmRF2iE2WMnYDr4XJAFvm5KnlcQpd4zy9AhkU/B4zuqEq993Bwz5sIk9Miu544S1oXwa0lHW9Oc876IYV/1FP8/91eBvS/Vf9HOr3obymX+X/Nzop6N+ZPPbhPCoqJ/1+jusJ86TAD/Qvwb8Rf+ZuLltTxY6LnwJrIA1sL/KlmTHQT0OzxnfjvC+tpT/DMCO8t+bjOd9kg756RCmJGU0eZo2tH99B8xhPzT0hQPMx7ZmQ3ik89s6Ot/tQFlULCn35O9eEZ7qe5Ut2f8aWHlD6iGngpUs6OuZtbDez0PYkmq/NDnx+X655/olgV/tF70+PeDXceB8v2Kf4P76fOGF3cP7sLovPsDdDWZwn/sOm2NWJ38/Y8ivuayPHfPl+h89jz1QP2Cs1+36lXy3Px6o5wDcU765QARcBuA+iPfFFp7/498DTlLG+/I/+D1QcvU90LGj/PH7lfmB6sf6nNUT64/+oH/V9wCOo3zqZfEd348vNLZIQA==:2D02\n^BY4,0^FT793,789^BON,4,N,23,N,1,\n^FH\\^FD[)>\\1E01\\1D02\\1D0075004\\1D250\\1D802\\1D119V3457422167\\1DGEOP\\1D565007\\1D261\\1D\\1D001/001\\1D01.20KG\\1DN\\1D6
115+
Place des Vosges\\1DParis\\1D\\1D\\1D\\1E07\\1DG03\\1D0\\1D0\\1D1\\1D\\1FHugo
116+
Victor\\1FHugo Victor\\1F\\1F\\1F+3360000000\\1Fhugo.victor@example.com\\1F\\1F\\1F\\1DB\\1D01.20KG\\1D\\1DAkretion
117+
\\1D\\1D\\1D\\1D\\1D\\1D0\\1D\\1D\\1E07\\1DS010\\1D\\1F334825384\\1FAkretion
118+
\\1F\\1F27 rue Henri Rolland\\1FBatiment B\\1FVilleurbanne\\1F69100\\1F250\\1D\\1E\\04\r^FS\n^FT39,1075^A0N,100,98^FH\\^FD^FS\n^BY4,3,182^FT82,1676^BCN,,N,N\n\n^BY4,3,277^FT130,1383^BCN,,N,N\n^FD>:%>50075004119>6V>53457422167802250^FS\n^FO1,4^GB1180,0,1^FS\n^FO785,398^GB390,0,2^FS\n^FO0,800^GB1181,0,2^FS\n^FO780,4^GB0,795,1^FS\n^FO1056,8^GB0,390,2^FS\n^FT276,1426^A0N,33,36^FB630,1,0,C^FH\\^FD0075
119+
0041 19V3 4574 2216 7802 2501 ^FS\n^FT50,1592^ADN,108,60^FB1152,1,0,C^FH\\^FD^FS\n^FT265,1716^A0N,33,36^FB253,1,0,C^FH\\^FD^FS\n^FT732,20^A0R,21,21^FH\\^FDR\\82f
120+
desti. : ^FS\n^FT757,20^A0R,21,21^FH\\^FDDestinataire / Destinee^FS\n^FT1099,877^A0N,25,24^FH\\^FDService^FS\n^FT396,1071^A0N,25,24^FB596,1,0,C^FH\\^FD17/09/24
121+
16:52 WS_SLS 24090202 2.0 ^FS\n^FT518,870^A0N,58,57^FH\\^FDD^FS\n^FT359,1074^A0N,100,98^FB802,1,0,R^FH\\^FD^FS\n^FO587,608^GB195,0,2^FS\n^FT36,996^A0N,163,103^FH\\^FDFR-COL-1175-75MOU^FS\n^FO66,1099^GB1029,0,5^FS\n^FT856,20^A0R,25,24^FH\\^FDFR
122+
FRANCE^FS\n^FT200,870^A0N,67,62^FH\\^FD3457422167^FS\n^FO1,451^GB779,0,2^FS\n^FT19,867^A0N,83,81^FH\\^FD119V^FS\n^FT394,859^A0N,67,60^FB770,1,0,R^FH\\^FD
123+
\ J+2_Dom_Sign^FS\n^FT884,20^A0R,25,24^FH\\^FD69100 Villeurbanne^FS\n^FT790,111^A0R,42,40^FH\\^FD565007^FS\n^FT791,20^A0R,25,24^FH\\^FDCompte
124+
:^FS\n^FT828,21^A0R,25,24^FH\\^FD^FS\n^FT14,308^A0N,33,36^FH\\^FD^FS\n^FT14,184^A0N,33,36^FH\\^FD^FS\n^FT15,144^A0N,33,36^FH\\^FD^FS\n^FT908,20^A0R,25,24^FH\\^FD^FS\n^FT931,20^A0R,25,24^FH\\^FDBatiment
125+
B^FS\n^FT342,1040^A0N,42,43^FB499,1,0,C^FH\\^FD802-FR-75004^FS\n^FT15,274^A0N,50,50^FH\\^FD^FS\n^FT15,231^A0N,50,50^FH\\^FD6
126+
Place des Vosges^FS\n^FT1004,21^A0R,25,24^FH\\^FDAkretion ^FS\n^FT954,20^A0R,25,24^FH\\^FD^FS\n^FT13,104^A0N,42,43^FH\\^FDHugo
127+
Victor^FS\n^FT977,20^A0R,25,24^FH\\^FD27 rue Henri Rolland^FS\n^FT13,66^A0N,42,43^FH\\^FD^FS\n^FT21,446^A0N,67,67^FH\\^FD^FS\n^FT1033,22^A0R,21,21^FH\\^FDExp\\82diteur
128+
/ Sender^FS\n^FT248,387^A0N,67,67^FH\\^FDPARIS^FS\n^FT13,387^A0N,92,91^FH\\^FD75004^FS\n^FT591,583^A0N,33,36^FB186,1,0,C^FH\\^FD1.2
129+
Kg ^FS\n^FT650,530^A0N,33,36^FH\\^FDPoids^FS\n^FT599,493^A0N,29,28^FH\\^FDLivraison
130+
: 1/1^FS\n^FT149,700^A0N,37,36^FH\\^FD^FS\n^FT149,667^A0N,37,36^FH\\^FD^FS\n^FT179,630^A0N,29,28^FH\\^FD^FS\n^FT14,606^A0N,29,28^FH\\^FDInstructions
131+
: ^FS\n^FT14,485^A0N,29,28^FH\\^FDNum. colis :^FS\n^FT13,518^A0N,29,28^FH\\^FDSite
132+
d\\82p\\93t : CAVAILLON PFC^FS\n^FT162,487^A0N,42,43^FH\\^FD9V 34574 22167
133+
7^FS\n^FT12,667^A0N,29,28^FH\\^FDR\\82f client :^FS\n^FT13,577^A0N,29,28^FH\\^FDCode
134+
porte : / Interphone : ^FS\n^FT12,547^A0N,29,28^FH\\^FDT\\82l\\82phone :
135+
+33600000000 / ^FS\n^FO585,451^GB0,133,1^FS\n^FO585,585^GB0,214,1^FS\n^FO391,706^GB0,94,2^FS\n^FO190,707^GB0,93,2^FS\n^FO1,704^GB779,0,2^FS\n^FT0,791^A0N,100,98^FH\\^FD^FS\n^FT586,791^A0N,100,98^FH\\^FDSign^FS\n^FT587,693^A0N,100,98^FH\\^FD^FS\n^FT394,791^A0N,100,98^FH\\^FDDom^FS\n^FT193,791^A0N,100,98^FH\\^FDJ+2^FS\n^FO1,3^GB781,450,4^FS\n^PQ1,0,1,Y^XZ\n\r\n--uuid:8702a2a4-612c-4609-8a0c-1338fa8e3bad--"
136+
headers:
137+
Access-Control-Allow-Origin:
138+
- '*'
139+
Connection:
140+
- Keep-Alive
141+
Content-Type:
142+
- multipart/mixed;boundary="uuid:8702a2a4-612c-4609-8a0c-1338fa8e3bad";charset=UTF-8
143+
Date:
144+
- Tue, 17 Sep 2024 14:52:54 GMT
145+
Keep-Alive:
146+
- timeout=15, max=200
147+
P3P:
148+
- policyref="/w3c/p3p.xml", CP="NOI DSP COR NID CUR ADM DEV OUR BUS"
149+
Server:
150+
- Apache
151+
Transfer-Encoding:
152+
- chunked
153+
Vary:
154+
- User-Agent
155+
X-Robots-Tag:
156+
- noindex
157+
status:
158+
code: 200
159+
message: ''
160+
version: 1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
interactions:
2+
- request:
3+
body: '{"outputFormat": {"x": 0, "y": 0, "outputPrintingType": "PDF_10x15_300dpi",
4+
"dematerialized": false, "returnType": null, "printCoDDocument": false}, "letter":
5+
{"service": {"productCode": "COL", "depositDate": "2025-01-01", "mailBoxPicking":
6+
false, "mailBoxPickingDate": null, "vatCode": null, "vatPercentage": null, "vatAmount":
7+
null, "transportationAmount": null, "totalAmount": null, "orderNumber": null,
8+
"commercialName": null, "returnTypeChoice": null, "reseauPostal": null}, "parcel":
9+
{"pickupLocationId": null, "parcelNumber": null, "insuranceAmount": null, "insuranceValue":
10+
null, "recommendationLevel": null, "weight": 35.0, "nonMachinable": false, "returnReceipt":
11+
false, "instructions": null, "ftd": false, "ddp": false, "disabledDeliveryBlockingCode":
12+
null, "cod": false, "codamount": null, "codcurrency": null}, "sender": {"senderParcelRef":
13+
null, "address": {"companyName": null, "lastName": "Akretion", "firstName":
14+
null, "line0": "Batiment B", "line1": null, "line2": "27 rue Henri Rolland",
15+
"line3": null, "countryCode": "FR", "city": "Villeurbanne", "zipCode": "69100",
16+
"phoneNumber": null, "mobileNumber": "+33482538457", "doorCode1": null, "doorCode2":
17+
null, "intercom": null, "email": null, "language": "FR", "stateOrProvinceCode":
18+
null}}, "addressee": {"addresseeParcelRef": null, "codeBarForReference": null,
19+
"serviceInfo": null, "promotionCode": null, "address": {"companyName": null,
20+
"lastName": "Hugo", "firstName": "Victor", "line0": null, "line1": null, "line2":
21+
"6 Place des Vosges", "line3": null, "countryCode": "FR", "city": "Paris", "zipCode":
22+
"75004", "phoneNumber": null, "mobileNumber": "+33600000000", "doorCode1": null,
23+
"doorCode2": null, "intercom": null, "email": "hugo.victor@example.com", "language":
24+
"FR", "stateOrProvinceCode": null}}, "codSenderAddress": null, "customsDeclarations":
25+
null}, "fields": null}'
26+
headers:
27+
Accept:
28+
- '*/*'
29+
Accept-Encoding:
30+
- gzip, deflate
31+
Connection:
32+
- keep-alive
33+
Content-Length:
34+
- '1850'
35+
Content-Type:
36+
- application/json
37+
User-Agent:
38+
- python-requests/2.32.3
39+
method: POST
40+
uri: https://ws.colissimo.fr/sls-ws/SlsServiceWSRest/2.0/checkGenerateLabel
41+
response:
42+
body:
43+
string: '{"messages":[{"id":"30301","type":"ERROR","messageContent":"Le poids
44+
du colis est incorrect","replacementValues":[]}]}'
45+
headers:
46+
Access-Control-Allow-Origin:
47+
- '*'
48+
Connection:
49+
- close
50+
Content-Type:
51+
- application/json;charset=UTF-8
52+
Date:
53+
- Tue, 17 Sep 2024 14:52:54 GMT
54+
P3P:
55+
- policyref="/w3c/p3p.xml", CP="NOI DSP COR NID CUR ADM DEV OUR BUS"
56+
Server:
57+
- Apache
58+
Transfer-Encoding:
59+
- chunked
60+
Vary:
61+
- User-Agent
62+
X-Robots-Tag:
63+
- noindex
64+
status:
65+
code: 400
66+
message: ''
67+
version: 1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
interactions:
2+
- request:
3+
body: '{"outputFormat": {"x": 0, "y": 0, "outputPrintingType": "PDF_10x15_300dpi",
4+
"dematerialized": false, "returnType": null, "printCoDDocument": false}, "letter":
5+
{"service": {"productCode": "COL", "depositDate": "2025-01-01", "mailBoxPicking":
6+
false, "mailBoxPickingDate": null, "vatCode": null, "vatPercentage": null, "vatAmount":
7+
null, "transportationAmount": null, "totalAmount": null, "orderNumber": null,
8+
"commercialName": null, "returnTypeChoice": null, "reseauPostal": null}, "parcel":
9+
{"pickupLocationId": null, "parcelNumber": null, "insuranceAmount": null, "insuranceValue":
10+
null, "recommendationLevel": null, "weight": 0.0, "nonMachinable": false, "returnReceipt":
11+
false, "instructions": null, "ftd": false, "ddp": false, "disabledDeliveryBlockingCode":
12+
null, "cod": false, "codamount": null, "codcurrency": null}, "sender": {"senderParcelRef":
13+
null, "address": {"companyName": null, "lastName": "Akretion", "firstName":
14+
null, "line0": "Batiment B", "line1": null, "line2": "27 rue Henri Rolland",
15+
"line3": null, "countryCode": "FR", "city": "Villeurbanne", "zipCode": "69100",
16+
"phoneNumber": null, "mobileNumber": "+33482538457", "doorCode1": null, "doorCode2":
17+
null, "intercom": null, "email": null, "language": "FR", "stateOrProvinceCode":
18+
null}}, "addressee": {"addresseeParcelRef": null, "codeBarForReference": null,
19+
"serviceInfo": null, "promotionCode": null, "address": {"companyName": null,
20+
"lastName": "Hugo", "firstName": "Victor", "line0": null, "line1": null, "line2":
21+
"6 Place des Vosges", "line3": null, "countryCode": "FR", "city": "Paris", "zipCode":
22+
"75004", "phoneNumber": null, "mobileNumber": "+33600000000", "doorCode1": null,
23+
"doorCode2": null, "intercom": null, "email": "hugo.victor@example.com", "language":
24+
"FR", "stateOrProvinceCode": null}}, "codSenderAddress": null, "customsDeclarations":
25+
null}, "fields": null}'
26+
headers:
27+
Accept:
28+
- '*/*'
29+
Accept-Encoding:
30+
- gzip, deflate
31+
Connection:
32+
- keep-alive
33+
Content-Length:
34+
- '1849'
35+
Content-Type:
36+
- application/json
37+
User-Agent:
38+
- python-requests/2.32.3
39+
method: POST
40+
uri: https://ws.colissimo.fr/sls-ws/SlsServiceWSRest/2.0/checkGenerateLabel
41+
response:
42+
body:
43+
string: "{\"messages\":[{\"id\":\"30300\",\"type\":\"ERROR\",\"messageContent\":\"Le
44+
poids du colis n'a pas \xE9t\xE9 transmis\",\"replacementValues\":[]}]}"
45+
headers:
46+
Access-Control-Allow-Origin:
47+
- '*'
48+
Connection:
49+
- close
50+
Content-Type:
51+
- application/json;charset=UTF-8
52+
Date:
53+
- Tue, 17 Sep 2024 14:52:54 GMT
54+
P3P:
55+
- policyref="/w3c/p3p.xml", CP="NOI DSP COR NID CUR ADM DEV OUR BUS"
56+
Server:
57+
- Apache
58+
Transfer-Encoding:
59+
- chunked
60+
Vary:
61+
- User-Agent
62+
X-Robots-Tag:
63+
- noindex
64+
status:
65+
code: 400
66+
message: ''
67+
version: 1

‎roulier/carriers/colissimo_fr/tests/cassettes/test_colissimo/test_common_success_get_packing_slip.yaml

+1,804
Large diffs are not rendered by default.

‎roulier/carriers/colissimo_fr/tests/cassettes/test_colissimo/test_documents_ok.yaml

+2,886
Large diffs are not rendered by default.

‎roulier/carriers/colissimo_fr/tests/cassettes/test_colissimo/test_full_customs_declarations.yaml

+3,043
Large diffs are not rendered by default.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
interactions:
2+
- request:
3+
body: '{"generateBordereauParcelNumberList": {"parcelsNumbers": ["unknown", "missing"]}}'
4+
headers:
5+
Accept:
6+
- '*/*'
7+
Accept-Encoding:
8+
- gzip, deflate
9+
Connection:
10+
- keep-alive
11+
Content-Length:
12+
- '81'
13+
Content-Type:
14+
- application/json
15+
User-Agent:
16+
- python-requests/2.32.3
17+
method: POST
18+
uri: https://ws.colissimo.fr/sls-ws/SlsServiceWSRest/2.0/generateBordereauByParcelsNumbers
19+
response:
20+
body:
21+
string: "\r\n--uuid:062a49da-3198-47be-8951-137fa5cd76d8\r\nContent-Type: application/json;charset=UTF-8\r\nContent-Transfer-Encoding:
22+
binary\r\nContent-ID: <jsonInfos>\r\n\r\n{\"messages\":[{\"id\":\"50031\",\"type\":\"ERROR\",\"messageContent\":\"Num\xE9ro
23+
de colis invalide unknown\"}],\"bordereauHeader\":null}\r\n--uuid:062a49da-3198-47be-8951-137fa5cd76d8--"
24+
headers:
25+
Access-Control-Allow-Origin:
26+
- '*'
27+
Connection:
28+
- close
29+
Content-Type:
30+
- multipart/mixed;boundary="uuid:062a49da-3198-47be-8951-137fa5cd76d8";charset=UTF-8
31+
Date:
32+
- Tue, 17 Sep 2024 14:52:55 GMT
33+
P3P:
34+
- policyref="/w3c/p3p.xml", CP="NOI DSP COR NID CUR ADM DEV OUR BUS"
35+
Server:
36+
- Apache
37+
Transfer-Encoding:
38+
- chunked
39+
Vary:
40+
- User-Agent
41+
X-Robots-Tag:
42+
- noindex
43+
status:
44+
code: 400
45+
message: ''
46+
version: 1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
interactions:
2+
- request:
3+
body: '{"outputFormat": {"x": 0, "y": 0, "outputPrintingType": "PDF_10x15_300dpi",
4+
"dematerialized": false, "returnType": null, "printCoDDocument": false}, "letter":
5+
{"service": {"productCode": "BPR", "depositDate": "2025-01-01", "mailBoxPicking":
6+
false, "mailBoxPickingDate": null, "vatCode": null, "vatPercentage": null, "vatAmount":
7+
null, "transportationAmount": null, "totalAmount": null, "orderNumber": null,
8+
"commercialName": "Webu", "returnTypeChoice": null, "reseauPostal": null}, "parcel":
9+
{"pickupLocationId": "929750", "parcelNumber": null, "insuranceAmount": null,
10+
"insuranceValue": null, "recommendationLevel": null, "weight": 1.2, "nonMachinable":
11+
false, "returnReceipt": false, "instructions": null, "ftd": false, "ddp": false,
12+
"disabledDeliveryBlockingCode": null, "cod": false, "codamount": null, "codcurrency":
13+
null}, "sender": {"senderParcelRef": null, "address": {"companyName": null,
14+
"lastName": "Akretion", "firstName": null, "line0": "Batiment B", "line1": null,
15+
"line2": "27 rue Henri Rolland", "line3": null, "countryCode": "FR", "city":
16+
"Villeurbanne", "zipCode": "69100", "phoneNumber": null, "mobileNumber": "+33482538457",
17+
"doorCode1": null, "doorCode2": null, "intercom": null, "email": null, "language":
18+
"FR", "stateOrProvinceCode": null}}, "addressee": {"addresseeParcelRef": null,
19+
"codeBarForReference": null, "serviceInfo": null, "promotionCode": null, "address":
20+
{"companyName": null, "lastName": "Hugo", "firstName": "Victor", "line0": null,
21+
"line1": null, "line2": "6 Place des Vosges", "line3": null, "countryCode":
22+
"FR", "city": "Paris", "zipCode": "75004", "phoneNumber": null, "mobileNumber":
23+
null, "doorCode1": null, "doorCode2": null, "intercom": null, "email": "no-reply@webu.coop",
24+
"language": "FR", "stateOrProvinceCode": null}}, "codSenderAddress": null, "customsDeclarations":
25+
null}, "fields": null}'
26+
headers:
27+
Accept:
28+
- '*/*'
29+
Accept-Encoding:
30+
- gzip, deflate
31+
Connection:
32+
- keep-alive
33+
Content-Length:
34+
- '1840'
35+
Content-Type:
36+
- application/json
37+
User-Agent:
38+
- python-requests/2.32.3
39+
method: POST
40+
uri: https://ws.colissimo.fr/sls-ws/SlsServiceWSRest/2.0/checkGenerateLabel
41+
response:
42+
body:
43+
string: "{\"messages\":[{\"id\":\"30220\",\"type\":\"ERROR\",\"messageContent\":\"Le
44+
num\xE9ro de portable du destinataire n'a pas \xE9t\xE9 transmis\",\"replacementValues\":[]}]}"
45+
headers:
46+
Access-Control-Allow-Origin:
47+
- '*'
48+
Connection:
49+
- close
50+
Content-Type:
51+
- application/json;charset=UTF-8
52+
Date:
53+
- Tue, 17 Sep 2024 14:52:54 GMT
54+
P3P:
55+
- policyref="/w3c/p3p.xml", CP="NOI DSP COR NID CUR ADM DEV OUR BUS"
56+
Server:
57+
- Apache
58+
Transfer-Encoding:
59+
- chunked
60+
Vary:
61+
- User-Agent
62+
X-Robots-Tag:
63+
- noindex
64+
status:
65+
code: 400
66+
message: ''
67+
version: 1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
interactions:
2+
- request:
3+
body: '{"outputFormat": {"x": 0, "y": 0, "outputPrintingType": "PDF_10x15_300dpi",
4+
"dematerialized": false, "returnType": null, "printCoDDocument": false}, "letter":
5+
{"service": {"productCode": "BPR", "depositDate": "2025-01-01", "mailBoxPicking":
6+
false, "mailBoxPickingDate": null, "vatCode": null, "vatPercentage": null, "vatAmount":
7+
null, "transportationAmount": null, "totalAmount": null, "orderNumber": null,
8+
"commercialName": "Webu", "returnTypeChoice": null, "reseauPostal": null}, "parcel":
9+
{"pickupLocationId": "929750", "parcelNumber": null, "insuranceAmount": null,
10+
"insuranceValue": null, "recommendationLevel": null, "weight": 1.2, "nonMachinable":
11+
false, "returnReceipt": false, "instructions": null, "ftd": false, "ddp": false,
12+
"disabledDeliveryBlockingCode": null, "cod": false, "codamount": null, "codcurrency":
13+
null}, "sender": {"senderParcelRef": null, "address": {"companyName": null,
14+
"lastName": "Akretion", "firstName": null, "line0": "Batiment B", "line1": null,
15+
"line2": "27 rue Henri Rolland", "line3": null, "countryCode": "FR", "city":
16+
"Villeurbanne", "zipCode": "69100", "phoneNumber": null, "mobileNumber": "+33482538457",
17+
"doorCode1": null, "doorCode2": null, "intercom": null, "email": null, "language":
18+
"FR", "stateOrProvinceCode": null}}, "addressee": {"addresseeParcelRef": null,
19+
"codeBarForReference": null, "serviceInfo": null, "promotionCode": null, "address":
20+
{"companyName": null, "lastName": "Hugo", "firstName": "Victor", "line0": null,
21+
"line1": null, "line2": "6 Place des Vosges", "line3": null, "countryCode":
22+
"FR", "city": "Paris", "zipCode": "75004", "phoneNumber": "0123456789", "mobileNumber":
23+
null, "doorCode1": null, "doorCode2": null, "intercom": null, "email": "no-reply@webu.coop",
24+
"language": "FR", "stateOrProvinceCode": null}}, "codSenderAddress": null, "customsDeclarations":
25+
null}, "fields": null}'
26+
headers:
27+
Accept:
28+
- '*/*'
29+
Accept-Encoding:
30+
- gzip, deflate
31+
Connection:
32+
- keep-alive
33+
Content-Length:
34+
- '1848'
35+
Content-Type:
36+
- application/json
37+
User-Agent:
38+
- python-requests/2.32.3
39+
method: POST
40+
uri: https://ws.colissimo.fr/sls-ws/SlsServiceWSRest/2.0/checkGenerateLabel
41+
response:
42+
body:
43+
string: "{\"messages\":[{\"id\":\"30220\",\"type\":\"ERROR\",\"messageContent\":\"Le
44+
num\xE9ro de portable du destinataire n'a pas \xE9t\xE9 transmis\",\"replacementValues\":[]}]}"
45+
headers:
46+
Access-Control-Allow-Origin:
47+
- '*'
48+
Connection:
49+
- close
50+
Content-Type:
51+
- application/json;charset=UTF-8
52+
Date:
53+
- Tue, 17 Sep 2024 14:52:54 GMT
54+
P3P:
55+
- policyref="/w3c/p3p.xml", CP="NOI DSP COR NID CUR ADM DEV OUR BUS"
56+
Server:
57+
- Apache
58+
Transfer-Encoding:
59+
- chunked
60+
Vary:
61+
- User-Agent
62+
X-Robots-Tag:
63+
- noindex
64+
status:
65+
code: 400
66+
message: ''
67+
version: 1

‎roulier/carriers/colissimo_fr/tests/cassettes/test_colissimo/test_pickup_ok.yaml

+1,028
Large diffs are not rendered by default.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
# Copyright 2024 Akretion (http://www.akretion.com).
2+
# @author Florian Mounier <florian.mounier@akretion.com>
3+
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
4+
5+
6+
from ....tests.conftest import * # noqa
Binary file not shown.

‎roulier/carriers/colissimo_fr/tests/test_colissimo.py

+496
Large diffs are not rendered by default.

‎roulier/schema.py

+78-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
# Copyright 2024 Akretion (http://www.akretion.com).
22
# @author Florian Mounier <florian.mounier@akretion.com>
33
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
4-
from datetime import date
5-
from pydantic import BaseModel
4+
from datetime import date, datetime
5+
from pydantic import BaseModel, model_validator
66

77

88
class Auth(BaseModel):
@@ -107,3 +107,79 @@ class PickupSite(BaseModel):
107107

108108
class PickupSiteOutput(BaseModel):
109109
sites: list[PickupSite]
110+
111+
112+
class PackingSlipInput(BaseModel):
113+
auth: Auth
114+
packing_slip_number: str | None = None
115+
parcels_numbers: list[str] | None = None
116+
117+
@model_validator(mode="after")
118+
def check_only_one_parameter(self):
119+
if not self.packing_slip_number and not self.parcels_numbers:
120+
raise ValueError(
121+
"At least one of packing_slip_number or parcels_numbers is required"
122+
)
123+
124+
if self.packing_slip_number and self.parcels_numbers:
125+
raise ValueError(
126+
"Only one of packing_slip_number or parcels_numbers is allowed"
127+
)
128+
129+
return self
130+
131+
132+
class PackingSlipSupportSite(BaseModel):
133+
code: int
134+
name: str
135+
136+
137+
class PackingSlipClient(BaseModel):
138+
number: str
139+
address: str
140+
company: str | None = None
141+
142+
143+
class PackingSlip(BaseModel):
144+
number: int
145+
published_datetime: datetime
146+
number_of_parcels: int
147+
site_pch: PackingSlipSupportSite
148+
client: PackingSlipClient
149+
150+
151+
class PackingSlipOutput(BaseModel):
152+
packing_slip: PackingSlip
153+
annexes: list[Label] = []
154+
155+
156+
class DocumentService(BaseModel):
157+
parcel_number: str
158+
159+
160+
class GetDocumentsInput(BaseModel):
161+
auth: Auth
162+
service: DocumentService
163+
164+
165+
class GetDocumentService(DocumentService):
166+
document_id: str
167+
168+
169+
class GetDocumentInput(BaseModel):
170+
auth: Auth
171+
service: GetDocumentService
172+
173+
174+
class CreateUpdateDocumentService(DocumentService):
175+
document_type: str
176+
document_path: str
177+
178+
179+
class CreateUpdateDocumentInput(BaseModel):
180+
auth: Auth
181+
service: CreateUpdateDocumentService
182+
183+
184+
class DocumentOutput(BaseModel):
185+
pass

‎setup.py

+1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
# v2
2323
"pydantic",
2424
"zeep",
25+
"requests-toolbelt",
2526
],
2627
extras_requires={
2728
"dev": ["pytest", "pytest-recording"],

0 commit comments

Comments
 (0)
Please sign in to comment.