
    MBj|4                        d Z ddlmZ ddlmZ ddlmZ ddlmZm	Z	m
Z
 ddlmZ ddlmZ ddlmZmZ dd	lmZ dd
lmZ ddlmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$ de%de%de%fdZ&e ed      d               Z'e ed      d               Z(e ed      d               Z)ed        Z*ed        Z+ed        Z,ed        Z-e ed      d               Z.e ed      d               Z/y)u   payroll/views/payroll_run_views.py
Module 5 — Payroll Run approval-action FBVs.
List/Nav/Form pages are handled by CBVs in payroll/cbv/payroll_run.py.
    )messages)Group)HttpResponse)get_object_or_404redirectrender)timezone)gettext_lazy)login_requiredpermission_required)notify)PayrollRunActionForm)LOG_ACTION_CA_APPROVELOG_ACTION_CEO_APPROVELOG_ACTION_EXECUTELOG_ACTION_RETURNLOG_ACTION_SUBMITRUN_CA_APPROVEDRUN_CEO_APPROVED	RUN_DRAFTRUN_PAIDRUN_RETURNEDRUN_SUBMITTED
PayrollRunPayrollRunLog
group_nameverbdescriptionc                     	 t         j                  j                  |       }|j                  j	                  d      D ]  }t        j                  ||||        y# t         j                  $ r Y yw xY w)z=Send an in-app notification to all members of a Django Group.)nameT)	is_active)	recipientr   r   N)r   objectsgetuser_setfilterr   sendDoesNotExist)r   r   r   actorgroupusers         C/var/www/python-projects/worksol/payroll/views/payroll_run_views.py_notify_groupr-   "   sk    !!z!2NN))D)9 	SDKKDkR	S s   AA A32A3zpayroll.view_payrollrunc                    t        t        |      }|j                  j                  d      j	                  d      }|j
                  j                  d      j	                  d      }t        | j                  j                  j                  dd            }|j                  t        k(  }|j                  t        k(  xr |j                  j                         }|j                  t        k(  xr d	|v }|j                  t        k(  xr d
|v }	|j                  t        k(  xr d	|v }
|j                  t        t        fv xr
 d	|v xs d
|v }t!        | d|||||||	|
|d	      S )Npkemployeeemployee__employee_first_namer)   
created_atr    TflatChief AccountantCEOz#payroll/payroll_run/run_detail.html)	runlineslogscan_compute
can_submitcan_ca_approvecan_ceo_approvecan_execute
can_return)r   r   r9   select_relatedorder_byapproval_logssetr+   groupsvalues_liststatusr   existsr   r   r   r   )requestr0   r8   r9   r:   user_groupsr;   r<   r=   r>   r?   r@   s               r,   payroll_run_detailrK   /   sP    J2
.CII$$Z099:YZE++G4==lKDgll))55f45HIK**	)Ky(?SYY-=-=-?JZZ=0V5G;5VNjjO3L8LO** 00V5G;5VK?? k)AUk-A  '@" (*" 
C 
 
    zpayroll.change_payrollrunc           
      *   t        t        |t              }| j                  dk(  rX|j	                          t        j                  | t        d|j                  j                          d|j                  d             t        d|j                        S )Nr0   rG   POSTz	Computed z employee payslip(s). Gross: z,.2fpayroll-run-detailr/   )r   r   r   methodcomputer   success_r9   counttotal_grossr   r0   )rI   r0   r8   s      r,   payroll_run_computerW   R   sv     J2i
@C~~	#))//+,,I#//Z^I_`a	
 (SVV44rL   c                    t        t        |t              }t        | j                  xs d       }| j
                  dk(  ri|j                         rX|j                  j                         s6t        j                  | t        d             t        d|j                        S t        |_        t!        j"                         |_        |j'                  ddg       t(        j*                  j-                  |t.        | j0                  |j2                  j5                  d	d
             t7        ddd|j8                   d|j:                   d|j<                   d| j0                         t        j>                  | t        d|j8                   d             t        d|j                        S tA        | d||t        d      d      S )NrN   rO   z?Cannot submit: run has no computed lines. Please compute first.rP   r/   rG   submitted_atupdate_fieldscomment r8   actionr)   r\   r6   zPayroll submitted for reviewRun z (u   –z() submitted for Chief Accountant review.r   r   r)   z submitted to Chief Accountant.$payroll/payroll_run/action_form.htmlzSubmit for Approvalformr8   action_label)!r   r   r   r   rO   rQ   is_validr9   rH   r   errorrT   r   r0   r   rG   r	   nowrY   saver   r#   creater   r+   cleaned_datar$   r-   	referenceperiod_start
