o
    š�žiOY  ã                   @   s˜   d dl Z d dlZd dlmZmZmZmZmZ d dlm	Z	 d dl
mZmZ d dlmZmZ d dlmZmZmZ d dlmZ e e¡ZG dd	„ d	ejƒZdS )
é    N)ÚapiÚfieldsÚmodelsÚmodulesÚtools)ÚSUPERUSER_ID)ÚValidationErrorÚ	UserError)ÚCommandÚDomain)Úhtml2plaintextÚ	file_openÚormcache)Úimage_processc                       s¶  e Zd ZdZdZdZddgZdZdÁdd	„Zd
d„ Z	dd„ Z
ejdddddd�Zejdd�Zejddd�Zejddddd�Zejdddd�Zejddddid�Zejdd�Zejdddd �Zejdddd �Zejd!d"ddd#�Zejd$dd%d&�Zejd'dd(d&�Zejd)dd*d&�Zejd+d,�Z ej!d-e	d.dd/�Z"ej!d0ddd1�Z#ejd2dd3�Z$ejd4d5dd6d7„ d8�Z%ejd9d:d;d<d=d�Z&ejd>d?d@�Z'ejd>dAd@�Z(ejd>dBd@�Z)ejd>dCd@�Z*ejdDd>dEdFdGdH�Z+ejdIddJ�Z,ejdKd>dLdMdN�Z-ejdOdPgdQ�Z.ejdRdddS�Z/ejdTdddS�Z0ejdUddJ�Z1ejdVdWddX�Z2ejdYdZddX�Z3ejd[d\�Z4ejd]d^d_d7„ d�Z5e d`da¡Z6ej7g db¢dcd�Z8e ¡ Z9e ¡ Z:ejddded@�Z;ej7g df¢dgddh�Z<e !di¡Z=ejdjdkd,�Z>e? @dldm¡ZA‡ fdndo„ZBdpdq„ ZCdrds„ ZDdtdu„ ZEeF Gdv¡dwdx„ ƒZHeF Gdyd7„ ¡dzd{„ ƒZId|d}„ ZJd~d„ ZKd€d�„ ZLd‚dƒ„ ZMd„d…„ ZNd†d‡„ ZOeF Gd-¡dˆd‰„ ƒZPeF Gd-¡dŠd‹„ ƒZQeF GdŒ¡d�dŽ„ ƒZRd�d�„ ZSeF Td‘¡d’d“„ ƒZUeF TdP¡d”d•„ ƒZVeF Td¡d–d—„ ƒZWeF GdP¡d˜d™„ ƒZXdšd›„ ZYeFjZdÂ‡ fd�dž„	ƒZ[eFjZ‡ fdŸd „ƒZ\eF Gd¡¡d¢d£„ ƒZ]eFj^‡ fd¤d¥„ƒZ_d¦d§„ Z`‡ fd¨d©„Za‡ fdªd«„ZbeF cd¬¡d­d®„ ƒZdeF cd¯d7„ ¡d°d±„ ƒZeeFjZd²d³„ ƒZfegd´dµd¶ƒd·d¸„ ƒZhd¹dº„ Zid»d¼„ Zjd½d¾„ Zkd¿dÀ„ Zl‡  ZmS )ÃÚ
ResCompanyúres.companyÚ	Companieszsequence, namezformat.address.mixinzformat.vat.label.mixinTNc                 C   s   t | j d¡ƒ‚)NzJDuplicating a company is not allowed. Please create a new company instead.)r	   ÚenvÚ_)ÚselfÚdefault© r   ú?/home/minischoggi19/odoo/odoo/addons/base/models/res_company.pyÚcopy   s   zResCompany.copyc                 C   s<   t ddƒ�}t | ¡ ¡W  d   ƒ S 1 sw   Y  d S )Nz$base/static/img/res_company_logo.pngÚrb)r   Úbase64Ú	b64encodeÚread)r   Úfiler   r   r   Ú	_get_logo   s   $ÿzResCompany._get_logoc                 C   s   | j jjjS ©N)r   ÚuserÚ
company_idÚcurrency_id©r   r   r   r   Ú_default_currency_id   s   zResCompany._default_currency_idzpartner_id.namezCompany NameF)ÚrelatedÚstringÚrequiredÚstoreÚreadonly)r   z/Used to order Companies in the company switcheré
   )Úhelpr   zParent CompanyÚrestrict)r'   ÚindexÚondeleteÚ	parent_idÚBranches)r'   Úactive_test)Úcontext)r.   Ú_compute_parent_ids)ÚcomputeÚcompute_sudoúres.partnerÚPartner)r'   r(   r.   zCompany TaglinezoCompany tagline, which is included in a printed document's header or footer (depending on the selected layout).)r'   Ú	translater,   zReport Footerz3Footer text displayed at the bottom of all reports.zCompany Detailsz0Header text displayed at the top of all reports.Ú_compute_empty_company_details)r5   zpartner_id.image_1920zCompany Logo)r&   r   r'   r*   Ú_compute_logo_web)r5   r)   Ú
