
    JXjQ,                         d Z ddlZddlmZmZmZ ddlmZ ddlm	Z	m
Z
  ej                  e      Zddd	Zd
dddZdddddZddddddZd Zd Z G d dej(                        Zy)a>  Extend hr.employee with SAP B1 linkage + full bidirectional field mapping.

Direction of truth:
  - B1 held the real employee roster (imported into Odoo once).
  - Odoo is the source of truth going forward and pushes changes back to B1,
    matched by the stored B1 EmployeeID (no fragile name matching, no dupes).

Mapping covers the HR-meaningful subset of B1's EmployeeInfo (identity, contact,
work/org, nationality/passport for foreign staff, marital/family, employment
date, salary, social insurance). Country-localization tax fields (DE/BR) are
intentionally ignored.
    N)_fieldsmodels)	UserError   )SAPB1Clientcheck_production_write_allowedmalefemale)gt_Male	gt_Femaler   r   gt_Undefined)r
   r   othersinglemarrieddivorcedwidower)
mts_Singlemts_Marriedmts_Divorcedmts_Widowedr   r   r   r   )r   r   r   r   
cohabitantc                 $    | syt        |       dd S )z1B1 DateTime -> 'YYYY-MM-DD' (Odoo date) or False.FN
   )strvalues    %xeno_sapb1_sync/models/hr_employee.py_b1_dater   $   s    u:cr?    c                     | sy|  dS )z(Odoo date -> B1 DateTime string or None.Nz
T00:00:00Z r   s    r   
_odoo_dater#   +   s    WJr    c                      e Zd ZdZ ej
                  dddddd      Z ej                  dddd	      Z ej                  d
d      Z
 ej                  dd      Z ej                  dd      Zd Zd Zd Zd Zd Zd Zy)
HrEmployeehr.employeezSAP B1 Employee IDTFzhr.group_hr_userz4EmployeeID of the linked record in SAP Business One.)stringindexcopyreadonlygroupshelpzLast B1 Sync)r'   r*   r)   r+   zEmployment Start (B1))r'   r+   zSalary (B1)zBank Account (B1)c                    | j                   d   | j                   d   }|j                  d      xs dj                         }|j                  d      xs dj                         }dj                  d ||fD              xs d|j                  d	       }fd
}i d|d|j                  d      xs dd|j                  d      xs dd|j                  d      xs dd|j                  d      xs ddt	        |j                  d            d|j                  d      xs dd|j                  d      xs dd|j                  d      xs ddt	        |j                  d            d|j                  d       xs d!d"|j                  d#      xs dd$|j                  d%      d&k7  d't	        |j                  d(            d)|j                  d*      xs d+d,|j                  d-      xs d}|j                  d.      t
        v rt
        |d.      |d/<   |j                  d0      t        v rt        |d0      |d1<    ||j                  d2            }|r||d3<    ||j                  d4            }	|	r|	|d5<   |j                  d6      r;|j                  d7      j                  d8d9|d6   fgd:;      }
