
    iC                         S SK JrJrJr  S SKJrJr  S SKJr  S SKJ	r	  S SK
Jr  S SKJrJrJr  S SKJr  S SKJr   " S	 S
5      rg)    )ListDictOptional)datetimedate)timezone)Q)Stamp)PayrollIntegrationPayrollSubmissionPayrollSubmissionStamp)PayrollAdapterFactory)MappingServicec                       \ rS rSrSrS\4S jr SS\S\S\S	\	\
\      S
\4
S jjrS\
\   S\S
\4S jrS
\4S jrSrg)PayrollService   z(Service for handling payroll submissionspayroll_integrationc                     Xl         [        R                  " UR                  UR                  =(       d    SUR
                  =(       d    SUR                  =(       d    SS.5      U l        [        5       U l	        g)zi
Initialize service with payroll integration

Args:
    payroll_integration: PayrollIntegration instance
 )api_endpointapi_key
api_secretN)
integrationr   create_adapterproviderr   r   r   adapterr   mapping_service)selfr   s     1D:\TimeStamps\payroll\services\payroll_service.py__init__PayrollService.__init__   sa     /,;;(( 3 @ @ FB.66<"1<<B
  ./    Nuser_idperiod_start
period_end	stamp_idsreturnc                    U R                   (       d"  [        SU R                  R                   35      eU R                  R                  XR                  5      nU(       d  [        SU 35      e[        UUUS9nU(       a  U[        US9-  n[        R                  R                  U5      R                  SS5      nUR                  5       (       d  [        S5      eU R                  Xu5      n[        R                  " U[        R                  R!                  5       5      n	[        R                  " U[        R"                  R!                  5       5      n
U R                   R%                  UU	U
U5      n[&        R                  R)                  U R                  UUUUS   (       a  S	OS
UR+                  SS5      US   (       a  [,        R.                  " 5       OSUS   (       d!  SR1                  UR+                  S/ 5      5      OSS9nU H!  n[2        R                  R)                  UUS9  M#     US   (       a>  [,        R.                  " 5       U R                  l        U R                  R7                  S/S9  U$ )a  
Submit timesheet for a user for a given period

Args:
    user_id: Internal user UUID
    period_start: Start date of period
    period_end: End date of period
    stamp_ids: Optional list of specific stamp IDs to include
    
Returns:
    PayrollSubmission instance
zUnsupported payroll provider: z#No employee mapping found for user )r#   	date__gte	date__lte)id__inr   timez(No stamps found for the specified periodsuccess	submittedfailedreference_idr   N
errors)r   r#   r$   r%   submission_statusexternal_reference_idsubmitted_aterror_message)
submissionstamp	last_sync)update_fields)r   
ValueErrorr   r   r   get_employee_mappingr	   r
   objectsfilterorder_byexists_transform_stamp_datar   combineminr,   maxsubmit_timesheetr   creategetr   nowjoinr   r9   save)r   r#   r$   r%   r&   employee_idquerystampstimesheet_dataperiod_start_dtperiod_end_dtresultr7   r8   s                 r   rE   PayrollService.submit_timesheet    s   & ||=d>N>N>W>W=XYZZ **??IYIYZB7)LMM " 
 Qi((E%%e,55ffE}}GHH 33FH #**<9J9J9LM ((X\\5F5F5HI..	
 '..55 $ 0 0%!-3I->kH"(**^R"@+1)+<$EKIEV$))FJJx$<=\^ 6 	

 E"**11% 2   ))1D&!!!>r"   rM   rK   c                   ^   " S S5      nT R                   R                  nT R                   R                  nS[        S[        [           4U 4S jjnS[        S[        [           4U 4S jjnUT R                   l        UT R                   l         T R                   R                  [        U5      U5      nUT R                   l        UT R                   l        U$ ! UT R                   l        UT R                   l        f = f)z=
Transform stamps using adapter, with proper mapping lookups
c                   2    \ rS rSrS rS\S\\   4S jrSrg);PayrollService._transform_stamp_data.<locals>.MappedAdapterw   c                 (    Xl         X l        X0l        g N)r   r   r   )r   r   r   r   s       r   r    DPayrollService._transform_stamp_data.<locals>.MappedAdapter.__init__x   s    &'6$#. r"   
project_idr'   c                 L    U R                   R                  XR                  5      $ rX   )r   get_project_mappingr   )r   rZ   s     r   r\   OPayrollService._transform_stamp_data.<locals>.MappedAdapter.get_project_mapping}   s    ++??
L\L\]]r"   r   r   r   N)	__name__
__module____qualname____firstlineno__r    strr   r\   __static_attributes__ r"   r   MappedAdapterrU   w   s!    /
^c ^hsm ^r"   rf   rZ   r'   c                 b   > TR                   R                  [        U 5      TR                  5      $ rX   )r   r\   rc   r   )rZ   r   s    r   r\   APayrollService._transform_stamp_data.<locals>.get_project_mapping   s&    '';;C
OTM]M]^^r"   r#   c                 P   > TR                   R                  U TR                  5      $ rX   )r   r<   r   )r#   r   s    r   r<   BPayrollService._transform_stamp_data.<locals>.get_employee_mapping   s"    ''<<WdFVFVWWr"   )r   r\   r<   rc   r   transform_stamp_datalist)	r   rM   rK   rf   original_get_projectoriginal_get_employeer\   r<   rQ   s	   `        r   rA   $PayrollService._transform_stamp_datar   s    
	^ 	^  $||?? $ A A	_C 	_HSM 	_	X# 	X(3- 	X ,?(,@)	F\\66tF|[QF 0DDLL,0EDLL- 0DDLL,0EDLL-s   %C $C>c                     U R                   (       d  SSU R                  R                   3S.$ U R                   R                  5       nUU(       a  SS.$ SS.$ )zW
Validate connection to payroll system

Returns:
    Dictionary with validation result
FzUnsupported provider: )validmessagezConnection successfulzConnection failed)r   r   r   validate_credentials)r   is_valids     r   validate_connection"PayrollService.validate_connection   sc     ||3D4D4D4M4M3NO 
 <<4462:.
 	
@S
 	
r"   r^   rX   )r_   r`   ra   rb   __doc__r   r    rc   r   r   r   r   rE   r
   r   rA   ru   rd   re   r"   r   r   r      s    20,> 0. *.PP P 	P
 DI&P 
Pd"DK "c "d "H
T 
r"   r   N)typingr   r   r   r   r   django.utilsr   django.db.modelsr	   stamps.modelsr
   payroll.modelsr   r   r   payroll.adapters.factoryr    payroll.services.mapping_servicer   r   re   r"   r   <module>r      s/    ' ' # !   X X : ;\
 \
r"   