attachmentÚ_compute_uses_default_logo)r5   r)   úres.currencyÚCurrencyc                 C   s   |   ¡ S r    )r%   r$   r   r   r   Ú<lambda>4   ó    zResCompany.<lambda>)r'   r(   r   ú	res.usersÚres_company_users_relÚcidÚuser_idzAccepted UsersÚ_compute_addressÚ_inverse_street)r5   ÚinverseÚ_inverse_street2Ú_inverse_zipÚ_inverse_cityzres.country.stateÚ_inverse_statez
Fed. Statez"[('country_id', '=?', country_id)])r5   rH   r'   Údomainzpartner_id.bank_ids)r&   r*   zres.countryÚ_inverse_countryÚCountry)r5   rH   r'   zcountry_id.codeÚ
country_id)r&   Údependszpartner_id.email)r&   r)   r*   zpartner_id.phonezpartner_id.websitezpartner_id.vatzTax ID)r&   r'   r*   zpartner_id.company_registryz
Company IDz'partner_id.company_registry_placeholder)r&   zreport.paperformatzPaper formatc                 C   s   | j jddd�S )Núbase.paperformat_euroF)Úraise_if_not_found)r   Úrefr$   r   r   r   r@   H   s    z
ir.ui.viewzDocument Template))ÚLatorU   )ÚRobotorV   )Ú	Open_Sansz	Open Sans)Ú
MontserratrX   )ÚOswaldrY   )ÚRalewayrZ   )ÚTajawalr[   )Ú	Fira_Monoz	Fira MonorU   Ú_compute_colorÚ_inverse_color))ÚBlankr_   )ú	Demo logor`   )ÚCustomra   r_   )r   r(   zBackground Imageúir.module.moduleÚ$_compute_uninstalled_l10n_module_idszunique (name)z The company name must be unique!c                    sT   |   dg¡D ]}| j dd¡}|r| d|ji¡ qtƒ }t|dƒr(| ¡  d S d S )N)Úpaperformat_idÚ=FrR   Frd   Úinit)Úsearchr   rT   ÚwriteÚidÚsuperÚhasattrrf   )r   ÚcompanyÚpaperformat_euroÚsup©Ú	__class__r   r   rf   W   s   €
ÿzResCompany.initc                 C   s   dgS )a  Get the set of fields delegated to the root company.

        Some fields need to be identical on all branches of the company. All
        fields listed by this function will be copied from the root company and
        appear as readonly in the form view.
        :rtype: set
        r#   r   r$   r   r   r   Ú'_get_company_root_delegated_field_names`   s   z2ResCompany._get_company_root_delegated_field_namesc                 C   s   g d¢S )z� Return a list of fields coming from the address partner to match
        on company address fields. Fields are labeled same on both models. )ÚstreetÚstreet2ÚcityÚzipÚstate_idrP   r   r$   r   r   r   Ú _get_company_address_field_namesj   s   z+ResCompany._get_company_address_field_namesc                    s   t ‡ fdd„|  ¡ D ƒƒS )Nc                 3   s   � | ]	}|ˆ | fV  qd S r    r   ©Ú.0Úfname©Úpartnerr   r   Ú	<genexpr>p   s   € ÿz9ResCompany._get_company_address_update.<locals>.<genexpr>)Údictrw   )r   r|   r   r{   r   Ú_get_company_address_updateo   s   ÿz&ResCompany._get_company_address_updateÚparent_pathc                 C   sJ   | j dd�D ]}|jr|  dd„ |j d¡D ƒ¡n||_|jd |_qd S )NF©r2   c                 s   s   � | ]	}|rt |ƒV  qd S r    )Úint)ry   ri   r   r   r   r}   v   s   € z1ResCompany._compute_parent_ids.<locals>.<genexpr>ú/r   )Úwith_contextr€   ÚbrowseÚsplitÚ
