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.
- karrio/server/pricing/__init__.py +1 -0
- karrio/server/pricing/admin.py +55 -0
- karrio/server/pricing/apps.py +12 -0
- karrio/server/pricing/migrations/0001_initial.py +974 -0
- karrio/server/pricing/migrations/0002_auto_20201127_0721.py +855 -0
- karrio/server/pricing/migrations/0003_auto_20201230_0820.py +939 -0
- karrio/server/pricing/migrations/0004_auto_20201231_1402.py +940 -0
- karrio/server/pricing/migrations/0005_auto_20210204_1725.py +923 -0
- karrio/server/pricing/migrations/0006_auto_20210217_1109.py +1224 -0
- karrio/server/pricing/migrations/0007_auto_20210218_1202.py +955 -0
- karrio/server/pricing/migrations/0008_auto_20210418_0504.py +1010 -0
- karrio/server/pricing/migrations/0009_auto_20210603_2149.py +1043 -0
- karrio/server/pricing/migrations/0010_auto_20210612_1608.py +1070 -0
- karrio/server/pricing/migrations/0011_auto_20210615_1601.py +1109 -0
- karrio/server/pricing/migrations/0012_surcharge_carrier_accounts.py +23 -0
- karrio/server/pricing/migrations/0013_alter_surcharge_services.py +1086 -0
- karrio/server/pricing/migrations/0014_auto_20211013_1520.py +12 -0
- karrio/server/pricing/migrations/0015_auto_20211204_1350.py +1124 -0
- karrio/server/pricing/migrations/0016_auto_20211220_1500.py +1126 -0
- karrio/server/pricing/migrations/0017_alter_surcharge_services.py +1093 -0
- karrio/server/pricing/migrations/0018_alter_surcharge_services.py +1100 -0
- karrio/server/pricing/migrations/0019_alter_surcharge_services.py +1093 -0
- karrio/server/pricing/migrations/0020_auto_20220412_1215.py +3175 -0
- karrio/server/pricing/migrations/0021_auto_20220413_0959.py +3179 -0
- karrio/server/pricing/migrations/0022_alter_surcharge_services.py +3144 -0
- karrio/server/pricing/migrations/0023_auto_20220504_1335.py +3175 -0
- karrio/server/pricing/migrations/0024_auto_20220808_0803.py +3180 -0
- karrio/server/pricing/migrations/0025_alter_surcharge_carriers.py +51 -0
- karrio/server/pricing/migrations/0026_auto_20220828_0158.py +3199 -0
- karrio/server/pricing/migrations/0027_alter_surcharge_services.py +3170 -0
- karrio/server/pricing/migrations/0028_surcharge_markup_carriers_surcharge_markup_services.py +3016 -0
- karrio/server/pricing/migrations/0029_alter_surcharge_services.py +2939 -0
- karrio/server/pricing/migrations/0030_alter_surcharge_services.py +2940 -0
- karrio/server/pricing/migrations/0031_alter_surcharge_carriers.py +52 -0
- karrio/server/pricing/migrations/0032_alter_surcharge_services.py +2963 -0
- karrio/server/pricing/migrations/0033_alter_surcharge_services.py +2964 -0
- karrio/server/pricing/migrations/0034_alter_surcharge_carriers_alter_surcharge_services.py +3009 -0
- karrio/server/pricing/migrations/0035_alter_surcharge_carriers.py +56 -0
- karrio/server/pricing/migrations/0036_alter_surcharge_carriers_alter_surcharge_services.py +3022 -0
- karrio/server/pricing/migrations/0037_alter_surcharge_carriers_alter_surcharge_services.py +3078 -0
- karrio/server/pricing/migrations/0038_alter_surcharge_carriers_alter_surcharge_services.py +3093 -0
- karrio/server/pricing/migrations/0039_alter_surcharge_carriers_alter_surcharge_services.py +3095 -0
- karrio/server/pricing/migrations/0040_alter_surcharge_services.py +3058 -0
- karrio/server/pricing/migrations/0041_alter_surcharge_services.py +3061 -0
- karrio/server/pricing/migrations/0042_alter_surcharge_carriers_alter_surcharge_services.py +3128 -0
- karrio/server/pricing/migrations/0043_alter_surcharge_services.py +3090 -0
- karrio/server/pricing/migrations/0044_alter_surcharge_carriers.py +62 -0
- karrio/server/pricing/migrations/0045_alter_surcharge_carriers.py +63 -0
- karrio/server/pricing/migrations/0046_alter_surcharge_services.py +3100 -0
- karrio/server/pricing/migrations/0047_alter_surcharge_services.py +3171 -0
- karrio/server/pricing/migrations/0048_alter_surcharge_services.py +3195 -0
- karrio/server/pricing/migrations/0049_alter_surcharge_carriers_alter_surcharge_services.py +3246 -0
- karrio/server/pricing/migrations/0050_alter_surcharge_carriers.py +64 -0
- karrio/server/pricing/migrations/0051_alter_surcharge_carriers_alter_surcharge_services.py +2956 -0
- karrio/server/pricing/migrations/0052_alter_surcharge_carriers_alter_surcharge_services.py +3547 -0
- karrio/server/pricing/migrations/0053_alter_surcharge_carriers_alter_surcharge_services.py +3561 -0
- karrio/server/pricing/migrations/0054_alter_surcharge_services.py +3409 -0
- karrio/server/pricing/migrations/0055_alter_surcharge_services.py +3455 -0
- karrio/server/pricing/migrations/0056_alter_surcharge_carriers_alter_surcharge_services.py +3609 -0
- karrio/server/pricing/migrations/0057_alter_surcharge_carriers_alter_surcharge_services.py +4384 -0
- karrio/server/pricing/migrations/0058_alter_surcharge_services.py +4321 -0
- karrio/server/pricing/migrations/0059_alter_surcharge_carriers_alter_surcharge_services.py +4892 -0
- karrio/server/pricing/migrations/0060_alter_surcharge_services.py +4894 -0
- karrio/server/pricing/migrations/0061_alter_surcharge_services.py +4888 -0
- karrio/server/pricing/migrations/0062_alter_surcharge_carriers_alter_surcharge_services.py +4704 -0
- karrio/server/pricing/migrations/0063_alter_surcharge_carriers_alter_surcharge_services.py +34 -0
- karrio/server/pricing/migrations/0064_alter_surcharge_carriers_alter_surcharge_services.py +4669 -0
- karrio/server/pricing/migrations/__init__.py +0 -0
- karrio/server/pricing/models.py +143 -0
- karrio/server/pricing/serializers.py +18 -0
- karrio/server/pricing/signals.py +35 -0
- karrio/server/pricing/tests.py +301 -0
- karrio/server/pricing/views.py +3 -0
- karrio_server_pricing-2025.5rc1.dist-info/METADATA +27 -0
- karrio_server_pricing-2025.5rc1.dist-info/RECORD +77 -0
- karrio_server_pricing-2025.5rc1.dist-info/WHEEL +5 -0
- 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,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,,
|