|
r|
j                  |d<<   |S )=Nzres.countryhr.department	FirstName LastName c              3   &   K   | ]	  }|s|  y wNr"   ).0ps     r   	<genexpr>z.HrEmployee._b1_to_odoo_vals.<locals>.<genexpr>N   s     6aA6s   zB1 #
EmployeeIDc                 X    | syj                  dd| fgd      }|j                  xs dS )NFcode=r   limit)searchid)r:   cCountrys     r   
country_ofz/HrEmployee._b1_to_odoo_vals.<locals>.country_ofP   s3    d 34A>A44=5 r    name	job_titleJobTitleF
work_emaileMail
work_phoneOfficePhonemobile_phoneMobilePhonebirthdayDateOfBirthplace_of_birth
BirthPlaceidentification_idIdNumberpassport_idPassportNumberpassport_expiration_datePassportExpirationDatechildrenNumOfChildrenr   ssnidSocialInsuranceNumberactiveActivetNOb1_start_date	StartDate	b1_salarySalary        b1_bank_accountBankAccountGendersexMartialStatusmaritalCitizenshipCountryCode
country_idCountryOfBirthcountry_of_birth
Departmentactive_testb1_dept_coder;   r   r<   department_id)
envgetstripjoinr   _SEX_B1_TO_ODOO_MARITAL_B1_TO_ODOOwith_contextr>   r?   )selfrowDeptfirstlastrC   rB   valsnatcobdeptrA   s              @r   _b1_to_odoo_valszHrEmployee._b1_to_odoo_valsH   s
   ((=)xx(%+224
#)r002xx6E4=66XDAV@W:X	!
D
,5
 #'''*3e
 #''-09E	

 CGGM2;e
 !78
 cggl3<u
  !4!=
 377#34=
 '9Q1R(S
 05A
 SWW45>
 swwx(E1
 Xcggk&:;
 *1c
  sww}5>!
$ 778/)#h-8DK77?#'::1#o2FGDO!9:;!$D!123'*D#$77< $$$7>> #s<'89:! ? D (,_%r    c                     | j                          | j                  xs dj                  dd      }i d|d   dt        |      dkD  r|d   n|d   d| j                  xs dd d d	| j
                  xs dd
| j                  xs dd| j                  xs ddt        | j                        d| j                  xs dd| j                  xs dd| j                  xs ddt        | j                        d| j                  xs dd| j                  xs ddt        | j                         d| j"                  xs dd| j$                  xs d}| j&                  t(        v rt(        | j&                     |d<   | j*                  t,        v rt,        | j*                     |d<   | j.                  r/| j.                  j0                  r| j.                  j0                  |d<   | j2                  r/| j2                  j0                  r| j2                  j0                  |d<   | j4                  r/| j4                  j6                  r| j4                  j6                  |d<   | j8                  r/| j8                  j:                  r| j8                  j:                  |d<   |S )Nr0   r2   r   r/   r   r1   rE      rG   rI   rK   rM   rO   rQ   rS   rU   rW   rY   r^   r`   ra   rc   rd   rf   rh   rj   rl   Manager)
ensure_onerC   splitlenrD   rF   rH   rJ   r#   rL   rN   rP   rR   rT   rV   rX   r]   r_   rb   re   _SEX_ODOO_TO_B1rg   _MARITAL_ODOO_TO_B1ri   r:   rk   rp   ro   	parent_idb1_employee_id)rx   partsbodys      r   _odoo_to_b1_valszHrEmployee._odoo_to_b1_vals|   s   b''Q/
q
CJNaa
 -2s3
 T__*
 4??0b
 4,,2
 :dmm4
 $--3
 ..4"
 d..4"
 %j1N1N&O
  T]]/a!
" $TZZ%52#
$ D$6$67%
& dnn+'
( 4//52)
, 88&,TXX6DN<<..$7$ED!??t33-1__-A-AD)*  T%:%:%?%?%)%:%:%?%?D!"$"4"4"A"A!%!3!3!@!@D>>dnn;;"nn;;DOr    c                    | j                   d   j                         }| j                   d   j                         }d}t        j                  | j                         5 }|j	                  dddi      D ]&  }|j                  |d   |j                  d	             ( |j	                  d
d|i      }d d d        t        j                  j                         }i }dx}	}
D ]  }|j                  d      }| j                  |      }||d<   ||d<   |j                  d      j                  dd|fgd      }|s+|j                  d      j                  dd|d   fdgd      }|r|j                  |       |
dz  }
n|j                  |      }|	dz  }	|||<   ||d<    |D ]2  }|j                  d      }|s||v s||   j                  |d   _        4 t"        j%                  d|	|
       |	|