parent_idsÚroot_id©r   rl   r   r   r   r4   s   s   (þzResCompany._compute_parent_idsc                 C   s   dd„ |   ¡ D ƒS )Nc                 S   s   g | ]}d |› �‘qS )zpartner_id.r   rx   r   r   r   Ú
<listcomp>y   s    z'ResCompany.<lambda>.<locals>.<listcomp>)rw   r$   r   r   r   r@   y   s    c                 C   sX   |   dd„ ¡D ]"}|j ¡ jdgd�}|d r)|j |d ¡ ¡ }| | |¡¡ qd S )Nc                 S   s   | j S r    )Ú
partner_id©rl   r   r   r   r@   {   s    z-ResCompany._compute_address.<locals>.<lambda>Úcontact)Úadr_pref)Úfilteredr‹   ÚsudoÚaddress_getr…   Úupdater   )r   rl   Úaddress_datar|   r   r   r   rF   y   s   €üzResCompany._compute_addressc                 C   ó   | D ]}|j |j_ qd S r    )rr   r‹   r‰   r   r   r   rG   �   ó   ÿzResCompany._inverse_streetc                 C   r”   r    )rs   r‹   r‰   r   r   r   rI   …   r•   zResCompany._inverse_street2c                 C   r”   r    )ru   r‹   r‰   r   r   r   rJ   ‰   r•   zResCompany._inverse_zipc                 C   r”   r    )rt   r‹   r‰   r   r   r   rK   �   r•   zResCompany._inverse_cityc                 C   r”   r    )rv   r‹   r‰   r   r   r   rL   ‘   r•   zResCompany._inverse_statec                 C   r”   r    )rP   r‹   r‰   r   r   r   rN   •   r•   zResCompany._inverse_countryc                 C   s4   | D ]}|j j}|ot tt |¡dd�¡|_qd S )N)é´   r   )Úsize)r‹   Ú
image_1920r   r   r   Ú	b64decodeÚlogo_web)r   rl   Úimgr   r   r   r;   ™   s    þzResCompany._compute_logo_webc                 C   s*   |   ¡ }| D ]}|j p|j|k|_qd S r    )r   ÚlogoÚuses_default_logo)r   Údefault_logorl   r   r   r   r=   Ÿ   s   ÿz%ResCompany._compute_uses_default_logorˆ   c                 C   s(   | D ]}|j jjp|j jjd |_qd S )Né   )rˆ   r‹   ÚcolorÚ_originri   r‰   r   r   r   r]   ¥   s   ÿzResCompany._compute_colorc                 C   s   | D ]}|j |jj_ qd S r    )r    rˆ   r‹   r‰   r   r   r   r^   ª   s   ÿzResCompany._inverse_colorrv   c                 C   s   | j jr| j j| _d S d S r    )rv   rP   r$   r   r   r   Ú_onchange_state®   s   ÿzResCompany._onchange_statec                 C   s   | j r
| j j| _d S d S r    )rP   r#   r$   r   r   r   Ú_onchange_country_id³   s   ÿzResCompany._onchange_country_idc                 C   s<   | j r|  ¡ D ]}| | | j | kr| j | | |< qd S d S r    )r0   rq   )r   rz   r   r   r   Ú_onchange_parent_id¸   s   €ýzResCompany._onchange_parent_idc                 C   sv   | j d  g d¢¡ | j d  ¡  | j j d| jjddœ¡ t| j j ¡ ƒ}| D ]}| j d  | 	|jj
¡¡|_q(d S )Nrb   )Úauto_installÚcountry_idsÚdependencies_idzir.module.module.dependencyaÍ  
            SELECT country.id,
                   ARRAY_AGG(module.id)
              FROM ir_module_module module,
                   res_country country
             WHERE module.auto_install
               AND state NOT IN %(install_states)s
               AND NOT EXISTS (
                       SELECT 1
                         FROM ir_module_module_dependency d
                         JOIN ir_module_module mdep ON (d.name = mdep.name)
                        WHERE d.module_id = module.id
                          AND d.auto_install_required
                          AND mdep.state NOT IN %(install_states)s
                   )
               AND EXISTS (
                       SELECT 1
                         FROM module_country mc
                        WHERE mc.module_id = module.id
                          AND mc.country_id = country.id
                   )
               AND country.id = ANY(%(country_ids)s)
          GROUP BY country.id
        )Ú	installedz