period_endrS   r   )rI   r0   r8   rd   s       r,   payroll_run_submitro   b   sm    J2i
@C 45D~~DMMOyy!NN7A&g$hi0SVV<<"
#<<>.9:$$-W\\%%)))R8 	% 	
 	/s}}oR0@0@/AS^^DTT|},,		
 	!d3==/9X$Y"Z[,88'AQ?T=UVX XrL   c           	      N   t        t        |t              }t        | j                  j
                  j                  dd            }d|vr6t        j                  | t        d             t        d|j                        S t        | j                  xs d       }| j                  d	k(  r|j                         rt         |_        |j%                  d
g       t&        j(                  j+                  |t,        | j                  |j.                  j1                  dd             t3        ddd|j4                   d| j                         t        j6                  | t        d|j4                   d             t        d|j                        S t9        | d||t        d      d      S )NrN   r    Tr4   r6   z6Only Chief Accountant members can perform this action.rP   r/   rO   rG   rZ   r\   r]   r^   r7   zPayroll awaiting CEO approvalr`   u>    approved by Chief Accountant — awaiting CEO final approval.ra   z approved. Forwarded to CEO.rb   zApprove (Chief Accountant)rc   )r   r   r   rD   r+   rE   rF   r   rg   rT   r   r0   r   rO   rQ   rf   r   rG   ri   r   r#   rj   r   rk   r$   r-   rl   rS   r   rI   r0   r8   rJ   rd   s        r,   payroll_run_ca_approverr      s^   
J2m
DCgll))55f45HIK,w"Z [\,88 45D~~DMMO$
z*$$1%%)))R8 	% 	
 	0s}}o-kl,,		
 	!d3==/9U$V"WX,88'AQ?[=\]_ _rL   c           	      N   t        t        |t              }t        | j                  j
                  j                  dd            }d|vr6t        j                  | t        d             t        d|j                        S t        | j                  xs d       }| j                  d	k(  r|j                         rt         |_        |j%                  d
g       t&        j(                  j+                  |t,        | j                  |j.                  j1                  dd             t3        ddd|j4                   d| j                         t        j6                  | t        d|j4                   d             t        d|j                        S t9        | d||t        d      d      S )NrN   r    Tr4   r7   z!Only CEO can perform this action.rP   r/   rO   rG   rZ   r\   r]   r^   r6   u-   Payroll approved by CEO — ready for paymentr`   z8 CEO-approved. Chief Accountant can now execute payment.ra   z+ CEO-approved. Ready for payment execution.rb   zFinal Approval (CEO)rc   )r   r   r   rD   r+   rE   rF   r   rg   rT   r   r0   r   rO   rQ   rf   r   rG   ri   r   r#   rj   r   rk   r$   r-   rl   rS   r   rq   s        r,   payroll_run_ceo_approvert      s^   
J2o
FCgll))55f45HIKKw"E FG,88 45D~~DMMO%
z*$$2',,%%)))R8 	% 	
 	@s}}o-ef,,		
 	!d3==/9d$e"fg,88'AQ?U=VWY YrL   c           	          t        t        |      }|j                  t        t        fvr6t        j                  | t        d             t        d|j                        S t        | j                  j                  j                  dd            }ddh|z  s6t        j                  | t        d	             t        d|j                        S t        | j                  xs d       }| j                   d
