
    MBjW                     n    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
mZmZ d Z eed	      d
        Zy)z
expense/signals.py
==================
Budget allocation tracking: update committed/approved/disbursed amounts
whenever an ExpenseRequest status changes.
    )pre_save)receiver)F   )STATUS_PENDINGSTATUS_APPROVEDSTATUS_DISBURSED
STATUS_KIVSTATUS_RESUBMITTEDc                    | syg }|dk(  r%t        d      |z
  | _        |j                  d       n)|dk(  r$t        d      |z
  | _        |j                  d       |dk(  r%t        d      |z   | _        |j                  d       nS|dk(  r%t        d      |z   | _        |j                  d       n)|dk(  r$t        d      |z   | _        |j                  d       |r%| j                  t        t        |                   yy)	z|
    Move `amount` from one bucket to another on a BudgetAllocation.
    Uses F() expressions to avoid race conditions.
    N	committedcommitted_amountapprovedapproved_amount	disburseddisbursed_amount)update_fields)r   r   appendr   r   savelistset)allocremove_fromadd_toamountr   s        3/var/www/python-projects/worksol/expense/signals.py_update_allocationr      s   
 Mk!!"#5!6!?/0	
	" !"3 4v =./!"#5!6!?/0	:	 !"3 4v =./	;	!"#5!6!?/0

c-&8!9
:     zexpense.ExpenseRequest)senderc                    |j                   sy	 | j                  j                  |j                         }|j                  }|j                  }||k(  ry|j                         }|j                  }d}|t        t        t        fv rd}n|t        k(  rd}d}	|t        t        t        fv rd}	n|t        k(  rd}	n|t        k(  rd}	t        |||	|       y# | j                  $ r Y yw xY w)z
    On every save of an ExpenseRequest, detect a status change and
    move the amount between budget allocation buckets accordingly.
    N)pkr   r   r   )r!   objectsgetDoesNotExiststatusget_current_allocationr   r   r   r
   r   r	   r   )
r   instancekwargsold
old_status
new_statusr   r   r   r   s
             r   sync_budget_allocationr,   4   s     ;;nn  HKK 0 JJZ++-E__F Kn&8*EE!		&  Fn&8*EE		&	'	' uk66:=  s   &C C"!C"N)__doc__django.db.models.signalsr   django.dispatchr   django.db.modelsr   modelsr   r   r	   r
   r   r   r,    r   r   <module>r3      s@    . $  ;> 
(34); 5);r   