to installz
to upgrade)r¦   Úinstall_states)r   Úflush_modelÚcrÚexecuterP   Úidsr~   Úfetchallr…   Úgetri   Úuninstalled_l10n_module_ids)r   Úmappingrl   r   r   r   rc   ¿   s   
þéÿz/ResCompany._compute_uninstalled_l10n_module_idsc                 C   sV   | j }tjd  o | jjjp| jjj o tjj	 o | jj
 d¡ }|r)|r)| ¡ S |S )NÚtest_enableÚinstall_mode)r°   r   Úconfigr   ÚregistryÚreadyÚ_initr   ÚmoduleÚcurrent_testr3   r¯   Úbutton_immediate_install)r   Úuninstalled_modulesÚis_ready_and_not_testr   r   r   Úinstall_l10n_modulesä   s   ÿþüzResCompany.install_l10n_modulesÚformc                    sX   t |  ¡ ƒ}tƒ j||fi |¤Ž\}}| d¡D ]}| d¡|v r'|  dd¡ q||fS )NÚfieldÚnamer*   zparent_id != False)Úsetrq   rj   Ú	_get_viewÚiterr¯   )r   Úview_idÚ	view_typeÚoptionsÚdelegated_fnamesÚarchÚviewÚfro   r   r   rÂ   ð   s   €zResCompany._get_viewc                    sf   t | jjƒ}| }tj}| dd ¡r!| jjj}tdd|jƒ}| 	¡ }| 
|¡}tt|ƒ ||¡}||@ S )NÚuser_preferenceri   Úin)r~   r   r3   r   ÚTRUEÚpopr!   Úcompany_idsr­   r�   r„   rj   r   Ú_search_display_name)r   ÚoperatorÚvaluer3   ÚnewselfÚ
constraintÚ	companiesrM   ro   r   r   rÐ   ù   s   

zResCompany._search_display_nameÚcompany_detailsc                 C   s    | D ]}t |jp	dƒ |_qd S )NÚ )r   rÖ   Úis_company_details_empty)r   Úrecordr   r   r   r:   
  s   ÿz)ResCompany._compute_empty_company_detailsc           
   	      s  dd„ |D ƒ}|r-| j d jdd� dd„ |D ƒ¡}| ¡  t||ƒD ]	\}}|j|d< q#|D ]"}|  | d¡¡ }rQ|  ¡ D ]}| 	|| j
|  || |¡¡ q?q/| j j ¡  tƒ  |¡}|rv| j j| j d	  t¡B  d
dd„ |D ƒi¡ d|j ¡  dd„ ¡_| d¡}	|	rŒ|	 ¡  |S )Nc                 S   s$   g | ]}|  d ¡r|  d¡s|‘qS )rÀ   r‹   ©r¯   ©ry   Úvalsr   r   r   rŠ     s    ýýÿz%ResCompany.create.<locals>.<listcomp>r7   F)Údefault_parent_idc                 S   sJ   g | ]!}|d  d|  d¡|  d¡|  d¡|  d¡|  d¡|  d¡dœ‘qS )	rÀ   Trœ   ÚemailÚphoneÚwebsiteÚvatrP   )rÀ   Ú
is_companyr˜   rÞ   rß   rà   rá   rP   rÚ   rÛ   r   r   r   rŠ     s    ÷øÿr‹   r0   rB   rÏ   c                 S   s   g | ]}t  |j¡‘qS r   )r
   Úlinkri   )ry   rl   r   r   r   rŠ   9  s    Tc                 S   ó   | j  S r    )Úactive)Úcr   r   r   r@   =  rA   z#ResCompany.create.<locals>.<lambda>rP   )r   r„   Úcreaterª   ru   ri   r…   r¯   rq   Ú
