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.

954 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. ('company_type', '=', 'person')]
  650. contact = partner_obj.search(domain)
  651. if len(contact) < 2:
  652. contact.type = "representative"
  653. else:
  654. raise UserError(
  655. _(
  656. "You have duplicate contact with email %s" % self.email
  657. )
  658. )
  659. if not contact:
  660. contact_vals = self.get_representative_vals()
  661. partner_obj.create(contact_vals)
  662. else:
  663. if len(contact) > 1:
  664. raise UserError(
  665. _(
  666. "There is two different persons with the"
  667. " same national register number. Please"
  668. " proceed to a merge before to continue"
  669. )
  670. )
  671. if contact.parent_id and contact.parent_id.id != partner.id:
  672. raise UserError(
  673. _(
  674. "This contact person is already defined"
  675. " for another company. Please select"
  676. " another contact"
  677. )
  678. )
  679. else:
  680. contact.write(
  681. {"parent_id": partner.id, "representative": True}
  682. )
  683. invoice = self.create_invoice(partner)
  684. self.write({"state": "done"})
  685. self.set_membership()
  686. return invoice
  687. @api.multi
  688. def block_subscription_request(self):
  689. self.ensure_one()
  690. self.write({"state": "block"})
  691. @api.multi
  692. def unblock_subscription_request(self):
  693. self.ensure_one()
  694. self.write({"state": "draft"})
  695. @api.multi
  696. def cancel_subscription_request(self):
  697. self.ensure_one()
  698. self.write({"state": "cancelled"})
  699. @api.multi
  700. def put_on_waiting_list(self):
  701. self.ensure_one()
  702. waiting_list_mail_template = self.env.ref(
  703. "easy_my_coop.email_template_waiting_list", False
  704. )
  705. waiting_list_mail_template.send_mail(self.id, True)
  706. self.write({"state": "waiting"})
  707. # todo move to share_line.py
  708. class ShareLine(models.Model):
  709. _name = "share.line"
  710. _description = "Share line"
  711. @api.multi
  712. def _compute_total_line(self):
  713. res = {}
  714. for line in self:
  715. line.total_amount_line = line.share_unit_price * line.share_number
  716. return res
  717. share_product_id = fields.Many2one(
  718. "product.product", string="Share type", required=True, readonly=True
  719. )
  720. share_number = fields.Integer(
  721. string="Number of Share", required=True, readonly=True
  722. )
  723. share_short_name = fields.Char(
  724. related="share_product_id.short_name",
  725. string="Share type name",
  726. readonly=True,
  727. )
  728. share_unit_price = fields.Monetary(
  729. string="Share price",
  730. currency_field="company_currency_id",
  731. readonly=True,
  732. )
  733. effective_date = fields.Date(string="Effective Date", readonly=True)
  734. partner_id = fields.Many2one(
  735. "res.partner",
  736. string="Cooperator",
  737. required=True,
  738. ondelete="cascade",
  739. readonly=True,
  740. )
  741. total_amount_line = fields.Monetary(
  742. string="Total amount line",
  743. currency_field="company_currency_id",
  744. compute="_compute_total_line",
  745. )
  746. company_id = fields.Many2one(
  747. "res.company",
  748. string="Company",
  749. required=True,
  750. change_default=True,
  751. readonly=True,
  752. default=lambda self: self.env["res.company"]._company_default_get(),
  753. )
  754. company_currency_id = fields.Many2one(
  755. "res.currency",
  756. string="Company Currency",
  757. related="company_id.currency_id",
  758. readonly=True,
  759. )
  760. # todo move to subscription_register.py
  761. class SubscriptionRegister(models.Model):
  762. _name = "subscription.register"
  763. _description = "Subscription register"
  764. @api.multi
  765. def _compute_total_line(self):
  766. for line in self:
  767. line.total_amount_line = line.share_unit_price * line.quantity
  768. name = fields.Char(string="Number Operation", required=True, readonly=True)
  769. register_number_operation = fields.Integer(
  770. string="Register Number Operation", required=True, readonly=True
  771. )
  772. partner_id = fields.Many2one(
  773. "res.partner", string="Cooperator", required=True, readonly=True
  774. )
  775. partner_id_to = fields.Many2one(
  776. "res.partner", string="Transfered to", readonly=True
  777. )
  778. date = fields.Date(
  779. string="Subscription Date", required=True, readonly=True
  780. )
  781. quantity = fields.Integer(string="Number of share", readonly=True)
  782. share_unit_price = fields.Monetary(
  783. string="Share price",
  784. currency_field="company_currency_id",
  785. readonly=True,
  786. )
  787. total_amount_line = fields.Monetary(
  788. string="Total amount line",
  789. currency_field="company_currency_id",
  790. compute="_compute_total_line",
  791. )
  792. share_product_id = fields.Many2one(
  793. "product.product",
  794. string="Share type",
  795. required=True,
  796. readonly=True,
  797. domain=[("is_share", "=", True)],
  798. )
  799. share_short_name = fields.Char(
  800. related="share_product_id.short_name",
  801. string="Share type name",
  802. readonly=True,
  803. )
  804. share_to_product_id = fields.Many2one(
  805. "product.product",
  806. string="Share to type",
  807. readonly=True,
  808. domain=[("is_share", "=", True)],
  809. )
  810. share_to_short_name = fields.Char(
  811. related="share_to_product_id.short_name",
  812. string="Share to type name",
  813. readonly=True,
  814. )
  815. quantity_to = fields.Integer(string="Number of share to", readonly=True)
  816. share_to_unit_price = fields.Monetary(
  817. string="Share to price",
  818. currency_field="company_currency_id",
  819. readonly=True,
  820. )
  821. type = fields.Selection(
  822. [
  823. ("subscription", "Subscription"),
  824. ("transfer", "Transfer"),
  825. ("sell_back", "Sell Back"),
  826. ("convert", "Conversion"),
  827. ],
  828. string="Operation Type",
  829. readonly=True,
  830. )
  831. company_id = fields.Many2one(
  832. "res.company",
  833. string="Company",
  834. required=True,
  835. change_default=True,
  836. readonly=True,
  837. default=lambda self: self.env["res.company"]._company_default_get(),
  838. )
  839. company_currency_id = fields.Many2one(
  840. "res.currency",
  841. related="company_id.currency_id",
  842. string="Company Currency",
  843. readonly=True,
  844. )
  845. user_id = fields.Many2one(
  846. "res.users",
  847. string="Responsible",
  848. readonly=True,
  849. default=lambda self: self.env.user,
  850. )
  851. _order = "register_number_operation asc"
  852. @api.model
  853. def read_group(
  854. self,
  855. domain,
  856. fields,
  857. groupby,
  858. offset=0,
  859. limit=None,
  860. orderby=False,
  861. lazy=True,
  862. ):
  863. if "share_unit_price" in fields:
  864. fields.remove("share_unit_price")
  865. if "register_number_operation" in fields:
  866. fields.remove("register_number_operation")
  867. res = super(SubscriptionRegister, self).read_group(
  868. domain,
  869. fields,
  870. groupby,
  871. offset=offset,
  872. limit=limit,
  873. orderby=orderby,
  874. lazy=lazy,
  875. )
  876. if "total_amount_line" in fields:
  877. for line in res:
  878. if "__domain" in line:
  879. lines = self.search(line["__domain"])
  880. inv_value = 0.0
  881. for line2 in lines:
  882. inv_value += line2.total_amount_line
  883. line["total_amount_line"] = inv_value
  884. return res