yipbee.py 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. # -*- coding: utf-8 -*-
  2. import BeautifulSoup
  3. import datetime
  4. import dingguo
  5. import email
  6. import ioex
  7. import re
  8. def parse_order_confirmation_mail(mail):
  9. assert isinstance(mail, email.message.Message)
  10. text = mail.get_payload()[0].get_payload()[0].get_payload(decode = True).decode('utf-8')
  11. if not u'Vielen Dank für deine Bestellung bei yipbee' in text:
  12. raise Exception('no yipbee confirmation')
  13. order_match_groups = re.search(
  14. ur'[\W\w]+'
  15. + ur'BESTELLUNG: (?P<order_id>\w+) vom (?P<order_time>\d\d.\d\d.\d{4} \d\d:\d\d:\d\d)'
  16. + ur'[\W\w]+'
  17. + ur'GESAMTPREIS\s+'
  18. + ur'(?P<articles_and_discount_text>[\W\w]+)'
  19. + ur'(?P<summary_text>ARTIKEL [\W\w]+)',
  20. text,
  21. re.UNICODE
  22. ).groupdict()
  23. order = dingguo.Order(
  24. u'yipbee',
  25. order_match_groups['order_id'],
  26. datetime.datetime.strptime(order_match_groups['order_time'], '%d.%m.%Y %H:%M:%S'),
  27. )
  28. for article_match in re.finditer(
  29. ur'(?P<name>[\w\-\.\:,%\(\) ]+ (Klasse \d|[\w\-\. ]+[^\d ]))'
  30. + ur'(?P<total_price>\d+,\d\d) €(?P<quantity>\d)(?P<total_price_2>\d+,\d\d) €',
  31. order_match_groups['articles_and_discount_text'].replace('\n', ' '),
  32. re.UNICODE,
  33. ):
  34. article_match_groups = article_match.groupdict()
  35. total_price = float(article_match_groups['total_price'].replace(',', '.'))
  36. total_price_2 = float(article_match_groups['total_price_2'].replace(',', '.'))
  37. assert abs(total_price - total_price_2) < 0.01, 'expected %f, received %f' % (total_price, total_price_2)
  38. quantity = int(article_match_groups['quantity'])
  39. order.items.append(dingguo.Article(
  40. name = article_match_groups['name'],
  41. price_brutto = dingguo.Sum(round(total_price / quantity, 2), u'EUR'),
  42. quantity = quantity,
  43. reseller = u'yipbee',
  44. shipper = u'yipbee',
  45. ))
  46. articles_price = float(text.split('RABATTE')[0].split('ARTIKEL')[-1].strip().split(' ')[0].replace(',', '.'))
  47. assert abs(articles_price - sum([a.price_brutto.value * a.quantity for a in order.items])) < 0.01
  48. discount_tag = BeautifulSoup.BeautifulSoup(
  49. order_match_groups['articles_and_discount_text'],
  50. convertEntities = BeautifulSoup.BeautifulSoup.HTML_ENTITIES,
  51. ).find('tr')
  52. if discount_tag:
  53. name_tag, value_tag = discount_tag.findAll('td', recursive = False)
  54. value, currency = value_tag.text.split(' ')
  55. order.discounts.append(dingguo.Discount(
  56. name = name_tag.text,
  57. amount = dingguo.Sum(float(value.replace(',', '.')) * -1, currency),
  58. ))
  59. delivery_price = order_match_groups['summary_text'].split('VERSAND')[1].split('STEUERN')[0].strip()
  60. delivery_price_value, delivery_price_currency = delivery_price.split(' ')
  61. order.items.append(dingguo.Item(
  62. name = u'Delivery',
  63. price_brutto = dingguo.Sum(float(delivery_price_value.replace(',', '.')), delivery_price_currency),
  64. ))
  65. return [order]