mytaxi.py 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. # -*- coding: utf-8 -*-
  2. import datetime
  3. import dingguo
  4. import email
  5. import ioex
  6. import re
  7. import subprocess
  8. def parse_order_confirmation_mail(mail):
  9. assert isinstance(mail, email.message.Message)
  10. if not 'mytaxi' in mail.get_payload()[0].get_payload()[0].get_payload(decode = True):
  11. raise Exception('no mytaxi mail')
  12. pdf_compressed = mail.get_payload()[1].get_payload(decode = True)
  13. pdftk = subprocess.Popen(
  14. ['pdftk - output - uncompress'],
  15. shell = True,
  16. stdin = subprocess.PIPE,
  17. stdout = subprocess.PIPE,
  18. )
  19. pdf_uncompressed = pdftk.communicate(
  20. input = pdf_compressed,
  21. )[0].decode('latin-1')
  22. assert type(pdf_uncompressed) is unicode
  23. order_match = re.search(
  24. ur'Rechnungsnummer:[^\(]+\((?P<order_id>\w+)\)',
  25. pdf_uncompressed,
  26. re.MULTILINE | re.UNICODE
  27. )
  28. order_id = order_match.groupdict()['order_id']
  29. ride_match_groups = re.search(
  30. ur'\(Bruttobetrag\)'
  31. + ur'[^\(]+'
  32. + ur'\((?P<price_brutto>\d+,\d+) (?P<price_brutto_currency>.+)\)'
  33. + ur'[\w\W]+'
  34. + ur'\((?P<driver>[^\(]+)\)'
  35. + ur'[^\(]+'
  36. + ur'\(\d+,\d+ .\)'
  37. + ur'[^\(]+'
  38. + ur'\((?P<name>Taxifahrt)'
  39. + ur'[^\(]+'
  40. + ur'\(von: (?P<departure_point>[^\)]+)'
  41. + ur'[^\(]+'
  42. + ur'\(nach: (?P<destination_point>[^\)]+)'
  43. + ur'[\w\W]+'
  44. + ur'Belegdatum \\\(Leistungszeitpunkt\\\):[^\(]+\((?P<arrival_time>\d\d.\d\d.\d\d \d\d:\d\d)\)',
  45. pdf_uncompressed,
  46. re.MULTILINE | re.UNICODE
  47. ).groupdict()
  48. arrival_time = datetime.datetime.strptime(
  49. ride_match_groups['arrival_time'],
  50. '%d.%m.%y %H:%M'
  51. )
  52. order = dingguo.Order(
  53. u'mytaxi',
  54. order_id,
  55. order_date = arrival_time.date(),
  56. )
  57. with ioex.setlocale('en_US.UTF-8'):
  58. order.items.append(dingguo.TaxiRide(
  59. price_brutto = dingguo.Sum(
  60. float(ride_match_groups['price_brutto'].replace(',', '.')),
  61. # why 0x80 ?
  62. u'EUR' if (ride_match_groups['price_brutto_currency'] == u'\x80')
  63. else ride_match_groups['price_brutto_currency'],
  64. ),
  65. departure_point = ride_match_groups['departure_point'],
  66. destination_point = ride_match_groups['destination_point'],
  67. driver = ride_match_groups['driver'],
  68. arrival_time = arrival_time,
  69. ))
  70. return [order]