Ë
    
.Úi§…  ã                  ó2  — d dl mZ d dlmZ d dlmZ d dlm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mZ d dlmZ d dlmZ d dlmZ d dlmZ  G d„ de«      Zddl	m Z m!Z!m"Z" ddlm#Z#m$Z$m%Z%m&Z& ddl'm(Z(m)Z)m*Z*m+Z+m,Z, d„ Z- G d„ dej\                  «      Z/ G d„ d«      Z0d-d„Z1d-d„Z2d.d„Z3ddœd/d„Z4d0d „Z5d!„ Z6d1d"„Z7d1d#„Z8d1d$„Z9d2d%„Z: G d&„ d'e0ejv                  «      Z< G d(„ d)e0ejz                  «      Z> G d*„ d+e0ejv                  «      Z?y,)3é    )Úannotations)ÚDecimal)ÚOptional)Úapps)Úmodels)ÚQ)Útimezone)ÚpermissionsÚserializersÚviewsets)Úaction)ÚPermissionDeniedÚValidationError)ÚPageNumberPagination)ÚResponse)ÚDjangoFilterBackend)ÚOrderingFilterc                  ó   — e Zd ZdZdZdZdZy)ÚTreasuryPaginationé2   Ú	page_sizeéÈ   ÚpageN)Ú__name__Ú
__module__Ú__qualname__r   Úpage_size_query_paramÚmax_page_sizeÚpage_query_param© ó    ú./var/www/html/acx/treasury_management/views.pyr   r      s   „ Ø€IØ'ÐØ€MØÑr!   r   é   )ÚTreasuryAccountÚTreasuryMovementÚRemittanceBatch)ÚTreasuryAccountSerializerÚTreasuryMovementSerializerÚRemittanceBatchSerializerÚRemittanceLineSerializer)Úcreate_manual_movementÚcreate_transferÚcreate_remittance_draftÚadd_payment_to_remittanceÚmark_remittance_paidc                óz  — t        | dd «      }|r|S t        | dd «      }|r|j                  sy d }dD ]  }	 t        j                  |d«      }|r nŒ |sy |j
                  j                  d«      j                  |d¬«      j                  d«      j                  «       }|r|j                  S d S # t        $ r Y Œ‡w xY w)NÚtenantÚuser)ÚaccountsÚtenancyÚ
MembershipÚactive)r2   Ústatusú-id)ÚgetattrÚis_authenticatedr   Ú	get_modelÚ	ExceptionÚobjectsÚselect_relatedÚfilterÚorder_byÚfirstr1   )Úrequestr1   r2   r5   Ú	app_labelÚms         r"   Úresolve_tenant_from_requestrE   +   sÐ   € Ü�W˜h¨Ó-€FÙØˆä�7˜F DÓ)€DÙ�t×,Ò,Øà€JØ,ò ˆ	ð	ÜŸ™¨	°<Ó@ˆJÙÙð ðñ Øð 	×Ñ×)Ñ)¨(Ó3ß	‰�T (ˆÓ	+ß	‰�%‹ß	‰‹ð	 ñ ˆ1�8‰8Ð"˜dÐ"øô ò 	Ùð	ús   ¶B.Â.	B:Â9B:c                  ó   — e Zd Zd„ Zy)ÚIsTenantMemberc                ó\   — t        |j                  xr |j                  j                  «      S ©N)Úboolr2   r:   )ÚselfrB   Úviews      r"   Úhas_permissionzIsTenantMember.has_permissionJ   s    € Ü�G—L‘LÒB W§\¡\×%BÑ%BÓCÐCr!   N)r   r   r   rM   r    r!   r"   rG   rG   I   s   „ óDr!   rG   c                  ó   — e Zd Zd„ Zd„ Zd„ Zy)ÚTenantScopedMixinc                óJ   — t        | j                  «      }|st        d«      ‚|S )Nz(Tenant context missing for this request.)rE   rB   r   )rK   r1   s     r"   Ú
get_tenantzTenantScopedMixin.get_tenantO   s$   € Ü,¨T¯\©\Ó:ˆÙÜ"Ð#MÓNÐNØˆr!   c                óF   — | j                  «       }|j                  |¬«      S )N©r1   )rQ   r?   )rK   Úqsr1   s      r"   Úfilter_by_tenantz"TenantScopedMixin.filter_by_tenantU   s   € Ø—‘Ó"ˆØ�y‰y ˆyÓ'Ð'r!   c                ór   — | j                  «       }|j                  || j                  j                  ¬«       y )N)r1   Ú
created_by)rQ   ÚsaverB   r2   )rK   Ú
serializerr1   s      r"   Úperform_createz TenantScopedMixin.perform_createY   s(   € Ø—‘Ó"ˆØ�‰˜v°$·,±,×2CÑ2CˆÕDr!   N)r   r   r   rQ   rU   rZ   r    r!   r"   rO   rO   N   s   „ òò(óEr!   rO   c                óZ   — 	 | j                   j                  |«       y# t        $ r Y yw xY w)NTF)Ú_metaÚ	get_fieldr<   )ÚmodelÚ
field_names     r"   Ú_safe_has_fieldr`   `   s.   € ðØ�‰×Ñ˜jÔ)ØøÜò Ùðús   ‚ ž	*©*c                ó¢   — 	 | j                   j                  |«      }t        t        |dd«      xr t        |dd «      «      S # t        $ r Y yw xY w)NÚis_relationFÚrelated_model)r\   r]   rJ   r9   r<   )r^   r_   Úfs      r"   Ú_safe_has_relationre   h   sP   € ðØ�K‰K×!Ñ! *Ó-ˆÜ”G˜A˜}¨eÓ4ÒZ¼ÀÀOÐUYÓ9ZÓ[Ð[øÜò Ùðús   ‚?A Á	AÁAc                óÚ   — | }t        |«      D ][  \  }}t        ||«      s y|t        |«      dz
  k(  r yt        ||«      s y|j                  j                  |«      }|j                  }Œ] y)z¶
    Returns True if model has the nested field path (FK traversals), e.g. ['case','debtor','full_name'].
    This avoids FieldError when the schema differs between deployments.
    Fr#   T)Ú	enumerater`   Úlenre   r\   r]   rc   )r^   ÚpartsrD   ÚiÚprd   s         r"   Ú_safe_has_pathrl   p   sp   € ð
 	€AÜ˜%Ó ò 	‰ˆˆ1Ü˜q !Ô$ÙØ”�E“
˜Q‘ÒÙä! ! QÔ'ÙØ�G‰G×Ñ˜aÓ ˆØ�O‰O‰ð	ð r!   F©Úendc               óÔ  — | sy| j                  «       } | syd}	 | j                  dd«      }t        j                  j	                  |«      }|€>	 t        j                  j                  | d«      }|}|r|t        j                  d¬«      z   }t        j                  |«      r(t        j                  |t        j                  «       «      }|S # t
        $ r d}Y ŒŒw xY w# t
        $ r Y yw xY w)zÖ
    Parse a date/datetime from query params.
    - Accepts ISO datetime (with or without timezone) or YYYY-MM-DD.
    - If end=True and only a date is provided, we return start of next day (to use with __lt).
    NÚZz+00:00z%Y-%m-%dr#   )Údays)ÚstripÚreplacer	   ÚdatetimeÚfromisoformatr<   ÚstrptimeÚ	timedeltaÚis_naiveÚ
