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.

190 lines
6.7 KiB

4 months ago
4 months ago
  1. # -*- coding: utf-8 -*-
  2. from odoo import models, fields, api
  3. from odoo.osv.expression import OR
  4. from .ffck_structure_type import SCALES
  5. class ResPartner(models.Model):
  6. _inherit = "res.partner"
  7. # Partner fields
  8. ffck_network = fields.Boolean(string="FFCK network")
  9. first_membership_date = fields.Date("Structure 1st membership")
  10. # Structure typing
  11. partner_scale = fields.Selection(
  12. selection=SCALES,
  13. string="Scale",
  14. compute="_get_partner_scale",
  15. store=True,
  16. )
  17. ffck_structure_type_id = fields.Many2one(
  18. comodel_name="ffck.structure.type",
  19. string="Structure type",
  20. )
  21. partner_code = fields.Char(string="FFCK code", size=6, index=True)
  22. partner_code_editable = fields.Boolean(string="FFCK code editable", default=True)
  23. # FFCK
  24. ffck_partner_id = fields.Many2one(
  25. comodel_name="res.partner",
  26. string="FFCK partner",
  27. ondelete="restrict",
  28. compute="_get_ffck_partner",
  29. store=False,
  30. )
  31. ffck_partner_code = fields.Char(string="FFCK", default="0", readonly=True)
  32. # CRCK
  33. crck_partner_id = fields.Many2one(
  34. comodel_name="res.partner",
  35. string="CRCK partner",
  36. index=True,
  37. ondelete="restrict",
  38. compute="_get_crck_partner",
  39. store=True,
  40. )
  41. crck_partner_code = fields.Char(related="crck_partner_id.partner_code", store=True)
  42. # CDCK
  43. cdck_partner_id = fields.Many2one(
  44. comodel_name="res.partner",
  45. string="CDCK partner",
  46. index=True,
  47. ondelete="restrict",
  48. compute="_get_cdck_partner",
  49. store=True,
  50. )
  51. cdck_partner_code = fields.Char(related="cdck_partner_id.partner_code", store=True)
  52. local_partner_id = fields.Many2one(
  53. comodel_name="res.partner",
  54. string="Local partner",
  55. index=True,
  56. ondelete="restrict",
  57. domain=[("ffck_network", "=", True), ("partner_scale", "=", 4)],
  58. )
  59. local_partner_code = fields.Char(
  60. related="local_partner_id.partner_code", store=True
  61. )
  62. @api.model
  63. def name_search(self, name="", args=None, operator="ilike", limit=100):
  64. """Allow searching by sequence code by default."""
  65. # Do not add any domain when user just clicked on search widget
  66. if not (name == "" and operator == "ilike"):
  67. # The dangling | is needed to combine with the domain added by super()
  68. args = OR(
  69. [
  70. [
  71. "&",
  72. ("ffck_network", "=", True),
  73. ("partner_code", "=like", name + "%"),
  74. ],
  75. args or [],
  76. ]
  77. )
  78. return super().name_search(name, args, operator, limit)
  79. def name_get(self):
  80. result = []
  81. ffck_partners = self.filtered("ffck_network")
  82. others = self - ffck_partners
  83. for record in ffck_partners:
  84. code = record.partner_code
  85. ref = record.ref
  86. result.append(
  87. (
  88. record.id,
  89. "{}{}{}".format(
  90. code and code + " - " or "",
  91. ref and record.is_company and ref + " - " or "",
  92. super(ResPartner, record).name_get()[0][1],
  93. ),
  94. )
  95. )
  96. result += super(ResPartner, others).name_get()
  97. return result
  98. # COMPUTES
  99. @api.depends("company_type", "ffck_structure_type_id")
  100. def _get_partner_scale(self):
  101. for partner in self:
  102. if partner.company_type == "individual":
  103. partner.partner_scale = "5"
  104. else:
  105. partner.partner_scale = partner.ffck_structure_type_id.scale
  106. def _get_ffck_partner(self):
  107. ffck = self.env.ref("ffck_commons.res_partner_ffck", raise_if_not_found=False)
  108. main = self.env.ref("base.main_partner")
  109. for partner in self:
  110. if main.ref == "FFCK":
  111. if ffck and ffck.active:
  112. ffck.write({"active": False})
  113. partner.ffck_partner_id = main
  114. else:
  115. partner.ffck_partner_id = ffck
  116. @api.depends("state_id", "ffck_network", "partner_scale")
  117. def _get_crck_partner(self):
  118. states = self.mapped("state_id")
  119. crck_ok = self.search(
  120. [
  121. ("ffck_network", "=", True),
  122. ("partner_scale", "=", "2"),
  123. ("state_id", "in", states.ids),
  124. ]
  125. )
  126. crck_by_state = {crck.state_id: crck for crck in crck_ok}
  127. states_ok = states & crck_ok.mapped("state_id")
  128. concerned = self.filtered(
  129. lambda rp: rp.ffck_network
  130. and int(rp.partner_scale) >= 2
  131. and rp.state_id in states_ok
  132. )
  133. for partner in concerned:
  134. state = partner.state_id
  135. partner.crck_partner_id = crck_by_state[state]
  136. # treat unconcerned
  137. for partner in self - concerned:
  138. partner.crck_partner_id = False
  139. @api.depends("country_department_id", "ffck_network", "partner_scale")
  140. def _get_cdck_partner(self):
  141. depts = self.mapped("country_department_id")
  142. cdck_ok = self.search(
  143. [
  144. ("ffck_network", "=", True),
  145. ("partner_scale", "=", "3"),
  146. ("country_department_id", "in", depts.ids),
  147. ]
  148. )
  149. cdck_by_dept = {cdck.country_department_id: cdck for cdck in cdck_ok}
  150. depts_ok = depts & cdck_ok.mapped("country_department_id")
  151. concerned = self.filtered(
  152. lambda rp: rp.ffck_network
  153. and int(rp.partner_scale) >= 3
  154. and rp.country_department_id in depts_ok
  155. )
  156. for partner in concerned:
  157. dept = partner.country_department_id
  158. partner.cdck_partner_id = cdck_by_dept[dept]
  159. # treat unconcerned
  160. for partner in self - concerned:
  161. partner.cdck_partner_id = False
  162. # ONCHANGES
  163. @api.onchange("partner_code", "company_type", "ffck_network")
  164. def onchange_partner_code(self):
  165. if self.ffck_network and self.is_company == False:
  166. code = self.partner_code or "000000"
  167. if len(code) < 6:
  168. self.update({"partner_code": code.zfill(6)})
  169. elif len(code) > 6:
  170. self.update({"partner_code": code[:-6]})
  171. # CRUD
  172. @api.model_create_multi
  173. def create(self, vals_list):
  174. for vals in vals_list:
  175. vals.update({"partner_code_editable": False})
  176. return super().create(vals_list)