k(  r|j#                         rt$        |_        |j'                  dg       t(        j*                  j-                  |t.        | j                  |j0                  j3                  dd             t5        ddd|j6                   d| j                   d| j                         t        j8                  | t        d|j6                   d             t        d|j                        S t;        | d||t        d      d      S )Nr/   z/Run cannot be returned from its current status.rP   r    Tr4   r6   r7   z.You do not have permission to return this run.rO   rG   rZ   r\   r]   r^   zPayroll Masterz#Payroll run returned for correctionr`   z was returned by z. Please review and resubmit.ra   z returned for correction.rb   zReturn for Correctionrc   )r   r   rG   r   r   r   rg   rT   r   r0   rD   r+   rE   rF   r   rO   rQ   rf   r   ri   r   r#   rj   r   rk   r$   r-   rl   warningr   rq   s        r,   payroll_run_returnrw      s   
J2
.C
zz-99w"S TU,88gll))55f45HIK'+5w"R ST,88 45D~~DMMO!
z*$$-W\\%%)))R8 	% 	
 	6s}}o->w||nLij,,		
 	!d3==/9R$S"TU,88'AQ?V=WXZ ZrL   c           	          t        t        |t              }t        | j                  j
                  j                  dd            }d|vr6t        j                  | t        d             t        d|j                        S t        | j                  xs d       }| j                  d	k(  r|j                         rt         |_        |j%                  d
g       t&        j(                  j+                  |t,        | j                  |j.                  j1                  dd             t        j2                  | t        d|j4                   d             t        d|j                        S t7        | d||t        d      d      S )NrN   r    Tr4   r6   z*Only Chief Accountant can execute payment.rP   r/   rO   rG   rZ   r\   r]   r^   r`   z- marked as PAID. Download payment file below.zpayroll-run-payment-filerb   zExecute Paymentrc   )r   r   r   rD   r+   rE   rF   r   rg   rT   r   r0   r   rO   rQ   rf   r   rG   ri   r   r#   rj   r   rk   r$   rS   rl   r   rq   s        r,   payroll_run_executery      s7   
J26F
GCgll))55f45HIK,w"N OP,88 45D~~DMMO
z*$$.gll%%)))R8 	% 	
 	!d3==/9f$g"hi2svv>>'AQ?P=QRT TrL   c                    ddl }ddl}t        t        |      }|j                  t
        t        fvr6t        j                  | t        d             t        d|j                        S |j                         }|j                  }d|_        |j                  g d       |j                   j#                  dd	      j%                  d
      }t'        |d      D ]  \  }}	t)        |	j*                  dd      }
|j                  |t-        |	j*                        t)        t)        |	j*                  dd      dd      |
r|
j.                  nd|
r|
j0                  nd|
r|
j2                  ndt5        |	j6                        |	j8                  |	j:                  g	        |j=                         }|j?                  |       |jA                  d       tC        |d      }d|jD                   d|d<   |S )z1Generate and download bank payment file as Excel.r   Nr/   z2Payment file is only available after CEO approval.rP   zBank Payment)	zS/NzEmployee NamezEmployee No.z	Bank NamezAccount NumberBranchzNet PayGradeStepemployee__employee_bank_detailsemployee__employee_work_infor2      employee_bank_detailsemployee_work_infoemployee_idr]   zAapplication/vnd.openxmlformats-officedocument.spreadsheetml.sheet)content_typezattachment; filename="payment_z.xlsx"zContent-Disposition)#ioopenpyxlr   r   rG   r   r   r   rg   rT   r   r0   Workbookactivetitleappendr9   rA   rB   	enumerategetattrr1   str	bank_nameaccount_numberbranchfloatnet_paygrade_snapshotstep_snapshotBytesIOri   seekr   rl   )rI   r0   r   r   r8   wbwsr9   ilinebankbufresponses                r,   payroll_run_payment_filer      s    
J2
.C
zz*H55w"V WX,88				B	BBHII   II$$)& h./ 

 UA& 4t}}&=tD
		GDMM+?FWYZ"DNN#'DRDKKR$,,

 
	 **,CGGCLHHQKXH
 )v> "# OrL   c                 H    ddl m} t        |||      }t        | dd|i      S )zCReturn payslip breakdown for a single employee line (HTMX partial).r   )PayrollRunLine)r0   run_idz'payroll/payroll_run/line_breakdown.htmlr   )payroll.models.payroll_runr   r   r   )rI   run_pkline_pkr   r   s        r,   payroll_run_line_detailr   ;  s)     :^GD'DvtnUUrL   N)0__doc__django.contribr   django.contrib.auth.modelsr   django.httpr   django.shortcutsr   r   r   django.utilsr	   django.utils.translationr
   rT   horilla.decoratorsr   r   notifications.signalsr   payroll.forms.payroll_run_formsr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r-   rK   rW   ro   rr   rt   rw   ry   r   r    rL   r,   <module>r      sa  
 $ , $ @ @ ! 6 B ( @   "c  3  ./ 0 B 015 2 5 01X 2 X> _ _> Y Y> Z ZD T T2 ./1 0 1r ./V 0 VrL   