make_awareÚget_current_timezone)Úvaluern   ÚdtÚ
normalizedÚds        r"   Ú	_parse_dtr   ƒ   så   € ñ ØØ�K‰K‹M€EÙØà	€Bðà—]‘] 3¨Ó1ˆ
Ü×Ñ×,Ñ,¨ZÓ8ˆð 
€zð	Ü×!Ñ!×*Ñ*¨5°*Ó=ˆAØˆBÙØœ(×,Ñ,°!Ô4Ñ4�ô ×Ñ˜ÔÜ× Ñ  ¤X×%BÑ%BÓ%DÓEˆØ€Iøô ò ØŠðûô ò 	Ùð	ús#   š1C
 Á=C Ã
CÃCÃ	C'Ã&C'c           
     óø   — t        j                  t        j                  t        j                  | t        j                  d«      ¬«      t        j
                  d«      t        j                  dd¬«      ¬«      «      S ©NÚamount)Ú	directionÚthenr   é   é   ©Ú
max_digitsÚdecimal_places)ÚdefaultÚoutput_field)r   ÚSumÚCaseÚWhenÚFÚValueÚDecimalField©rƒ   s    r"   Ú_money_sum_exprr“   §   sQ   € Ü�:‰:Ü�‰Ü�K‰K )´&·(±(¸8Ó2DÔEÜ—L‘L “OÜ×,Ñ,¸È1ÔMô	
óð r!   c                 ó¬  — t        j                  t        j                  t        j                  t        j
                  j                  t        j                  d«      ¬«      t        j                  t        j
                  j                  t        j                  d«       ¬«      t        j                  d«      t        j                  dd¬«      ¬«      «      S r�   )r   rŒ   r�   rŽ   r%   Ú	DirectionÚINr�   ÚOUTr�   r‘   r    r!   r"   Ú_money_signed_exprr˜   ±   s†   € Ü�:‰:Ü�‰Ü�K‰KÔ"2×"<Ñ"<×"?Ñ"?ÄfÇhÁhÈxÓFXÔYÜ�K‰KÔ"2×"<Ñ"<×"@Ñ"@ÌÏÉÐQYÓHZÐGZÔ[Ü—L‘L “OÜ×,Ñ,¸È1ÔMô		
óð r!   c                ó²   — g d¢g d¢g d¢g d¢g d¢g d¢g}t        «       }|D ]3  }t        | |«      sŒdj                  |«      dz   }|t        d	i ||i¤Žz  }Œ5 |S )
N)ÚcaseÚdebtorÚ	full_name)rš   r›   Úname)rš   r›   Údisplay_name)rš   r›   Ú
first_name)rš   r›   Ú	last_name)rš   r›   ÚphoneÚ__Ú__icontainsr    ©r   rl   Újoin©Ú
base_modelÚtokenÚpathsÚqri   Úlookups         r"   Ú_search_debtor_fieldsr¬   ¼   sm   € â'Ú"Ú*Ú(Ú'Ú#ð€Eô 	
‹€AØò &ˆÜ˜* eÕ,Ø—Y‘Y˜uÓ%¨Ñ5ˆFØ”Ñ%�f˜e�_Ñ%Ñ%‰Að&ð €Hr!   c           	     ó¾   — ddgddgddgddgddgddgddgdd	gg}t        «       }|D ]3  }t        | |«      sŒd
j                  |«      dz   }|t        di ||i¤Žz  }Œ5 |S )NÚcustomerrœ   r�   rž   Úcompany_namerŸ   r    r¡   Úemailr¢   r£   r    r¤   r¦   s         r"   Ú_search_customer_fieldsr±   Í   s›   € à	�[Ð!Ø	�VÐØ	�^Ð$Ø	�^Ð$Ø	�\Ð"Ø	�[Ð!Ø	�WÐØ	�WÐð	€Eô 	
‹€AØò &ˆÜ˜* eÕ,Ø—Y‘Y˜uÓ%¨Ñ5ˆFØ”Ñ%�f˜e�_Ñ%Ñ%‰Að&ð €Hr!   c           	     óè   — ddg}t        | |«      s
t        «       S g d¢}g d¢}t        «       }|D ]@  }|D ]9  }dd||g}t        | |«      sŒdj                  |«      dz   }	|t        di |	|i¤Žz  }Œ; ŒB |S )z¬
    Some deployments may attach the creditor/customer on case.portfolio.customer OR case.portfolio.client OR case.portfolio.owner.
    We try all combinations safely.
    rš   Ú	portfolio)r®   ÚclientÚowner)rœ   r�   rž   r¯   rŸ   r    r¡   r°   r¢   r£   r    )rl   r   r¥   )
r§   r¨   Úportfolio_relÚrel_candidatesÚname_fieldsrª   ÚrelÚnfri   r«   s
             r"   Ú!_search_portfolio_customer_fieldsr»   à   s–   € ð
 ˜[Ð)€MÜ˜* mÔ4Ü‹sˆ