setdefaultÚ_fieldsÚconvert_to_writerµ   Úclear_cacherj   r!   r   rh   r#   r�   r�   rå   r½   )
r   Ú	vals_listÚno_partner_vals_listÚpartnersrÜ   r|   Úparentrz   rÕ   Úcompanies_needs_l10nro   r   r   rç     s4   þõ €ÿ
zResCompany.createc                 C   s   ddhS )Nrå   Úsequencer   r$   r   r   r   Úcache_invalidation_fieldsE  s   þz$ResCompany.cache_invalidation_fieldsc                    s   t ƒ  ¡ }| jj ¡  |S )z’
        Unlink the companies and clear the cache to make sure that
        _get_company_ids of res.users gets only existing company ids.
        )rj   Úunlinkr   rµ   rë   )r   Úresro   r   r   ró   L  s   
zResCompany.unlinkc                    sh  d|v rt | j d¡ƒ‚| d¡r%| jd  |d ¡}|js%| ddi¡ tƒ  |¡}|  ¡ }h d£}| d¡o>|  	d	d
„ ¡pB|  ¡ }| 
|¡sN| jj ¡  | 
|¡sZ| jj d¡ | d¡du red| j_| D ]/}t|ƒt|  ¡ ƒ@  }r–|js–|  ¡  dd|jfdd|jfg¡}	t|ƒD ]}
||
 |	|
< q�qg|r�| ¡  |  ¡ }t|ƒt| ¡ ƒ@ }|r²|  |¡ |S )Nr0   z(The company hierarchy cannot be changed.r#   r>   rå   T>   ÚfontÚprimary_colorÚsecondary_colorÚexternal_report_layout_idrP   c                 S   rä   r    )rP   rŒ   r   r   r   r@   d  rA   z"ResCompany.write.<locals>.<lambda>ÚassetsFri   Úchild_ofz!=)r	   r   r   r¯   r…   rå   rh   rj   rò   r�   Ú
isdisjointrµ   rë   Ú	child_idsrÁ   rq   r0   r�   rg   ri   Úsortedr½   rw   ÚkeysÚinvalidate_model)r   rÜ   Úcurrencyrô   Úinvalidation_fieldsÚasset_invalidation_fieldsrð   rl   ÚchangedÚbranchesrz   Úcompany_address_fieldsÚcompany_address_fields_updro   r   r   rh   U  sH   

þý



þ€
zResCompany.writerå   c                 C   sL   | D ]!}|j s#| jd  dd|jfdg¡}|r#t| jjd|j|d�ƒ‚qd S )NrB   r"   re   )rå   re   TzzThe company %(company_name)s cannot be archived because it is still used as the default company of %(active_users)s users.)Úcompany_nameÚactive_users)rå   r   Úsearch_countri   r   r   rÀ   )r   rl   Úcompany_active_usersr   r   r   Ú_check_active†  s   