t'        |      dS # 1 sw Y   KxY w)Nr&   r.   a   EmployeeID,FirstName,LastName,JobTitle,eMail,OfficePhone,MobilePhone,DateOfBirth,BirthPlace,IdNumber,PassportNumber,PassportExpirationDate,NumOfChildren,SocialInsuranceNumber,Gender,MartialStatus,CitizenshipCountryCode,CountryOfBirth,Department,Manager,StartDate,Salary,BankAccount,ActiveDepartmentsz$selectz	Code,Name)paramsCodeNameEmployeesInfor   r8   	b1_syncedr   Frm   r;   r   r<   rC   )r   r;   F	_odoo_empr   z!B1 import: %s created, %s updated)createdupdatedtotal)rq   sudor   from_envget_all_b1_get_or_createrr   r   Datetimenowr   rw   r>   writecreater?   r   _loggerinfor   )rx   Employeerz   selectb1drowsr   by_b1idr   r   ry   b1_idr}   empmgr_b1s                   r   action_import_from_b1z HrEmployee.action_import_from_b1   sA   88M*//1xx(--/( 	 !!$((+ 	KrZZy+6NZO A&&qy!%%-@A::oy&6I:JD		K oo!!#' 	#CGGL)E((-D #D%*D!"''E':AA"C/0 B C +++>EEc4<02PQYZ F  		$1ood+1 GEN"C'	#,  	@CWWY'F&G+-4V_-?-?K *	@
 	8'7K"wTKKK	K 	Ks   AG99Hc                 T   | st        t        d            t        | j                         d}t	        j
                  | j                        5 }| D ]  }|j                         }|j                  r"|j                  d|j                   d|       nBd|j                   |d<   |j                  d|      }|r|j                  d	      r
|d	   |_        t        j                  j                         |_        |d
z  } 	 d d d        t         j#                  d|       |S # 1 sw Y   !xY w)NzmNo employee selected to push. Use 'Push all employees to SAP B1' from the list view if that's what you meant.r   zEmployeesInfo())jsonzODOO-ExternalEmployeeNumberr   r8   r   zB1 push: %s employees)r   r   r	   rq   r   r   r   r   patchr?   postrr   r   r   r   r   r   r   )rx   pushedr   r   r   r   s         r   action_push_to_b1zHrEmployee.action_push_to_b1   s    AG   	'txx0!!$((+ 	r 
++-%%HH~c.@.@-AC$HO7<SVVH5ED12 ggoDgAG7;;|#<-4\-B* & 3 3 5!
	 	,f5	 	s   B0DD'c                 Z    | j                   d   j                  g       j                         S )zExplicit bulk push -- the only place 'push everyone' is allowed,
        so it can never happen by accident (see action_push_to_b1).r&   )rq   r>   r   )rx   s    r   action_push_all_to_b1z HrEmployee.action_push_all_to_b1   s'     xx&--b1CCEEr    c                     | j                  g       }|j                  d       }|r)t        | j                  d      sy |j	                          y y )Nc                 n    | j                    xs' | j                  xr | j                  | j                   kD  S r4   )r   
write_date)es    r   <lambda>z-HrEmployee._cron_push_to_b1.<locals>.<lambda>   s'    !++oV!,,*U1<<!++;U r    T)soft)r>   filteredr	   rq   r   )rx   
candidatesstales      r   _cron_push_to_b1zHrEmployee._cron_push_to_b1   sI    [[_
##V
 1$((F##% r    N)__name__
__module____qualname___inheritr   Integerr   r   r   Dater]   Floatr_   Charrb   r   r   r   r   r   r   r"   r    r   r%   r%   2   s    H $V^^#4ed!CN
  ~5'9;I  FKK'>GYZMM:LMI!fkk)<EWXO0h%R/Lf8F
&r    r%   )__doc__loggingodoor   r   r   odoo.exceptionsr   sapb1_clientr   r	   	getLoggerr   r   ru   r   rv   r   r   r#   Modelr%   r"   r    r   <module>r      s     " " % E
'

H
% %8<$nU9y 
 }=  O& O&r    