â4€NÚt€Kä	‹€AØò *ˆØò 	*ˆBØ˜[¨#¨rÐ2ˆEÜ˜j¨%Õ0ØŸ™ 5Ó)¨MÑ9�Ø”QÑ)˜& %˜Ñ)Ñ)‘ñ		*ð*ð €Hr!   c                óJ  — |xs dj                  «       }|s| S | j                  }t        «       }dD ]"  }t        ||«      sŒ|t        di |› d�|i¤Žz  }Œ$ t	        |ddg«      r|t        |¬«      z  }t	        |ddg«      r|t        |¬	«      z  }t	        |dd
g«      r|t        |¬«      z  }t	        |ddg«      r|t        |¬«      z  }t	        |ddg«      r|t        |¬«      z  }|t        ||«      z  }|t        ||«      z  }|t        ||«      z  }| j                  |«      S )NÚ )ÚlabelÚ	referenceÚnotesÚcurrencyr£   Úaccountr�   )Úaccount__name__icontainsrš   r¿   ©Úcase__reference__icontainsÚcase_number©Úcase__case_number__icontainsÚpayment)Úpayment__reference__icontainsrÀ   )Úpayment__notes__icontainsr    )	rr   r^   r   r`   rl   r¬   r±   r»   r?   )rT   r¨   r§   rª   Úpaths        r"   Ú_apply_text_searchrÍ   ö   sC  € ØŠ[�b×ÑÓ!€EÙØˆ	à—‘€JÜ	‹€Að <ò 4ˆÜ˜: tÕ,Ø”Ñ3˜˜˜kÐ*¨EÐ2Ñ3Ñ3‰Að4ô
 �j 9¨fÐ"5Ô6Ø	ŒQ¨Ô.Ñ.ˆä�j 6¨;Ð"7Ô8Ø	ŒQ¨%Ô0Ñ0ˆÜ�j 6¨=Ð"9Ô:Ø	ŒQ¨EÔ2Ñ2ˆä�j 9¨kÐ":Ô;Ø	ŒQ¨UÔ3Ñ3ˆÜ�j 9¨gÐ"6Ô7Ø	ŒQ¨Ô/Ñ/ˆð Ô	˜z¨5Ó	1Ñ1€AØÔ	  ¨UÓ	3Ñ3€AØÔ	*¨:°uÓ	=Ñ=€Aà�9‰9�Q‹<Ðr!   c                  óh   — e Zd ZeZegZeegZ	g d¢Z
ddgZej                  j                  «       Zd„ Zy)ÚTreasuryAccountViewSet)r�   rÁ   Ú
is_defaultÚ
created_atz-is_defaultr�   c                ó\   — | j                  t        j                  j                  «       «      S rI   )rU   r$   r=   Úall)rK   s    r"   Úget_querysetz#TreasuryAccountViewSet.get_queryset$  s"   € Ø×$Ñ$¤_×%<Ñ%<×%@Ñ%@Ó%BÓCÐCr!   N)r   r   r   r'   Úserializer_classrG   Úpermission_classesr   r   Úfilter_backendsÚordering_fieldsÚorderingr$   r=   rÓ   ÚquerysetrÔ   r    r!   r"   rÏ   rÏ     sD   „ Ø0ÐØ(Ð)ÐØ*¨NÐ;€OÚF€OØ˜vÐ&€Hà×&Ñ&×*Ñ*Ó,€HóDr!   rÏ   c                  ót  — e Zd ZeZegZeZe	e
gZg d¢ZddgZej                  j!                  «       Zd„ Z eddgd¬«      d	„ «       Z eddgd
¬«      d„ «       Z eddgd¬«      d„ «       Z G d„ dej0                  «      Z eddgd¬«      d„ «       Z G d„ dej0                  «      Z eddgd¬«      d„ «       Zy)ÚTreasuryMovementViewSet)Ú
value_daterÑ   r‚   ú-value_dater8   c           
     ó:  — | j                  t        j                  j                  dddddd«      «      }| j                  j
                  j                  d«      }|r|j                  |¬«      }| j                  j
                  j                  d«      }|r|j                  |¬«      }| j                  j
                  j                  d«      }|r|j                  |¬	«      }| j                  j
                  j                  d
«      }|r|j                  |¬«      }| j                  j
                  j                  d«      }|r|j                  |¬«      }| j                  j
                  j                  d«      }|r|j                  |¬«      }| j                  j
                  j                  d«      }|rt        ||«      }| j                  j
                  j                  d«      }	|	r*t        |j                  ddg«      r|j                  |	¬«      }| j                  j
                  j                  d«      }
|
r7t        |j                  |
j                  «       «      }|r|j                  |«      }| j                  j
                  j                  d«      }|r\t        |j                  |j                  «       «      t        |j                  |j                  «       «      z  }|r|j                  |«      }| j                  j
                  j                  d«      }|r}|j                  «       }|rkt        «       }t        |j                  ddg«      r|t        |¬«      z  }t        |j                  ddg«      r|t        |¬«      z  }|r|j                  |«      }t!        | j                  j
                  j                  d«      d¬«      }|r|j                  |¬«      }t!        | j                  j
                  j                  d«      d¬«      }|r|j                  |¬ «      }|S )!NrÂ   r®   rš   Úcase__debtorrÉ   Ú
remittance)Ú
account_id©Úcustomer_id)Úcase_idrƒ   r’   r7   ©r7   Úsource)rç   rª   r›   )Úcase__debtor_idÚdebtor_qÚ
customer_qÚcase_qr¿   rÄ   rÆ   rÇ   Ú	date_fromFrm   )Úvalue_date__gteÚdate_toT)Úvalue_date__lt)rU   r%   r=   r>   rB   Úquery_paramsÚgetr?   rÍ   rl   r^   r¬   rr   r±   r»   r   r   )rK   rT   râ   rä   rå   rƒ   r7   rç   rª   Ú	debtor_idré   Údqrê   Úcqrë   r¨   Úor_qrì   rî   s                      r"   rÔ   z$TreasuryMovementViewSet.get_queryset2  s]  € Ø×"Ñ"Ü×$Ñ$×3Ñ3°I¸zÈ6ÐSaÐclÐnzÓ{ó
ˆð
 —\‘\×.Ñ.×2Ñ2°9Ó=ˆ
ÙØ—‘ j�Ó1ˆBà—l‘l×/Ñ/×3Ñ3°JÓ?ˆÙØ—‘ {�Ó3ˆBà—,‘,×+Ñ+×/Ñ/°Ó7ˆÙØ—‘ 7�Ó+ˆBà—L‘L×-Ñ-×1Ñ1°+Ó>ˆ	ÙØ—‘ Y�Ó/ˆBà—‘×*Ñ*×.Ñ.¨xÓ8ˆÙØ—‘ &�Ó)ˆBà—‘×*Ñ*×.Ñ.¨xÓ8ˆÙØ—‘ &�Ó)ˆBð �L‰L×%Ñ%×)Ñ)¨#Ó.ˆÙÜ# B¨Ó*ˆBà—L‘L×-Ñ-×1Ñ1°(Ó;ˆ	Ùœ¨¯©°6¸8Ð2DÔEØ—‘¨9�Ó5ˆBà—<‘<×,Ñ,×0Ñ0°Ó<ˆÙÜ& r§x¡x°·±Ó1AÓBˆBÙØ—Y‘Y˜r“]�à—\‘\×.Ñ.×2Ñ2°<Ó@ˆ
ÙÜ(¨¯©°:×3CÑ3CÓ3EÓFÔIjÐkm×ksÑksÐu÷  vFñ  vFó  vHó  JIñ  IˆBÙØ—Y‘Y˜r“]�à—‘×*Ñ*×.Ñ.¨xÓ8ˆÙØ—L‘L“NˆEÙÜ“s�Ü! "§(¡(¨V°[Ð,AÔBØœA¸Ô?Ñ?�DÜ! "§(¡(¨V°]Ð,CÔDØœA¸5ÔAÑA�DÙØŸ™ 4›�Bô ˜dŸl™l×7Ñ7×;Ñ;¸KÓHÈeÔTˆ	ÙØ—‘¨9�Ó5ˆBä˜DŸL™L×5Ñ5×9Ñ9¸)ÓDÈ$ÔOˆÙØ—‘¨'�Ó2ˆBàˆ	r!   Frñ   Úsummary©ÚdetailÚmethodsÚurl_pathc                óÐ  — | j                  «       }|j                  j                  d«      }|dv r*|j                  t        j
                  j                  ¬«      }g }|j                  d«      j                  t        t        j                  j                  «      t        t        j                  j                  «      t        «       t        j                  d«      ¬«      j!                  d«      D ]\  }|j#                  |d   t%        |d   xs d«      t%        |d	   xs d«      t%        |d
   xs d«      t'        |d   xs d«      dœ«       Œ^ g }|j                  dd«      j                  t        t        j                  j                  «      t        t        j                  j                  «      t        «       t        j                  d«      t        j(                  d«      ¬«      j!                  dd«      D ]d  }|j#                  |d   |d   t%        |d   xs d«      t%        |d	   xs d«      t%        |d   xs d«      t'        |d   xs d«      |d   dœ«       Œf t+        ||dœ«      S )z­
        Returns totals and per-account balances for the filtered queryset.
        Useful for dashboards & account cards without fetching the whole paginated list.
        Úconfirmed_only)Ú1ÚtrueÚTrueÚyesÚonNr½   ræ   rÁ   Úid)Útotal_inÚ	total_outÚnetÚcountr  r   r  r  r  )rÁ   r  r  r  r  râ   rÝ   ©r  r  Úbalancer  Úlast_value_dater  r	  )rÂ   rÁ   r  r  r  r  r	  )ÚtotalsÚaccount_balances)rÔ   rð   rñ   r?   r%   ÚStatusÚ	CONFIRMEDÚvaluesÚannotater“   r•   r–   r—   r˜   r   ÚCountr@   ÚappendÚstrÚintÚMaxr   )rK   rB   rT   rü   r
  Úrowr  s          r"   rö   zTreasuryMovementViewSet.summary~  s1  € ð ×ÑÓ ˆð !×-Ñ-×1Ñ1Ð2BÓCˆØÐIÑIà—‘Ô"2×"9Ñ"9×"CÑ"C�ÓDˆBð ˆà�I‰I�jÓ!ß‰XÜ(Ô)9×)CÑ)C×)FÑ)FÓGÜ)Ô*:×*DÑ*D×*HÑ*HÓIÜ&Ó(Ü—l‘l 4Ó(ð	 ó ÷ ‰X�jÓ!ò	ˆCð �M‰Mà # J¡Ü # C¨
¡OÒ$8°qÓ 9Ü!$ S¨Ñ%5Ò%:¸Ó!;Ü˜s 5™zš¨QÓ/Ü   W¡Ò!2°Ó3ñõð	ð* Ðà�I‰I�l JÓ/ß‰XÜ(Ô)9×)CÑ)C×)FÑ)FÓGÜ)Ô*:×*DÑ*D×*HÑ*HÓIÜ*Ó,Ü—l‘l 4Ó(Ü &§
¡
¨<Ó 8ð ó ÷ ‰X�j ,Ó/ò	ˆCð ×#Ñ#à" <Ñ0Ø # J¡Ü # C¨
¡OÒ$8°qÓ 9Ü!$ S¨Ñ%5Ò%:¸Ó!;Ü" 3 y¡>Ò#6°QÓ7Ü   W¡Ò!2°Ó3Ø'*Ð+<Ñ'=ñõ
ð	ô.  6Ð?OÑPÓQÐQr!   zcustomer-suggestionsc                óþ  — | j                  «       }t        j                  j                  |¬«      j	                  d¬«      }|j                  t        j
                  j                  ¬«      }|j                  j                  d«      xs dj                  «       }|r4t        t        |«      t        t        |«      z  }|r|j                  |«      }t        |j                  d«      j                  t        t        j                   j"                  «      t        t        j                   j$                  «      t'        «       t)        j*                  d«      t)        j,                  d	«      ¬
«      j/                  d«      dd «      }t        j0                  j3                  d«      j4                  j6                  }|D �cg c]  }|j                  d«      sŒ|d   ‘Œ }	}|j                  j                  |	¬«      }
i }|
D ]s  }d}dD ]  }t9        ||d«      }|sŒ|} n |sDt9        |dd«      xs d}t9        |dd«      xs d}|› d|› �j                  «       xs t;        |«      }||t9        |d«      <   Œu g }|D ]}  }|j=                  |d   |j                  |d   «      xs d|d   › �t;        |d   xs d«      t;        |d   xs d«      t;        |d   xs d«      t?        |d   xs d«      |d   dœ«       Œ tA        |«      S c c}w )z‡
        Suggestions for selecting a creditor/customer (useful for remittances).
        Based on existing treasury movements.
        rS   T)Úcustomer__isnullræ   rª   r½   rä   r  rÝ   r  z-last_value_dateNr   r®   ©Úpk__in©rœ   r�   rž   r¯   rŸ   r    Ú ú#r  r   r  r  r  r	  )r  r�   r  r  r  r  r	  )!rQ   r%   r=   r?   Úexcluder  r  rð   rñ   rr   r±   r»   Úlistr  r  r“   r•   r–   r—   r˜   r   r  r  r@   r\   r]   Úremote_fieldr^   r9   r  r  r  r   )rK   rB   r1   rT   rª   rô   ÚrowsÚCustomerModelÚrÚcust_idsÚ	customersÚname_mapÚcr�   ÚattrÚvalrA   ÚlastÚouts                      r"   Úcustomer_suggestionsz,TreasuryMovementViewSet.customer_suggestions½  sÞ  € ð —‘Ó"ˆÜ×%Ñ%×,Ñ,°FÐ,Ó;×CÑCÐUYÐCÓZˆØ�Y‰YÔ.×5Ñ5×?Ñ?ˆYÓ@ˆð ×!Ñ!×%Ñ% cÓ*Ò0¨b×7Ñ7Ó9ˆÙÜ(Ô)9¸1Ó=Ô@aÔbrÐtuÓ@vÑvˆBÙØ—Y‘Y˜r“]�ô Ø�I‰I�mÓ$ß‰XÜ(Ô)9×)CÑ)C×)FÑ)FÓGÜ)Ô*:×*DÑ*D×*HÑ*HÓIÜ*Ó,Ü—l‘l 4Ó(Ü &§
¡
¨<Ó 8ð ó ÷ ‰XÐ(Ó)¨#¨2ð/ó

ˆô )×.Ñ.×8Ñ8¸ÓD×QÑQ×WÑWˆØ.2ÖK¨°a·e±e¸MÕ6J�A�mÓ$ÐKˆÐKØ!×)Ñ)×0Ñ0¸Ð0ÓAˆ	ØˆØò 	.ˆAØˆDØMò �Ü˜a  tÓ,�ÚØ�DÙð	ñ
 Ü  <°Ó6Ò<¸"�Ü˜q +¨tÓ4Ò:¸�Ø ˜'  4 &Ð)×0Ñ0Ó2Ò<´c¸!³f�Ø)-ˆH”W˜Q Ó%Ò&ð	.ð ˆØò 	ˆAØ�J‰Jà˜MÑ*Ø$ŸL™L¨¨=Ñ)9Ó:ÒTÀÀ!ÀMÑBRÐASÐ>TÜ # A j¡MÒ$6°QÓ 7Ü!$ Q {¡^Ò%8°qÓ!9Ü" 1 Y¡<Ò#4°1Ó5Ü   7¡¢¨qÓ1Ø'(Ð):Ñ';ñõ
ð	ô ˜‹}Ðùò= Ls   Æ5K:ÇK:zdebtor-suggestionsc                ó®  — | j                  «       }t        j                  j                  |¬«      j	                  d¬«      }|j
                  j                  d«      xs dj                  «       }|r#t        t        |«      }|r|j                  |«      }|j
                  j                  d«      }	 |rt        |«      nd}t        dt        |d	«      «      }t        t        d
dg«      st        g «      S t        |j	                  d¬«      j!                  d«      j#                  t%        j&                  d«      ¬«      j)                  d«      d| «      }	 t        j*                  j-                  d
«      j.                  j0                  j*                  j-                  d«      j.                  j0                  }	|D �
cg c]  }
|
j                  d«      sŒ|
d   ‘Œ }}
|	j                  j                  |¬«      }i }|D ]s  }d}dD ]  }t3        ||d«      }|sŒ|} n |sDt3        |dd«      xs d}t3        |dd«      xs d}|› d|› �j                  «       xs t5        |«      }||t3        |d«      <   Œu |D �cg c]   }|sŒ||j                  |«      xs d|› �dœ‘Œ" }}t        |«      S # t        $ r d}Y �Œñw xY w# t        $ r t        g «      cY S w xY wc c}
w c c}w )zf
        Suggestions for selecting a debtor (from case debtors linked to treasury movements).
        rS   T)Úcase__isnullrª   r½   Úlimitr   r#   r   rš   r›   )Úcase__debtor__isnullrè   r  )r  z-countNr  )rœ   r�   rž   rŸ   r    r  r  )r  r¾   )rQ   r%   r=   r?   r  rð   rñ   rr   r¬   r  r<   ÚmaxÚminrl   r   r  r  r  r   r  r@   r\   r]   r  r^   r9   r  )rK   rB   r1   rT   rª   ró   r.  Úlimit_nr   ÚDebtorModelr"  Ú
debtor_idsÚdebtorsr%  r~   r�   r'  r(  rA   r)  Údidr*  s                         r"   Údebtor_suggestionsz*TreasuryMovementViewSet.debtor_suggestionsý  sÃ  € ð
 —‘Ó"ˆÜ×%Ñ%×,Ñ,°FÐ,Ó;×CÑCÐQUÐCÓVˆà×!Ñ!×%Ñ% cÓ*Ò0¨b×7Ñ7Ó9ˆÙÜ&Ô'7¸Ó;ˆBÙØ—Y‘Y˜r“]�à×$Ñ$×(Ñ(¨Ó1ˆð	Ù$)”c˜%”j¨rˆGô �aœ˜W cÓ*Ó+ˆô Ô.°¸Ð0BÔCÜ˜B“<ÐäØ�J‰J¨DˆJÓ1ß‰VÐ%Ó&ß‰XœFŸL™L¨Ó.ˆXÓ/ß‰X�hÓ 	 'ð+ó
ˆð	 Ü*×0Ñ0×:Ñ:¸6ÓB×OÑO×UÑU×[Ñ[×eÑeÐfnÓo×|Ñ|÷  Cñ  CˆKð 59ÖU¨q¸A¿E¹EÐBSÕ<T�aÐ)Ó*ÐUˆ
ÐUØ×%Ñ%×,Ñ,°JÐ,Ó?ˆØˆØò 	.ˆAØˆDØ=ò �Ü˜a  tÓ,�ÚØ�DÙð	ñ
 Ü  <°Ó6Ò<¸"�Ü˜q +¨tÓ4Ò:¸�Ø ˜'  4 &Ð)×0Ñ0Ó2Ò<´c¸!³f�Ø)-ˆH”W˜Q Ó%Ò&ð	.ð PZÖaÈÒ]`�c H§L¡L°Ó$5Ò$B¸1¸S¸E¸ÓCÐaˆÐaÜ˜‹}ÐøôK ò 	Ø‹Gð	ûô" ò 	 Ü˜B“<Òð	 üò Vùò  bs=   Â/J! ÅA J3 Æ5KÇKÉ/KÉ7KÊ!J0Ê/J0Ê3K
