yipbee.py 3.2 KB

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