28 lines
1.3 KiB
Python
28 lines
1.3 KiB
Python
"""Exact approved Site DTF price ladders; integer BRL cents at the boundary.
|
|
|
|
Quantity/grade must be supplied by an authenticated commercial reviewer.
|
|
This module does not inspect artwork or perform pre-flight.
|
|
"""
|
|
from decimal import Decimal, ROUND_CEILING
|
|
|
|
TIERS = {
|
|
'file': [(90,1490),(75,1620),(60,1750),(40,1870),(0,1990)],
|
|
'avulsa': [(90,2490),(75,2620),(60,2750),(40,2870),(0,2990)],
|
|
'uvfile': [(90,6990),(75,7390),(60,7790),(40,8190),(0,8590)],
|
|
'uv': [(90,8390),(75,8790),(60,9190),(40,9590),(0,9990)],
|
|
}
|
|
|
|
def price(mode: str, metres: str, grade: int) -> dict:
|
|
length = Decimal(str(metres))
|
|
if mode not in TIERS or not length.is_finite() or not 0 < length <= 12000:
|
|
raise ValueError('Invalid product or length')
|
|
if isinstance(grade, bool) or not isinstance(grade, int) or not 0 <= grade <= 100:
|
|
raise ValueError('Grade must be an integer between 0 and 100')
|
|
billed = max(Decimal('1'), (length * 10).to_integral_value(rounding=ROUND_CEILING) / 10)
|
|
unit = next(cents for minimum, cents in TIERS[mode] if grade >= minimum)
|
|
return {'mode': mode, 'metres': str(length), 'grade': grade,
|
|
'billed_metres': str(billed), 'unit_cents': unit,
|
|
'total_cents': int(billed * unit),
|
|
'discount_cents': int(billed * (TIERS[mode][-1][1] - unit))}
|
|
|