Ë	K
c                  óæ  — e Zd Z ej                  «       Z ej                  ddg¬«      Z ej                  dd¬«      Z	 ej                  dd¬	«      Z ej                  d¬
«      Z ej                  dd¬	«      Z ej                  dd¬	«      Z ej                  dd¬	«      Z ej                  dd¬«      Z ej                  dd¬«      Z ej                  dd¬«      Z ej                  dd¬«      Zy)ú6TreasuryMovementViewSet.ManualMovementCreateSerializer)Úinr:  )r*  r*  )Úchoicesr…   r†   r‡   FT©ÚrequiredÚallow_blank©r=  )r=  Ú
allow_nullN)r   r   r   r   ÚIntegerFieldrÂ   ÚChoiceFieldrƒ   r‘   r‚   Ú	CharFieldrÁ   ÚDateTimeFieldrÝ   r¾   r¿   rÀ   r®   rš   rÉ   rá   r    r!   r"   ÚManualMovementCreateSerializerr9  7  sñ   „ Ø*�+×*Ñ*Ó,ˆØ+�K×+Ñ+°\À>Ð4RÔSˆ	Ø)�×)Ñ)°RÈÔJˆØ(�;×(Ñ(°%ÀTÔJˆØ.�[×.Ñ.¸Ô>ˆ
Ø%�×%Ñ%¨uÀ$ÔGˆØ)�K×)Ñ)°5ÀdÔKˆ	Ø%�×%Ñ%¨uÀ$ÔGˆð ,�;×+Ñ+°UÀtÔLˆØ'ˆ{×'Ñ'°À4ÔHˆØ*�+×*Ñ*°EÀdÔKˆØ-�[×-Ñ-°uÈÔN‰
r!   rE  ÚpostÚmanualc                ó  — | j                  «       }| j                  |j                  ¬«      }|j                  d¬«       |j                  }t
        j                  j                  |d   |¬«      j                  «       }|st        ddi«      ‚d }|j                  d«      rE	 t        j                  dd	«      }|j                  j                  |d   |¬«      j                  «       }d }|j                  d
