You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

134 lines
4.5 KiB

  1. # Copyright 2020 Coop IT Easy SCRL fs
  2. # Robin Keunen <robin@coopiteasy.be>
  3. # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
  4. import logging
  5. from datetime import date, timedelta
  6. from odoo import api, fields, models
  7. from .subscription_request_adapter import SubscriptionRequestAdapter
  8. _logger = logging.getLogger(__name__)
  9. class SubscriptionRequest(models.Model):
  10. _inherit = "subscription.request"
  11. source = fields.Selection(selection_add=[("emc_api", "Easy My Coop API")])
  12. binding_id = fields.One2many(
  13. comodel_name="emc.binding.subscription.request",
  14. inverse_name="internal_id",
  15. string="Binding ID",
  16. required=False,
  17. )
  18. @api.model
  19. def _get_backend(self):
  20. backend = self.env["emc.backend"].search([("active", "=", True)])
  21. try:
  22. backend.ensure_one()
  23. except ValueError as e:
  24. _logger.error(
  25. "One and only one backend is allowed for the Easy My Coop "
  26. "connector."
  27. )
  28. raise e
  29. return backend
  30. @api.model
  31. def fetch_subscription_requests(self, date_from=None, date_to=None):
  32. SRBinding = self.env["emc.binding.subscription.request"]
  33. backend = self._get_backend()
  34. adapter = SubscriptionRequestAdapter(backend=backend)
  35. requests_dict = adapter.search(date_from=date_from, date_to=date_to)
  36. for request_dict in requests_dict["rows"]:
  37. external_id = request_dict["id"]
  38. request_values = adapter.to_write_values(request_dict)
  39. sr_binding = SRBinding.search_binding(backend, external_id)
  40. if sr_binding: # update request
  41. sr_binding.internal_id.write(request_values)
  42. else:
  43. srequest = self.env["subscription.request"].create(
  44. request_values
  45. )
  46. SRBinding.create(
  47. {
  48. "backend_id": backend.id,
  49. "external_id": external_id,
  50. "internal_id": srequest.id,
  51. }
  52. )
  53. external_ids = [row["id"] for row in requests_dict["rows"]]
  54. srequests = SRBinding.search(
  55. [
  56. ("backend_id", "=", backend.id),
  57. ("external_id", "in", external_ids),
  58. ]
  59. ).mapped("internal_id")
  60. return srequests
  61. @api.model
  62. def backend_read(self, external_id):
  63. SRBinding = self.env["emc.binding.subscription.request"]
  64. backend = self._get_backend()
  65. adapter = SubscriptionRequestAdapter(backend)
  66. sr_data = adapter.read(external_id)
  67. request_values = adapter.to_write_values(sr_data)
  68. sr_binding = SRBinding.search_binding(backend, external_id)
  69. if sr_binding: # update request
  70. srequest = sr_binding.internal_id
  71. srequest.write(request_values)
  72. else:
  73. srequest = self.env["subscription.request"].create(request_values)
  74. SRBinding.create(
  75. {
  76. "backend_id": backend.id,
  77. "external_id": external_id,
  78. "internal_id": srequest.id,
  79. }
  80. )
  81. return srequest
  82. @api.model
  83. def fetch_subscription_requests_cron(self):
  84. backend = self._get_backend()
  85. date_to = date.today()
  86. date_from = date_to - timedelta(days=1)
  87. _logger.info(
  88. "fetching subscription requests at {backend} from {date_from} to "
  89. "{date_to}.".format(
  90. backend=backend.name, date_from=date_from, date_to=date_to
  91. )
  92. )
  93. self.fetch_subscription_requests(date_from=date_from, date_to=date_to)
  94. _logger.info("fetch done.")
  95. @api.multi
  96. def validate_subscription_request(self):
  97. self.ensure_one()
  98. invoice = super(
  99. SubscriptionRequest, self
  100. ).validate_subscription_request()
  101. if self.source == "emc_api":
  102. backend = self._get_backend()
  103. sr_adapter = SubscriptionRequestAdapter(backend=backend)
  104. invoice_dict = sr_adapter.validate(self.binding_id.external_id)
  105. InvoiceBinding = self.env["emc.binding.account.invoice"]
  106. InvoiceBinding.create(
  107. {
  108. "backend_id": backend.id,
  109. "external_id": invoice_dict["id"],
  110. "internal_id": invoice.id,
  111. }
  112. )
  113. return invoice