import re import scrapers from decimal import Decimal, ROUND_UP our_margin = Decimal('1.3') def find_product_details(vendor_and_sku): [vendor, sku] = vendor_and_sku.split(':', 2) if vendor == 'ah': return scrapers.ah_get_by_sku(sku) raise Exception(f'unknown vendor: {vendor}') def update_product_pricings(src): find_updatable = re.compile(r'#\s*(?P<sku>\S+)\s+(?P<units>\d+)x$') find_aliases = re.compile(r'^(?P<aliases>\S+)') lines = src.split('\n') lines_out = [] for line in lines: m = find_updatable.search(line) if not m: lines_out.append(line) continue d = find_product_details(m['sku']) product_aliases = set() if not line.startswith('#'): product_aliases = set(find_aliases.search(line)['aliases'].split(',')) product_aliases.add(d['ean']) aliases = ','.join(sorted(product_aliases)) units = int(m["units"]) price = d['price'] # Apply a 30% margin and divide by the number of units per sold packaging. unit_price = price * our_margin / units # Round up to 5ct. unit_price = (unit_price * 20).quantize(Decimal('1'), rounding=ROUND_UP) / 20 lines_out.append(f'{aliases:<15} {unit_price:.2f} {d["name"]:<32} # {m["sku"]} {units}x') return '\n'.join(lines_out)