«      rE	 t        j                  dd«      }	|	j                  j                  |d
   |¬«      j                  «       }t        |||d   |d   |j                  d«      xs |j                  |j                  d«      |j                  d«      xs d|j                  d«      xs d|j                  d«      xs d|||j                   ¬«      }
t#        t%        |
«      j                  d¬«      S # t        $ r Y �Œw xY w# t        $ r Y ŒÇw xY w)N©ÚdataT©Úraise_exceptionrÂ   ©Úpkr1   ú Invalid account for this tenant.r®   r$  ÚCustomerrš   Úcasesr�   rƒ   r‚   rÁ   rÝ   r¾   r½   r¿   rÀ   )r1   rÂ   rƒ   r‚   rÁ   rÝ   r¾   r¿   rÀ   r®   rš   rW   éÉ   ræ   )rQ   rE  rJ  Úis_validÚvalidated_datar$   r=   r?   rA   r   rñ   r   r;   r<   r+   rÁ   r2   r   r(   )rK   rB   r1   ÚsrJ  rÂ   r®   rP  rš   r�   Úmvs              r"   Úcreate_manualz%TreasuryMovementViewSet.create_manualG  sß  € à—‘Ó"ˆØ×/Ñ/°W·\±\Ð/ÓBˆØ	�
‰
 4ˆ
