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.

947 lines
30 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 datetime import datetime
  5. # pylint: disable=missing-manifest-dependency
  6. from addons.base_iban.models.res_partner_bank import validate_iban
  7. from odoo import _, api, fields, models
  8. from odoo.exceptions import UserError, ValidationError
  9. # This structure is only used in easy_my_coop_webstite's controller
  10. _REQUIRED = [
  11. "email",
  12. "firstname",
  13. "lastname",
  14. "birthdate",
  15. "address",
  16. "share_product_id",
  17. "ordered_parts",
  18. "zip_code",
  19. "city",
  20. "gender",
  21. ]
  22. @api.model
  23. def _lang_get(self):
  24. languages = self.env["res.lang"].search([])
  25. return [(language.code, language.name) for language in languages]
  26. # todo move to subscription_request.py
  27. class SubscriptionRequest(models.Model):
  28. _name = "subscription.request"
  29. _description = "Subscription Request"
  30. # This function is only used in easy_my_coop_webstite's controller
  31. def get_required_field(self):
  32. required_fields = _REQUIRED
  33. company = self.env["res.company"]._company_default_get()
  34. if company.data_policy_approval_required:
  35. required_fields.append("data_policy_approved")
  36. if company.internal_rules_approval_required:
  37. required_fields.append("internal_rules_approved")
  38. if company.financial_risk_approval_required:
  39. required_fields.append("financial_risk_approved")
  40. return required_fields
  41. def get_mail_template_notif(self, is_company=False):
  42. if is_company:
  43. mail_template = "easy_my_coop.email_template_confirmation_company"
  44. else:
  45. mail_template = "easy_my_coop.email_template_confirmation"
  46. return self.env.ref(mail_template, False)
  47. def is_member(self, vals, cooperator):
  48. if cooperator.member:
  49. vals["type"] = "increase"
  50. vals["already_cooperator"] = True
  51. return vals
  52. @api.model
  53. def create(self, vals):
  54. partner_obj = self.env["res.partner"]
  55. if not vals.get("partner_id"):
  56. cooperator = False
  57. if vals.get("email"):
  58. cooperator = partner_obj.get_cooperator_from_email(
  59. vals.get("email")
  60. )
  61. if cooperator:
  62. # TODO remove the following line once it has
  63. # been found a way to avoid double encoding
  64. cooperator = cooperator[0]
  65. vals["type"] = "subscription"
  66. vals = self.is_member(vals, cooperator)
  67. vals["partner_id"] = cooperator.id
  68. else:
  69. cooperator_id = vals.get("partner_id")
  70. cooperator = partner_obj.browse(cooperator_id)
  71. vals = self.is_member(vals, cooperator)
  72. if not cooperator.cooperator:
  73. cooperator.write({"cooperator": True})
  74. subscr_request = super(SubscriptionRequest, self).create(vals)
  75. mail_template_notif = subscr_request.get_mail_template_notif(False)
  76. mail_template_notif.send_mail(subscr_request.id)
  77. return subscr_request
  78. @api.model
  79. def create_comp_sub_req(self, vals):
  80. vals["name"] = vals["company_name"]
  81. if not vals.get("partner_id"):
  82. cooperator = self.env["res.partner"].get_cooperator_from_crn(
  83. vals.get("company_register_number")
  84. )
  85. if cooperator:
  86. vals["partner_id"] = cooperator.id
  87. vals["type"] = "increase"
  88. vals["already_cooperator"] = True
  89. subscr_request = super(SubscriptionRequest, self).create(vals)
  90. confirmation_mail_template = subscr_request.get_mail_template_notif(
  91. True
  92. )
  93. confirmation_mail_template.send_mail(subscr_request.id)
  94. return subscr_request
  95. def check_empty_string(self, value):
  96. if value is None or value is False or value == "":
  97. return False
  98. return True
  99. def check_iban(self, iban):
  100. try:
  101. if iban:
  102. validate_iban(iban)
  103. return True
  104. else:
  105. return False
  106. except ValidationError:
  107. return False
  108. @api.multi
  109. @api.depends("iban", "skip_control_ng")
  110. def _compute_validated_lines(self):
  111. for sub_request in self:
  112. validated = sub_request.skip_control_ng or self.check_iban(
  113. sub_request.iban
  114. )
  115. sub_request.validated = validated
  116. @api.multi
  117. @api.depends(
  118. "share_product_id", "share_product_id.list_price", "ordered_parts"
  119. )
  120. def _compute_subscription_amount(self):
  121. for sub_request in self:
  122. sub_request.subscription_amount = (
  123. sub_request.share_product_id.list_price
  124. * sub_request.ordered_parts
  125. )
  126. already_cooperator = fields.Boolean(
  127. string="I'm already cooperator",
  128. readonly=True,
  129. states={"draft": [("readonly", False)]},
  130. )
  131. name = fields.Char(
  132. string="Name",
  133. required=True,
  134. readonly=True,
  135. states={"draft": [("readonly", False)]},
  136. )
  137. firstname = fields.Char(
  138. string="Firstname",
  139. readonly=True,
  140. states={"draft": [("readonly", False)]},
  141. )
  142. lastname = fields.Char(
  143. string="Lastname",
  144. readonly=True,
  145. states={"draft": [("readonly", False)]},
  146. )
  147. birthdate = fields.Date(
  148. string="Birthdate",
  149. readonly=True,
  150. states={"draft": [("readonly", False)]},
  151. )
  152. gender = fields.Selection(
  153. [("male", _("Male")), ("female", _("Female")), ("other", _("Other"))],
  154. string="Gender",
  155. readonly=True,
  156. states={"draft": [("readonly", False)]},
  157. )
  158. type = fields.Selection(
  159. [
  160. ("new", "New Cooperator"),
  161. ("subscription", "Subscription"),
  162. ("increase", "Increase number of share"),
  163. ],
  164. string="Type",
  165. default="new",
  166. readonly=True,
  167. states={"draft": [("readonly", False)]},
  168. )
  169. state = fields.Selection(
  170. [
  171. ("draft", "Draft"),
  172. ("block", "Blocked"),
  173. ("done", "Done"),
  174. ("waiting", "Waiting"),
  175. ("transfer", "Transfer"),
  176. ("cancelled", "Cancelled"),
  177. ("paid", "paid"),
  178. ],
  179. string="State",
  180. required=True,
  181. default="draft",
  182. )
  183. email = fields.Char(
  184. string="Email",
  185. required=True,
  186. readonly=True,
  187. states={"draft": [("readonly", False)]},
  188. )
  189. iban = fields.Char(
  190. string="Account Number",
  191. readonly=True,
  192. states={"draft": [("readonly", False)]},
  193. )
  194. partner_id = fields.Many2one(
  195. "res.partner",
  196. string="Cooperator",
  197. readonly=True,
  198. states={"draft": [("readonly", False)]},
  199. )
  200. share_product_id = fields.Many2one(
  201. "product.product",
  202. string="Share type",
  203. domain=[("is_share", "=", True)],
  204. required=True,
  205. readonly=True,
  206. states={"draft": [("readonly", False)]},
  207. )
  208. share_short_name = fields.Char(
  209. related="share_product_id.short_name",
  210. string="Share type name",
  211. readonly=True,
  212. states={"draft": [("readonly", False)]},
  213. )
  214. share_unit_price = fields.Float(
  215. related="share_product_id.list_price",
  216. string="Share price",
  217. readonly=True,
  218. states={"draft": [("readonly", False)]},
  219. )
  220. subscription_amount = fields.Monetary(
  221. compute="_compute_subscription_amount",
  222. string="Subscription amount",
  223. currency_field="company_currency_id",
  224. readonly=True,
  225. states={"draft": [("readonly", False)]},
  226. )
  227. ordered_parts = fields.Integer(
  228. string="Number of Share",
  229. required=True,
  230. readonly=True,
  231. default=1,
  232. states={"draft": [("readonly", False)]},
  233. )
  234. address = fields.Char(
  235. string="Address",
  236. required=True,
  237. readonly=True,
  238. states={"draft": [("readonly", False)]},
  239. )
  240. city = fields.Char(
  241. string="City",
  242. required=True,
  243. readonly=True,
  244. states={"draft": [("readonly", False)]},
  245. )
  246. zip_code = fields.Char(
  247. string="Zip Code",
  248. required=True,
  249. readonly=True,
  250. states={"draft": [("readonly", False)]},
  251. )
  252. country_id = fields.Many2one(
  253. "res.country",
  254. string="Country",
  255. ondelete="restrict",
  256. required=True,
  257. readonly=True,
  258. states={"draft": [("readonly", False)]},
  259. )
  260. phone = fields.Char(
  261. string="Phone", readonly=True, states={"draft": [("readonly", False)]}
  262. )
  263. user_id = fields.Many2one("res.users", string="Responsible", readonly=True)
  264. # todo rename to valid_subscription_request
  265. validated = fields.Boolean(
  266. compute="_compute_validated_lines",
  267. string="Valid Subscription request?",
  268. readonly=True,
  269. )
  270. skip_control_ng = fields.Boolean(
  271. string="Skip control",
  272. help="if this field is checked then no"
  273. " control will be done on the national"
  274. " register number and on the iban bank"
  275. " account. To be done in case of the id"
  276. " card is from abroad or in case of"
  277. " a passport",
  278. )
  279. lang = fields.Selection(
  280. _lang_get,
  281. string="Language",
  282. required=True,
  283. readonly=True,
  284. states={"draft": [("readonly", False)]},
  285. default=lambda self: self.env["res.company"]
  286. ._company_default_get()
  287. .default_lang_id.code,
  288. )
  289. date = fields.Date(
  290. string="Subscription date request",
  291. required=True,
  292. readonly=True,
  293. states={"draft": [("readonly", False)]},
  294. default=lambda self: datetime.strftime(datetime.now(), "%Y-%m-%d"),
  295. )
  296. company_id = fields.Many2one(
  297. "res.company",
  298. string="Company",
  299. required=True,
  300. change_default=True,
  301. readonly=True,
  302. default=lambda self: self.env["res.company"]._company_default_get(),
  303. )
  304. company_currency_id = fields.Many2one(
  305. "res.currency",
  306. related="company_id.currency_id",
  307. string="Company Currency",
  308. readonly=True,
  309. )
  310. is_company = fields.Boolean(
  311. string="Is a company",
  312. readonly=True,
  313. states={"draft": [("readonly", False)]},
  314. )
  315. is_operation = fields.Boolean(
  316. string="Is an operation",
  317. readonly=True,
  318. states={"draft": [("readonly", False)]},
  319. )
  320. company_name = fields.Char(
  321. string="Company name",
  322. readonly=True,
  323. states={"draft": [("readonly", False)]},
  324. )
  325. company_email = fields.Char(
  326. string="Company email",
  327. readonly=True,
  328. states={"draft": [("readonly", False)]},
  329. )
  330. company_register_number = fields.Char(
  331. string="Company register number",
  332. readonly=True,
  333. states={"draft": [("readonly", False)]},
  334. )
  335. company_type = fields.Selection(
  336. [("", "")],
  337. string="Company type",
  338. readonly=True,
  339. states={"draft": [("readonly", False)]},
  340. )
  341. same_address = fields.Boolean(
  342. string="Same address",
  343. readonly=True,
  344. states={"draft": [("readonly", False)]},
  345. )
  346. activities_address = fields.Char(
  347. string="Activities address",
  348. readonly=True,
  349. states={"draft": [("readonly", False)]},
  350. )
  351. activities_city = fields.Char(
  352. string="Activities city",
  353. readonly=True,
  354. states={"draft": [("readonly", False)]},
  355. )
  356. activities_zip_code = fields.Char(
  357. string="Activities zip Code",
  358. readonly=True,
  359. states={"draft": [("readonly", False)]},
  360. )
  361. activities_country_id = fields.Many2one(
  362. "res.country",
  363. string="Activities country",
  364. ondelete="restrict",
  365. readonly=True,
  366. states={"draft": [("readonly", False)]},
  367. )
  368. contact_person_function = fields.Char(
  369. string="Function",
  370. readonly=True,
  371. states={"draft": [("readonly", False)]},
  372. )
  373. operation_request_id = fields.Many2one(
  374. "operation.request",
  375. string="Operation Request",
  376. readonly=True,
  377. states={"draft": [("readonly", False)]},
  378. )
  379. capital_release_request = fields.One2many(
  380. "account.invoice",
  381. "subscription_request",
  382. string="Capital release request",
  383. readonly=True,
  384. states={"draft": [("readonly", False)]},
  385. )
  386. capital_release_request_date = fields.Date(
  387. string="Force the capital " "release request date",
  388. help="Keep empty to use the " "current date",
  389. copy=False,
  390. readonly=True,
  391. states={"draft": [("readonly", False)]},
  392. )
  393. source = fields.Selection(
  394. [
  395. ("website", "Website"),
  396. ("crm", "CRM"),
  397. ("manual", "Manual"),
  398. ("operation", "Operation"),
  399. ],
  400. string="Source",
  401. default="website",
  402. readonly=True,
  403. states={"draft": [("readonly", False)]},
  404. )
  405. data_policy_approved = fields.Boolean(
  406. string="Data Policy Approved", default=False
  407. )
  408. internal_rules_approved = fields.Boolean(
  409. string="Approved Internal Rules", default=False
  410. )
  411. financial_risk_approved = fields.Boolean(
  412. string="Financial Risk Approved", default=False
  413. )
  414. _order = "id desc"
  415. def get_person_info(self, partner):
  416. self.firstname = partner.firstname
  417. self.name = partner.name
  418. self.lastname = partner.lastname
  419. self.email = partner.email
  420. self.birthdate = partner.birthdate_date
  421. self.gender = partner.gender
  422. self.address = partner.street
  423. self.city = partner.city
  424. self.zip_code = partner.zip
  425. self.country_id = partner.country_id
  426. self.phone = partner.phone
  427. self.lang = partner.lang
  428. @api.onchange("partner_id")
  429. def onchange_partner(self):
  430. partner = self.partner_id
  431. if partner:
  432. self.is_company = partner.is_company
  433. self.already_cooperator = partner.member
  434. if partner.bank_ids:
  435. self.iban = partner.bank_ids[0].acc_number
  436. if partner.member:
  437. self.type = "increase"
  438. if partner.is_company:
  439. self.company_name = partner.name
  440. self.company_email = partner.email
  441. self.company_register_number = partner.company_register_number
  442. representative = partner.get_representative()
  443. self.get_person_info(representative)
  444. self.contact_person_function = representative.function
  445. else:
  446. self.get_person_info(partner)
  447. # declare this function in order to be overriden
  448. def get_eater_vals(self, partner, share_product_id): # noqa
  449. return {}
  450. def _prepare_invoice_line(self, product, partner, qty):
  451. self.ensure_one()
  452. account = (
  453. product.property_account_income_id
  454. or product.categ_id.property_account_income_categ_id
  455. )
  456. if not account:
  457. raise UserError(
  458. _(
  459. "Please define income account for this product:"
  460. ' "%s" (id:%d) - or for its category: "%s".'
  461. )
  462. % (product.name, product.id, product.categ_id.name)
  463. )
  464. fpos = partner.property_account_position_id
  465. if fpos:
  466. account = fpos.map_account(account)
  467. res = {
  468. "name": product.name,
  469. "account_id": account.id,
  470. "price_unit": product.lst_price,
  471. "quantity": qty,
  472. "uom_id": product.uom_id.id,
  473. "product_id": product.id or False,
  474. }
  475. return res
  476. def get_capital_release_mail_template(self):
  477. template = "easy_my_coop.email_template_release_capital"
  478. return self.env.ref(template, False)
  479. def send_capital_release_request(self, invoice):
  480. email_template = self.get_capital_release_mail_template()
  481. # we send the email with the capital release request in attachment
  482. # TODO remove sudo() and give necessary access right
  483. email_template.sudo().send_mail(invoice.id, True)
  484. invoice.sent = True
  485. def get_journal(self):
  486. return self.env.ref("easy_my_coop.subscription_journal")
  487. def get_accounting_account(self):
  488. account_obj = self.env["account.account"]
  489. if self.company_id.property_cooperator_account:
  490. account = self.company_id.property_cooperator_account
  491. else:
  492. accounts = account_obj.search([("code", "=", "416000")])
  493. if accounts:
  494. account = accounts[0]
  495. else:
  496. raise UserError(
  497. _("You must set a cooperator account on you company.")
  498. )
  499. return account
  500. def get_invoice_vals(self, partner):
  501. return {
  502. "partner_id": partner.id,
  503. "journal_id": self.get_journal().id,
  504. "account_id": self.get_accounting_account().id,
  505. "type": "out_invoice",
  506. "release_capital_request": True,
  507. "subscription_request": self.id,
  508. }
  509. def create_invoice(self, partner):
  510. # creating invoice and invoice lines
  511. invoice_vals = self.get_invoice_vals(partner)
  512. if self.capital_release_request_date:
  513. invoice_vals["date_invoice"] = self.capital_release_request_date
  514. invoice = self.env["account.invoice"].create(invoice_vals)
  515. vals = self._prepare_invoice_line(
  516. self.share_product_id, partner, self.ordered_parts
  517. )
  518. vals["invoice_id"] = invoice.id
  519. self.env["account.invoice.line"].create(vals)
  520. # validate the capital release request
  521. invoice.action_invoice_open()
  522. self.send_capital_release_request(invoice)
  523. return invoice
  524. def get_partner_company_vals(self):
  525. partner_vals = {
  526. "name": self.company_name,
  527. "last_name": self.company_name,
  528. "is_company": self.is_company,
  529. "company_register_number": self.company_register_number, # noqa
  530. "cooperator": True,
  531. "street": self.address,
  532. "zip": self.zip_code,
  533. "city": self.city,
  534. "email": self.company_email,
  535. "out_inv_comm_type": "bba",
  536. "customer": self.share_product_id.customer,
  537. "country_id": self.country_id.id,
  538. "lang": self.lang,
  539. "data_policy_approved": self.data_policy_approved,
  540. "internal_rules_approved": self.internal_rules_approved,
  541. "financial_risk_approved": self.financial_risk_approved,
  542. }
  543. return partner_vals
  544. def get_partner_vals(self):
  545. partner_vals = {
  546. "name": self.name,
  547. "firstname": self.firstname,
  548. "lastname": self.lastname,
  549. "street": self.address,
  550. "zip": self.zip_code,
  551. "email": self.email,
  552. "gender": self.gender,
  553. "cooperator": True,
  554. "city": self.city,
  555. "phone": self.phone,
  556. "country_id": self.country_id.id,
  557. "lang": self.lang,
  558. "birthdate_date": self.birthdate,
  559. "customer": self.share_product_id.customer,
  560. "data_policy_approved": self.data_policy_approved,
  561. "internal_rules_approved": self.internal_rules_approved,
  562. "financial_risk_approved": self.financial_risk_approved,
  563. }
  564. return partner_vals
  565. def get_representative_vals(self):
  566. contact_vals = {
  567. "name": self.name,
  568. "firstname": self.firstname,
  569. "lastname": self.lastname,
  570. "customer": False,
  571. "is_company": False,
  572. "cooperator": True,
  573. "street": self.address,
  574. "gender": self.gender,
  575. "zip": self.zip_code,
  576. "city": self.city,
  577. "phone": self.phone,
  578. "email": self.email,
  579. "country_id": self.country_id.id,
  580. "out_inv_comm_type": "bba",
  581. "out_inv_comm_algorithm": "random",
  582. "lang": self.lang,
  583. "birthdate_date": self.birthdate,
  584. "parent_id": self.partner_id.id,
  585. "representative": True,
  586. "function": self.contact_person_function,
  587. "type": "representative",
  588. "data_policy_approved": self.data_policy_approved,
  589. "internal_rules_approved": self.internal_rules_approved,
  590. "financial_risk_approved": self.financial_risk_approved,
  591. }
  592. return contact_vals
  593. def create_coop_partner(self):
  594. partner_obj = self.env["res.partner"]
  595. if self.is_company:
  596. partner_vals = self.get_partner_company_vals()
  597. else:
  598. partner_vals = self.get_partner_vals()
  599. partner = partner_obj.create(partner_vals)
  600. if self.iban:
  601. self.env["res.partner.bank"].create(
  602. {"partner_id": partner.id, "acc_number": self.iban}
  603. )
  604. return partner
  605. def set_membership(self):
  606. # To be overridden
  607. return True
  608. @api.multi
  609. def validate_subscription_request(self):
  610. self.ensure_one()
  611. # todo rename to validate (careful with iwp dependencies)
  612. partner_obj = self.env["res.partner"]
  613. if self.ordered_parts <= 0:
  614. raise UserError(_("Number of share must be greater than 0."))
  615. if self.partner_id:
  616. partner = self.partner_id
  617. else:
  618. partner = None
  619. domain = []
  620. if self.already_cooperator:
  621. raise UserError(
  622. _(
  623. "The checkbox already cooperator is"
  624. " checked please select a cooperator."
  625. )
  626. )
  627. elif self.is_company and self.company_register_number:
  628. domain = [
  629. (
  630. "company_register_number",
  631. "=",
  632. self.company_register_number,
  633. )
  634. ] # noqa
  635. elif not self.is_company and self.email:
  636. domain = [("email", "=", self.email)]
  637. if domain:
  638. partner = partner_obj.search(domain)
  639. if not partner:
  640. partner = self.create_coop_partner()
  641. self.partner_id = partner
  642. else:
  643. partner = partner[0]
  644. partner.cooperator = True
  645. if self.is_company and not partner.has_representative():
  646. contact = False
  647. if self.email:
  648. domain = [("email", "=", self.email)]
  649. contact = partner_obj.search(domain)
  650. if contact:
  651. contact.type = "representative"
  652. if not contact:
  653. contact_vals = self.get_representative_vals()
  654. partner_obj.create(contact_vals)
  655. else:
  656. if len(contact) > 1:
  657. raise UserError(
  658. _(
  659. "There is two different persons with the"
  660. " same national register number. Please"
  661. " proceed to a merge before to continue"
  662. )
  663. )
  664. if contact.parent_id and contact.parent_id.id != partner.id:
  665. raise UserError(
  666. _(
  667. "This contact person is already defined"
  668. " for another company. Please select"
  669. " another contact"
  670. )
  671. )
  672. else:
  673. contact.write(
  674. {"parent_id": partner.id, "representative": True}
  675. )
  676. invoice = self.create_invoice(partner)
  677. self.write({"state": "done"})
  678. self.set_membership()
  679. return invoice
  680. @api.multi
  681. def block_subscription_request(self):
  682. self.ensure_one()
  683. self.write({"state": "block"})
  684. @api.multi
  685. def unblock_subscription_request(self):
  686. self.ensure_one()
  687. self.write({"state": "draft"})
  688. @api.multi
  689. def cancel_subscription_request(self):
  690. self.ensure_one()
  691. self.write({"state": "cancelled"})
  692. @api.multi
  693. def put_on_waiting_list(self):
  694. self.ensure_one()
  695. waiting_list_mail_template = self.env.ref(
  696. "easy_my_coop.email_template_waiting_list", False
  697. )
  698. waiting_list_mail_template.send_mail(self.id, True)
  699. self.write({"state": "waiting"})
  700. # todo move to share_line.py
  701. class ShareLine(models.Model):
  702. _name = "share.line"
  703. _description = "Share line"
  704. @api.multi
  705. def _compute_total_line(self):
  706. res = {}
  707. for line in self:
  708. line.total_amount_line = line.share_unit_price * line.share_number
  709. return res
  710. share_product_id = fields.Many2one(
  711. "product.product", string="Share type", required=True, readonly=True
  712. )
  713. share_number = fields.Integer(
  714. string="Number of Share", required=True, readonly=True
  715. )
  716. share_short_name = fields.Char(
  717. related="share_product_id.short_name",
  718. string="Share type name",
  719. readonly=True,
  720. )
  721. share_unit_price = fields.Monetary(
  722. string="Share price",
  723. currency_field="company_currency_id",
  724. readonly=True,
  725. )
  726. effective_date = fields.Date(string="Effective Date", readonly=True)
  727. partner_id = fields.Many2one(
  728. "res.partner",
  729. string="Cooperator",
  730. required=True,
  731. ondelete="cascade",
  732. readonly=True,
  733. )
  734. total_amount_line = fields.Monetary(
  735. string="Total amount line",
  736. currency_field="company_currency_id",
  737. compute="_compute_total_line",
  738. )
  739. company_id = fields.Many2one(
  740. "res.company",
  741. string="Company",
  742. required=True,
  743. change_default=True,
  744. readonly=True,
  745. default=lambda self: self.env["res.company"]._company_default_get(),
  746. )
  747. company_currency_id = fields.Many2one(
  748. "res.currency",
  749. string="Company Currency",
  750. related="company_id.currency_id",
  751. readonly=True,
  752. )
  753. # todo move to subscription_register.py
  754. class SubscriptionRegister(models.Model):
  755. _name = "subscription.register"
  756. _description = "Subscription register"
  757. @api.multi
  758. def _compute_total_line(self):
  759. for line in self:
  760. line.total_amount_line = line.share_unit_price * line.quantity
  761. name = fields.Char(string="Number Operation", required=True, readonly=True)
  762. register_number_operation = fields.Integer(
  763. string="Register Number Operation", required=True, readonly=True
  764. )
  765. partner_id = fields.Many2one(
  766. "res.partner", string="Cooperator", required=True, readonly=True
  767. )
  768. partner_id_to = fields.Many2one(
  769. "res.partner", string="Transfered to", readonly=True
  770. )
  771. date = fields.Date(
  772. string="Subscription Date", required=True, readonly=True
  773. )
  774. quantity = fields.Integer(string="Number of share", readonly=True)
  775. share_unit_price = fields.Monetary(
  776. string="Share price",
  777. currency_field="company_currency_id",
  778. readonly=True,
  779. )
  780. total_amount_line = fields.Monetary(
  781. string="Total amount line",
  782. currency_field="company_currency_id",
  783. compute="_compute_total_line",
  784. )
  785. share_product_id = fields.Many2one(
  786. "product.product",
  787. string="Share type",
  788. required=True,
  789. readonly=True,
  790. domain=[("is_share", "=", True)],
  791. )
  792. share_short_name = fields.Char(
  793. related="share_product_id.short_name",
  794. string="Share type name",
  795. readonly=True,
  796. )
  797. share_to_product_id = fields.Many2one(
  798. "product.product",
  799. string="Share to type",
  800. readonly=True,
  801. domain=[("is_share", "=", True)],
  802. )
  803. share_to_short_name = fields.Char(
  804. related="share_to_product_id.short_name",
  805. string="Share to type name",
  806. readonly=True,
  807. )
  808. quantity_to = fields.Integer(string="Number of share to", readonly=True)
  809. share_to_unit_price = fields.Monetary(
  810. string="Share to price",
  811. currency_field="company_currency_id",
  812. readonly=True,
  813. )
  814. type = fields.Selection(
  815. [
  816. ("subscription", "Subscription"),
  817. ("transfer", "Transfer"),
  818. ("sell_back", "Sell Back"),
  819. ("convert", "Conversion"),
  820. ],
  821. string="Operation Type",
  822. readonly=True,
  823. )
  824. company_id = fields.Many2one(
  825. "res.company",
  826. string="Company",
  827. required=True,
  828. change_default=True,
  829. readonly=True,
  830. default=lambda self: self.env["res.company"]._company_default_get(),
  831. )
  832. company_currency_id = fields.Many2one(
  833. "res.currency",
  834. related="company_id.currency_id",
  835. string="Company Currency",
  836. readonly=True,
  837. )
  838. user_id = fields.Many2one(
  839. "res.users",
  840. string="Responsible",
  841. readonly=True,
  842. default=lambda self: self.env.user,
  843. )
  844. _order = "register_number_operation asc"
  845. @api.model
  846. def read_group(
  847. self,
  848. domain,
  849. fields,
  850. groupby,
  851. offset=0,
  852. limit=None,
  853. orderby=False,
  854. lazy=True,
  855. ):
  856. if "share_unit_price" in fields:
  857. fields.remove("share_unit_price")
  858. if "register_number_operation" in fields:
  859. fields.remove("register_number_operation")
  860. res = super(SubscriptionRegister, self).read_group(
  861. domain,
  862. fields,
  863. groupby,
  864. offset=offset,
  865. limit=limit,
  866. orderby=orderby,
  867. lazy=lazy,
  868. )
  869. if "total_amount_line" in fields:
  870. for line in res:
  871. if "__domain" in line:
  872. lines = self.search(line["__domain"])
  873. inv_value = 0.0
  874. for line2 in lines:
  875. inv_value += line2.total_amount_line
  876. line["total_amount_line"] = inv_value
  877. return res