1
1

main.py 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. from datetime import datetime
  2. import json
  3. import os
  4. from flask import Flask, request
  5. from src.models.transaction_model import transaction_model
  6. from src.errors.argument_exception import argument_exception
  7. from src.export.exporter_factory import exporter_factory
  8. from src.settings.settings_manager import settings_manager
  9. from src.logic.start_factory import start_factory
  10. from src.storage.storage import storage
  11. from src.storage.storage_service import storage_service
  12. setman = settings_manager()
  13. start = None
  14. strg = None
  15. app = Flask(__name__)
  16. @app.route("/api/export/<storage_key>/<format>", methods=["GET"])
  17. def get_export_format(storage_key: str, format: str):
  18. global setman, start, strg
  19. try:
  20. exp = exporter_factory().create(format)
  21. except argument_exception as e:
  22. return "Wrong format: " + e.error.error_text, 400
  23. if storage_key not in strg.data:
  24. return "Key not found", 404
  25. return app.response_class(
  26. response=exp.export_by_key(storage_key),
  27. status=200,
  28. mimetype=exp.strategy.mimetype,
  29. )
  30. @app.route("/api/export/<storage_key>", methods=["GET"])
  31. def get_export(storage_key: str):
  32. global setman, start, strg
  33. format = setman.settings.export_format
  34. try:
  35. exp = exporter_factory().create(format)
  36. except argument_exception as e:
  37. return "Wrong format: " + e.error.error_text, 400
  38. if storage_key not in strg.data:
  39. return "Key not found", 404
  40. return app.response_class(
  41. response=exp.export_by_key(storage_key),
  42. status=200,
  43. mimetype=exp.strategy.mimetype,
  44. )
  45. @app.route("/api/export/rests", methods=["GET"])
  46. def get_rests():
  47. args = request.args
  48. if "start_period" not in args.keys() or "stop_period" not in args.keys():
  49. raise argument_exception("Нет дат!")
  50. start_date = datetime.strptime(args["start_period"], "%Y-%m-%d")
  51. stop_date = datetime.strptime(args["stop_period"], "%Y-%m-%d")
  52. service = storage_service(start.storage.data[storage.transaction_key()])
  53. result = service.create_turns_dt(strg, start_date, stop_date, strg)
  54. return storage_service.create_response(result, app)
  55. @app.route("/api/storage/<nomenclature_name>/turns")
  56. def get_nomens_rests(nomenclature_name):
  57. nomen = [
  58. nomen
  59. for nomen in start.storage.data[storage.nomenclature_key()]
  60. if nomen.name == nomenclature_name
  61. ][0]
  62. service = storage_service(start.storage.data[storage.transaction_key()])
  63. result = service.create_turns_nomen(strg, nomen)
  64. return storage_service.create_response(result, app)
  65. @app.route("/api/storage/<recipe_name>/debits")
  66. def debits_recipe(recipe_name):
  67. args = request.args
  68. if "storage" not in args:
  69. raise argument_exception("Не указан склад!")
  70. recipe = [
  71. recipe
  72. for recipe in start.storage.data[storage.recipe_key()]
  73. if recipe.name == recipe_name
  74. ]
  75. storage_ = [
  76. storage
  77. for storage in start.storage.data[storage.storage_key()]
  78. if storage.name == args["storage"]
  79. ]
  80. if len(recipe) == 0 or len(storage_) == 0:
  81. return ""
  82. recipe = recipe[0]
  83. storage_ = storage_[0]
  84. service = storage_service(start.storage.data[storage.transaction_key()])
  85. turns = service.create_turns(recipe, storage=storage_)
  86. recipe_need = {}
  87. for recipe_row in recipe.rows:
  88. recipe_need[recipe_row.nomenculature.name] = recipe_row.size
  89. transactions = []
  90. for turn in turns:
  91. if recipe_need[turn.nomen.name] > turn.remains:
  92. raise argument_exception(
  93. "Не удалось произвести списание! Остатков на складе не достаточно!"
  94. )
  95. transactions.append(
  96. transaction_model(
  97. storage=storage_,
  98. nomen=turn.nomen,
  99. operation=False,
  100. countes=recipe_need[turn.nomen.name],
  101. unit=turn.unit,
  102. period=datetime.now(),
  103. )
  104. )
  105. start.storage.data[storage.journal_key()] += transactions
  106. return app.response_class(
  107. response=json.dumps({"success": True}),
  108. status=200,
  109. mimetype="application/json; charset=utf-8",
  110. )
  111. # Инициализация приложения
  112. def run():
  113. global setman, start, strg
  114. setman.open(os.path.dirname(__file__) + "/config/settings.json")
  115. strg = storage()
  116. start = start_factory(setman.settings, strg)
  117. start.create()
  118. start.create_transactions()
  119. app.run()
  120. if __name__ == "__main__":
  121. run()