Ô(Ø×Ñˆä!×)Ñ)×0Ñ0°D¸±OÈFÐ0ÓS×YÑYÓ[ˆÙÜ! 9Ð.PÐ"QÓRÐRð ˆØ�8‰8�JÔðÜŸ>™>¨+°zÓB�Ø#×+Ñ+×2Ñ2°d¸:Ñ6FÈvÐ2ÓV×\Ñ\Ó^�ð ˆØ�8‰8�FÔðÜ—~‘~ g¨vÓ6�Ø—|‘|×*Ñ*¨d°6©lÀ6Ð*ÓJ×PÑPÓR�ô $ØØØ˜;Ñ'Ø˜‘>Ø—X‘X˜jÓ)Ò=¨W×-=Ñ-=Ø—x‘x Ó-Ø—(‘(˜7Ó#Ò) rØ—h‘h˜{Ó+Ò1¨rØ—(‘(˜7Ó#Ò) rØØØ—|‘|ô
ˆô Ô2°2Ó6×;Ñ;ÀCÔHÐHøô3 ò Úðûô ò Ùðús&   Â AG( Ã8AG8 Ç(	G5Ç4G5Ç8	HÈHc                  ó>  — e Zd Z ej                  «       Z ej                  «       Z ej                  dd¬«      Z ej                  dd¬«      Z
 ej                  d¬«      Z ej                  dd¬«      Z ej                  dd¬«      Z ej                  dd¬«      Zy)	ú*TreasuryMovementViewSet.TransferSerializerr…   r†   r‡   FTr<  r?  N)r   r   r   r   rA  Úfrom_accountÚ
to_accountr‘   r‚   rC  rÁ   rD  rÝ   r¾   r¿   rÀ   r    r!   r"   ÚTransferSerializerrY  s  s˜   „ Ø/�{×/Ñ/Ó1ˆØ-�[×-Ñ-Ó/ˆ
Ø)�×)Ñ)°RÈÔJˆØ(�;×(Ñ(°%ÀTÔJˆØ.�[×.Ñ.¸Ô>ˆ
Ø%�×%Ñ%¨uÀ$ÔGˆØ)�K×)Ñ)°5ÀdÔKˆ	Ø%�×%Ñ%¨uÀ$ÔG‰r!   r\  Útransferc                óR  — | j                  «       }| j                  |j                  ¬«      }|j                  d¬«       |j                  }t
        j                  j                  |d   |¬«      j                  «       }t
        j                  j                  |d   |¬«      j                  «       }|st        ddi«      ‚|st        ddi«      ‚|j                  |j                  k(  rt        dd	i«      ‚t        ||||d
   |j                  d«      xs |j                  |j                  d«      |j                  d«      xs d|j                  d«      xs d|j                  ¬«	      \  }}}	t        |rt!        |«      j                  nd |rt!        |«      j                  nd |	dœd¬«      S )NrI  TrK  rZ  rM  r[  z'Invalid source account for this tenant.z,Invalid destination account for this tenant.z2Destination must be different from source account.r‚   rÁ   rÝ   r¿   r½   rÀ   )	r1   rZ  r[  r‚   rÁ   rÝ   r¿   rÀ   rW   )r*  r:  Útransfer_keyrR  ræ   )rQ   r\  rJ  rS  rT  r$   r=   r?   rA   r   r  r,   rñ   rÁ   r2   r   r(   )
rK   rB   r1   rU  rJ  Úfrom_accÚto_accÚout_mvÚin_mvr_  s
             r"   r]  z TreasuryMovementViewSet.transfer}  s‰  € à—‘Ó"ˆØ×#Ñ#¨¯©Ð#Ó6ˆØ	�
‰
 4ˆ
Ô(Ø×Ñˆä"×*Ñ*×1Ñ1°T¸.Ñ5IÐRXÐ1ÓY×_Ñ_ÓaˆÜ ×(Ñ(×/Ñ/°4¸Ñ3EÈfÐ/ÓU×[Ñ[Ó]ˆÙÜ! >Ð3\Ð"]Ó^Ð^ÙÜ! <Ð1_Ð"`ÓaÐaØ�;‰;˜&Ÿ)™)Ò#Ü! <Ð1eÐ"fÓgÐgä&5ØØ!ØØ˜‘>Ø—X‘X˜jÓ)Ò>¨X×->Ñ->Ø—x‘x Ó-Ø—h‘h˜{Ó+Ò1¨rØ—(‘(˜7Ó#Ò) rØ—|‘|ô
'
Ñ#ˆ��|ô áBHÔ1°&Ó9×>Ò>ÈdÙ@EÔ0°Ó7×<Ò<È4Ø ,ñð
 ô
ð 	
r!   N)r   r   r   r(   rÕ   rG   rÖ   r   Úpagination_classr   r   r×   rØ   rÙ   r%   r=   rÓ   rÚ   rÔ   r   rö   r+  r7  r   Ú
SerializerrE  rW  r\  r]  r    r!   r"   rÜ   rÜ   (  s  „ Ø1ÐØ(Ð)ÐØ)ÐØ*¨NÐ;€OÚ<€OØ˜uÐ%€Hà×'Ñ'×+Ñ+Ó-€HòHñX �5 5 '°IÔ>ñ<Ró ?ð<Rñ| �5 5 'Ð4JÔKñ=ó Lð=ñ~ �5 5 'Ð4HÔIñ5ó Jð5ôrO¨×)?Ñ)?ô Oñ  �5 6 (°XÔ>ñ)Ió ?ð)IôVH˜[×3Ñ3ô Hñ �5 6 (°ZÔ@ñ!
ó Añ!
r!   rÜ   c                  óJ  — e Zd ZeZegZeZe	e
gZg d¢ZdgZej                  j!                  «       Zd„ Z eddgd¬«      d„ «       Z ed	dgd
¬«      dd„«       Z ed	dgd¬«      dd„«       Z ed	dgd¬«      dd„«       Z ed	dgd¬«      dd„«       Z eddgd¬«      d„ «       Zy)ÚRemittanceBatchViewSet)r  rÑ   Úamount_totalr7   r8   c           	     ó$  — | j                  t        j                  j                  dd«      j	                  ddd«      «      }| j
                  j                  j                  d«      }|r|j                  |¬«      }| j
                  j                  j                  d«      }|r|j                  |¬«      }| j
                  j                  j                  d	«      xs d
j                  «       }|r¤t        |¬«      t        |¬«      z  }|j                  «       r|t        t        |«      ¬«      z  }ddgddgddgddgddgddgddgddgfD ]5  }t        t        |«      sŒ|t        di dj                  |«      dz   |i¤Žz  }Œ7 |j                  |«      }|S )Nr®   rÂ   ÚlinesÚlines__paymentÚlines__caserã   r7   ræ   rª   r½   )Úreference__icontains)Únotes__icontains)r  rœ   r�   rž   r¯   rŸ   r    r¡   r°   r¢   r£   r    )rU   r&   r=   r>   Úprefetch_relatedrB   rð   rñ   r?   rr   r   Úisdigitr  rl   r¥   )rK   rT   rä   r7   rª   rõ   ri   s          r"   rÔ   z#RemittanceBatchViewSet.get_queryset¬  s�  € Ø×"Ñ"Ü×#Ñ#×2Ñ2°:¸yÓI×ZÑZÐ[bÐdtð  wDó  Eó
ˆð —l‘l×/Ñ/×3Ñ3°JÓ?ˆÙØ—‘ {�Ó3ˆBà—‘×*Ñ*×.Ñ.¨xÓ8ˆÙØ—‘ &�Ó)ˆBà�\‰\×&Ñ&×*Ñ*¨3Ó/Ò5°2×<Ñ<Ó>ˆÙÜ¨!Ô,¬qÀ!Ô/DÑDˆDØ�y‰yŒ{ØœœS ›VœÑ$�à˜[Ð)Ø˜VÐ$Ø˜^Ð,Ø˜^Ð,Ø˜\Ð*Ø˜[Ð)Ø˜WÐ%Ø˜WÐ%ð	ò I�ô "¤/°5Õ9ØœAÑH $§)¡)¨EÓ"2°]Ñ"BÀQÐ GÑHÑH‘DðIð —‘˜4“ˆBàˆ	r!   FrF  Údraftr÷   c                óØ  — | j                  «       }|j                  j                  d«      }|j                  j                  d«      }|j                  j                  dd«      }|j                  j                  dd«      }|st        ddi«      ‚|st        ddi«      ‚t	        j
                  d	d
«      }|j                  j                  ||¬«      j                  «       }|st        ddi«      ‚t        j                  j                  ||¬«      j                  «       }	|	st        ddi«      ‚t        |||	||j                  |¬«      }
t        | j                  |
«      j                  d¬«      S )Nr®   rÂ   rÁ   ÚXAFrÀ   r½   zcustomer is requiredzaccount is requiredr$  rP  rM  z!Invalid customer for this tenant.rO  )r1   r®   rÂ   rÁ   rW   rÀ   rR  ræ   )rQ   rJ  rñ   r   r   r;   r=   r?   rA   r$   r-   r2   r   Úget_serializer)rK   rB   r1   rä   râ   rÁ   rÀ   rP  r®   rÂ   Úobjs              r"   Úcreate_draftz#RemittanceBatchViewSet.create_draftÐ  sJ  € à—‘Ó"ˆØ—l‘l×&Ñ& zÓ2ˆØ—\‘\×%Ñ% iÓ0ˆ
Ø—<‘<×#Ñ# J°Ó6ˆØ—‘× Ñ  ¨"Ó-ˆáÜ! :Ð/EÐ"FÓGÐGÙÜ! 9Ð.CÐ"DÓEÐEä—>‘> +¨zÓ:ˆØ×#Ñ#×*Ñ*¨kÀ&Ð*ÓI×OÑOÓQˆÙÜ! :Ð/RÐ"SÓTÐTä!×)Ñ)×0Ñ0°JÀvÐ0ÓN×TÑTÓVˆÙÜ! 9Ð.PÐ"QÓRÐRä%ØØØØØ—|‘|Øô
ˆô ˜×+Ñ+¨CÓ0×5Ñ5¸cÔBÐBr!   Tzadd-paymentNc                ó  — | j                  «       }| j                  «       j                  |¬«      j                  «       }|st	        ddid¬«      S |j
                  j                  d«      }|j
                  j                  d«      }|j
                  j                  dd	«      }|st        dd
