from odoo import _, api, fields, models from odoo.exceptions import UserError import odoo.addons.decimal_precision as dp class PartnerCreateSubscription(models.TransientModel): _name = "partner.create.subscription" _description = "Create Subscription From Partner" @api.multi @api.onchange("share_product") def on_change_share_type(self): self.share_qty = self.share_product.minimum_quantity @api.model def _default_product_id(self): domain = [ ("is_share", "=", True), ("default_share_product", "=", True), ] active_id = self.env.context.get("active_id") if active_id: partner = self.env["res.partner"].browse(active_id) if partner.is_company: domain.append(("by_company", "=", True)) else: domain.append(("by_individual", "=", True)) return self.env["product.product"].search(domain)[0] def _get_representative(self): partner = self._get_partner() if partner.is_company: return partner.search( [("parent_id", "=", partner.id), ("representative", "=", True)] ) return False @api.model def _get_representative_email(self): representative = self._get_representative() if representative: return representative.email return False @api.model def _get_representative_name(self): representative = self._get_representative() if representative: return representative.name return False @api.model def _get_partner(self): active_id = self.env.context.get("active_id") return self.env["res.partner"].browse(active_id) @api.model def _get_is_company(self): return self._get_partner().is_company @api.model def _get_email(self): return self._get_partner().email @api.model def _get_register_number(self): partner = self._get_partner() if partner.is_company: return partner.company_register_number @api.model def _get_bank_account(self): partner = self._get_partner() if len(partner.bank_ids) > 0: return partner.bank_ids[0].acc_number return None @api.model def _get_possible_share(self): domain = [("is_share", "=", True)] partner = self._get_partner() if partner.is_company: domain.append(("by_company", "=", True)) else: domain.append(("by_individual", "=", True)) return domain @api.multi @api.depends("share_product", "share_qty") def _compute_subscription_amount(self): for sub_request in self: sub_request.subscription_amount = ( sub_request.share_product.list_price * sub_request.share_qty ) is_company = fields.Boolean(String="Is company?", default=_get_is_company) cooperator = fields.Many2one( "res.partner", string="Cooperator", default=_get_partner ) register_number = fields.Char( string="Register Company Number", default=_get_register_number ) email = fields.Char(string="Email", required=True, default=_get_email) bank_account = fields.Char( string="Bank account", required=True, default=_get_bank_account ) share_product = fields.Many2one( "product.product", string="Share Type", domain=_get_possible_share, default=_default_product_id, required=True, ) share_qty = fields.Integer(string="Share Quantity", required=True) share_unit_price = fields.Float( related="share_product.list_price", string="Share price", readonly=True ) subscription_amount = fields.Float( compute="_compute_subscription_amount", string="Subscription amount", digits=dp.get_precision("Account"), readonly=True, ) representative_name = fields.Char( string="Representative name", default=_get_representative_name ) representative_email = fields.Char( string="Representative email", default=_get_representative_email ) @api.multi def create_subscription(self): sub_req = self.env["subscription.request"] partner_obj = self.env["res.partner"] cooperator = self.cooperator vals = { "partner_id": cooperator.id, "share_product_id": self.share_product.id, "ordered_parts": self.share_qty, "cooperator": True, "user_id": self.env.uid, "email": self.email, "source": "crm", "address": self.cooperator.street, "zip_code": self.cooperator.zip, "city": self.cooperator.city, "country_id": self.cooperator.country_id.id, } if self.is_company: vals["company_name"] = cooperator.name vals["company_email"] = cooperator.email vals["name"] = "/" vals["company_register_number"] = self.register_number vals["is_company"] = True else: vals["name"] = cooperator.name coop_vals = {} if not self._get_email(): coop_vals["email"] = self.email if not self._get_register_number(): if self.is_company: coop_vals["company_register_number"] = self.register_number if self.is_company and not self._get_representative(): representative = False if self.representative_email: representative = partner_obj.search( [("email", "=", self.representative_email)] ) if representative: if len(representative) > 1: raise UserError( _( "There is two different persons with " "the same national register number. " "Please proceed to a merge before to " "continue" ) ) if representative.parent_id: raise UserError( _( "A person can't be representative of " "two different companies." ) ) representative.parent_id = cooperator.id else: if self.representative_email: represent_vals = { "name": self.representative_name, "cooperator": True, "email": self.representative_email, "parent_id": cooperator.id, "representative": True, } partner_obj.create(represent_vals) if not self._get_bank_account(): partner_bank = self.env["res.partner.bank"] partner_bank.create( {"partner_id": cooperator.id, "acc_number": self.bank_account} ) vals["iban"] = self.bank_account if self.is_company: representative = self._get_representative() vals["name"] = representative.name if coop_vals: cooperator.write(coop_vals) new_sub_req = sub_req.create(vals) return { "type": "ir.actions.act_window", "view_type": "form, tree", "view_mode": "form", "res_model": "subscription.request", "res_id": new_sub_req.id, "target": "current", }