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. _REQUIRED = [
  10. "email",
  11. "firstname",
  12. "lastname",
  13. "birthdate",
  14. "address",
  15. "share_product_id",
  16. "ordered_parts",
  17. "zip_code",
  18. "city",
  19. "iban",
  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. def get_required_field(self):
  31. required_fields = _REQUIRED
  32. company = self.env["res.company"]._company_default_get()
  33. if company.data_policy_approval_required:
  34. required_fields.append("data_policy_approved")
  35. if company.internal_rules_approval_required:
  36. required_fields.append("internal_rules_approved")
  37. if company.financial_risk_approval_required:
  38. required_fields.append('financial_risk_approved')
  39. return required_fields
  40. def get_mail_template_notif(self, is_company=False):
  41. if is_company:
  42. mail_template = "easy_my_coop.email_template_confirmation_company"
  43. else:
  44. mail_template = "easy_my_coop.email_template_confirmation"
  45. return self.env.ref(mail_template, False)
  46. def is_member(self, vals, cooperator):
  47. if cooperator.member:
  48. vals["type"] = "increase"
  49. vals["already_cooperator"] = True
  50. return vals
  51. @api.model
  52. def create(self, vals):
  53. partner_obj = self.env["res.partner"]
  54. if not vals.get("partner_id"):
  55. cooperator = False
  56. if vals.get("email"):
  57. cooperator = partner_obj.get_cooperator_from_email(
  58. vals.get("email")
  59. )
  60. if cooperator:
  61. # TODO remove the following line once it has
  62. # been found a way to avoid double encoding
  63. cooperator = cooperator[0]
  64. vals["type"] = "subscription"
  65. vals = self.is_member(vals, cooperator)
  66. vals["partner_id"] = cooperator.id
  67. else:
  68. cooperator_id = vals.get("partner_id")
  69. cooperator = partner_obj.browse(cooperator_id)
  70. vals = self.is_member(vals, cooperator)
  71. if not cooperator.cooperator:
  72. cooperator.write({"cooperator": True})
  73. subscr_request = super(SubscriptionRequest, self).create(vals)
  74. mail_template_notif = subscr_request.get_mail_template_notif(False)
  75. mail_template_notif.send_mail(subscr_request.id)
  76. return subscr_request
  77. @api.model
  78. def create_comp_sub_req(self, vals):
  79. vals["name"] = vals["company_name"]
  80. if not vals.get("partner_id"):
  81. cooperator = self.env["res.partner"].get_cooperator_from_crn(
  82. vals.get("company_register_number")
  83. )
  84. if cooperator:
  85. vals["partner_id"] = cooperator.id
  86. vals["type"] = "increase"
  87. vals["already_cooperator"] = True
  88. subscr_request = super(SubscriptionRequest, self).create(vals)
  89. confirmation_mail_template = subscr_request.get_mail_template_notif(
  90. True
  91. )
  92. confirmation_mail_template.send_mail(subscr_request.id)
  93. return subscr_request
  94. def check_empty_string(self, value):
  95. if value is None or value is False or value == "":
  96. return False
  97. return True
  98. def check_iban(self, iban):
  99. try:
  100. if iban:
  101. validate_iban(iban)
  102. return True
  103. else:
  104. return False
  105. except ValidationError:
  106. return False
  107. @api.multi
  108. @api.depends("iban", "skip_control_ng")
  109. def _compute_validated_lines(self):
  110. for sub_request in self:
  111. validated = sub_request.skip_control_ng or self.check_iban(
  112. sub_request.iban
  113. )
  114. sub_request.validated = validated
  115. @api.multi
  116. @api.depends(
  117. "share_product_id", "share_product_id.list_price", "ordered_parts"
  118. )
  119. def _compute_subscription_amount(self):
  120. for sub_request in self:
  121. sub_request.subscription_amount = (
  122. sub_request.share_product_id.list_price
  123. * sub_request.ordered_parts
  124. )
  125. already_cooperator = fields.Boolean(
  126. string="I'm already cooperator",
  127. readonly=True,
  128. states={"draft": [("readonly", False)]},
  129. )
  130. name = fields.Char(
  131. string="Name",
  132. required=True,
  133. readonly=True,
  134. states={"draft": [("readonly", False)]},
  135. )
  136. firstname = fields.Char(
  137. string="Firstname",
  138. readonly=True,
  139. states={"draft": [("readonly", False)]},
  140. )
  141. lastname = fields.Char(
  142. string="Lastname",
  143. readonly=True,
  144. states={"draft": [("readonly", False)]},
  145. )
  146. birthdate = fields.Date(
  147. string="Birthdate",
  148. readonly=True,
  149. states={"draft": [("readonly", False)]},
  150. )
  151. gender = fields.Selection(
  152. [("male", _("Male")), ("female", _("Female")), ("other", _("Other"))],
  153. string="Gender",
  154. readonly=True,
  155. states={"draft": [("readonly", False)]},
  156. )
  157. type = fields.Selection(
  158. [
  159. ("new", "New Cooperator"),
  160. ("subscription", "Subscription"),
  161. ("increase", "Increase number of share"),
  162. ],
  163. string="Type",
  164. default="new",
  165. readonly=True,
  166. states={"draft": [("readonly", False)]},
  167. )
  168. state = fields.Selection(
  169. [
  170. ("draft", "Draft"),
  171. ("block", "Blocked"),
  172. ("done", "Done"),
  173. ("waiting", "Waiting"),
  174. ("transfer", "Transfer"),
  175. ("cancelled", "Cancelled"),
  176. ("paid", "paid"),
  177. ],
  178. string="State",
  179. required=True,
  180. default="draft",
  181. )
  182. email = fields.Char(
  183. string="Email",
  184. required=True,
  185. readonly=True,
  186. states={"draft": [("readonly", False)]},
  187. )
  188. iban = fields.Char(
  189. string="Account Number",
  190. readonly=True,
  191. states={"draft": [("readonly", False)]},
  192. )
  193. partner_id = fields.Many2one(
  194. "res.partner",
  195. string="Cooperator",
  196. readonly=True,
  197. states={"draft": [("readonly", False)]},
  198. )
  199. share_product_id = fields.Many2one(
  200. "product.product",
  201. string="Share type",
  202. domain=[("is_share", "=", True)],
  203. required=True,
  204. readonly=True,
  205. states={"draft": [("readonly", False)]},
  206. )
  207. share_short_name = fields.Char(
  208. related="share_product_id.short_name",
  209. string="Share type name",
  210. readonly=True,
  211. states={"draft": [("readonly", False)]},
  212. )
  213. share_unit_price = fields.Float(
  214. related="share_product_id.list_price",
  215. string="Share price",
  216. readonly=True,
  217. states={"draft": [("readonly", False)]},
  218. )
  219. subscription_amount = fields.Monetary(
  220. compute="_compute_subscription_amount",
  221. string="Subscription amount",
  222. currency_field="company_currency_id",
  223. readonly=True,
  224. states={"draft": [("readonly", False)]},
  225. )
  226. ordered_parts = fields.Integer(
  227. string="Number of Share",
  228. required=True,
  229. readonly=True,
  230. default=1,
  231. states={"draft": [("readonly", False)]},
  232. )
  233. address = fields.Char(
  234. string="Address",
  235. required=True,
  236. readonly=True,
  237. states={"draft": [("readonly", False)]},
  238. )
  239. city = fields.Char(
  240. string="City",
  241. required=True,
  242. readonly=True,
  243. states={"draft": [("readonly", False)]},
  244. )
  245. zip_code = fields.Char(
  246. string="Zip Code",
  247. required=True,
  248. readonly=True,
  249. states={"draft": [("readonly", False)]},
  250. )
  251. country_id = fields.Many2one(
  252. "res.country",
  253. string="Country",
  254. ondelete="restrict",
  255. required=True,
  256. readonly=True,
  257. states={"draft": [("readonly", False)]},
  258. )
  259. phone = fields.Char(
  260. string="Phone", readonly=True, states={"draft": [("readonly", False)]}
  261. )
  262. user_id = fields.Many2one("res.users", string="Responsible", readonly=True)
  263. # todo rename to valid_subscription_request
  264. validated = fields.Boolean(
  265. compute="_compute_validated_lines",
  266. string="Valid Subscription request?",
  267. readonly=True,
  268. )
  269. skip_control_ng = fields.Boolean(
  270. string="Skip control",
  271. help="if this field is checked then no"
  272. " control will be done on the national"
  273. " register number and on the iban bank"
  274. " account. To be done in case of the id"
  275. " card is from abroad or in case of"
  276. " a passport",
  277. )
  278. lang = fields.Selection(
  279. _lang_get,
  280. string="Language",
  281. required=True,
  282. readonly=True,
  283. states={"draft": [("readonly", False)]},
  284. default=lambda self: self.env["res.company"]
  285. ._company_default_get()
  286. .default_lang_id.code,
  287. )
  288. date = fields.Date(
  289. string="Subscription date request",
  290. required=True,
  291. readonly=True,
  292. states={"draft": [("readonly", False)]},
  293. default=lambda self: datetime.strftime(datetime.now(), "%Y-%m-%d"),
  294. )
  295. company_id = fields.Many2one(
  296. "res.company",
  297. string="Company",
  298. required=True,
  299. change_default=True,
  300. readonly=True,
  301. default=lambda self: self.env["res.company"]._company_default_get(),
  302. )
  303. company_currency_id = fields.Many2one(
  304. "res.currency",
  305. related="company_id.currency_id",
  306. string="Company Currency",
  307. readonly=True,
  308. )
  309. is_company = fields.Boolean(
  310. string="Is a company",
  311. readonly=True,
  312. states={"draft": [("readonly", False)]},
  313. )
  314. is_operation = fields.Boolean(
  315. string="Is an operation",
  316. readonly=True,
  317. states={"draft": [("readonly", False)]},
  318. )
  319. company_name = fields.Char(
  320. string="Company name",
  321. readonly=True,
  322. states={"draft": [("readonly", False)]},
  323. )
  324. company_email = fields.Char(
  325. string="Company email",
  326. readonly=True,
  327. states={"draft": [("readonly", False)]},
  328. )
  329. company_register_number = fields.Char(
  330. string="Company register number",
  331. readonly=True,
  332. states={"draft": [("readonly", False)]},
  333. )
  334. company_type = fields.Selection(
  335. [("", "")],
  336. string="Company type",
  337. readonly=True,
  338. states={"draft": [("readonly", False)]},
  339. )
  340. same_address = fields.Boolean(
  341. string="Same address",
  342. readonly=True,
  343. states={"draft": [("readonly", False)]},
  344. )
  345. activities_address = fields.Char(
  346. string="Activities address",
  347. readonly=True,
  348. states={"draft": [("readonly", False)]},
  349. )
  350. activities_city = fields.Char(
  351. string="Activities city",
  352. readonly=True,
  353. states={"draft": [("readonly", False)]},
  354. )
  355. activities_zip_code = fields.Char(
  356. string="Activities zip Code",
  357. readonly=True,
  358. states={"draft": [("readonly", False)]},
  359. )
  360. activities_country_id = fields.Many2one(
  361. "res.country",
  362. string="Activities country",
  363. ondelete="restrict",
  364. readonly=True,
  365. states={"draft": [("readonly", False)]},
  366. )
  367. contact_person_function = fields.Char(
  368. string="Function",
  369. readonly=True,
  370. states={"draft": [("readonly", False)]},
  371. )
  372. operation_request_id = fields.Many2one(
  373. "operation.request",
  374. string="Operation Request",
  375. readonly=True,
  376. states={"draft": [("readonly", False)]},
  377. )
  378. capital_release_request = fields.One2many(
  379. "account.invoice",
  380. "subscription_request",
  381. string="Capital release request",
  382. readonly=True,
  383. states={"draft": [("readonly", False)]},
  384. )
  385. capital_release_request_date = fields.Date(
  386. string="Force the capital " "release request date",
  387. help="Keep empty to use the " "current date",
  388. copy=False,
  389. readonly=True,
  390. states={"draft": [("readonly", False)]},
  391. )
  392. source = fields.Selection(
  393. [
  394. ("website", "Website"),
  395. ("crm", "CRM"),
  396. ("manual", "Manual"),
  397. ("operation", "Operation"),
  398. ],
  399. string="Source",
  400. default="website",
  401. readonly=True,
  402. states={"draft": [("readonly", False)]},
  403. )
  404. data_policy_approved = fields.Boolean(
  405. string="Data Policy Approved", default=False
  406. )
  407. internal_rules_approved = fields.Boolean(
  408. string="Approved Internal Rules", default=False
  409. )
  410. financial_risk_approved = fields.Boolean(
  411. string='Financial Risk Approved',
  412. 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