þü€øzResCompany._check_activec                 C   s   |   ¡ dg S )Nr0   )rq   r$   r   r   r   r@   —  s    c                 C   sZ   | D ](}|j r*| ¡ D ]}|| |j | kr)| jd  d|¡j}t| j d|¡ƒ‚qqd S )Nzir.model.fieldsr   z=The %s of a subsidiary must be the same as it's root company.)r0   rq   r   Ú_getÚfield_descriptionr   r   )r   rl   rz   Údescriptionr   r   r   Ú_check_root_delegated_fields—  s   þ€ýz'ResCompany._check_root_delegated_fieldsc                 C   sF   z|   ¡ j d¡}W |S  ty"   | jd   ¡ jg ddd�}Y |S w )Nzbase.main_companyr   é   ri   )ÚlimitÚorder)r�   r   rT   Ú
ValueErrorrg   )r   Úmain_companyr   r   r   Ú_get_main_company   s   ýýzResCompany._get_main_companyztuple(self.env.companies.ids)zself.idzself.env.uidc                 C   sT   |   ¡  g }| jj}|  ¡ }|r| ||@ j¡ |j}|s|s(| jjtkr(| jS |S r    )	Ú
ensure_oner   rÕ   r�   Úextendr­   rü   Úuidr   )r   Úaccessible_branch_idsÚ
accessibleÚcurrentr   r   r   Ú__accessible_branches©  s   þz ResCompany.__accessible_branchesc                 C   s   |   |  ¡ ¡S r    )r…   Ú _ResCompany__accessible_branchesr$   r   r   r   Ú_accessible_branches½  s   zResCompany._accessible_branchesc                 C   s   | |   ¡  dd| jjfg¡kS )a  Return whether or all the branches of the companies in self are selected.

        Is ``True`` if all the branches, and only those, are selected.
        Can be used when some actions only make sense for whole companies regardless of the
        branches.
        ri   rú   )r�   rg   rˆ   r­   r$   r   r   r   Ú_all_branches_selectedÀ  s   z!ResCompany._all_branches_selectedc              	   C   sF   |   ¡  d| j d¡ddd| jfgd| jdœddgdd	gdd
ggdœS )Nzir.actions.act_windowr1   r   r0   re   F)r2   rÝ   ÚlistÚkanbanr¾   )ÚtyperÀ   Ú	res_modelrM   r3   Úviews)r  r   r   ri   r$   r   r   r   Úaction_all_company_branchesÉ  s   
þ÷z&ResCompany.action_all_company_branchesc                    sz   ˆ   ¡  ˆ j d¡ ¡ jdd�j}| ‡ fdd„¡}|r |d S ˆ j d¡ ¡  dˆ j d	ˆ j	 ˆ j	d
dˆ j	gfgdœ¡S )Nzbase.group_publicFr�   c                    s
   | j ˆ kS r    )r"   )r!   r$   r   r   r@   Û  s   
 z-ResCompany._get_public_user.<locals>.<lambda>r   zbase.public_userzPublic user for %szpublic-user@company-%s.comé   )rÀ   Úloginr"   rÏ   )
r  r   rT   r�   r„   Úall_user_idsr�   r   rÀ   ri   )r   Úpublic_usersÚpublic_users_for_companyr   r$   r   Ú_get_public_user×  s   üzResCompany._get_public_userr    )Nr¾   )nÚ__name__Ú
__module__Ú__qualname__Ú_nameÚ_descriptionÚ_orderÚ_inheritÚ_parent_storer   r   r%   r   ÚCharrÀ   ÚBooleanrå   ÚIntegerrñ   ÚMany2oner0   ÚOne2manyrü   Úall_child_idsr€   Ú	Many2manyr‡   rˆ   r‹   ÚHtmlÚreport_headerÚreport_footerrÖ   rØ   ÚBinaryrœ   rš   r�   r#   Úuser_idsrr   rs   ru   rt   rv   Úbank_idsrP   Úcountry_coderÞ   rß   rà   rá   Úcompany_registryÚcompany_registry_placeholderrd   rø   Ú	Selectionrõ   rö   r÷   r    Úlayout_backgroundÚlayout_background_imager°   r   Ú
ConstraintÚ
_name_uniqrf   rq   rw   r   r   rQ   r4   rF   rG   rI   rJ   rK   rL   rN   r;   r=   r]   r^   Úonchanger¢   r£   r¤   rc   r½   ÚmodelrÂ   rÐ   r:   Úmodel_create_multirç   rò   ró   rh   Ú
constrainsr  r  r  r   r  r  r  r%  r+  Ú__classcell__r   r   ro   r   r      sÞ    
þ
þ	









$
3	1




	r   )r   ÚloggingÚodoor   r   r   r   r   Úodoo.apir   Úodoo.exceptionsr   r	   Úodoo.fieldsr
   r   Ú
odoo.toolsr   r   r   Úodoo.tools.imager   Ú	getLoggerr,  Ú_loggerÚModelr   r   r   r   r   Ú<module>   s   
