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.

212 lines
7.2 KiB

  1. # Copyright 2019 Coop IT Easy SCRL fs
  2. # Houssine Bakkali <houssine@coopiteasy.be>
  3. # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
  4. from odoo import api, fields, models
  5. class ResPartner(models.Model):
  6. _inherit = "res.partner"
  7. @api.multi
  8. def _get_report_base_filename(self):
  9. self.ensure_one()
  10. if self.member:
  11. return "Cooperator Certificate - %s" % self.name
  12. else:
  13. return "unknown"
  14. @api.multi
  15. def _invoice_total(self):
  16. account_invoice_report = self.env["account.invoice.report"]
  17. if not self.ids:
  18. self.total_invoiced = 0.0
  19. return True
  20. all_partners_and_children = {}
  21. all_partner_ids = []
  22. for partner in self:
  23. # price_total is in the company currency
  24. all_partners_and_children[partner] = self.search(
  25. [("id", "child_of", partner.id)]
  26. ).ids
  27. all_partner_ids += all_partners_and_children[partner]
  28. # searching account.invoice.report via the orm is comparatively
  29. # expensive (generates queries "id in []" forcing to build the
  30. # full table).
  31. # In simple cases where all invoices are in the same currency than
  32. # the user's company access directly these elements
  33. # generate where clause to include multicompany rules
  34. where_query = account_invoice_report._where_calc(
  35. [
  36. ("partner_id", "in", all_partner_ids),
  37. ("state", "not in", ["draft", "cancel"]),
  38. ("company_id", "=", self.env.user.company_id.id),
  39. ("type", "in", ("out_invoice", "out_refund")),
  40. ("release_capital_request", "=", False),
  41. ]
  42. )
  43. account_invoice_report._apply_ir_rules(where_query, "read")
  44. from_clause, where_clause, where_clause_params = where_query.get_sql()
  45. # price_total is in the company currency
  46. query = (
  47. """
  48. SELECT SUM(price_total) as total, partner_id
  49. FROM account_invoice_report account_invoice_report
  50. WHERE %s
  51. GROUP BY partner_id
  52. """
  53. % where_clause
  54. )
  55. self.env.cr.execute(query, where_clause_params)
  56. price_totals = self.env.cr.dictfetchall()
  57. for partner, child_ids in all_partners_and_children.items():
  58. partner.total_invoiced = sum(
  59. price["total"]
  60. for price in price_totals
  61. if price["partner_id"] in child_ids
  62. )
  63. @api.multi
  64. @api.depends("share_ids")
  65. def _compute_effective_date(self):
  66. # TODO change it to compute it from the share register
  67. for partner in self:
  68. if partner.share_ids:
  69. partner.effective_date = partner.share_ids[0].effective_date
  70. @api.multi
  71. def _get_share_type(self):
  72. shares = self.env["product.product"].search([("is_share", "=", True)])
  73. share_types = [(s.default_code, s.short_name) for s in shares]
  74. return [("", "")] + share_types
  75. @api.multi
  76. @api.depends(
  77. "share_ids",
  78. "share_ids.share_product_id",
  79. "share_ids.share_product_id.default_code",
  80. "share_ids.share_number",
  81. )
  82. def _compute_cooperator_type(self):
  83. for partner in self:
  84. share_type = ""
  85. for line in partner.share_ids:
  86. if line.share_number > 0:
  87. share_type = line.share_product_id.default_code
  88. break
  89. partner.cooperator_type = share_type
  90. @api.multi
  91. @api.depends("share_ids")
  92. def _compute_share_info(self):
  93. for partner in self:
  94. number_of_share = 0
  95. total_value = 0.0
  96. for line in partner.share_ids:
  97. number_of_share += line.share_number
  98. total_value += line.share_unit_price * line.share_number
  99. partner.number_of_share = number_of_share
  100. partner.total_value = total_value
  101. cooperator = fields.Boolean(
  102. string="Cooperator",
  103. help="Check this box if this contact is a"
  104. " cooperator (effective or not).",
  105. )
  106. member = fields.Boolean(
  107. string="Effective cooperator",
  108. help="Check this box if this cooperator" " is an effective member.",
  109. )
  110. coop_candidate = fields.Boolean(
  111. string="Cooperator candidate",
  112. compute="_compute_coop_candidate",
  113. store=True,
  114. readonly=True,
  115. )
  116. old_member = fields.Boolean(
  117. string="Old cooperator",
  118. help="Check this box if this cooperator is"
  119. " no more an effective member.",
  120. )
  121. # todo use oca partner_contact_gender
  122. gender = fields.Selection(
  123. [("male", "Male"), ("female", "Female"), ("other", "Other")],
  124. string="Gender",
  125. )
  126. share_ids = fields.One2many(
  127. "share.line", "partner_id", string="Share Lines"
  128. )
  129. cooperator_register_number = fields.Integer(string="Cooperator Number")
  130. number_of_share = fields.Integer(
  131. compute="_compute_share_info",
  132. multi="share",
  133. string="Number of share",
  134. readonly=True,
  135. )
  136. total_value = fields.Float(
  137. compute="_compute_share_info",
  138. multi="share",
  139. string="Total value of shares",
  140. readonly=True,
  141. )
  142. company_register_number = fields.Char(string="Company Register Number")
  143. cooperator_type = fields.Selection(
  144. selection="_get_share_type",
  145. compute=_compute_cooperator_type,
  146. string="Cooperator Type",
  147. store=True,
  148. )
  149. effective_date = fields.Date(
  150. sting="Effective Date", compute=_compute_effective_date, store=True
  151. )
  152. representative = fields.Boolean(string="Legal Representative")
  153. subscription_request_ids = fields.One2many(
  154. "subscription.request", "partner_id", string="Subscription request"
  155. )
  156. legal_form = fields.Selection([("", "")], string="Legal form")
  157. data_policy_approved = fields.Boolean(string="Approved Data Policy")
  158. internal_rules_approved = fields.Boolean(string="Approved Internal Rules")
  159. @api.multi
  160. @api.depends("subscription_request_ids.state")
  161. def _compute_coop_candidate(self):
  162. for partner in self:
  163. if partner.member:
  164. is_candidate = False
  165. else:
  166. sub_requests = partner.subscription_request_ids.filtered(
  167. lambda record: record.state == "done"
  168. )
  169. is_candidate = bool(sub_requests)
  170. partner.coop_candidate = is_candidate
  171. @api.multi
  172. def has_representative(self):
  173. self.ensure_one()
  174. if self.child_ids.filtered("representative"):
  175. return True
  176. return False
  177. @api.multi
  178. def get_representative(self):
  179. self.ensure_one()
  180. return self.child_ids.filtered("representative")
  181. def get_cooperator_from_email(self, email):
  182. return self.env["res.partner"].search(
  183. [("cooperator", "=", True), ("email", "=", email)]
  184. )
  185. def get_cooperator_from_crn(self, company_register_number):
  186. return self.env["res.partner"].search(
  187. [
  188. ("cooperator", "=", True),
  189. ("company_register_number", "=", company_register_number),
  190. ]
  191. )