himport 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. from __future__ import unicode_literals
  4. import getopt
  5. import locale
  6. import logging
  7. import os
  8. import shutil
  9. import sys
  10. import csv
  11. import datetime
  12. import codecs
  13. import getpass
  14. from himports import settings
  15. from himports.hledger import *
  16. from himports.dolibarrAlchemyHledger import *
  17. logging.basicConfig(level=logging.INFO)
  18. logger = logging.getLogger('hreport')
  19. sys.stdout = codecs.getwriter(locale.getpreferredencoding())(sys.stdout)
  20. def process_args(argv):
  21. options = {}
  22. usage = u'himport -a -p -d -v'
  23. try:
  24. opts, args = getopt.getopt(
  25. argv, "hp:P:adv",
  26. ["mysql-password=", "mysql-port"]
  27. )
  28. except getopt.GetoptError:
  29. print usage
  30. sys.exit(2)
  31. options['alchemy'] = False
  32. options['pdb'] = False
  33. options['verbose'] = 0
  34. for opt, arg in opts:
  35. if opt == '-h':
  36. print usage
  37. sys.exit()
  38. elif opt in ("-p", "--mysql-password"):
  39. options['mysql_password'] = arg
  40. elif opt in ("-P", "--mysql-port"):
  41. options['mysql_port'] = arg
  42. elif opt in ("-a", "--alchemy"):
  43. options['alchemy'] = True
  44. elif opt in ("-v", "--verbose"):
  45. options['verbose'] += 1
  46. elif opt in ("-d", "--pdb"):
  47. options['pdb'] = True
  48. return options
  49. def do_mysql(options):
  50. # On recupere les donnees via la base de donnees de dolibarr
  51. s = settings.get('MYSQL_SETTINGS')
  52. password = s['password']
  53. if 'mysql_password' in options:
  54. password = options['mysql_password']
  55. if password is None or password == "":
  56. password = getpass.getpass("password for mysql user '%s': " % (s['user']))
  57. port = s['port']
  58. if 'mysql_port' in options:
  59. port = options['mysql_port']
  60. if options['alchemy']:
  61. dolibarr = HledgerDolibarrSQLAlchemy(s['host'], port, s['database'], s['user'], password)
  62. dolibarr.connect()
  63. else:
  64. dolibarr = DolibarrSQL(s['host'], port, s['database'], s['user'], password)
  65. dolibarr.connect()
  66. bank_entries = dolibarr.get_bank_entries()
  67. sell_entries = dolibarr.get_sell_entries()
  68. supplier_entries = dolibarr.get_supplier_entries()
  69. social_entries = dolibarr.get_social_entries()
  70. dolibarr.disconnect()
  71. # On verifie s'il manque des postes comptables dans les ecritures
  72. pc_missing = set()
  73. pc_missing.update(bank_entries.check_pc())
  74. pc_missing.update(sell_entries.check_pc())
  75. pc_missing.update(supplier_entries.check_pc())
  76. pc_missing.update(social_entries.check_pc())
  77. if len(pc_missing) > 0:
  78. print "WARNING: poste comptable manquant"
  79. for pc in pc_missing:
  80. sys.stdout.write("%s\n" % (pc))
  81. # On ecrie les fichiers hledger
  82. Writer.write("bank",bank_entries)
  83. Writer.write("sells",sell_entries)
  84. Writer.write("suppliers",supplier_entries)
  85. Writer.write("social",social_entries)
  86. Writer.write_hreport_plan()
  87. def do_sqlalchemy(options):
  88. # On recupere les donnees via la base de donnees de dolibarr
  89. s = settings.get('MYSQL_SETTINGS')
  90. password = s['password']
  91. if 'mysql_password' in options:
  92. password = options['mysql_password']
  93. if password is None or password == "":
  94. password = getpass.getpass("password for mysql user '%s': " % (s['user']))
  95. port = s['port']
  96. if 'mysql_port' in options:
  97. port = options['mysql_port']
  98. dolibarr = HledgerDolibarrSQLAlchemy(s['host'], port, s['database'], s['user'], password, options['verbose'] >= 2)
  99. dolibarr.connect()
  100. if options['pdb']:
  101. from ptpdb import set_trace
  102. s = dolibarr.session
  103. b = s.query(Bank).all()[10]
  104. set_trace()
  105. pass
  106. bank_journal = dolibarr.get_bank_journal()
  107. sell_journal = dolibarr.get_sell_journal()
  108. supplier_journal = dolibarr.get_supplier_journal()
  109. social_journal = dolibarr.get_social_journal()
  110. # On verifie s'il manque des postes comptables dans les ecritures
  111. pc_missing = set()
  112. pc_missing.update(bank_journal.check_pc())
  113. pc_missing.update(sell_journal.check_pc())
  114. pc_missing.update(supplier_journal.check_pc())
  115. pc_missing.update(social_journal.check_pc())
  116. if len(pc_missing) > 0:
  117. print "WARNING: poste comptable manquant"
  118. for pc in pc_missing:
  119. sys.stdout.write("%s\n" % (pc))
  120. # On ecrie les fichiers hledger
  121. Writer.write("bank", bank_journal)
  122. Writer.write("sells", sell_journal)
  123. Writer.write("suppliers", supplier_journal)
  124. Writer.write("social", social_journal)
  125. Writer.write_hreport_plan()
  126. dolibarr.disconnect()
  127. def main(argv):
  128. locale.setlocale(locale.LC_ALL, b'fr_FR.utf-8')
  129. options = process_args(argv)
  130. if options['alchemy']:
  131. do_sqlalchemy(options)
  132. else:
  133. do_mysql(options)
  134. if __name__ == "__main__":
  135. main(sys.argv[1:])