i«      ‚t        j                  dd«      }|j                  j                  ||¬«      j                  d«      j                  «       }	|	st        ddi«      ‚d }
|�1t        |«      j                  «       d	k7  r	 t        t        |«      «      }
t!        ||	|
|¬«      }t	        t#        |«      j
                  d¬«      S # t        $ r t        ddi«      ‚w xY w)N©rN  rø   ú
Not found.é”  ræ   rÉ   r‚   rÀ   r½   zpayment is requiredÚcollections_managementÚPaymentrM  rš   z Invalid payment for this tenant.zInvalid amount)rá   rÉ   r‚   rÀ   rR  )rQ   rÔ   r?   rA   r   rJ  rñ   r   r   r;   r=   r>   r  rr   r   r<   r.   r*   )rK   rB   rN  r1   ÚremÚ
payment_idr‚   rÀ   r|  rÉ   ÚamtÚlines               r"   Úadd_paymentz"RemittanceBatchViewSet.add_paymentð  sq  € à—‘Ó"ˆØ×ÑÓ!×(Ñ(¨BÐ(Ó/×5Ñ5Ó7ˆÙÜ˜X |Ð4¸SÔAÐAà—\‘\×%Ñ% iÓ0ˆ
Ø—‘×!Ñ! (Ó+ˆØ—‘× Ñ  ¨"Ó-ˆáÜ! 9Ð.CÐ"DÓEÐEä—.‘.Ð!9¸9ÓEˆØ—/‘/×(Ñ(¨J¸vÐ(ÓF×UÑUÐV\Ó]×cÑcÓeˆÙÜ! 9Ð.PÐ"QÓRÐRàˆØÐ¤# f£+×"3Ñ"3Ó"5¸Ò";ðDÜœc &›kÓ*�ô )°CÀÐQTÐ\aÔbˆÜÔ0°Ó6×;Ñ;ÀCÔHÐHøô	 ò DÜ% xÐ1AÐ&BÓCÐCðDús   Ä1E4 Å4Fz	mark-paidc                ó~  — | j                  «       }| j                  «       j                  |¬«      j                  «       }|st	        ddid¬«      S |j
                  j                  dd«      }t        |||j                  ¬«      }t	        | j                  |«      j
                  |r|j                  d	œ«      S d d	œ«      S )
Nrx  rø   ry  rz  ræ   r¿   r½   )rá   r¿   rW   )rá   Úmovement_id)rQ   rÔ   r?   rA   r   rJ  rñ   r/   r2   rt  r  )rK   rB   rN  r1   r}  r¿   rV  s          r"   Ú	mark_paidz RemittanceBatchViewSet.mark_paid  sª   € à—‘Ó"ˆØ×ÑÓ!×(Ñ(¨BÐ(Ó/×5Ñ5Ó7ˆÙÜ˜X |Ð4¸SÔAÐAà—L‘L×$Ñ$ [°"Ó5ˆ	Ü!¨S¸IÐRY×R^ÑR^Ô_ˆÜ t×':Ñ':¸3Ó'?×'DÑ'DÑ^`ÐUW×UZÑUZÑkÓlÐlÐfjÑkÓlÐlr!   Úvalidatec                ó²  — | j                  «       j                  |¬«      j                  «       }|st        ddid¬«      S |j                  t
        j                  j                  fvrt        dd|j                  › d�i«      ‚t
        j                  j                  |_        |j                  dd	g¬
«       t        | j                  |«      j                  «      S )Nrx  rø   ry  rz  ræ   r7   z*Cannot validate a remittance with status 'z'.Ú
updated_at©Úupdate_fields)rÔ   r?   rA   r   r7   r&   r  ÚDRAFTr   Ú	VALIDATEDrX   rt  rJ  ©rK   rB   rN  r}  s       r"   r…  zRemittanceBatchViewSet.validate  s¼   € à×ÑÓ!×(Ñ(¨BÐ(Ó/×5Ñ5Ó7ˆÙÜ˜X |Ð4¸SÔAÐAØ�:‰:œo×4Ñ4×:Ñ:Ð<Ñ<Ü! 8Ð/YÐZ]×ZdÑZdÐYeÐegÐ-hÐ"iÓjÐjÜ$×+Ñ+×5Ñ5ˆŒ
Ø�‰ ¨,Ð7ˆÔ8Ü˜×+Ñ+¨CÓ0×5Ñ5Ó6Ð6r!   Úcancelc                ó–  — | j                  «       j                  |¬«      j                  «       }|st        ddid¬«      S |j                  t
        j                  j                  k(  rt        ddi«      ‚t
        j                  j                  |_        |j                  ddg¬	«       t        | j                  |«      j                  «      S )
Nrx  rø   ry  rz  ræ   r7   z6Cannot cancel a remittance that has already been paid.r‡  rˆ  )rÔ   r?   rA   r   r7   r&   r  ÚPAIDr   Ú	CANCELLEDrX   rt  rJ  rŒ  s       r"   r�  zRemittanceBatchViewSet.cancel%  s§   € à×ÑÓ!×(Ñ(¨BÐ(Ó/×5Ñ5Ó7ˆÙÜ˜X |Ð4¸SÔAÐAØ�:‰:œ×/Ñ/×4Ñ4Ò4Ü! 8Ð-eÐ"fÓgÐgÜ$×+Ñ+×5Ñ5ˆŒ
Ø�‰ ¨,Ð7ˆÔ8Ü˜×+Ñ+¨CÓ0×5Ñ5Ó6Ð6r!   rñ   zeligible-paymentsc                ó¤  — | j                  «       }|j                  j                  d«      }|j                  j                  d«      xs dj                  «       }|j                  j                  d«      }	 |rt	        |«      nd}t        dt        |d«      «      }t        j                  j                  |t        j                  j                  t        j                  j                  t        j                  j                   ¬«      j#                  d	¬
«      j%                  dddd«      j'                  d«      }|r|j                  |¬«      }|rt)        ||«      }t+        |j-                  dd	¬«      j/                  «       d|dz   «      }|st1        g «      S t3        j4                  dd«      }	|	j                  j                  ||¬«      j                  d	¬«      j%                  dd«      j'                  dd«      }
i }|D ]  }t7        |dd«      }|sŒ||vsŒ|||<   Œ d„ }d„ }g }|
d| D �]	  }t7        |dd«      }|j                  t7        |d«      «      }|rt7        |dd«      nd}t7        |dd«      xs t7        |dd«      xs d}|j9                  t7        |d«      t;        t7        |dd «      xs d «      |t7        |d!d«      t7        |d"d«      xs d|rt7        |dd«      ndt7        |d"d«      xs t7        |d#d«      xs |rt;        |«      nd ||«      |rt7        |dd«      nd ||«      d$œ
«       �Œ t1        |«      S # t
        $ r d}Y �ŒÊw xY w)%a;  
        List payments that:
        - have generated an IN treasury movement (source=payment) => means the money passed by ACX
        - are NOT already linked to a remittance line
        Optional filters:
        - customer=<id>
        - q=<text> (case ref / debtor / payment ref)
        - limit=<int>
        r®   rª   r½   r.  r   r#   r   )r1   rç   rƒ   r7   T)Úpayment__isnullrš   rÉ   rà   rÞ   rã   r~  )ÚflatNé   r{  r|  )r1   Úid__in)Úremittance_lines__isnullz-paid_atr8   c                óê   — | rt        | dd «      nd }|sy dD ]  }t        ||d «      }|sŒ|c S  t        |dd «      xs d}t        |dd «      xs d}|› d|› �j                  «       }|xs t        |«      S )Nr›   )rœ   r�   rž   r¾   rŸ   r½   r    r  ©r9   rr   r  )rš   r›   r'  r(  rA   r)  Únms          r"   Ú_debtor_namez>RemittanceBatchViewSet.eligible_payments.<locals>._debtor_namei  s�   € Ù6:”W˜T 8¨TÔ2ÀˆFÙØØFò �Ü˜f d¨DÓ1�ÚØ’Jðô ˜F L°$Ó7Ò=¸2ˆEÜ˜6 ;°Ó5Ò;¸ˆDØ�G˜1˜T˜FÐ#×*Ñ*Ó,ˆBØÒ$œ˜V›Ð$r!   c                óÈ   — | sy dD ]  }t        | |d «      }|sŒ|c S  t        | dd «      xs d}t        | dd «      xs d}|› d|› �j                  «       }|xs t        | «      S )Nr  rŸ   r½   r    r  r˜  )Úcustr'  r(  rA   r)  r™  s         r"   Ú_customer_namez@RemittanceBatchViewSet.eligible_payments.<locals>._customer_namev  s|   € ÙØØMò �Ü˜d D¨$Ó/�ÚØ’Jðô ˜D ,°Ó5Ò;¸ˆEÜ˜4 ¨dÓ3Ò9°rˆDØ�G˜1˜T˜FÐ#×*Ñ*Ó,ˆBØ’?œ˜T›Ð"r!   r  rÁ   rs  r‚   r   Úpaid_atr¿   rÆ   )
