karrio-server-pricing 2025.5rc1__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 (77) hide show
  1. karrio/server/pricing/__init__.py +1 -0
  2. karrio/server/pricing/admin.py +55 -0
  3. karrio/server/pricing/apps.py +12 -0
  4. karrio/server/pricing/migrations/0001_initial.py +974 -0
  5. karrio/server/pricing/migrations/0002_auto_20201127_0721.py +855 -0
  6. karrio/server/pricing/migrations/0003_auto_20201230_0820.py +939 -0
  7. karrio/server/pricing/migrations/0004_auto_20201231_1402.py +940 -0
  8. karrio/server/pricing/migrations/0005_auto_20210204_1725.py +923 -0
  9. karrio/server/pricing/migrations/0006_auto_20210217_1109.py +1224 -0
  10. karrio/server/pricing/migrations/0007_auto_20210218_1202.py +955 -0
  11. karrio/server/pricing/migrations/0008_auto_20210418_0504.py +1010 -0
  12. karrio/server/pricing/migrations/0009_auto_20210603_2149.py +1043 -0
  13. karrio/server/pricing/migrations/0010_auto_20210612_1608.py +1070 -0
  14. karrio/server/pricing/migrations/0011_auto_20210615_1601.py +1109 -0
  15. karrio/server/pricing/migrations/0012_surcharge_carrier_accounts.py +23 -0
  16. karrio/server/pricing/migrations/0013_alter_surcharge_services.py +1086 -0
  17. karrio/server/pricing/migrations/0014_auto_20211013_1520.py +12 -0
  18. karrio/server/pricing/migrations/0015_auto_20211204_1350.py +1124 -0
  19. karrio/server/pricing/migrations/0016_auto_20211220_1500.py +1126 -0
  20. karrio/server/pricing/migrations/0017_alter_surcharge_services.py +1093 -0
  21. karrio/server/pricing/migrations/0018_alter_surcharge_services.py +1100 -0
  22. karrio/server/pricing/migrations/0019_alter_surcharge_services.py +1093 -0
  23. karrio/server/pricing/migrations/0020_auto_20220412_1215.py +3175 -0
  24. karrio/server/pricing/migrations/0021_auto_20220413_0959.py +3179 -0
  25. karrio/server/pricing/migrations/0022_alter_surcharge_services.py +3144 -0
  26. karrio/server/pricing/migrations/0023_auto_20220504_1335.py +3175 -0
  27. karrio/server/pricing/migrations/0024_auto_20220808_0803.py +3180 -0
  28. karrio/server/pricing/migrations/0025_alter_surcharge_carriers.py +51 -0
  29. karrio/server/pricing/migrations/0026_auto_20220828_0158.py +3199 -0
  30. karrio/server/pricing/migrations/0027_alter_surcharge_services.py +3170 -0
  31. karrio/server/pricing/migrations/0028_surcharge_markup_carriers_surcharge_markup_services.py +3016 -0
  32. karrio/server/pricing/migrations/0029_alter_surcharge_services.py +2939 -0
  33. karrio/server/pricing/migrations/0030_alter_surcharge_services.py +2940 -0
  34. karrio/server/pricing/migrations/0031_alter_surcharge_carriers.py +52 -0
  35. karrio/server/pricing/migrations/0032_alter_surcharge_services.py +2963 -0
  36. karrio/server/pricing/migrations/0033_alter_surcharge_services.py +2964 -0
  37. karrio/server/pricing/migrations/0034_alter_surcharge_carriers_alter_surcharge_services.py +3009 -0
  38. karrio/server/pricing/migrations/0035_alter_surcharge_carriers.py +56 -0
  39. karrio/server/pricing/migrations/0036_alter_surcharge_carriers_alter_surcharge_services.py +3022 -0
  40. karrio/server/pricing/migrations/0037_alter_surcharge_carriers_alter_surcharge_services.py +3078 -0
  41. karrio/server/pricing/migrations/0038_alter_surcharge_carriers_alter_surcharge_services.py +3093 -0
  42. karrio/server/pricing/migrations/0039_alter_surcharge_carriers_alter_surcharge_services.py +3095 -0
  43. karrio/server/pricing/migrations/0040_alter_surcharge_services.py +3058 -0
  44. karrio/server/pricing/migrations/0041_alter_surcharge_services.py +3061 -0
  45. karrio/server/pricing/migrations/0042_alter_surcharge_carriers_alter_surcharge_services.py +3128 -0
  46. karrio/server/pricing/migrations/0043_alter_surcharge_services.py +3090 -0
  47. karrio/server/pricing/migrations/0044_alter_surcharge_carriers.py +62 -0
  48. karrio/server/pricing/migrations/0045_alter_surcharge_carriers.py +63 -0
  49. karrio/server/pricing/migrations/0046_alter_surcharge_services.py +3100 -0
  50. karrio/server/pricing/migrations/0047_alter_surcharge_services.py +3171 -0
  51. karrio/server/pricing/migrations/0048_alter_surcharge_services.py +3195 -0
  52. karrio/server/pricing/migrations/0049_alter_surcharge_carriers_alter_surcharge_services.py +3246 -0
  53. karrio/server/pricing/migrations/0050_alter_surcharge_carriers.py +64 -0
  54. karrio/server/pricing/migrations/0051_alter_surcharge_carriers_alter_surcharge_services.py +2956 -0
  55. karrio/server/pricing/migrations/0052_alter_surcharge_carriers_alter_surcharge_services.py +3547 -0
  56. karrio/server/pricing/migrations/0053_alter_surcharge_carriers_alter_surcharge_services.py +3561 -0
  57. karrio/server/pricing/migrations/0054_alter_surcharge_services.py +3409 -0
  58. karrio/server/pricing/migrations/0055_alter_surcharge_services.py +3455 -0
  59. karrio/server/pricing/migrations/0056_alter_surcharge_carriers_alter_surcharge_services.py +3609 -0
  60. karrio/server/pricing/migrations/0057_alter_surcharge_carriers_alter_surcharge_services.py +4384 -0
  61. karrio/server/pricing/migrations/0058_alter_surcharge_services.py +4321 -0
  62. karrio/server/pricing/migrations/0059_alter_surcharge_carriers_alter_surcharge_services.py +4892 -0
  63. karrio/server/pricing/migrations/0060_alter_surcharge_services.py +4894 -0
  64. karrio/server/pricing/migrations/0061_alter_surcharge_services.py +4888 -0
  65. karrio/server/pricing/migrations/0062_alter_surcharge_carriers_alter_surcharge_services.py +4704 -0
  66. karrio/server/pricing/migrations/0063_alter_surcharge_carriers_alter_surcharge_services.py +34 -0
  67. karrio/server/pricing/migrations/0064_alter_surcharge_carriers_alter_surcharge_services.py +4669 -0
  68. karrio/server/pricing/migrations/__init__.py +0 -0
  69. karrio/server/pricing/models.py +143 -0
  70. karrio/server/pricing/serializers.py +18 -0
  71. karrio/server/pricing/signals.py +35 -0
  72. karrio/server/pricing/tests.py +301 -0
  73. karrio/server/pricing/views.py +3 -0
  74. karrio_server_pricing-2025.5rc1.dist-info/METADATA +27 -0
  75. karrio_server_pricing-2025.5rc1.dist-info/RECORD +77 -0
  76. karrio_server_pricing-2025.5rc1.dist-info/WHEEL +5 -0
  77. karrio_server_pricing-2025.5rc1.dist-info/top_level.txt +2 -0
