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.

941 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. "street_name",
  16. "house_number",
  17. "share_product_id",
  18. "ordered_parts",
  19. "zip_code",
  20. "city",
  21. "iban",
  22. "gender",
  23. ]
  24. @api.model
  25. def _lang_get(self):
  26. languages = self.env["res.lang"].search([])
  27. return [(language.code, language.name) for language in languages]
  28. # todo move to subscription_request.py
  29. class SubscriptionRequest(models.Model):
  30. _name = "subscription.request"
  31. _description = "Subscription Request"
  32. # This function is only used in easy_my_coop_webstite's controller
  33. def get_required_field(self):
  34. required_fields = _REQUIRED
  35. company = self.env["res.company"]._company_default_get()
  36. if company.data_policy_approval_required:
  37. required_fields.append("data_policy_approved")
  38. if company.internal_rules_approval_required:
  39. required_fields.append("internal_rules_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. _order = "id desc"
  412. def get_person_info(self, partner):
  413. self.firstname = partner.firstname
  414. self.name = partner.name
  415. self.lastname = partner.lastname
  416. self.email = partner.email
  417. self.birthdate = partner.birthdate_date
  418. self.gender = partner.gender
  419. self.address = partner.street
  420. self.city = partner.city
  421. self.zip_code = partner.zip
  422. self.country_id = partner.country_id
  423. self.phone = partner.phone
  424. self.lang = partner.lang
  425. @api.onchange("partner_id")
  426. def onchange_partner(self):
  427. partner = self.partner_id
  428. if partner:
  429. self.is_company = partner.is_company
  430. self.already_cooperator = partner.member
  431. if partner.bank_ids:
  432. self.iban = partner.bank_ids[0].acc_number
  433. if partner.member:
  434. self.type = "increase"
  435. if partner.is_company:
  436. self.company_name = partner.name
  437. self.company_email = partner.email
  438. self.company_register_number = partner.company_register_number
  439. representative = partner.get_representative()
  440. self.get_person_info(representative)
  441. self.contact_person_function = representative.function
  442. else:
  443. self.get_person_info(partner)
  444. # declare this function in order to be overriden
  445. def get_eater_vals(self, partner, share_product_id): # noqa
  446. return {}
  447. def _prepare_invoice_line(self, product, partner, qty):
  448. self.ensure_one()
  449. account = (
  450. product.property_account_income_id
  451. or product.categ_id.property_account_income_categ_id
  452. )
  453. if not account:
  454. raise UserError(
  455. _(
  456. "Please define income account for this product:"
  457. ' "%s" (id:%d) - or for its category: "%s".'
  458. )
  459. % (product.name, product.id, product.categ_id.name)
  460. )
  461. fpos = partner.property_account_position_id
  462. if fpos:
  463. account = fpos.map_account(account)
  464. res = {
  465. "name": product.name,
  466. "account_id": account.id,
  467. "price_unit": product.lst_price,
  468. "quantity": qty,
  469. "uom_id": product.uom_id.id,
  470. "product_id": product.id or False,
  471. }
  472. return res
  473. def get_capital_release_mail_template(self):
  474. template = "easy_my_coop.email_template_release_capital"
  475. return self.env.ref(template, False)
  476. def send_capital_release_request(self, invoice):
  477. email_template = self.get_capital_release_mail_template()
  478. # we send the email with the capital release request in attachment
  479. # TODO remove sudo() and give necessary access right
  480. email_template.sudo().send_mail(invoice.id, True)
  481. invoice.sent = True
  482. def get_journal(self):
  483. return self.env.ref("easy_my_coop.subscription_journal")
  484. def get_accounting_account(self):
  485. account_obj = self.env["account.account"]
  486. if self.company_id.property_cooperator_account:
  487. account = self.company_id.property_cooperator_account
  488. else:
  489. accounts = account_obj.search([("code", "=", "416000")])
  490. if accounts:
  491. account = accounts[0]
  492. else:
  493. raise UserError(
  494. _("You must set a cooperator account on you company.")
  495. )
  496. return account
  497. def get_invoice_vals(self, partner):
  498. return {
  499. "partner_id": partner.id,
  500. "journal_id": self.get_journal().id,
  501. "account_id": self.get_accounting_account().id,
  502. "type": "out_invoice",
  503. "release_capital_request": True,
  504. "subscription_request": self.id,
  505. }
  506. def create_invoice(self, partner):
  507. # creating invoice and invoice lines
  508. invoice_vals = self.get_invoice_vals(partner)
  509. if self.capital_release_request_date:
  510. invoice_vals["date_invoice"] = self.capital_release_request_date
  511. invoice = self.env["account.invoice"].create(invoice_vals)
  512. vals = self._prepare_invoice_line(
  513. self.share_product_id, partner, self.ordered_parts
  514. )
  515. vals["invoice_id"] = invoice.id
  516. self.env["account.invoice.line"].create(vals)
  517. # validate the capital release request
  518. invoice.action_invoice_open()
  519. self.send_capital_release_request(invoice)
  520. return invoice
  521. def get_partner_company_vals(self):
  522. partner_vals = {
  523. "name": self.company_name,
  524. "last_name": self.company_name,
  525. "is_company": self.is_company,
  526. "company_register_number": self.company_register_number, # noqa
  527. "cooperator": True,
  528. "street": self.address,
  529. "zip": self.zip_code,
  530. "city": self.city,
  531. "email": self.company_email,
  532. "out_inv_comm_type": "bba",
  533. "customer": self.share_product_id.customer,
  534. "country_id": self.country_id.id,
  535. "lang": self.lang,
  536. "data_policy_approved": self.data_policy_approved,
  537. "internal_rules_approved": self.internal_rules_approved,
  538. }
  539. return partner_vals
  540. def get_partner_vals(self):
  541. partner_vals = {
  542. "name": self.name,
  543. "firstname": self.firstname,
  544. "lastname": self.lastname,
  545. "street": self.address,
  546. "zip": self.zip_code,
  547. "email": self.email,
  548. "gender": self.gender,
  549. "cooperator": True,
  550. "city": self.city,
  551. "phone": self.phone,
  552. "country_id": self.country_id.id,
  553. "lang": self.lang,
  554. "birthdate_date": self.birthdate,
  555. "customer": self.share_product_id.customer,
  556. "data_policy_approved": self.data_policy_approved,
  557. "internal_rules_approved": self.internal_rules_approved,
  558. }
  559. return partner_vals
  560. def get_representative_vals(self):
  561. contact_vals = {
  562. "name": self.name,
  563. "firstname": self.firstname,
  564. "lastname": self.lastname,
  565. "customer": False,
  566. "is_company": False,
  567. "cooperator": True,
  568. "street": self.address,
  569. "gender": self.gender,
  570. "zip": self.zip_code,
  571. "city": self.city,
  572. "phone": self.phone,
  573. "email": self.email,
  574. "country_id": self.country_id.id,
  575. "out_inv_comm_type": "bba",
  576. "out_inv_comm_algorithm": "random",
  577. "lang": self.lang,
  578. "birthdate_date": self.birthdate,
  579. "parent_id": self.partner_id.id,
  580. "representative": True,
  581. "function": self.contact_person_function,
  582. "type": "representative",
  583. "data_policy_approved": self.data_policy_approved,
  584. "internal_rules_approved": self.internal_rules_approved,
  585. }
  586. return contact_vals
  587. def create_coop_partner(self):
  588. partner_obj = self.env["res.partner"]
  589. if self.is_company:
  590. partner_vals = self.get_partner_company_vals()
  591. else:
  592. partner_vals = self.get_partner_vals()
  593. partner = partner_obj.create(partner_vals)
  594. if self.iban:
  595. self.env["res.partner.bank"].create(
  596. {"partner_id": partner.id, "acc_number": self.iban}
  597. )
  598. return partner
  599. def set_membership(self):
  600. # To be overridden
  601. return True
  602. @api.multi
  603. def validate_subscription_request(self):
  604. self.ensure_one()
  605. # todo rename to validate (careful with iwp dependencies)
  606. partner_obj = self.env["res.partner"]
  607. if self.ordered_parts <= 0:
  608. raise UserError(_("Number of share must be greater than 0."))
  609. if self.partner_id:
  610. partner = self.partner_id
  611. else:
  612. partner = None
  613. domain = []
  614. if self.already_cooperator:
  615. raise UserError(
  616. _(
  617. "The checkbox already cooperator is"
  618. " checked please select a cooperator."
  619. )
  620. )
  621. elif self.is_company and self.company_register_number:
  622. domain = [
  623. (
  624. "company_register_number",
  625. "=",
  626. self.company_register_number,
  627. )
  628. ] # noqa
  629. elif not self.is_company and self.email:
  630. domain = [("email", "=", self.email)]
  631. if domain:
  632. partner = partner_obj.search(domain)
  633. if not partner:
  634. partner = self.create_coop_partner()
  635. self.partner_id = partner
  636. else:
  637. partner = partner[0]
  638. partner.cooperator = True
  639. if self.is_company and not partner.has_representative():
  640. contact = False
  641. if self.email:
  642. domain = [("email", "=", self.email)]
  643. contact = partner_obj.search(domain)
  644. if contact:
  645. contact.type = "representative"
  646. if not contact:
  647. contact_vals = self.get_representative_vals()
  648. partner_obj.create(contact_vals)
  649. else:
  650. if len(contact) > 1:
  651. raise UserError(
  652. _(
  653. "There is two different persons with the"
  654. " same national register number. Please"
  655. " proceed to a merge before to continue"
  656. )
  657. )
  658. if contact.parent_id and contact.parent_id.id != partner.id:
  659. raise UserError(
  660. _(
  661. "This contact person is already defined"
  662. " for another company. Please select"
  663. " another contact"
  664. )
  665. )
  666. else:
  667. contact.write(
  668. {"parent_id": partner.id, "representative": True}
  669. )
  670. invoice = self.create_invoice(partner)
  671. self.write({"state": "done"})
  672. self.set_membership()
  673. return invoice
  674. @api.multi
  675. def block_subscription_request(self):
  676. self.ensure_one()
  677. self.write({"state": "block"})
  678. @api.multi
  679. def unblock_subscription_request(self):
  680. self.ensure_one()
  681. self.write({"state": "draft"})
  682. @api.multi
  683. def cancel_subscription_request(self):
  684. self.ensure_one()
  685. self.write({"state": "cancelled"})
  686. @api.multi
  687. def put_on_waiting_list(self):
  688. self.ensure_one()
  689. waiting_list_mail_template = self.env.ref(
  690. "easy_my_coop.email_template_waiting_list", False
  691. )
  692. waiting_list_mail_template.send_mail(self.id, True)
  693. self.write({"state": "waiting"})
  694. # todo move to share_line.py
  695. class ShareLine(models.Model):
  696. _name = "share.line"
  697. _description = "Share line"
  698. @api.multi
  699. def _compute_total_line(self):
  700. res = {}
  701. for line in self:
  702. line.total_amount_line = line.share_unit_price * line.share_number
  703. return res
  704. share_product_id = fields.Many2one(
  705. "product.product", string="Share type", required=True, readonly=True
  706. )
  707. share_number = fields.Integer(
  708. string="Number of Share", required=True, readonly=True
  709. )
  710. share_short_name = fields.Char(
  711. related="share_product_id.short_name",
  712. string="Share type name",
  713. readonly=True,
  714. )
  715. share_unit_price = fields.Monetary(
  716. string="Share price",
  717. currency_field="company_currency_id",
  718. readonly=True,
  719. )
  720. effective_date = fields.Date(string="Effective Date", readonly=True)
  721. partner_id = fields.Many2one(
  722. "res.partner",
  723. string="Cooperator",
  724. required=True,
  725. ondelete="cascade",
  726. readonly=True,
  727. )
  728. total_amount_line = fields.Monetary(
  729. string="Total amount line",
  730. currency_field="company_currency_id",
  731. compute="_compute_total_line",
  732. )
  733. company_id = fields.Many2one(
  734. "res.company",
  735. string="Company",
  736. required=True,
  737. change_default=True,
  738. readonly=True,
  739. default=lambda self: self.env["res.company"]._company_default_get(),
  740. )
  741. company_currency_id = fields.Many2one(
  742. "res.currency",
  743. string="Company Currency",
  744. related="company_id.currency_id",
  745. readonly=True,
  746. )
  747. # todo move to subscription_register.py
  748. class SubscriptionRegister(models.Model):
  749. _name = "subscription.register"
  750. _description = "Subscription register"
  751. @api.multi
  752. def _compute_total_line(self):
  753. for line in self:
  754. line.total_amount_line = line.share_unit_price * line.quantity
  755. name = fields.Char(string="Number Operation", required=True, readonly=True)
  756. register_number_operation = fields.Integer(
  757. string="Register Number Operation", required=True, readonly=True
  758. )
  759. partner_id = fields.Many2one(
  760. "res.partner", string="Cooperator", required=True, readonly=True
  761. )
  762. partner_id_to = fields.Many2one(
  763. "res.partner", string="Transfered to", readonly=True
  764. )
  765. date = fields.Date(
  766. string="Subscription Date", required=True, readonly=True
  767. )
  768. quantity = fields.Integer(string="Number of share", readonly=True)
  769. share_unit_price = fields.Monetary(
  770. string="Share price",
  771. currency_field="company_currency_id",
  772. readonly=True,
  773. )
  774. total_amount_line = fields.Monetary(
  775. string="Total amount line",
  776. currency_field="company_currency_id",
  777. compute="_compute_total_line",
  778. )
  779. share_product_id = fields.Many2one(
  780. "product.product",
  781. string="Share type",
  782. required=True,
  783. readonly=True,
  784. domain=[("is_share", "=", True)],
  785. )
  786. share_short_name = fields.Char(
  787. related="share_product_id.short_name",
  788. string="Share type name",
  789. readonly=True,
  790. )
  791. share_to_product_id = fields.Many2one(
  792. "product.product",
  793. string="Share to type",
  794. readonly=True,
  795. domain=[("is_share", "=", True)],
  796. )
  797. share_to_short_name = fields.Char(
  798. related="share_to_product_id.short_name",
  799. string="Share to type name",
  800. readonly=True,
  801. )
  802. quantity_to = fields.Integer(string="Number of share to", readonly=True)
  803. share_to_unit_price = fields.Monetary(
  804. string="Share to price",
  805. currency_field="company_currency_id",
  806. readonly=True,
  807. )
  808. type = fields.Selection(
  809. [
  810. ("subscription", "Subscription"),
  811. ("transfer", "Transfer"),
  812. ("sell_back", "Sell Back"),
  813. ("convert", "Conversion"),
  814. ],
  815. string="Operation Type",
  816. readonly=True,
  817. )
  818. company_id = fields.Many2one(
  819. "res.company",
  820. string="Company",
  821. required=True,
  822. change_default=True,
  823. readonly=True,
  824. default=lambda self: self.env["res.company"]._company_default_get(),
  825. )
  826. company_currency_id = fields.Many2one(
  827. "res.currency",
  828. related="company_id.currency_id",
  829. string="Company Currency",
  830. readonly=True,
  831. )
  832. user_id = fields.Many2one(
  833. "res.users",
  834. string="Responsible",
  835. readonly=True,
  836. default=lambda self: self.env.user,
  837. )
  838. _order = "register_number_operation asc"
  839. @api.model
  840. def read_group(
  841. self,
  842. domain,
  843. fields,
  844. groupby,
  845. offset=0,
  846. limit=None,
  847. orderby=False,
  848. lazy=True,
  849. ):
  850. if "share_unit_price" in fields:
  851. fields.remove("share_unit_price")
  852. if "register_number_operation" in fields:
  853. fields.remove("register_number_operation")
  854. res = super(SubscriptionRegister, self).read_group(
  855. domain,
  856. fields,
  857. groupby,
  858. offset=offset,
  859. limit=limit,
  860. orderby=orderby,
  861. lazy=lazy,
  862. )
  863. if "total_amount_line" in fields:
  864. for line in res:
  865. if "__domain" in line:
  866. lines = self.search(line["__domain"])
  867. inv_value = 0.0
  868. for line2 in lines:
  869. inv_value += line2.total_amount_line
  870. line["total_amount_line"] = inv_value
  871. return res