r  r‚   rÁ   rž  r¿   rå   Úcase_referenceÚdebtor_namerä   Úcustomer_name)rQ   rð   rñ   rr   r  r<   r0  r1  r%   r=   r?   ÚSourceÚPAYMENTr•   r–   r  r  r  r>   r@   rÍ   r  Úvalues_listÚdistinctr   r   r;   r9   r  r  )rK   rB   r1   rä   rª   r.  r2  Úmv_qsÚpayment_idsr|  Úpay_qsÚmv_maprV  Úpidrš  r�  r*  rk   rš   rœ  rÁ   s                        r"   Úeligible_paymentsz(RemittanceBatchViewSet.eligible_payments0  sJ  € ð —‘Ó"ˆØ×*Ñ*×.Ñ.¨zÓ:ˆØ×!Ñ!×%Ñ% cÓ*Ò0¨b×7Ñ7Ó9ˆØ×$Ñ$×(Ñ(¨Ó1ˆð	Ù$)”c˜%”j¨rˆGô �aœ˜W cÓ*Ó+ˆô ×$Ñ$×+Ñ+ØÜ'×.Ñ.×6Ñ6Ü*×4Ñ4×7Ñ7Ü'×.Ñ.×8Ñ8ð	 ,ó ÷ ‰W TˆWÓ*ß‰^˜J¨°	¸>ÓJß‰X�mÓ$ð 	ñ Ø—L‘L¨[�LÓ9ˆEáÜ& u¨aÓ0ˆEä˜5×,Ñ,¨\ÀÐ,ÓE×NÑNÓPÐQ`ÐT[Ð^_ÑT_ÐaÓbˆÙÜ˜B“<Ðä—.‘.Ð!9¸9ÓEˆà�O‰O×"Ñ"¨&¸Ð"ÓEß‰V¨TˆVÓ2ß‰^˜F NÓ3ß‰X�j %Ó(ð	 	ð ˆØò 	!ˆBÜ˜"˜l¨DÓ1ˆCÚ�s &Ò(Ø ��s’ð	!ò
	%ò
	#ð ˆØ˜˜Ð!ó 	ˆAÜ˜1˜f dÓ+ˆDØ—‘œG A tÓ,Ó-ˆBÙ46”7˜2˜z¨4Ô0¸DˆDÜ˜q *¨dÓ3Ò_´w¸tÀZÐQUÓ7VÒ_ÐZ_ˆHà�J‰Jä! ! TÓ*Ü!¤'¨!¨X°qÓ"9Ò">¸QÓ?Ø (Ü& q¨)°TÓ:Ü!(¨¨K¸Ó!>Ò!DÀ"Ù<@œw t¨T°4Ô8ÀdÜ&-¨d°KÀÓ&Fò  'NÌ'ÐRVÐXeÐgkÓJlò  'Nñ  CÔqtÐuyÔqzð  IMÙ#/°Ó#5Ù@D¤7¨4°°tÔ#<È$Ù%3°DÓ%9ñöð	ô* ˜‹}Ðøôo ò 	Ø‹Gð	ús   Á5M  Í MÍMrI   )r   r   r   r)   rÕ   rG   rÖ   r   rd  r   r   r×   rØ   rÙ   r&   r=   rÓ   rÚ   rÔ   r   rv  r�  r„  r…  r�  r«  r    r!   r"   rg  rg  ¢  s  „ Ø0ÐØ(Ð)ÐØ)ÐØ*¨NÐ;€OÚD€OØˆw€Hà×&Ñ&×*Ñ*Ó,€Hò ñH �5 6 (°WÔ=ñCó >ðCñ> �4 & °MÔBòIó CðIñ8 �4 & °KÔ@òmó Aðmñ �4 & °JÔ?ò7ó @ð7ñ �4 & °HÔ=ò7ó >ð7ñ �5 5 'Ð4GÔHñgó Iñgr!   rg  N)r_   r  ÚreturnrJ   )ri   z	list[str]r¬  rJ   )r{   zOptional[str]rn   rJ   )rƒ   r  )r¨   r  r¬  r   )r¨   r  )@Ú
__future__r   Údecimalr   Útypingr   Údjango.appsr   Ú	django.dbr   Údjango.db.modelsr   Údjango.utilsr	   Úrest_frameworkr
   r   r   Úrest_framework.decoratorsr   Úrest_framework.exceptionsr   r   Úrest_framework.paginationr   Úrest_framework.responser   Údjango_filters.rest_frameworkr   Úrest_framework.filtersr   r   r$   r%   r&   r'   r(   r)   r*   Úservicesr+   r,   r-   r.   r/   rE   ÚBasePermissionrG   rO   r`   re   rl   r   r“   r˜   r¬   r±   r»   rÍ   ÚModelViewSetrÏ   ÚReadOnlyModelViewSetrÜ   rg  r    r!   r"   ú<module>r¿     s   ðÝ "å Ý å Ý Ý Ý !ß =Ñ =Ý ,ß GÝ :Ý ,Ý =Ý 1ôÐ-ô ÷ GÑ F÷ó ÷õ ò#ô<D�[×/Ñ/ô D÷
Eñ Eó$óóð& 49õ !óHòóó"ó&ó, ôJ
DÐ.°×0EÑ0Eô 
Dôw
Ð/°×1NÑ1Nô w
ôtvÐ.°×0EÑ0Eõ vr!   