File without changes
@@ -0,0 +1,143 @@
1
+ import typing
2
+ import logging
3
+ import functools
4
+ import django.db.models as models
5
+ import django.core.validators as validators
6
+
7
+ import karrio.lib as lib
8
+ import karrio.core.models as karrio
9
+ import karrio.server.core.models as core
10
+ import karrio.server.core.fields as fields
11
+ import karrio.server.core.datatypes as datatypes
12
+ import karrio.server.providers.models as providers
13
+ import karrio.server.pricing.serializers as serializers
14
+
15
+ logger = logging.getLogger(__name__)
16
+
17
+
18
+ @core.register_model
19
+ class Surcharge(core.Entity):
20
+ class Meta:
21
+ db_table = "surcharge"
22
+ verbose_name = "Markup"
23
+ verbose_name_plural = "Markups"
24
+
25
+ id = models.CharField(
26
+ max_length=50,
27
+ primary_key=True,
28
+ default=functools.partial(core.uuid, prefix="chrg_"),
29
+ editable=False,
30
+ )
31
+ active = models.BooleanField(default=True)
32
+
33
+ name = models.CharField(
34
+ max_length=100,
35
+ unique=True,
36
+ help_text="The surcharge name (label) that will appear in the rate (quote)",
37
+ )
38
+ amount = models.FloatField(
39
+ validators=[validators.MinValueValidator(0.1)],
40
+ default=0.0,
41
+ help_text="""
42
+ The surcharge amount or percentage to add to the quote
43
+ """,
44
+ )
45
+ surcharge_type = models.CharField(
46
+ max_length=25,
47
+ choices=serializers.SURCHAGE_TYPE,
48
+ default=serializers.SURCHAGE_TYPE[0][0],
49
+ help_text="""
50
+ Determine whether the surcharge is in percentage or net amount
51
+ <br/><br/>
52
+ For <strong>AMOUNT</strong>: rate ($22) and amount (1) will result in a new total_charge of ($23)
53
+ <br/>
54
+ For <strong>PERCENTAGE</strong>: rate ($22) and amount (5) will result in a new total_charge of ($23.10)
55
+ """,
56
+ )
57
+ carriers = fields.MultiChoiceField(
58
+ choices=serializers.CARRIERS,
59
+ null=True,
60
+ blank=True,
61
+ help_text="""
62
+ The list of carriers you want to apply the surcharge to.
63
+ <br/>
64
+ Note that by default, the surcharge is applied to all carriers
65
+ """,
66
+ )
67
+ carrier_accounts = models.ManyToManyField(
68
+ providers.Carrier,
69
+ blank=True,
70
+ help_text="""
71
+ The list of carrier accounts you want to apply the surcharge to.
72
+ <br/>
73
+ Note that by default, the surcharge is applied to all carrier accounts
74
+ """,
75
+ )
76
+ services = fields.MultiChoiceField(
77
+ choices=serializers.SERVICES,
78
+ null=True,
79
+ blank=True,
80
+ help_text="""
81
+ The list of services you want to apply the surcharge to.
82
+ <br/>
83
+ Note that by default, the surcharge is applied to all services
84
+ """,
85
+ )
86
+
87
+ @property
88
+ def object_type(self):
89
+ return "surcharge"
90
+
91
+ def __str__(self):
92
+ type_ = "$" if self.surcharge_type == "AMOUNT" else "%"
93
+ return f"{self.id} ({self.amount} {type_})"
94
+
95
+ def apply_charge(self, response: datatypes.RateResponse) -> datatypes.RateResponse:
96
+ def apply(rate: datatypes.Rate) -> datatypes.Rate:
97
+ applicable = []
98
+ carrier_ids = [c.carrier_id for c in self.carrier_accounts.all()]
99
+ charges = getattr(rate, "extra_charges", None) or []
100
+
101
+ if any(self.carriers or []):
102
+ applicable.append(rate.carrier_name in self.carriers)
103
+
104
+ if any(carrier_ids):
105
+ applicable.append(rate.carrier_id in carrier_ids)
106
+
107
+ if any(self.services or []):
108
+ applicable.append(rate.service in self.services)
109
+
110
+ if any(applicable) and all(applicable):
111
+ logger.debug("applying broker surcharge to rate")
112
+
113
+ amount = lib.to_decimal(
114
+ self.amount
115
+ if self.surcharge_type == "AMOUNT"
116
+ else (rate.total_charge * (typing.cast(float, self.amount) / 100))
117
+ )
118
+ total_charge = lib.to_decimal(rate.total_charge + amount)
119
+ extra_charges = rate.extra_charges + [
120
+ karrio.ChargeDetails(
121
+ name=typing.cast(str, self.name),
122
+ amount=amount,
123
+ currency=rate.currency,
124
+ )
125
+ ]
126
+
127
+ return datatypes.Rate(
128
+ **{
129
+ **lib.to_dict(rate),
130
+ "total_charge": total_charge,
131
+ "extra_charges": extra_charges,
132
+ }
133
+ )
134
+
135
+ return rate
136
+
137
+ return datatypes.RateResponse(
138
+ messages=response.messages,
139
+ rates=sorted(
140
+ [apply(rate) for rate in response.rates],
141
+ key=lambda rate: rate.total_charge,
142
+ ),
143
+ )
@@ -0,0 +1,18 @@
1
+ import enum
2
+ import karrio.server.core.dataunits as dataunits
3
+ from karrio.server.core.serializers import (
4
+ CARRIERS,
5
+ )
6
+
7
+
8
+ class SurchargeType(enum.Enum):
9
+ AMOUNT = "$"
10
+ PERCENTAGE = "%"
11
+
12
+
13
+ CARRIER_SERVICES = [
14
+ dataunits.REFERENCE_MODELS["services"][name]
15
+ for name in sorted(dataunits.REFERENCE_MODELS["services"].keys())
16
+ ]
17
+ SERVICES = [(code, code) for services in CARRIER_SERVICES for code in services]
18
+ SURCHAGE_TYPE = [(c.name, c.value) for c in list(SurchargeType)]
@@ -0,0 +1,35 @@
1
+ import logging
2
+ import functools
3
+ import importlib
4
+ from django.db.models import Q
5
+
6
+ from karrio.server.serializers import Context
7
+ from karrio.server.core.gateway import Rates
8
+ import karrio.server.pricing.models as models
9
+
10
+ logger = logging.getLogger(__name__)
11
+
12
+
13
+ def register_rate_post_processing(*args, **kwargs):
14
+ Rates.post_process_functions += [apply_custom_surcharges]
15
+ logger.info("karrio.pricing signals registered...")
16
+
17
+
18
+ def apply_custom_surcharges(context: Context, result):
19
+ _filters = tuple()
20
+
21
+ if importlib.util.find_spec("karrio.server.orgs") is not None:
22
+ _filters += (
23
+ Q(active=True, org__id=getattr(context.org, "id", None))
24
+ | Q(active=True, org=None),
25
+ )
26
+ else:
27
+ _filters += (Q(active=True),)
28
+
29
+ charges = models.Surcharge.objects.filter(*_filters)
30
+
31
+ return functools.reduce(
32
+ lambda cummulated_result, charge: charge.apply_charge(cummulated_result),
33
+ charges,
34
+ result,
35
+ )
@@ -0,0 +1,301 @@
1
+ import json
2
+ import logging
3
+ from unittest.mock import patch, ANY
4
+ from django.urls import reverse
5
+ from rest_framework import status
6
+ from karrio.core.models import RateDetails, ChargeDetails
7
+ from karrio.server.core.tests import APITestCase
8
+ import karrio.server.pricing.models as models
9
+
10
+ logging.disable(logging.CRITICAL)
11
+
12
+
13
+ class TestPricing(APITestCase):
14
+ def setUp(self) -> None:
15
+ super().setUp()
16
+
17
+ self.charge: models.Surcharge = models.Surcharge.objects.create(
18
+ **{
19
+ "amount": 1.0,
20
+ "name": "brokerage",
21
+ "carriers": ["canadapost"],
22
+ "services": ["canadapost_priority", "canadapost_regular_parcel"],
23
+ }
24
+ )
25
+
26
+ def test_apply_surcharge_amount_to_shipment_rates(self):
27
+ url = reverse("karrio.server.proxy:shipment-rates")
28
+ data = RATING_DATA
29
+
30
+ with patch("karrio.server.core.gateway.utils.identity") as mock:
31
+ mock.return_value = RETURNED_VALUE
32
+ response = self.client.post(f"{url}", data)
33
+ response_data = json.loads(response.content)
34
+
35
+ self.assertEqual(response.status_code, status.HTTP_200_OK)
36
+ self.assertDictEqual(response_data, RATING_RESPONSE)
37
+
38
+ def test_apply_surcharge_percentage_to_shipment_rates(self):
39
+ self.charge.amount = 2.0
40
+ self.charge.surcharge_type = "PERCENTAGE"
41
+ self.charge.save()
42
+ url = reverse("karrio.server.proxy:shipment-rates")
43
+ data = RATING_DATA
44
+
45
+ with patch("karrio.server.core.gateway.utils.identity") as mock:
46
+ mock.return_value = RETURNED_VALUE
47
+ response = self.client.post(f"{url}", data)
48
+ response_data = json.loads(response.content)
49
+
50
+ self.assertEqual(response.status_code, status.HTTP_200_OK)
51
+ self.assertDictEqual(response_data, RATING_WITH_PERCENTAGE_RESPONSE)
52
+
53
+
54
+ RATING_DATA = {
55
+ "shipper": {
56
+ "postal_code": "V6M2V9",
57
+ "city": "Vancouver",
58
+ "country_code": "CA",
59
+ "state_code": "BC",
60
+ "residential": True,
61
+ "address_line1": "5840 Oak St",
62
+ },
63
+ "recipient": {
64
+ "postal_code": "E1C4Z8",
65
+ "city": "Moncton",
66
+ "country_code": "CA",
67
+ "state_code": "NB",
68
+ "residential": False,
69
+ "address_line1": "125 Church St",
70
+ },
71
+ "parcels": [
72
+ {
73
+ "weight": 1,
74
+ "weight_unit": "KG",
75
+ "packagePreset": "canadapost_corrugated_small_box",
76
+ }
77
+ ],
78
+ "services": [],
79
+ "carrier_ids": ["canadapost"],
80
+ }
81
+
82
+ RETURNED_VALUE = (
83
+ [
84
+ RateDetails(
85
+ carrier_id="canadapost",
86
+ carrier_name="canadapost",
87
+ currency="CAD",
88
+ transit_days=7,
89
+ service="canadapost_expedited_parcel",
90
+ total_charge=32.99,
91
+ extra_charges=[
92
+ ChargeDetails(amount=29.64, currency="CAD", name="Base charge"),
93
+ ChargeDetails(amount=1.24, currency="CAD", name="Fuel surcharge"),
94
+ ChargeDetails(amount=-2.19, currency="CAD", name="SMB Savings"),
95
+ ChargeDetails(amount=4.3, currency="CAD", name="Duty and taxes"),
96
+ ChargeDetails(amount=-0.95, currency="CAD", name="Discount"),
97
+ ],
98
+ ),
99
+ RateDetails(
100
+ carrier_id="canadapost",
101
+ carrier_name="canadapost",
102
+ currency="CAD",
103
+ transit_days=2,
104
+ service="canadapost_xpresspost",
105
+ total_charge=85.65,
106
+ extra_charges=[
107
+ ChargeDetails(amount=75.82, currency="CAD", name="Base charge"),
108
+ ChargeDetails(amount=3.21, currency="CAD", name="Fuel surcharge"),
109
+ ChargeDetails(amount=-4.55, currency="CAD", name="SMB Savings"),
110
+ ChargeDetails(amount=4.3, currency="CAD", name="Duty and taxes"),
111
+ ChargeDetails(amount=11.17, currency="CAD", name="Discount"),
112
+ ],
113
+ ),
114
+ RateDetails(
115
+ carrier_id="canadapost",
116
+ carrier_name="canadapost",
117
+ currency="CAD",
118
+ transit_days=2,
119
+ service="canadapost_priority",
120
+ total_charge=113.93,
121
+ extra_charges=[
122
+ ChargeDetails(amount=101.83, currency="CAD", name="Base charge"),
123
+ ChargeDetails(amount=4.27, currency="CAD", name="Fuel surcharge"),
124
+ ChargeDetails(amount=-7.03, currency="CAD", name="SMB Savings"),
125
+ ChargeDetails(amount=14.86, currency="CAD", name="Duties and taxes"),
126
+ ChargeDetails(amount=-2.76, currency="CAD", name="Discount"),
127
+ ],
128
+ ),
129
+ ],
130
+ [],
131
+ )
132
+
133
+ RATING_RESPONSE = {
134
+ "messages": [],
135
+ "rates": [
136
+ {
137
+ "id": ANY,
138
+ "object_type": "rate",
139
+ "carrier_name": "canadapost",
140
+ "carrier_id": "canadapost",
141
+ "currency": "CAD",
142
+ "estimated_delivery": ANY,
143
+ "service": "canadapost_expedited_parcel",
144
+ "total_charge": 32.99,
145
+ "transit_days": 7,
146
+ "extra_charges": [
147
+ {"name": "Base charge", "amount": 29.64, "currency": "CAD"},
148
+ {"name": "Fuel surcharge", "amount": 1.24, "currency": "CAD"},
149
+ {"name": "SMB Savings", "amount": -2.19, "currency": "CAD"},
150
+ {"name": "Duty and taxes", "amount": 4.3, "currency": "CAD"},
151
+ {"name": "Discount", "amount": -0.95, "currency": "CAD"},
152
+ ],
153
+ "meta": {
154
+ "ext": "canadapost",
155
+ "carrier": "canadapost",
156
+ "rate_provider": "canadapost",
157
+ "service_name": "CANADAPOST EXPEDITED PARCEL",
158
+ "carrier_connection_id": ANY,
159
+ },
160
+ "test_mode": True,
161
+ },
162
+ {
163
+ "id": ANY,
164
+ "object_type": "rate",
165
+ "carrier_name": "canadapost",
166
+ "carrier_id": "canadapost",
167
+ "currency": "CAD",
168
+ "estimated_delivery": ANY,
169
+ "service": "canadapost_xpresspost",
170
+ "total_charge": 85.65,
171
+ "transit_days": 2,
172
+ "extra_charges": [
173
+ {"name": "Base charge", "amount": 75.82, "currency": "CAD"},
174
+ {"name": "Fuel surcharge", "amount": 3.21, "currency": "CAD"},
175
+ {"name": "SMB Savings", "amount": -4.55, "currency": "CAD"},
176
+ {"name": "Duty and taxes", "amount": 4.3, "currency": "CAD"},
177
+ {"name": "Discount", "amount": 11.17, "currency": "CAD"},
178
+ ],
179
+ "meta": {
180
+ "ext": "canadapost",
181
+ "carrier": "canadapost",
182
+ "rate_provider": "canadapost",
183
+ "service_name": "CANADAPOST XPRESSPOST",
184
+ "carrier_connection_id": ANY,
185
+ },
186
+ "test_mode": True,
187
+ },
188
+ {
189
+ "id": ANY,
190
+ "object_type": "rate",
191
+ "carrier_name": "canadapost",
192
+ "carrier_id": "canadapost",
193
+ "currency": "CAD",
194
+ "estimated_delivery": ANY,
195
+ "service": "canadapost_priority",
196
+ "total_charge": 114.93,
197
+ "transit_days": 2,
198
+ "extra_charges": [
199
+ {"name": "Base charge", "amount": 101.83, "currency": "CAD"},
200
+ {"name": "Fuel surcharge", "amount": 4.27, "currency": "CAD"},
201
+ {"name": "SMB Savings", "amount": -7.03, "currency": "CAD"},
202
+ {"name": "Duties and taxes", "amount": 14.86, "currency": "CAD"},
203
+ {"name": "Discount", "amount": -2.76, "currency": "CAD"},
204
+ {"name": "brokerage", "amount": 1.0, "currency": "CAD"},
205
+ ],
206
+ "meta": {
207
+ "ext": "canadapost",
208
+ "carrier": "canadapost",
209
+ "carrier_connection_id": ANY,
210
+ "rate_provider": "canadapost",
211
+ "service_name": "CANADAPOST PRIORITY",
212
+ },
213
+ "test_mode": True,
214
+ },
215
+ ],
216
+ }
217
+
218
+ RATING_WITH_PERCENTAGE_RESPONSE = {
219
+ "messages": [],
220
+ "rates": [
221
+ {
222
+ "id": ANY,
223
+ "object_type": "rate",
224
+ "carrier_name": "canadapost",
225
+ "carrier_id": "canadapost",
226
+ "currency": "CAD",
227
+ "estimated_delivery": ANY,
228
+ "service": "canadapost_expedited_parcel",
229
+ "total_charge": 32.99,
230
+ "transit_days": 7,
231
+ "extra_charges": [
232
+ {"name": "Base charge", "amount": 29.64, "currency": "CAD"},
233
+ {"name": "Fuel surcharge", "amount": 1.24, "currency": "CAD"},
234
+ {"name": "SMB Savings", "amount": -2.19, "currency": "CAD"},
235
+ {"name": "Duty and taxes", "amount": 4.3, "currency": "CAD"},
236
+ {"name": "Discount", "amount": -0.95, "currency": "CAD"},
237
+ ],
238
+ "meta": {
239
+ "ext": "canadapost",
240
+ "carrier": "canadapost",
241
+ "rate_provider": "canadapost",
242
+ "service_name": "CANADAPOST EXPEDITED PARCEL",
243
+ "carrier_connection_id": ANY,
244
+ },
245
+ "test_mode": True,
246
+ },
247
+ {
248
+ "id": ANY,
249
+ "object_type": "rate",
250
+ "carrier_name": "canadapost",
251
+ "carrier_id": "canadapost",
252
+ "currency": "CAD",
253
+ "estimated_delivery": ANY,
254
+ "service": "canadapost_xpresspost",
255
+ "total_charge": 85.65,
256
+ "transit_days": 2,
257
+ "extra_charges": [
258
+ {"name": "Base charge", "amount": 75.82, "currency": "CAD"},
259
+ {"name": "Fuel surcharge", "amount": 3.21, "currency": "CAD"},
260
+ {"name": "SMB Savings", "amount": -4.55, "currency": "CAD"},
261
+ {"name": "Duty and taxes", "amount": 4.3, "currency": "CAD"},
262
+ {"name": "Discount", "amount": 11.17, "currency": "CAD"},
263
+ ],
264
+ "meta": {
265
+ "ext": "canadapost",
266
+ "carrier": "canadapost",
267
+ "rate_provider": "canadapost",
268
+ "service_name": "CANADAPOST XPRESSPOST",
269
+ "carrier_connection_id": ANY,
270
+ },
271
+ "test_mode": True,
272
+ },
273
+ {
274
+ "id": ANY,
275
+ "object_type": "rate",
276
+ "carrier_name": "canadapost",
277
+ "carrier_id": "canadapost",
278
+ "currency": "CAD",
279
+ "estimated_delivery": ANY,
280
+ "service": "canadapost_priority",
281
+ "total_charge": 116.21,
282
+ "transit_days": 2,
283
+ "extra_charges": [
284
+ {"name": "Base charge", "amount": 101.83, "currency": "CAD"},
285
+ {"name": "Fuel surcharge", "amount": 4.27, "currency": "CAD"},
286
+ {"name": "SMB Savings", "amount": -7.03, "currency": "CAD"},
287
+ {"name": "Duties and taxes", "amount": 14.86, "currency": "CAD"},
288
+ {"name": "Discount", "amount": -2.76, "currency": "CAD"},
289
+ {"name": "brokerage", "amount": 2.28, "currency": "CAD"},
290
+ ],
291
+ "meta": {
292
+ "ext": "canadapost",
293
+ "carrier": "canadapost",
294
+ "carrier_connection_id": ANY,
295
+ "rate_provider": "canadapost",
296
+ "service_name": "CANADAPOST PRIORITY",
297
+ },
298
+ "test_mode": True,
299
+ },
300
+ ],
301
+ }
@@ -0,0 +1,3 @@
1
+ from django.shortcuts import render
2
+
3
+ # Create your views here.
@@ -0,0 +1,27 @@
1
+ Metadata-Version: 2.4
2
+ Name: karrio_server_pricing
3
+ Version: 2025.5rc1
4
+ Summary: Multi-carrier shipping API Pricing panel
5
+ Author-email: karrio <hello@karrio.io>
6
+ License-Expression: Apache-2.0
7
+ Project-URL: Homepage, https://github.com/karrioapi/karrio
8
+ Classifier: Programming Language :: Python :: 3
9
+ Requires-Python: >=3.11
10
+ Description-Content-Type: text/markdown
11
+ Requires-Dist: karrio_server_core
12
+
13
+ # karrio.server.pricing
14
+
15
+ This package is a module of the [karrio](https://pypi.org/project/karrio.server) universal shipping API.
16
+
17
+ ## Requirements
18
+
19
+ `Python 3.11+`
20
+
21
+ ## Installation
22
+
23
+ ```bash
24
+ pip install karrio.server.pricing
25
+ ```
26
+
27
+ Check the [karrio docs](https://docs.karrio.io) to get started.
@@ -0,0 +1,77 @@
1
+ karrio/server/pricing/__init__.py,sha256=zXpxAFuHsCdAaESYGLRvdqCs7CXtIn8cF688jV4ufQc,64
2
+ karrio/server/pricing/admin.py,sha256=FPLSutMYkKF-fGWGeKQmfJLO5UAB8wRABhhVS9lAckE,1683
3
+ karrio/server/pricing/apps.py,sha256=n9qkGVkmU1gTCLc7WR3iGaPWwW9NtaVFGR2xvBSMvA4,341
4
+ karrio/server/pricing/models.py,sha256=_P-SQu9oE-VWfYNnOeU0KSbTJ-lKz1IKdP8DYgfRsrQ,4747
5
+ karrio/server/pricing/serializers.py,sha256=fVpgHpzPsmgOclqRY-adOodsjh7EEPikEcLe3MPisu8,483
6
+ karrio/server/pricing/signals.py,sha256=lCcmGN67crZZLQRQ24y7-C_K0JDYBaYq1sYocyMaeGw,974
7
+ karrio/server/pricing/tests.py,sha256=N--C29tL04fLzzJr1hATxWH-6Yp_H68_rys1Xx_oVKI,11426
8
+ karrio/server/pricing/views.py,sha256=xc1IQHrsij7j33TUbo-_oewy3vs03pw_etpBWaMYJl0,63
9
+ karrio/server/pricing/migrations/0001_initial.py,sha256=KKEklxf8Q1-IQn-8ZchbCi3-zmIyjn80DaGqPgRRI5w,52327
10
+ karrio/server/pricing/migrations/0002_auto_20201127_0721.py,sha256=zhiRIHjyUhwH8Mw2qljkWO1wkZPftqAJpwh6QH5oO2o,41778
11
+ karrio/server/pricing/migrations/0003_auto_20201230_0820.py,sha256=kMNkaoyh9cU3NGair6skjZbsSz3l1D6ayOktAx_Bl1E,45681
12
+ karrio/server/pricing/migrations/0004_auto_20201231_1402.py,sha256=ZNAxHcSesa99D9g0FbpAFUHHEyQGoRq_uCszkr5MVoI,45757
13
+ karrio/server/pricing/migrations/0005_auto_20210204_1725.py,sha256=7LgIz8FzdLobYcbjL9rJrS7rqmuj-iRSzbnAaLz7j5U,45099
14
+ karrio/server/pricing/migrations/0006_auto_20210217_1109.py,sha256=JK5EvuY7Jj7V9x2VXzGlZ8AuRQdcFp5RenVI36RNxTQ,62858
15
+ karrio/server/pricing/migrations/0007_auto_20210218_1202.py,sha256=mZnDAyV0jJ9V4pLF1clCt9wMBiUnOW0X013TnZdTXtc,46733
16
+ karrio/server/pricing/migrations/0008_auto_20210418_0504.py,sha256=pm3el6Czf1oYhx6ojB8GvHxOqFUTTrDMWBfigUzGhY0,49307
17
+ karrio/server/pricing/migrations/0009_auto_20210603_2149.py,sha256=NNqKQZnws-R5Nx0Vp0U1XvHSRuKJjKpyIs5cyG9URso,51018
18
+ karrio/server/pricing/migrations/0010_auto_20210612_1608.py,sha256=aPJcZ0ERxP4SwQSykdUGytKMn0cNIz6mJJ6A0I1aDTU,52320
19
+ karrio/server/pricing/migrations/0011_auto_20210615_1601.py,sha256=mxuZpIjBTMcIm4kFK8D-B_7NwfDXXIeKB9dxXvLYFxw,53521
20
+ karrio/server/pricing/migrations/0012_surcharge_carrier_accounts.py,sha256=fdy1TJJC1opvLHEaes5qS4yS028jr1gpbRwUtW67sVg,746
21
+ karrio/server/pricing/migrations/0013_alter_surcharge_services.py,sha256=nzzQL8Q9B9VRX1KxNk-S0uPjKr9BXSgzfg8IpENBaa0,52446
22
+ karrio/server/pricing/migrations/0014_auto_20211013_1520.py,sha256=nbzfDzAT00yV7nKoTs5aV6d6Wk_rFrhc8WjYQ_cS6j0,226
23
+ karrio/server/pricing/migrations/0015_auto_20211204_1350.py,sha256=R97KwAB3IqyxaLTAMQsrT5Ndtk6zXVvW83pn4t6s7x0,54281
24
+ karrio/server/pricing/migrations/0016_auto_20211220_1500.py,sha256=sEB4FXsq5bWeIlagGYZrD-k_SwKTYQAjcbRFQB4qNfQ,54387
25
+ karrio/server/pricing/migrations/0017_alter_surcharge_services.py,sha256=0CiEmBoBooXB3A_uMKPsgPeTmPyApXYI9Tih-csfxIo,52887
26
+ karrio/server/pricing/migrations/0018_alter_surcharge_services.py,sha256=tnShmI3EUqYcuc_qz2SupJZdNEPjx6ZwC3Lq0i8qB_o,53256
27
+ karrio/server/pricing/migrations/0019_alter_surcharge_services.py,sha256=pmFufv-mTxwyHik-o1UPb5zwgSOnR6iziyfaTDCPKYo,52893
28
+ karrio/server/pricing/migrations/0020_auto_20220412_1215.py,sha256=NX4zaUn3LO_JSeG71V6hW0arLs6iPoIk15MHBqH3qsI,148724
29
+ karrio/server/pricing/migrations/0021_auto_20220413_0959.py,sha256=s6Aa5d_JPfW0EnhR8orqesEG0oxnbR6qvZSzxuWZBmY,148996
30
+ karrio/server/pricing/migrations/0022_alter_surcharge_services.py,sha256=xYT-lXPpWy5GuKBPN50fl_jNmXZ_4S8KkZbHRZeezRc,147327
31
+ karrio/server/pricing/migrations/0023_auto_20220504_1335.py,sha256=QZ4cu3ZkAe7osAq63GIkuvvfVYjrYi2H3_rhT11heCk,148652
32
+ karrio/server/pricing/migrations/0024_auto_20220808_0803.py,sha256=BKRvV7XAbDF6krnvQ7paHFmWnjCBHTizdlK7D34LkjI,148964
33
+ karrio/server/pricing/migrations/0025_alter_surcharge_carriers.py,sha256=xdbs4YjH0JMTlVG8X1Bk4Ge7Zwa8Oy2t-A5PlZH9ZzY,1956
34
+ karrio/server/pricing/migrations/0026_auto_20220828_0158.py,sha256=9HQrd1Rn2_UpOciXQpEdUuXQ0PCs0rIIS7Sugmy_QpY,149879
35
+ karrio/server/pricing/migrations/0027_alter_surcharge_services.py,sha256=3RdA8DfSM-IIP1fN16oTW2EERNm404mrTPvu1rn5F6M,148613
36
+ karrio/server/pricing/migrations/0028_surcharge_markup_carriers_surcharge_markup_services.py,sha256=ROgSx45w2OQUNZGCt3hJJ_beLW_cdDFcOAlSR-bJrtY,146271
37
+ karrio/server/pricing/migrations/0029_alter_surcharge_services.py,sha256=XpVrqiMLQCCu4ypS0VYtsmzx7t2doXwlqWWG8ehG588,143815
38
+ karrio/server/pricing/migrations/0030_alter_surcharge_services.py,sha256=5lJDxemu6bIqjmGnl3wDNlRJEtvqRd2s2KSfTCg6Fec,143844
39
+ karrio/server/pricing/migrations/0031_alter_surcharge_carriers.py,sha256=Bpxcg8XThUWnFzFyNhnCqq9fKE6-lXm-fm-3benFuDY,2038
40
+ karrio/server/pricing/migrations/0032_alter_surcharge_services.py,sha256=F1wDXYEWVAou7oEf3UP8JP5-PN-715K2hTV4ZbLVgG8,145524
41
+ karrio/server/pricing/migrations/0033_alter_surcharge_services.py,sha256=-LHjLXjRDZ1gYKGypoMnHDEB5cYfvNlo5no8aNS8wYQ,145580
42
+ karrio/server/pricing/migrations/0034_alter_surcharge_carriers_alter_surcharge_services.py,sha256=SWYcOsmN47OW0A9aOyR8V7-WNxHyOcO05u5owjjVKyI,147914
43
+ karrio/server/pricing/migrations/0035_alter_surcharge_carriers.py,sha256=IijC_yrpPbjSAFPsIrhSCeRgSzi0Ror2ei8x0MsQxrk,2233
44
+ karrio/server/pricing/migrations/0036_alter_surcharge_carriers_alter_surcharge_services.py,sha256=xtTJwtp_Ljdx_YIur9mMvAboLdWd2BQT38BqxI4L0fs,148634
45
+ karrio/server/pricing/migrations/0037_alter_surcharge_carriers_alter_surcharge_services.py,sha256=uTRNe7tZyU32nWEZV2FWpz31OHi35lDngmWMvfD7UUs,151384
46
+ karrio/server/pricing/migrations/0038_alter_surcharge_carriers_alter_surcharge_services.py,sha256=a_52GCbwa5mhjOs7e-y2IbdjP3prjaopN47bo3Np7sk,152312
47
+ karrio/server/pricing/migrations/0039_alter_surcharge_carriers_alter_surcharge_services.py,sha256=zYsW0JtAlLKA1YvABr3TFe2mUXqtUxdw1aYcRUlSLf8,152430
48
+ karrio/server/pricing/migrations/0040_alter_surcharge_services.py,sha256=UXvPyfF486KCKaNZcJHKSrtfxL5xE2D71gtk1OSzGhs,150737
49
+ karrio/server/pricing/migrations/0041_alter_surcharge_services.py,sha256=5ApErjbW3Cx5A_x612jgQ0a8TNDUDCBev84sRnoLaAo,150934
50
+ karrio/server/pricing/migrations/0042_alter_surcharge_carriers_alter_surcharge_services.py,sha256=fobTqTuCQHAlSgUrkope129c-cITWGonZM93np2HwLA,154113
51
+ karrio/server/pricing/migrations/0043_alter_surcharge_services.py,sha256=oIpse1UGWfoa75G2fxIARhi1jrjkE7vQ-aG_Dwu0Kzs,152421
52
+ karrio/server/pricing/migrations/0044_alter_surcharge_carriers.py,sha256=z4hPheZWQcyHMZVnsRrpFsQ7j3LTiT402F_klhdQsOM,2494
53
+ karrio/server/pricing/migrations/0045_alter_surcharge_carriers.py,sha256=gITu034u2bI6KUQN807d8-w9PsxdbQac-2nrfKKITIE,2534
54
+ karrio/server/pricing/migrations/0046_alter_surcharge_services.py,sha256=9Ha3m66J7x9g6eDEbLIx7QAH3CvocZ8XFpDqfAHjObM,152861
55
+ karrio/server/pricing/migrations/0047_alter_surcharge_services.py,sha256=Iok3DRYnX8vvPnimoffVbCGVMAYGYstmZQMeCmqyiHo,156654
56
+ karrio/server/pricing/migrations/0048_alter_surcharge_services.py,sha256=oyKhyQ8zcHqY1bpqOU46jxmM8eC3rx2ZssiDDUN2XUI,157708
57
+ karrio/server/pricing/migrations/0049_alter_surcharge_carriers_alter_surcharge_services.py,sha256=gcDDAj5M6s1go10bcY09hYW3FqocuqIkuL_Go-OTe4g,160081
58
+ karrio/server/pricing/migrations/0050_alter_surcharge_carriers.py,sha256=85XhhvkS5ny8dey38zRZC3xV6DPQzJFqBHo0IF8biG4,2603
59
+ karrio/server/pricing/migrations/0051_alter_surcharge_carriers_alter_surcharge_services.py,sha256=8xRxbZRQwiG1Pgs5gO_DjHO5SzTQJ3zZLMJeWqzximk,144620
60
+ karrio/server/pricing/migrations/0052_alter_surcharge_carriers_alter_surcharge_services.py,sha256=gg3L_bQPr2DvxYxLqtEC1PCuxjxHu656h_X_D1Iaaj4,173595
61
+ karrio/server/pricing/migrations/0053_alter_surcharge_carriers_alter_surcharge_services.py,sha256=DQ9tWyq9g1w1UPtnGylzeQuOtukNl7WjTZhGx4MUpQ0,174401
62
+ karrio/server/pricing/migrations/0054_alter_surcharge_services.py,sha256=A6vGwuK1PgFNUqZEwtssdvE36GBOLY_zgYA5_5appm8,166866
63
+ karrio/server/pricing/migrations/0055_alter_surcharge_services.py,sha256=YCIgR0zR0oh3uGPqzH1L6ulaa3ep-_PJPxSZkD2bV50,169533
64
+ karrio/server/pricing/migrations/0056_alter_surcharge_carriers_alter_surcharge_services.py,sha256=9UTmMtRF__5cd-4Q41kheDgtbLvgaxkZZnHO571q84A,177184
65
+ karrio/server/pricing/migrations/0057_alter_surcharge_carriers_alter_surcharge_services.py,sha256=n9-Z4Xdz6rKKwSmviJTpcDHXRI13mosTQ6aNoX0sMCc,222692
66
+ karrio/server/pricing/migrations/0058_alter_surcharge_services.py,sha256=-nKc6D53B4aolm6q70Zn2K6nbyuxkxTW8eY3MdWZEXc,219828
67
+ karrio/server/pricing/migrations/0059_alter_surcharge_carriers_alter_surcharge_services.py,sha256=8QIZKH2YY1FFAQJ_JLOeGAUhsxl312N67JQhMpjRZfk,248262
68
+ karrio/server/pricing/migrations/0060_alter_surcharge_services.py,sha256=8t8b14a5zrxFGr8rqD3I_qVZqGnwaSFlnT_s38r-3C0,248338
69
+ karrio/server/pricing/migrations/0061_alter_surcharge_services.py,sha256=90fPWiRlklFEkpPGY3c0qiNtHVlr5Ovzn4VmgtCjF4o,247713
70
+ karrio/server/pricing/migrations/0062_alter_surcharge_carriers_alter_surcharge_services.py,sha256=8qb5xscUK4DVzd7c6bhuMDPvem7avNl_2feYHozbWr8,237849
71
+ karrio/server/pricing/migrations/0063_alter_surcharge_carriers_alter_surcharge_services.py,sha256=6NNyPCICUo0SRvz_LgqkNk6GecfYnpoOKtuNJe1U8EY,1231
72
+ karrio/server/pricing/migrations/0064_alter_surcharge_carriers_alter_surcharge_services.py,sha256=_ocynnDsSp0WsEFapWWCC-pHE2kIJG6NmDdrT1c5tMs,235993
73
+ karrio/server/pricing/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
74
+ karrio_server_pricing-2025.5rc1.dist-info/METADATA,sha256=ES8qEY-ngGDwCUo3KEq7LoaBph1xmheOAOkpWDvdkxo,687
75
+ karrio_server_pricing-2025.5rc1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
76
+ karrio_server_pricing-2025.5rc1.dist-info/top_level.txt,sha256=D1D7x8R3cTfjF_15mfiO7wCQ5QMtuM4x8GaPr7z5i78,12
77
+ karrio_server_pricing-2025.5rc1.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (80.9.0)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1,2 @@
1
+ dist
2
+ karrio