
    F.j;                        d dl mZmZmZ d dlmZmZmZ d dlm	Z	 ddl
 ddl 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 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# 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, d dl- d dl.m/Z/ d dl0m1Z1m2Z2 d dl3Z3d dl4Z4d dl5Z5d dl6Z6d dl7m8Z8 d dl9Z9d dl'm(Z( d dl:Z:d Z;d~dZ<d Z=d~dZ>d  Z?d! Z@d" ZAd# ZBd$ ZCdd%ZDd& ZEd' ZFdd(ZGd) ZHd* ZIdd+ZJd, ZKd- ZLd. ZMdd/ZNd0 ZOd1 ZPdd2ZQd3 ZRd4 ZSd5 ZTd6 ZUd7 ZVd8 ZWd9 ZXd: ZYd; ZZd< Z[d= Z\d> Z]d? Z^d@ Z_dA Z`dB ZadC ZbdD ZcdE ZddF ZedG ZfdH ZgdI ZhdJ ZidK ZjdL ZkdM ZldN ZmdO ZndP ZodQ ZpdR ZqedS        ZrdT ZsdU ZtdV ZudW ZvdX ZwdY ZxdZ Zyd[ Zzd\ Z{dd]Z|d^ Z}d_ Z~d` Zda Zdb Zdc Zdd Zde Zdf Zdg Zdh Zdi Zdj Zdk Zdl Zdm Zdn Zdo Zdp Zdq Zdr Zds Zdt Zdu Zdv Zdw Zdx Zdy Zdz Zd{ Zd| Zd} Zy)    )renderredirectget_object_or_404)authenticateloginlogout)messages   )*)
connectiontransaction)never_cache)serializers)JsonResponse)render_to_string)model_to_dict)get_user_agent)settings)Q)F)datetime)	timedelta)EmailMessage)HttpResponse)User)parse_qs)FileResponse)Workbookload_workbook)Image)AnchorMarkerTwoCellAnchorN)reducec                    | xs dj                  d      j                  d      D cg c]R  }t        |      j                         st        |      j                         dk7  s:t        |      j                         T c}S c c}w )N ;0stripsplitstr	raw_valuexs     F/var/www/web_app/django/projects/fyw/app/tonal/greg/app_files/views.py_legacy_split_idsr0   0   s_    %._"$;$;C$@$F$Fs$KxqsSTv||~befgbhbnbnbptwbwCFLLNxxxs   BB#Bc                 "   g }| xs g D ]M  }t        |xs d      j                  d      j                         }|s2|dk7  s8||vs=|j                  |       O |r|rddj                  |      z   dz   S dS |rddj                  |      z   dz   S dS )Nr%   r&   r'   z;0;)r+   r)   appendjoin)valuesinclude_zeroclean_valuesvalues       r/   _legacy_join_idsr8   4   s    L2 'EKR &&s+113Uc\e<&?&'
 7Cusxx--3NN1=3,''#-E2E    c                 6   t         j                  j                  |       j                         }|sg S t        j                  j                  |      j                  d      j                  dd      D cg c]  }t        |      rt        |       c}S c c}w )N
id_companycompanyr'   
contact_idcontact__id_contactTflat)models_companiesobjectsfilterfirstmodels_company_contactsexcludevalues_listr+   )
company_idr>   r@   s      r/   _get_contact_ids_for_companyrL   B        &&---DJJLG	 299@@ A 

'S'
!++.C$+"O	 z?	 	J     6Bc                    t         j                  j                  |       j                         }g }|rJt	        t
        j                  j                  |      j                  d      j                  dd            }|D cg c](  }t        |      st        |      dk7  st        |      * }}|r|j                  d       |S c c}w )N
id_contact)contactr'   rK   company__id_companyTrB   )
models_contactsrE   rF   rG   listrH   rI   rJ   r+   r2   )r@   r5   rR   idsr.   s        r/   _get_company_ids_for_contactrX   R   s     %%,,
,CIIKG
C*2299 : 

'S'
!++.C$+"OQ 
;a#a&SVs]3q6
;C
;

3J <s   CC!Cc                 6   t         j                  j                  |       j                         }|sg S t        j                  j                  |      j                  d      j                  dd      D cg c]  }t        |      rt        |       c}S c c}w )Nr;   r=   r'   
project_idproject__id_projectTrB   )rD   rE   rF   rG   models_company_projectsrI   rJ   r+   )rK   r>   r[   s      r/   _get_project_ids_for_companyr^   e   rM   rN   c                 l   t         j                  j                  |       j                         }g }|rJt	        t
        j                  j                  |      j                  d      j                  dd            }|D cg c](  }t        |      st        |      dk7  st        |      * c}S c c}w )N
id_projectprojectr'   rS   rT   TrB   )	models_projectsrE   rF   rG   rV   r]   rI   rJ   r+   )r[   rc   rW   r.   s       r/   _get_company_ids_for_projectre   u   s     %%,,
,CIIKG
C*2299 : 

'S'
!++.C$+"OQ  <q3q6c!fmCF<<<s   B1B1!B1c                 6   t         j                  j                  |       j                         }|sg S t        j                  j                  |      j                  d      j                  dd      D cg c]  }t        |      rt        |       c}S c c}w )Nr;   r=   r'   )
address_idaddress__id_addressTrB   )rD   rE   rF   rG   models_company_addressesrI   rJ   r+   )rK   r>   rg   s      r/   _get_address_ids_for_companyrj      s     &&---DJJLG	 3::AA B 

'S'
!++.C$+"O	 z?	 	J  rN   c                 6   t         j                  j                  |       j                         }|sg S t        j                  j                  |      j                  d      j                  dd      D cg c]  }t        |      rt        |       c}S c c}w )Nr`   rb   r'   )sales_document_id"sales_document__id_sales_documentsTrB   )rd   rE   rF   rG   models_project_sales_documentsrI   rJ   r+   )r[   rc   rl   s      r/   #_get_sales_document_ids_for_projectro      s     %%,,
,CIIKG	 "@!G!G!N!N "O "

'C'
(5Y`d)e	  !	 	  rN   c                     | sg S t         j                  j                  |       j                  d      j	                  dd      D cg c]  }t        |      rt        |       c}S c c}w )Ninteractionr'   rS   rT   TrB   )models_interaction_companiesrE   rF   rI   rJ   r+   )rr   rK   s     r/    _get_company_ids_for_interactionrt      so     	 7>>EE# F 

'S'
!++.C$+"O	 z?	 	J  s   A(c                 d   t        | xs d      j                  d      j                         } t        |xs d      j                  d      j                         }| r|r
| dk(  s|dk(  ry t        j                  j	                  |       j                         }t        j                  j	                  |      j                         }|r|sy |r"t        j                  j                  ||       n/t        j                  j	                  ||      j                          t        |j                         y )Nr%   r&   r'   r;   rP   )r>   rR   )r+   r)   rD   rE   rF   rG   rU   rH   get_or_createdelete._rebuild_company_members_legacy_from_relationsr<   )rK   r@   addr>   rR   s        r/   _sync_company_contact_linkrz      s    Z%2&,,S1779JZ%2&,,S1779JZ:+<
c@Q&&---DJJLG%%,,
,CIIKG'
''55gw5W''..w.PWWY273E3EFr9   c                      y N r=   s    r/   "_sync_company_contacts_from_legacyr~           r9   c                      y r|   r}   rS   s    r/   rx   rx      r   r9   c                 d   t        | xs d      j                  d      j                         } t        |xs d      j                  d      j                         }| r|r
| dk(  s|dk(  ry t        j                  j	                  |       j                         }t        j                  j	                  |      j                         }|r|sy |r"t        j                  j                  ||       n/t        j                  j	                  ||      j                          t        |j                         y )Nr%   r&   r'   r;   r`   )r>   rc   )r+   r)   rD   rE   rF   rG   rd   r]   rv   rw   /_rebuild_company_projects_legacy_from_relationsr<   )rK   r[   ry   r>   rc   s        r/   _sync_company_project_linkr      s    Z%2&,,S1779JZ%2&,,S1779JZ:+<
c@Q&&---DJJLG%%,,
,CIIKG'
''55gw5W''..w.PWWY3G4F4FGr9   c                      y r|   r}   r=   s    r/   "_sync_company_projects_from_legacyr      r   r9   c                      y r|   r}   rS   s    r/   r   r      r   r9   c                 d   t        | xs d      j                  d      j                         } t        |xs d      j                  d      j                         }| r|r
| dk(  s|dk(  ry t        j                  j	                  |       j                         }t        j                  j	                  |      j                         }|r|sy |r"t        j                  j                  ||       n/t        j                  j	                  ||      j                          t        |j                         y )Nr%   r&   r'   r;   
id_address)r>   address)r+   r)   rD   rE   rF   rG   models_addressesri   rv   rw   0_rebuild_company_addresses_legacy_from_relationsr<   )rK   rg   ry   r>   r   s        r/   _sync_company_address_linkr      s    Z%2&,,S1779JZ%2&,,S1779JZ:+<
c@Q&&---DJJLG&&---DJJLG'
 ((66wPW6X ((///QXXZ4W5G5GHr9   c                      y r|   r}   r=   s    r/   #_sync_company_addresses_from_legacyr     r   r9   c                      y r|   r}   rS   s    r/   r   r     r   r9   c                      y r|   r}   rS   s    r/   6_rebuild_company_relation_legacy_fields_from_relationsr     r   r9   c                 d   t        | xs d      j                  d      j                         } t        |xs d      j                  d      j                         }| r|r
| dk(  s|dk(  ry t        j                  j	                  |       j                         }t        j                  j	                  |      j                         }|r|sy |r"t        j                  j                  ||       n/t        j                  j	                  ||      j                          t        |j                         y )Nr%   r&   r'   r`   id_sales_documents)rc   sales_document)r+   r)   rd   rE   rF   rG   models_sales_documentsrn   rv   rw   6_rebuild_project_sales_documents_legacy_from_relationsra   )r[   rl   ry   rc   r   s        r/   !_sync_project_sales_document_linkr     s    Z%2&,,S1779J-34::3?EEG.*2CGX\_G_%%,,
,CIIKG+33::N_:`ffhN.
&..<<W]k<l&..55gVd5elln:7;M;MNr9   c                      y r|   r}   rb   s    r/   )_sync_project_sales_documents_from_legacyr   -  r   r9   c                      y r|   r}   rZ   s    r/   r   r   3  r   r9   c                 T    	 | dv r|S t        |       S # t        t        f$ r |cY S w xY w)NNr%   )int	TypeError
ValueError)r7   defaults     r/   	_safe_intr   8  s7    JN5zz" s    
 ''c                    | sy t               }|j                         D ]d  }t        |      }dD ]R  }|j                  |      s|j	                  |dd      }|j                         r|j                  t        |              d f |st        t        dd            }t               }t        |      }t        t        |      t        |d      d      }t        j                  j                  | |      j                          t        j                  j                  |       j!                  d	d
      }	|j#                  d |	D               |D ]  }
|j%                  d|
 d      }t'        ||
      }|dk  s||v r|
}||v rt        d|dz         D ]
  }||vs|} n |j                  |       |j%                  d|
 d      xs dj)                         }d }|r2|dvr.t*        j                  j                  |      j-                         }t        j                  j/                  | |
|||j%                  d|
 d      xs d|j%                  d|
 d      xs d|j%                  d|
 d      xs d|j%                  d|
 d      xs d|j%                  d|
 d      xs d|j%                  d|
 d      xs dt'        |j%                  d|
 d      d              y )N)	sales_documents_index_line_sales_documents_quantity_sales_documents_description_!sales_documents_description_free_sales_documents_price_sales_documents_discount_!sales_documents_calculated_price_!sales_documents_discounted_price_sales_documents_vat_r%   r
         r   )r   sales_documents_line_number__inr   sales_documents_line_positionTrB   c              3   &   K   | ]	  }|s|  y wr|   r}   ).0positions     r/   	<genexpr>z7_sync_sales_document_lines_from_post.<locals>.<genexpr>m  s     Sx((Ss   r   r   #r'   
id_productr   r   r   r   r   r   r   r   r   sales_documents_line_numberr   productsales_documents_quantity sales_documents_description_freesales_documents_pricesales_documents_discount sales_documents_calculated_price sales_documents_discounted_pricesales_documents_vat)setkeysr+   
startswithreplaceisdigitry   r   rangesortedmaxlenmodels_sales_document_linesrE   rF   rw   rJ   updategetr   r)   models_productsrG   create)doc_instance	post_datadetected_line_numberskeyprefixsuffixused_positionsordered_line_numbersmax_fallback_positionpreserved_positionsiraw_positionline_positionfallback
product_idr   s                   r/   $_sync_sales_document_lines_from_postr   @  s   
  E~~ #h

 	F ~~f%VR3>>#)--c&k:	& ! #E!RL 1UN!"78$8 93?S]_;`bde
  ''..#(< /  fh5==DD# E k1k=  S3FSS!  
 }}'B1#%FK!,21 ?MN*!!%:Q%>? >1$,M
 	=)mm&B1#$FKQrXXZ
*J6%--44
4KQQSG#++22'()*7%.]]5Nqc3RTV%W%][]-6]]=^_`^a;bdf-g-mkm"+--2H0Lb"Q"WUW%.]]5Nqc3RTV%W%][]-6]]=^_`^a;bdf-g-mkm-6]]=^_`^a;bdf-g-mkm ))--:Nqc8RTV*WYZ [ 	3 	
) 
r9   c           	         | syt        t        j                  j                  |       j	                  d      j                  d            }t        dd      D ]  }t        | d| t        |             t        | d| d	       t        | d
| d	       t        | d| d	       t        | d| d	       t        | d| d	       t        | d| d	       t        | d| d	       t        | d| d        |D ]E  }t        t        |dd	      d      }|dk  s|dkD  r&t        | d| t        |j                  xs |             t        | d| |j                  xs d	       t        | d
| t        |j                  xs d	             t        | d| |j                  xs d	       t        | d| |j                  xs d	       t        | d| |j                   xs d	       t        | d| |j"                  xs d	       t        | d| |j$                  xs d	       t        | d| |j&                  xs d       H t)        |      S )up  
    STEP 30:
    Remplit en mémoire les anciens champs sales_documents_*_1..25 depuis
    table_sales_document_lines, sans jamais relire les anciennes colonnes comme fallback.

    But : table_sales_document_lines devient la seule source de lecture pour les lignes.
    Les anciens noms restent seulement des miroirs techniques pour les templates/forms/exports.
    Fr   r   r   r
   r   r   r   r%   r   r   r   r   r   r   r   r   r   )rV   r   rE   rF   select_relatedorder_byr   setattrr+   r   getattrr   r   r   r   r   r   r   r   r   bool)r   linesr   lines       r/   9_hydrate_sales_document_legacy_fields_from_relation_linesr     sz    #++	|	,			"	/	0	E 1b\ 	= ;A3?QH 9!=rB <QC@"E A!ErJ 6qc:B? 9!=rB A!ErJ A!ErJ 4QC8!<	=  Ygd$A2FJq5AF ;A3?TEgEgElklAmn 9!=t?\?\?b`bc <QC@#dooF[Y[B\] A!EtGlGlGrprs 6qc:D<V<V<\Z\] 9!=t?\?\?b`bc A!EtGlGlGrprs A!EtGlGlGrprs 4QC8$:R:R:WVWXY ;r9   c                    | syt        t        j                  j                  |       j	                  d      j                  d            }|D ci c]  }t        t        |dd      d      | }}g }t        dd      D ]D  }|j                  |      }|rd	| t        |j                  xs |      d
| |j                  xs dd| t        |j                  xs d      d| |j                  xs dd| |j                  xs dd| |j                   xs dd| |j"                  xs dd| |j$                  xs dd| |j&                  xs di	}n8d	| t        |      d
| dd| dd| dd| dd| dd| dd| dd| di	}|j)                         D ]#  \  }}t+        | ||       |j-                  |       % G | j/                  |       yc c}w )u   
    STEP 20: table_sales_document_lines devient la source principale des lignes.
    Les anciens champs sales_documents_*_1..25 restent reconstruits uniquement
    pour compatibilité temporaire avec les formulaires/templates existants.
    Nr   r   r   r%   r   r
   r   r   r   r   r   r   r   r   r   r   update_fields)rV   r   rE   rF   r   r   r   r   r   r   r+   r   r   r   r   r   r   r   r   r   itemsr   r2   save)	r   r   r   line_by_numberr   r   r4   
field_namer7   s	            r/   3_rebuild_sales_document_lines_legacy_from_relationsr     sO    #++	|	,			"	/	0	E  	'$ =rBAFLN 
 M1b\ -!!!$-aS13t7Y7Y7^]^3_+A3/1N1N1TRT.qc2C8M24N3A379^9^9dbd(,d.H.H.NB+A3/1N1N1TRT3A379^9^9dbd3A379^9^9dbd&qc*D,D,D,I
F .aS13q6+A3/.qc2B3A37(,b+A3/3A373A37&qc*A
F "( 	-JL*e4  ,	-9-@ M2Os   Gc                 r   | syt         j                  j                  |       j                          t	               }t        dd      D ]l  }t        | d| d      }t        ||      }|dk  s	|dkD  s||v r|}||v rt        dd      D ]
  }||vs|} n |j                  |       t        t        | d| d      xs d      j                         }d}|r2|d	vr.t        j                  j                  |
      j                         }t         j                  j                  | |||t        | d| d      xs dt        | d| d      xs dt        | d| d      xs dt        | d| d      xs dt        | d| d      xs dt        | d| d      xs dt        t        | d| d      d             o y)u   
    REFACTOR STEP 10:
    Synchronise table_sales_document_lines depuis les anciens champs encore présents
    sur l'instance. Utile notamment après duplication d'un document.
    Nr   r
   r   r   r%   r   r   r   r   r   r   r   r   r   r   r   r   r   )r   rE   rF   rw   r   r   r   r   ry   r+   r)   r   rG   r   )r   r   r   r   r   r   r   r   s           r/   (_sync_sales_document_lines_from_instancer     s    ''..l.KRRTUN1b\  
|/J1#-NPRS!,21 2m~6UMN*!!RL >1$,M
 	=)1MaS/QSUV\Z\]cce
*J6%--44
4KQQSG#++22'()*7%,\=VWXVY;Z\^%_%ece-4\EfghfiCjln-o-usu"),:PQRPS8TVX"Y"_]_%,\=VWXVY;Z\^%_%ece-4\EfghfiCjln-o-usu-4\EfghfiCjln-o-usu )',BVWXVY@Z\^*_ab c 	3 	
) 
r9   c                 8   | sy t        t        | dd            }d } |t        | dd            } |t        | dd            } |t        | dd            } |t        | dd            }t        j                  j	                  |       j                          t        |      D ]v  \  }}t        j                  j                  | ||t        |      k  r||   nd|t        |      k  r||   nd|t        |      k  r||   nd|t        |      k  r||   nd	       x y )
Nsales_documents_deposit_idr%   c                     | xs dj                  d      j                  d      D cg c]5  }t        |      j                         st        |      j                         7 c}S c c}w )Nr%   r&   r(   r,   s     r/   _split_keep_zerozC_sync_sales_document_deposits_from_legacy.<locals>._split_keep_zero2  sL    )2b(?(?(D(J(J3(Ob1SVWXSYS_S_SaAbbbs   A$A$sales_documents_deposit_numbersales_documents_deposit_datesales_documents_deposit_amountsales_documents_deposit_methodr   r   r   r   r   r   r   )	r0   r   models_sales_document_depositsrE   rF   rw   	enumerater   r   )	r   rW   r   numbersdatesamountsmethodsidx
deposit_ids	            r/   )_sync_sales_document_deposits_from_legacyr  ,  s"   
GL2NPRS
TCc w|5UWYZ[GW\3QSUVWEw|5UWYZ[Gw|5UWYZ[G"**111NUUW$S> 
Z&..55''1;>W;M73<SU7:SZ7GsR;>W;M73<SU;>W;M73<SU 	6 	

r9   c                 p   | syd| _         d| _        d| _        d| _        d| _        t        t        j                  j                  |       j                  d            }|syd } ||D cg c]  }|j                    c}      | _          ||D cg c]  }|j                   c}      | _         ||D cg c]  }|j                   c}      | _         ||D cg c]  }|j                   c}      | _         ||D cg c]  }|j                   c}      | _        yc c}w c c}w c c}w c c}w c c}w )NFr%   r   id_sales_document_depositTc                     | D cg c]5  }t        |      j                         st        |      j                         7 }}|rddj                  |      z   dz   S dS c c}w )Nr&   r%   )r+   r)   r3   )r4   r7   r6   s      r/   _join_with_semizW_hydrate_sales_document_legacy_deposits_from_relation_deposits.<locals>._join_with_semi\  sW    8>Uu#e*BRBRBTE
((*UU5AsSXXl++c1IrI Vs
   AA)
r   r   r   r   r   rV   r   rE   rF   r   )r   depositsr  ds       r/   >_hydrate_sales_document_legacy_deposits_from_relation_depositsr  F  s!   
 /1L+24L/02L-24L/24L/&..	|	,	-	.H J />em>n`aq?[?[>n.oL+2AmuBvhi1CcCcBv2wL/0?iq@rdeA_A_@r0sL-2AmuBvhi1CcCcBv2wL/2AmuBvhi1CcCcBv2wL/ ?oBv@rBvBvs   +DD$5D)D.?D3c                      y r|   r}   )interaction_ids    r/   2_rebuild_interaction_company_legacy_from_relationsr  h  r   r9   c                    | sy g }|xs g D ]M  }t        |xs d      j                  d      j                         }|s2|dk7  s8||vs=|j                  |       O t        j                  j                  |       j                          |D ]T  }t        j                  j                  |      j                         }|s4t        j                  j                  | |       V t        | j                         y )Nr%   r&   r'   rq   r;   )rr   r>   )r+   r)   r2   rs   rE   rF   rw   rD   rG   rv   r  id_interaction)interaction_instancecompany_idsclean_company_idsrK   r>   s        r/   $_sync_interaction_companies_from_idsr  m  s    
 !'R 1
)r*005;;=
*+
BS0S$$Z01
 !((//<P/QXXZ' 
"**11Z1HNNP(00>>0 ?  77K7Z7Z[r9   c                      y r|   r}   )r  s    r/   '_sync_interaction_companies_from_legacyr    r   r9   c                     	 |dvrt        ddid      S t        j                  j                  |      }|j	                         st        ddid      S |d	   }t        |       t        |d
d      }t        j                  j                  |      j                         }|r1|j                  xs d d|j                  xs d j                         nd}|r1|j                  xs d d|j                  xs d j                         nd}t        |dd      }	| j                  j                  dd      }
|
dk(  rd}
|
dk(  rd}
|
dk(  rd}
| j                  j                  dd      }| j                  j                  dd      }t         j                  j                  |	      j                         }t"        j                  j                  |      j                         }|rB|j$                  xs d d|j&                  xs d d|j(                  xs d j                         nd}|r1|j*                  xs d d|j,                  xs d j                         nd}|r|j.                  xs d j                         nd}| j                  j                  dd      }| j                  j                  dd      }| j                  j                  dd      }t0        j                  j3                         D ci c]"  }t5        |j6                        |j8                  $ }}t;        |      }t=        |D ch c]9  }|j?                  d      d   jA                         s&|j?                  d      d   ; c}      }|D cg c];  }|jC                         D ci c]  \  }}|jE                  d|       s|| c}}= }}}}g }|D ]M  }|jC                         D ]8  \  }}d |v s|jG                  t5        |      |j?                  d      d   i       : O tI        tJ        jL                  jO                  tP        jR                  d!            }|d"   } d#| jT                  _+        d#| jT                  _,        d#| jT                  _-        d#| jT                  _.        d$| j^                  d%   _0        d$| jb                  _2        tg        d&d'(      | ji                  d)d*|
+      _5        tg        d,d'(      | ji                  d)d-|+      _5        | jm                  d*d.d*d-/       tg        d&d'(      | ji                  d*d.|+      _5        | jm                  d.d.d.d-/       tg        d&d'(      | ji                  d.d.|+      _5        | jm                  d0d.d0d-/       tg        d&d'(      | ji                  d0d.|+      _5        | jm                  d1d.d1d-/       tg        d&d'(      | ji                  d1d.|+      _5        | jm                  d-d.d-d-/       tg        d&d'(      | ji                  d-d.|+      _5        to        tJ        jL                  jO                  tP        jR                  d2            }!tq        d3ts        d4d	d5d56      ts        d7d7d8d86      9      |!_:        | jw                  |!       |ty        d:d:d;<      d=|ty        d>d>d;<      d=|ty        d?d?d;<      d=d@}"dA}#t{        t}        |            D ]  }$|#d4z  }#g dd}}&}%|D ]  }'t5        |$d4z         |'v s|'t5        |$d4z            }t        |dB| d      }(|j                  t5        |(      d      j                         }&|&j                         })t        |dC| d      }*t        |dD| d      }+t        |dE| d      },t        |dF| d      }-t        |dG| d      }.t        |dH| d      }/|&|*|+|-|.|,|/g}% |"j                  )d       }0d$}1t{        |$d4z   t}        |            D ]  }2|D ]t  }'t5        |2d4z         |'v s|'t5        |2d4z            }3t        |dB|3 d      }4|j                  t5        |4      d      j                         j                         }5|5|)k(  srdI}1 n |1r n |0r|1r	|0dJ   |%d<   n/|%d<   |0r|0dK   nd }6|)dLk(  r
tg        d&d'(      | ji                  |#d)|&j                         +      _5        t        dMdNd$O      | ji                  |#d)P      _B        |6r|6| ji                  |#d)P      _C        tg        d'Q      | ji                  |#dRd+      _5        |6r|6| ji                  |#dRP      _C        tg        d,d'(      | ji                  |#d7*+      _5        t        dMdNS      | ji                  |#d7P      _B        |6r|6| ji                  |#d7P      _C        t        t{        d*dN      |%d)d        D ]  \  }7}8| ji                  |#|7|8+      }9|7d*k(  r&tg        d&d'(      |9_5        t        dMdNd$O      |9_B        nr|7d.k(  r&tg        d,d'(      |9_5        t        dMdNd$O      |9_B        nG|7d0k(  rtg        d&d'(      |9_5        n/|7d1k(  rtg        d'd'(      |9_5        n|7d-k(  rtg        d,d'(      |9_5        |6r|6|9_C        |6s|7d-k(  s|1st        dMdNd$O      |9_B         t{        d)d*      D ]0  }:| ji                  |#|:P      }9tg        d'Q      |9_5        |6s*|6|9_C        2 tg        d&d'(      | ji                  |#d)|& d* +      _5        t        dMdN|6rd$ndIO      | ji                  |#d)P      _B        | jm                  |#d)|#d7/       t        t{        d*dN      |%d)d        D ]o  \  }7}8| ji                  |#|7|8+      }9|7dTv rtg        d'd'(      |9_5        n|7d-k(  rtg        d,d'(      |9_5        |6r|6|9_C        |6sT|7d-k(  sZ|1s]t        dMdNd$O      |9_B        q  dUt        |#d4z   dV       | _F        tJ        jL                  jO                  tP        jR                  dW| dX      };|j                  |;       |dYk(  rRt        |;dZ      5 }<|<j                         }=d d d        tK        j                  |;       t        =d[\      }>d]| dX|>d^<   |>S t        j                  d_d`dadbdctP        jR                  |;gd$d       tJ        jL                  jO                  tP        jR                  dW| de      }?tJ        jL                  j	                  |?      st        ddfidg      S t        |?dZ      5 }<|<j                         }@d d d        tK        j                  |?       tJ        jL                  j	                  |;      rtK        j                  |;       |dhk(  r1| j                  j                  did      j                  djdk      j?                  dk      D Acg c]#  }A|Aj                         sAj                         % }B}A| j                  j                  dld      j                  djdk      j?                  dk      D Acg c]#  }A|Aj                         sAj                         % }C}A| j                  j                  dmd      j                  djdk      j?                  dk      D Acg c]#  }A|Aj                         sAj                         % }D}A| j                  j                  dndo      }E| j                  j                  dpd      }FBst        ddqid      S 	 t        EFtP        j                  BCDr      }Gds|G_R        |Gj                  dW| de@dt       | j                  j                  du      D ]7  }HGj                  |Hj                  |Hj                         |Hj                         9 Gj                          t        dvdwB i      S t        @dt\      }>d]| de|>d^<   |>S c c}w c c}w c c}}w c c}}}w # 1 sw Y   xY w# 1 sw Y   xY wc c}Aw c c}Aw c c}Aw # t        $ r%}At        ddxt5        A       idg      cY d }A~AS d }A~Aww xY w# t        $ r"}At        dt5        A      idg      cY d }A~AS d }A~Aww xY w)yN)xlsxpdfpdf_mailerrorzInvalid export format  statusr   zDocument not found  r   "sales_documents_billing_address_idr%   r    z - sales_documents_ref_contact_iddocument_typequoteDevisdelivery_notezBon de livraisoninvoiceFacturedocument_numbercompany_numrP   r;   total_category_1total_category_2total_category_3_r   zTonal_Devis_Template.xlsxSheet_1gQ?TAleftcenter)
horizontalvertical      )rowcolumnr7   right	      )	start_rowstart_columnend_row
end_column      zTonal_logo.pngtwoCellr
   i0u  )colr<  colOffrowOff   iЊ)editAs_fromtofae9dbsolid)start_color	end_color	fill_type)totalfillebf0dfdce5f0)materielzetude, conception, realisation	transport   r   r   r   r   r   r   r   FrT  rU  rX  Arial
   )namesizebold)r<  r=  )r9     )r]  r^  )r;  r@  rE  rF  zA1:I6   Tonal_Devis_z.xlsxr  rbzAapplication/vnd.openxmlformats-officedocument.spreadsheetml.sheet)content_typez!attachment; filename=Tonal_Devis_zContent-Dispositionlibreofficez
--headlessz--convert-tor  z--outdir)checkz.pdfzPDF conversion failed  r  rN  r&   ,ccbccsubjectzVotre devis PDFcontentz(Adresse e-mail du destinataire manquante)rk  body
from_emailrN  ri  rj  htmlzapplication/pdfcustom_attachmentmessageu   PDF envoyé à u   Échec de l'envoi du mail : )Zr   r   rE   rF   existsr   r   r   rG   address_numberaddress_street_name_1r)   address_postal_codeaddress_cityGETr   rU   rD   contact_gendercontact_last_namecontact_first_namecontact_phone_1contact_email_1company_namer   allr+   r   product_denominationr   r   r*   r   r   endswithr2   r   ospathr3   r   BASE_DIRpage_marginsr6  r>  topbottomcolumn_dimensionshidden
page_setuphorizontalCentered	Alignmentcell	alignmentmerge_cellsr    r"   r!   anchor	add_imagePatternFillr   r   lowerupperFontfontrU  zipr   
print_arear   openreadremover   
subprocessrunPOSTr   r   DEFAULT_FROM_EMAILcontent_subtypeattachFILESgetlistr]  rd  send	Exception)Irequestxlsx_or_pdfcurrent_sales_documents_idsales_documents_querysetdocbilling_address_idbilling_addressline1line2r@   r'  r-  rK   rR   r>   contact_str_1contact_str_2company_str
total_cat1
total_cat2
total_cat3pproduct_id_to_namedoc_dictksuffixesr   vlist_of_line_dictsindex_line_map	line_dictworkbook	worksheetimgcategory_total_mapr<  indexline_contentdescidx_dictr   desc_key	desc_freepricediscountquantitycalculated_pricediscounted_pricecategory_infois_last_of_categoryfuture_indexfuture_suffixfuture_product_idfuture_descrU  	col_indexr7   r  rH  
excel_pathf	file_dataresponsepdf_pathpdf_dataeemail_toemail_cc	email_bccrk  	body_htmlemailcustom_filesI                                                                            r/   export_to_excel_or_pdfr    s8   C; 99*A B3OO#9#A#A#H#H\v#H#w '..0*> ?LL&q)A#F$S*NPRS*2299EW9X^^` tC?117R8/:_:_:ece9fgmmo  IK rA?66<"=SA]A]Acac@dekkm  GIS"BBG
<G##MO+.MI%%M!++//*;R@[[__]B7
!))00J0GMMO"**11Z1HNNP KR7117R8':S:S:YWY9ZZ[\c\v\v\|z|[}~  E  E  G  XZfm7228b97;R;R;XVX:YZ``bsuAH--34;;=b[[__%7<
[[__%7<
[[__%7<
 %,,002
 q555
 

 !%X\bAQAYAYA[1773<+\] #
 
 'nn.Kda!**q\2JQTK
 
 + 	FI!) F10A5"))3q61773<3C*DEF	F
 !h.?.?A\!]^Y'	&*	#'+	$%)	"(,	%26	##C(/26	/IR^dowIx	1Qm<FKT`grzK{	1Qo>H1QRSGP\bmuGv	1Qk:D1QRSAJV\goAp	1Qe4>1QRSAJV\goAp	1Qe4>1QRSIR^dowIx	1Qm<F1QRSIR^dowIx	1Qm<FBGGLL!2!24DEF"1!E%HqG


 	C  #-khbjv}6~8BKdl  yA  MT  MU  /V#-{xckw~7  A
 3123 Z	KE1HC)+R$L* tuqy>X-%c%!)n5F!(0LVH.UWY!ZJ-11#j/2FLLND#zz|H '/PQWPX-Y[] ^I#C+A&)JBOE&s.Gx,PRTUH&s.Gx,PRTUH'.s6WX^W_4`bd'e$'.s6WX^W_4`bd'e$$()UHFVX`br#sLt /228TBM"& %eai5G1H I 
 . "H<!+,8(0\A5E1F(G,3C;WXeWf9gik,l)&8&<&<SAR=SUW&X&^&^&`&f&f&h&(227/!" +
 !4#0#9R #3R ,9=(tD:%R[gm  yA  SB	3q

EO9=7QSZ^9_	3q16$C:?HQ[cHd	3q;E$C:?OXdkv~O	3q	BL9=7QS9T	3q16$C:?(+E!RL,qr:J(K K$Iu$>>c)5>QD A~)2fx)X$(gBT$J	"a)2gPX)Y$(gBT$J	"a)2fx)X"a)2hQY)Z"a)2gPX)Y$(		Q3F$(gBT$J	#K& !A; )C$>>c#>>D%.%ADN$(		) \epv  BJ  \K	3q4&)8MNX9=7QSbfZ^lq9r	3q16%%!S]^%_(+E!RL,qr:J(K 	K$Iu$>>c)5>QD L0)2hQY)Z"a)2gPX)Y$(		Q3F$(gBT$J		KcZ	Kx "&c#'2&6%78	WW\\("3"3|D^C__d5ef
j!& j$' %1FFH	%IIj!#`H 1RRlQmmr.sH*+O<
HL]L]_i
	 77<< 1 1\B\A]]a3bcww~~h'*A B3OO(D! 	 QvvxH	  			(77>>*%IIj!*$+2<<+;+;D"+E+M+McSV+W+]+]^a+bpafgfmfmfo	pHp+2<<+;+;D"+E+M+McSV+W+]+]^a+bpafgfmfmfo	pHp,3LL,<,<UB,G,O,OPSUX,Y,_,_`c,drqhihohohqrIrll&&y2CDG((B7I#W.X$Ybeffe$#"'::! )/%|,F+GtLhXij $+==#8#89L#M aKLL!1!1;3C3C3E{G_G_`a 

#Y/(0L$MNN
  7HI,MNhMiim*n&'q
 ]K
d% %$	  	  qpr8  e#W0McRSfX.V$W`cdde  ;Wc!f-c::;s  A@6 >A@6 JA@6 -'A@6 *'

(A@6 5*/5%A@6 LA@6 :D	A@6 AA@6 "A@6 *HA@6 8A@6 >A@6 AA@6 CA@6 *A@6 0A@6 3BA@6 64A@6 <BA@6 A@6 )%BA@6 966!?A@6  ;6;?A@6 A@ A@ /A
A@6 ;B1A@ -A@6 
A@6 A@6 &!A@6 )3.A@6 @	A@3@A@.@(A@3@)A@6 @.A@3@3A@6 @6	AA!@?AAAAA!AAA!c                    | j                   j                  d      }|st        ddid      S t        j                  j                  |      j                         }|st        ddid      S t        |      }t        j                  j                  |	      }|D cg c]=  }|j                  r/|j                  |j                  |j                  |j                  d
? }}t        d|i      S c c}w )NrK   r  zMissing company_idr   r!  r;   Company not foundr#  id_contact__in)idr  
first_name	last_namecontacts)rw  r   r   rD   rE   rF   rG   rL   rU   r|  rQ   rz  ry  )r  rK   r>   contact_idsr  cdatas          r/   "get_email_form_contacts_of_companyr    s    .JW&:;CHH&&---DJJLGW&9:3GG /z:K&&--[-IH  Q.. ,,&&..,,		
D  T*++s   AC,c                    t         j                  j                  d      j                  d      j	                  dd      }|D cg c]&  }|j
                  |j                  |j                  d( }}t        d|i      S c c}w )	NF)email__isnullr%   )r  r  r  )r  r  r  users)	r   rE   rF   rI   r   r  r  r  r   )r  r  userr  s       r/   get_email_form_django_usersr    s    LLe4<<2<FOOP[]ijE  	 ZZ//	
D  $((s   +A?c                    | j                   j                  rt        dt        |      z   dz         }t        |d      }t        j
                  j                  |      }|D cg c]  }t        |       }}t        |d       }g }|D ]+  }t        |      dk7  s|j                  t        |             - t        t        j                  d |D                    }t        |      }	t        j
                  j                  |	      j!                  d
      }
|
D cg c]  }t        |       }}|g k(  rcddddg}t        dt        |D cg c]  }|d   	 c}      j#                  dd      j#                  dd      j#                  dd      z   dz         }na|d   g}t        dt        |D cg c]  }|d   	 c}      j#                  dd      j#                  dd      j#                  dd      z   dz         }|j#                  dd      }t%        |      }d}|D ]+  }t        |      dk7  st        |      |v s t        |      } n |st'        d |D        d      }t        j
                  j                  |      j)                         }|rt        |      gng }t        |      }t+        |      }t        |      }t        |d      }t        j
                  j                  |	      j!                  d
      }|D cg c]  }t        |       }}t        j
                  j                  d      j)                         }|r,t-        d |D              s|j/                  t        |             |g k(  rddddg}|d d  }d|vr|j/                  d       t        |      |vr|j1                  dt        |             t2        j
                  j                  |      }|D cg c]  }t        |       }}t        |d       }t2        j
                  j                  |      }|D cg c]  }t        |       } }t        | D cg c]  }|d   	 c}      j#                  dd      j#                  dd      j#                  dd      j#                  dd      }!|s| }t2        j
                  j5                  |      }"t        j
                  j5                  |j#                  dd            }#t7        | j8                  xs d |"|      }$t;        | j8                  xs d |#      }%|$j=                         r|$j?                          |%j=                         r|%j?                          |$j=                         s|%j=                         rtA        d      S tC        | d|$|%||||!||j#                  dd      ||d 
      S tE        jF                  | d!       tA        d"      S c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w )#Nr&   Tr5   id_company__inc                     | d   dk(  S Nr<   r'   r}   r.   s    r/   <lambda>z&update_record_mobile.<locals>.<lambda>      PQR^P_cfPf r9   r   r'   c              3   h   K   | ]*  }t        |      st        |      d k7  st        |       , ywr'   Nr+   r   r[   s     r/   r   z'update_record_mobile.<locals>.<genexpr>  B       -Nbefpbqvy  {E  wF  JM  wMS_  -N   222id_project__in-project_last_modification_datezComapany to save firstra   project_last_modification_dateproject_denominationra   [r%   ]'r   c              3   P   K   | ]  }t        |      d k7  st        |         ywr  r  r   rK   s     r/   r   z'update_record_mobile.<locals>.<genexpr>  :       =RQ[z}  I  {J  NQ  {QS_  =R   &&r;   r`   c              3   V   K   | ]!  }t        |j                  d             dk(   # ywra   r'   Nr+   r   r   r  s     r/   r   z'update_record_mobile.<locals>.<genexpr>  #     #gCl(;$<$C#g   ')zSave company firstr  c                     | d   dk(  S NrQ   r'   r}   r  s    r/   r  z&update_record_mobile.<locals>.<lambda>      AlOWZDZ r9   rP   rQ   instancepkr  testzupdate_record_mobile.html)
formform2selectbox_company_projectselectbox_all_companiesselectbox_membersdefault_selected_member_id(selectbox_most_recent_company_members_idformated_most_recent_project_idselectbox_projectsselectbox_most_recent_projectYou Must Be Logged In...home)$r  is_authenticatedr+   rX   rD   rE   rF   r   r   extendr^   rV   dictfromkeysr8   rd   r   r   re   nextrG   rL   anyr2   insertrU   r   forms_contactsr  forms_projectsis_validr   r   r   r	   success)&r  r  	pk_formatcompany_ids_for_contact%query_all_companies_where_pk_is_foundr>   r   all_project_idsrK   7company_projects_ids_of_all_companies_where_pk_is_foundquery_most_recent_projectlr%  r&  r  r$  most_recent_project_id#company_ids_for_most_recent_projectr#  selected_companyselectbox_most_recent_companyselected_company_project_idsselected_company_member_ids"selectbox_most_recent_company_test%selectbox_most_recent_company_membersquery_default_projectr  zero_project
member_idsquery_selectbox_membersr!  query_default_selected_memberdefault_selected_memberr"  current_recordcurrent_record2r  r  s&                                         r/   update_record_mobilerK    s   ||$$ CGC(	 #?rPT"U0@0H0H0O0O_v0O0w-In"og=#9"o"o"()@Ff"g1 	QJ:#%&&'CJ'OP	Q t}}  -N  -N   N  OBRSbBc?$3$;$;$B$BRa$B$b$k$k  mN  %O!8QR1mA.RR#<?cf  AY  .Z  -[).1#Vs<tQRQ|_<t8u8}8}  B  DF  9G  9O  9O  PS  TV  9W  9_  9_  `c  eg  9h  3h  kn  3n  /o+-?-B,C).1#cTq:rq1\?:r6s6{6{|  BD  7E  7M  7M  NQ  RT  7U  7]  7]  ^a  ce  7f  3f  hk  3k  /l+!@!H!Hb!Q.JKa.b+3501 	J:#%#j/=`*`;>z?8	 87;  =R_v  =R  TV  8W4+33::Fn:ouuwM]7G)H(Ice%'CDl'm$&BCk&l#-=>Z-[*0@A\ko0p- / 7 7 > >7 !? !

(4
5 	 @U$U!]1%5$U!$U '..555EKKM#gMf#g g%,,]<-HI$*"ccwx)z%
 13
j c"r7*$aR)"1"9"9"@"@PZ"@"[7NO!]1-OO"#4:Z[(7(?(?(F(FRT(F(U%=Z"[=#3"["[%(&=>Q|_>&@@GR@PQXQXY\^`Qabibijmnpbqryryz}  @B  sC 	# ! 7(00444C)1155A`AhAhilmoAp5q gll2d^PRSw||3toN ==?IIK >>JJL==?enn.F## g:DFKYrWnQbZt iQ bA  bI  bI  JM  NP  bQTf]z
=? 
@ 
	@ 	"<=U #p S =u ;s, %V. P #\>s0   #WW	W+W :W%W*"W/?W4c                 h   t               }| j                  j                  d      }| j                  j                  d      }d fd}|dk(  sB|dk(  rxt        j                  j                  d||g      }|D cg c]  }t        |       }}|D cg c]  }|d   d	k7  s| }} ||      }t        d
d|i|       |d<   t        |      S |dk(  rt        j                  j                  t        |      t        |      z  t        |      z        j                  d	      }t        j                  j                  t        |      t        |      z        j                  d	      }	|	D 
cg c]  }
t        |
j                         }}
|t         j                  j                  |j#                  dd            j#                  dd      D cg c]  }t        |       c}z  }t%        t         j'                  d |D                    }t(        j                  j                  |      j                  d	      j#                  dd      D cg c]  }t        |       }}t%        t         j'                  |            }t+        |      }t        j                  j                  t        |      t        |       z  t        |!      z  t        |"      z  t        |#      z  t        |$      z  t        |%      z  t        |&      z  t        |'      z  t        |(      z  t        |)      z        }|D cg c]  }t        |       }}|D cg c]  }|d   d	k7  s| }} ||      }t        d
||d*|       |d<   t        |      S y t        j                  j                  d+      }|D cg c]  }t        |       }}|D cg c]  }|d   d	k7  s| }} ||      }t        d
d|i|       |d<   t        |      S c c}w c c}w c c}
w c c}w c c}w c c}w c c}w c c}w c c}w ),N	txtSearchselect_main_search_prefilterc                  t   i } t         j                  j                  d      j                  d      }|D ]J  }| j	                  t        |j                        g       j                  |j                  j                         L | j                         D ci c]  \  }}|dj                  |       c}}S c c}}w )Nr'   r?   r>   z ; )rH   rE   rI   r   
setdefaultr+   r@   r2   r>   r}  r   r3   )	companies	relationsrelationr@   namess        r/   build_companies_by_contactz9article_filter_mobile.<locals>.build_companies_by_contact=  s    	+33;;s;KZZ[de	! 	eH  X%8%8!92>EEhFVFVFcFcd	eGPGXY2C*e
EJJu--YYYs   B4c                 f            }| D ]#  }|j                  t        |d         d      |d<   % | S )NrQ   r%  r}  )r   r+   )main_searched_contact_foundrQ  r  rU  s      r/   add_company_namez/article_filter_mobile.<locals>.add_company_nameD  s@    .0	, 	IA )c!L/.BC HAn	I**r9   r%   r]  z\SELECT * FROM table_contacts WHERE contact_first_name RLIKE %s OR contact_last_name RLIKE %srQ   r'   zgrid_mobile.htmlrW  r  
html_table
everywhereid_project__icontains)project_last_modification_date__icontainsproject_denomination__icontainsr`   id_company__icontainscompany_name__icontainsr;   ra   TrB   )project_id__inrT   c              3   2   K   | ]  }|s|d k7  s|  ywr  r}   r  s     r/   r   z(article_filter_mobile.<locals>.<genexpr>m  s     ,zJYchrvyhyZ,zs   )company_id__inr?   rA   id_contact__icontainsr  contact_first_name__icontainscontact_last_name__icontainscontact_email_1__icontainscontact_phone_1__icontainscontact_phone_2__icontainscontact_email_2__icontainscontact_gender__icontainscontact_language__icontainstest__icontains)rW  	number_ofzSELECT * FROM table_contacts)r+  r  r   rU   rE   rawr   r   r   rd   rF   r   rI   rD   r+   r<   r]   rJ   rV   r,  rH   r8   )r  r  searchrN  rX  	locationsr:  rW  project_matchescompany_matchesr>   r  rK   r@   r  r}  rU  s                   @r/   article_filter_mobiler  7  s   6D\\k*F#*<<#3#34R#S Z+ R<'61'//33 5F 6<FO	EI
 FO*O=+;*O'*O6Q*lUVWcUdhkUk1*l'*l*:;V*W'!12DGd  gB  GC:A"CD%%'<7 .55<</FCD&9: gg%	  /66==/&12 gg% 
 CRRw3w112RKR"9"A"A"H"H#2#>#>|RV#>#W #I #+3$+?	 J K t}},z+,zz{K #:"A"A"H"H#. #I #'S')++6KRV+*W	 JK  t}}[9:K(5I'//66/-.78 v67 V4	5
 V45 V45 V45 F34 f5	6 &)
*I FO*O=+;*O'*O6Q*lUVWcUdhkUk1*l'*l*:;V*W'!12D  gB  OX  GY  bi  "jD%%g 8j $++//0NO	AJ&KA}Q'7&K#&K2M&hQQRS_Q`dgQgq&h#&h&67R&S#-.@C`b}B~  HO  P\ D!!I +P*l( S. +P*l 'L&hsH   ;PP!P0PPP>P P%$P%5P*P/P/c                    t               }| j                  j                  d      }| j                  j                  d      }|r|dk(  rt        j                  j                  t        |      t        |      z        }|D cg c]  }t        |       }}|D cg c]  }t        |d         dk7  s| }}t        d|g d	| 
      |d<   t        |      S |dk(  rxt        j                  j                  |      }|D cg c]  }t        |       }}|D cg c]  }t        |d         dk7  s| }}t        dg |d	| 
      |d<   t        |      S |dk(  rt        j                  j                  t        |      t        |      z  t        |      z  t        |      z  t        |      z  t        |      z  t        |      z  t        |      z  t        |      z  t        |      z        }t        j                  j                  t        |      t        |      z  t        |      z  t        |      z        }t        j                  j                  t        |      t        |      z  t        |      z  t        |      z  t        |      z        }	t        j                  j                  t        |       t        |!      z  t        |"      z  t        |#      z  t        |$      z  t        |%      z  t        |&      z  t        |'      z  t        |(      z  t        |)      z        }
|D cg c]  }t        |       }}|D cg c]  }|d   dk7  s| }}|D cg c]  }t        |       }}|D cg c]  }|d   dk7  s| }}|	D cg c]  }t        |       }}|D cg c]  }|d*   dk7  s| }}|
D cg c]  }t        |       }}|D cg c]  }|d+   dk7  s| }}t        d||||d,| 
      |d<   t        |      S y t        j                  j                         }t        j                  j                         }t        j                  j                         }	t        j                  j                         }
|D cg c]  }t        |       }}|D cg c]  }|d   dk7  s| }}|D cg c]  }t        |       }}|D cg c]  }|d   dk7  s| }}|	D cg c]  }t        |       }}|D cg c]  }|d*   dk7  s| }}|
D cg c]  }t        |       }}|D cg c]  }|d+   dk7  s| }}t        d||||d,| 
      |d<   t        |      S c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w )-NrM  rN  r]  rk  rm  rQ   r'   	grid.html)rW  main_searched_company_foundrY  rZ  r}  rd  r<   r[  ri  ro  rq  ru  rs  rw  ry  r{  rb  )company_vat_number__icontains)company_type__icontainsr\  r^  r`  )project_maturity__icontains)project_credibility__icontains)id_interaction__icontains) interaction_full_date__icontains)interaction_date__icontains)interaction_time__icontains)interaction_user__icontains)!interaction_contact_id__icontains)!interaction_project_id__icontains)interaction_content__icontains)interaction_type__icontains)interaction_mode__icontainsra   r  )rW  r  main_searched_project_foundmain_searched_interaction_found)r+  r  r   rU   rE   rF   r   r   r+   r   r   rD   rd   models_interactionsr~  )r  r  r  rN  !main_searched_contact_found_queryr:  rW  !main_searched_company_found_queryr  !main_searched_project_found_query%main_searched_interaction_found_queryr  r  s                r/   main_search_recordsr    ss   6D\\k*F#*<<#3#34R#S '610?0G0G0N0NqouOvyz  Y_  z`  P`  1a-Ef*g=+;*g'*g6Q*qUXYZ[gYhUimpUp1*q'*q!1+^y^`?A ;B"CD  %%)^;0@0H0H0O0O(. 1P 1- Fg*g=+;*g'*g6Q*qUXYZ[gYhUimpUp1*q'*q!1+^`^y?A ;B"CD  %%)\90?0G0G0N0N/78v67 V45 V4	5
 V45 V45 F34 f56 &)	*1- 1A0H0H0O0O/&1278 &121- 1@0G0G0N0N/FCD&9: f56 8	91- 5H4O4O4V4VF36:;f56 f56 f5	6
 F;< F;< 89 f56 f5	651 Fg*g=+;*g'*g6Q*lUVWcUdhkUk1*l'*lEf*g=+;*g'*g6Q*lUVWcUdhkUk1*l'*lEf*g=+;*g'*g6Q*lUVWcUdhkUk1*l'*lIn.oA}Q/?.o+.o:Y.xQ]^_o]ptw]wq.x+.x!1+_z[v[v_~@>
 ;B"CD  %%E :H -<,C,C,G,G,I),<,D,D,H,H,J),;,C,C,G,G,I)0C0K0K0O0O0Q-Ab&cA}Q'7&c#&c2M&hQQRS_Q`dgQgq&h#&hAb&cA}Q'7&c#&c2M&hQQRS_Q`dgQgq&h#&hAb&cA}Q'7&c#&c2M&hQQRS_Q`dgQgq&h#&hEj*k=+;*k'*k6U*tYZ[kYlpsYs1*t'*t-k[v[v[v_~<>
 7>?\ D!!g +h*q +h*qp +h*l*g*l*g*l.o.x 'd&h&c&h&c&h*k*ts   U>V2V VV/VVV-V7VV!V!'V&?V+V+V0/V5=V5!V:9V?V?W)W	7W	WW'W1W	WWc                     | sd} | j                  d      }g }|D ]I  }t        |xs d      j                  dd      j                         }|s3|dk7  s9|j	                  |       K |S )N00%r%   r&   )r*   r+   r   r)   r2   )selected_rows_rawselected_rowscleanedr7   s       r/   _clean_selected_grid_idsr    so     %++C0MG "EKR ((b1779Ud]NN5!"
 Nr9   c           	          | D cg c]  }t        |       }}|D cg c]#  }t        |j                  |d            dk7  s"|% c}S c c}w c c}w )Nr%   r'   )r   r+   r   )querysetid_fieldr:  rowss       r/   _dicts_without_zeror  &  sJ    &./M!/D/?!s1552#673>A?? 0?s   A#AAc                 h    | D ],  }|j                  dd      |d<   |j                  dd      |d<   . | S )Nrz  r%   r  ry  r  )r   )contact_rowsr<  s     r/   _format_contact_relation_dictsr  -  sG      <GG$8"=L77#6;K< r9   c                    t               }t        | j                  j                  d            }t	               }|D ]  }|j                  t        |              t        j                  j                  t        |            }t        |d      }t	               }|D ]+  }|j                  t        |j                  d                   - t        j                  j                  t        |            }	t        |	d      }
t        j                  j                  |      }t        |d      }t        d|||
d	| 
      |d<   t!        |      S )Nr  r  r<   r  ra   )interaction_contact_id__inr  sub_grid.html)company_relationsinteraction_relationsproject_relationsrY  rZ  )r+  r  r  r   r   r   rX   rD   rE   rF   rV   r  r^   rd   r  r   r   )r  r  selected_contact_idsr  r@   company_filterr  project_idsr>   project_filterr  interaction_filterr  s                r/   search_contact_relationsr  5  s?   6D3GLL4D4D_4UV %K* E
7
CDE &--44DDU4VN+NLI %K$ T7L8QRST %,,334CT3UN+NLI -44;;Wk;l/0BDTU)/QbTiPa<> 3:	;D
 r9   c                 V   t               }t        | j                  j                  d            }t        j
                  j                  |      }t        |d      }t               }|D ]  }|j                  t        |              t        j
                  j                  t        |            }t        t        |d            }t               }	|D ]  }|	j                  t        |              t        j
                  j                  t        |	            }
t        |
d      }t        t         j
                  j                  |      j#                  d	d
            }t$        j
                  j                  |      }t        |d      }t'        d||||d|       |d<   t)        |      S )Nr  r  r<   r  rQ   r  ra   )company__id_company__ininteraction__id_interactionTrB   id_interaction__inr  r  )contact_relationsr  r  r  rY  rZ  )r+  r  r  r   rD   rE   rF   r  r   r   rL   rU   rV   r  r^   rd   rs   rJ   r  r   r   )r  r  selected_company_idsr  r  r  rK   contact_filterr  r  r  r  relation_interaction_idsr  r  s                  r/   search_company_relationsr  W  s   6D3GLL4D4D_4UV &--44DX4YN+NLI %K* E
7
CDE %,,334CT3UN67J>[g7hi %K* E
7
CDE %,,334CT3UN+NLI  $$@$H$H$O$O 4 %P %k/dk; = -44;;Og;h/0BDTU)/PaPaQbTi<>
 3:;D r9   c                    t               }t        | j                  j                  d            }t	               }|D ]  }|j                  t        |              t        j                  j                  t        |            }t        |d      }t	               }|D ]+  }|j                  t        |j                  d                   - t        j                  j                  t        |            }	t        t        |	d            }
t        j                  j                  |      }t        |d      }t!        d|||
d	| 
      |d<   t#        |      S )Nr  r  r<   r  rQ   )interaction_project_id__inr  r  )r  r  r  rY  rZ  )r+  r  r  r   r   r   re   rD   rE   rF   rV   r  rL   rU   r  r  r   r   )r  r  selected_project_idsr  r[   r  r  r  r>   r  r  r  r  s                r/   search_project_relationsr    sF   6D3GLL4D4D_4UV %K* E
7
CDE &--44DDU4VN+NLI %K$ T7L8QRST %,,334CT3UN67J>[g7hi -44;;Wk;l/0BDTU)/QbTiPa<> 3:	;D
 r9   c           	      4   t               }t        | j                  j                  d            }t        j
                  j                  |      }t        |d      }|D cg c]  }|d   	 }}|D cg c]  }|s|	 }}t        j
                  j                  |      }t        t        |d            }t               }	|D ]  }
|	j                  t        |
              t        j
                  j                  t        |	            }t        |d      }|D cg c]  }|d	   	 }}|D cg c]  }|s|	 }}t        j
                  j                  |
      }t        |d      }t!        d|||||d|       |d<   t#        |      S c c}w c c}w c c}w c c}w )Nr  r  r  interaction_contact_idr  rQ   r  r<   interaction_project_idr  ra   r  )r  r  r  r  selected_rows_in_gridrY  rZ  )r+  r  r  r   r  rE   rF   r  rU   r  r   r   rt   rD   rV   rd   r   r   )r  r  selected_interaction_idsr  r  r.   get_all_contacts_idr  r  r  interaction_objr  r  get_all_projects_idr  r  s                   r/   search_interaction_relationsr    s   6D78H8H8YZ -44;;Og;h/0BDTU AVV1156VV&9?Q1??$,,33CV3WN67J>[g7hi %K- N;OLMN &--44DDU4VN+NLI AVV1156VV&9?Q1??$,,33CV3WN+NLI)/PaPaQbTiUm	<> 3:;D 5 W? W?s$   F1F9FF*F2Fc                 *   t        |       }|j                  rt        j                  j	                         }| j
                  dk(  r|| j                  d   }| j                  d   }t        | ||      }|-t        | |       t        j                  | d       t        d      S t        j                  | d       t        d      S t        | dd	|i      S |j                  rt        j                  j	                         }| j
                  dk(  r|| j                  d   }| j                  d   }t        | ||      }|-t        | |       t        j                  | d
       t        d      S t        j                  | d       t        d      S t        | dd	|i      S y )Nr  usernamepasswordr  r  zYou Have Been Logged In PC!r(  z2There Was An Error Logging In, Please Try Again...z	home.htmlrecordszYou Have Been Logged In MOBILE!r  	test.html)r   is_pcrU   rE   r~  methodr  r   r   r	   r3  r   r   	is_mobile)r  
user_agentr  r  r  r  s         r/   r(  r(    sq   (J !))--/>>V#||J/H||J/H(XNDgt$  *GH''  *^_''';70CDD			!))--/>>V#||J/H||J/H(XNDgt$  *KL''  *^_''';G0DEE# 
r9   c                 Z    t        |        t        j                  | d       t        d      S )NzYou Have Been Logged Out...r(  )r   r	   r3  r   rY  s    r/   logout_userr    s%    
7OW;<Fr9   c                    | j                   dk(  rt        | j                        }|j                         r|j	                          |j
                  d   }|j
                  d   }t        ||      }t        | |       t        j                  | d       t        d      S t               }t        | dd|i      S t        | dd|i      S )	Nr  r  	password1r  z*You Have Successfully Registered! Welcome!r(  zregister.htmlr  )r  
SignUpFormr  r2  r   cleaned_datar   r   r	   r3  r   r   )r  r  r  r  r  s        r/   register_userr    s    ~~',,'==?IIK((4H((5HHED'4 W&RSF##|g>>'?VDM::r9   c                     | j                   j                  r/t        j                  j	                  |      }t        | dd|i      S t        j                  | d       t        d      S )NrP   zrecord.htmlcustomer_recordz*You Must Be Logged In To View That Page...r(  )	r  r)  rU   rE   r   r   r	   r3  r   )r  r  r  s      r/   r  r    sY    ||$$)11555Dg}/@.QRR"NOr9   c                    | j                   j                  rQt        j                  j	                  |      }|j                          t        j                  | d       t        d      S t        j                  | d       t        d      S )NrP   zRecord Deleted Successfully...r(  z#You Must Be Logged In To Do That...)	r  r)  rU   rE   r   rw   r	   r3  r   )r  r  	delete_its      r/   delete_recordr    sl    ||$$#++//2/>	"BC"GHr9   c                    | j                   j                  rt        | j                  xs d       }t	        | j                  xs d       }| j
                  dk(  rQ|j                         rA|j                          |j                          t        j                  | d       t        d      S t        | d||d      S t        j                  | d       t        d      S )Nr  zRecord Added...r(  zadd_record.html)r  r  r'  )r  r)  forms_add_contactsr  forms_companiesr  r2  r   r	   r3  r   r   )r  r  r  s      r/   
add_recordr  !  s    ||$$!',,"6$7 45>>V#}}		

  *;<''g0$u2MNN"<=r9   c                 J   | j                   j                  d      }| j                   j                  d      }| j                   j                  d      }|dk(  r]t        j                  j	                  ||      j                         }|st        ||d       d}t        d	|i      S d
}t        d	|i      S |dk(  r]t        j                  j	                  ||      j                         }|rt        ||d       d}t        d	|i      S d}t        d	|i      S t        d	did      S )Nadd_or_removeexisting_contact_idcurrent_companyry   rK   r@   Try   zContact added to company !result_2existe dejar  FzContact removed from company !z$Not a member of the currrent companyzInvalid actionr   r!  )r  r   rH   rE   rF   rr  rz   r   )r  r  r  r  relation_existsr  s         r/   1add_or_remove_existing_contact_to_current_companyr  2  s@   LL$$_5M!,,**+@All&&'89O
 199@@&* A 
 &( 	
 &8KQUV3HX 677 %HX 677 199@@&* A 
 &( 	
 &8KQVW7HH 566 >HX 677%56sCCr9   c                    | j                   j                  r| j                  j                  d      }t	        |      }t
        j                  j                  |      }g }|D ]  }t        |       |j                  xs dj                         }t        |dd      xs dj                         }|j                  xs dj                         }|j                  xs dj                         }	|j                  xs dj                         }
t        |dd      xs dj                         }|j                  xs dj                         }|j                   xs dj                         }|j"                  xs dj                         }g }|dk(  rD|j%                  d       |j%                  d       |j%                  d       |j%                  d	       |dk(  r3|j%                  d       |j%                  d       |j%                  d	       |dk(  r"|j%                  d       |j%                  d	       |d	k(  r|j%                  d	       |s|j%                  d	       d|v rd}nd|v rd}n	d|v rd}nd	}g d
}t'        |j"                  xs d      j                         j)                         }||v r|nd	}|j%                  i d|j*                  d|j,                  d|j.                  d|d|d|d|	d|
d|d|d|d|d|d|d|j0                  xs dd|j2                  xs dd|j4                  xs d|j6                  xs d|j8                  xs d|j:                  xs dd        t=        d |D              st
        j                  j                  d      j?                         }|j%                  i ddd|r|j,                  nd dddddddddddddddddddd	gdd	dd	dddddddddd       tA        |d! d"#      }tC        d$|i      S tE        jF                  | d%       tI        d&      S )'Nproject_num)id_sales_documents__inr%    sales_documents_delivery_note_id$sales_documents_delivery_note_numberr+  r*  depositr(  r(  r  r*  r+  r  denominationlast_mod
invoice_iddelivery_note_idpurchase_order_idquote_idinvoice_numberdelivery_note_numberpurchase_order_numberquote_numbertypes	main_typestepr  deposit_numberdeposit_date)deposit_amountdeposit_methodrent_or_salec              3   V   K   | ]!  }t        |j                  d             dk(   # yw)r  r'   Nr  )r   r  s     r/   r   z8update_selectbox_sales_documents_edit.<locals>.<genexpr>  s"     B3swwt}%,Br  r'   r   zNouveau documentc                     | d   S )Nr  r}   r  s    r/   r  z7update_selectbox_sales_documents_edit.<locals>.<lambda>  s
    1Z= r9   T)r   reverse	documentsr'  r(  )%r  r)  rw  r   ro   r   rE   rF   r  sales_documents_invoice_idr)   r   !sales_documents_purchase_order_idsales_documents_quote_idsales_documents_invoice_number%sales_documents_purchase_order_numbersales_documents_quote_numbersales_documents_timeline_stepr2   r+   r  r   sales_documents_denomination&sales_documents_last_modification_dater   r   r   r   r   sales_documents_rent_or_saler.  rG   r   r   r	   r3  r   )r  r  list_sales_documentssales_documents_qsr  r  r  r  r  r  r   r  r  r  timeline_step	doc_typesr  valid_stepsstep_rawr  zero_docdocuments_sorteds                         r/   %update_selectbox_sales_documents_editr"  ^  s>   ||$$kkoom4  C;O3;;BBZnBo	% H	C K3O88>BEEGJ '-OQS T ZXZaac!$!F!F!L" S S U44:AACH!@@FBMMON$+C1WY[$\$b`b#i#i#k %(%N%N%TRT$[$[$]!<<BIIKL >>D"KKMMI	)  +  1  +  )/  1  +  )	)  +  )'  )  )I%%	 I-+	i'%	#	JK3<<BCIIKQQSH';68GD c,, @ @ CFF z	
 #%5 $&7 X !. '(< ()>   Y  c<<B  !#"D"D"J!"  @ @ FB#$ #&"D"D"J"%"D"D"J # @ @ E2) gH	Z B	BB-55<<PS<TZZ\H c(!F!FXj C b	
 #B $R B !" ' (  ' W  b  !"!" #$ #%"$ ") . ")1HRVW)
  	
 	"<=r9   c                 R   | j                   j                  r| j                  dk7  rt        ddid      S | j                  j                  d      }| j                  j                  d      xs dj                         }| j                  j                  d	      xs dj                         }| j                  j                  d
      xs dj                         }| j                  j                  d      xs dj                         }| j                  j                  d      xs dj                         }	 t        j                  j                  |      }t        j                  j                  ||      j                         }|r-||_        ||_        ||_        ||_        |j!                          n%t        j                  j#                  ||||||       t%        |       |j!                  g d       t        ddi      S # t        j&                  $ r t        ddid      cY S w xY w)Nr  r  unauthorized  r!  doc_idr  r'   r  r  r	  r
  r   r   r   r   r   r   r   r   r   r   r3  TDocument introuvabler#  )r  r)  r  r   r  r   r)   r   rE   r   rF   rG   r   r   r   r   r   r   r  DoesNotExist)	r  r&  new_id
new_numbernew_date
new_amount
new_methodr  existing_relations	            r/   save_deposit_infor1    s   <<((GNNf,DWn5cBB\\h'Fll|,3::<F,,""#34;BBDJ  07C>>@H,,""#34;BBDJ,,""#34;BBDJ(K$,,00F0K +22V36VJUW 	 ?I<=E:?I<?I<""$*2299"+1/9-5/9/9 :  	GsK  
 	 Y-..!.. KW&<=cJJKs   2CH "H&%H&c                 @   | j                   j                  r| j                  dk7  rt        ddid      S | j                  j                  d      }| j                  j                  d      }	 t        j                  j                  |      }t        j                  j                  ||	      j                         \  }}|d
k(  r=t        |       t        j                  j                  ||	      j                         \  }}|d
k(  rt        ddid      S t        |      r|j                  g d       n7d|_        d|_        d|_        d|_        d|_        |j                  g d       t        ddi      S # t        j&                  $ r t        ddid      cY S w xY w)Nr  r  r$  r%  r!  r&  r  r   r'  r   u   ID non trouvér#  r(  r   r%   r3  Tr)  )r  r)  r  r   r  r   r   rE   r   rF   rw   r  r  r   r   r   r   r   r   r*  )r  r&  deposit_id_to_remover  deleted_countr2  s         r/   delete_deposit_infor5    s   <<((GNNf,DWn5cBB\\h'F"<<++L9.K$,,00F0K :AAHH'; I 
 &( 	q
 A5c:=EELL"+?  M   fh M1
 A*: ;CHHI#NHH $H  .0C*13C./1C,13C.13C.HH $H  Y-..!.. KW&<=cJJKs   ,B'E8 A#E8 8"FFc                    | j                   j                  
rNt        dt        |      z   dz         }| j                  j	                  dd      }| j                  j	                  dd      }t        |d      }t        j                  j                  |      }|D cg c]  }t        |       }}t        |d 	      }g }	|D ]+  }
t        |
      d
k7  s|	j                  t        |
             - t        t        j                  d |	D                    }	t!        |	      }t"        j                  j                  |	      j%                  d      }|D cg c]  }t        |       }}|g k(  rcd
d
ddg}t        dt        |D cg c]  }|d   	 c}      j'                  dd      j'                  dd      j'                  dd      z   dz         }na|d   g}t        dt        |D cg c]  }|d   	 c}      j'                  dd      j'                  dd      j'                  dd      z   dz         }|j'                  dd      }t)        |      }d}|D ]+  }
t        |
      d
k7  st        |
      |v s t        |
      } n |st+        d |D        d      }t        j                  j                  |      j-                         }|rt        |      gng }t        |      }t/        |      }t!        |      }t!        |d      }t"        j                  j                  |      j%                  d      }|D cg c]  }t        |       }}t"        j                  j                  d
      j-                         }|r,t1        d |D              s|j3                  t        |             |g k(  rd
d
ddg}|d d  }d
|vr|j3                  d
       t        |      |vr|j5                  dt        |             t6        j                  j                  |      }|D cg c]  }t        |       } }t        | d 	      } t6        j                  j                  |      }!|!D cg c]  }t        |       }"}t        |"D cg c]  }|d   	 c}      j'                  dd      j'                  dd      j'                  dd      j'                  dd      }#| s|"} |dk(  r|rt6        j                  j                  |      j-                         }$|$rqt        |$j8                        }#t        |$      }%| D &cg c]4  }&t        |&j	                  d            t        |$j8                        k7  r|&6 } }&| j5                  d|%       t:        j                  j=                  dd       }'t        |'      }'t:        j                  j=                  d!d       }(t        |(      }(|r|r}d })d }*|d"k(  r|})n|d#k(  r|}*t)        |      }+|+r|+d   })n|d$k(  r~t>        j                  j                  |%      j-                         },|,rNtA        |,d&d      r-|,jB                  d
k7  r|,jB                  }*t)        |*      }+|+r|+d   })|)stE        |,      }+|+r|+d   })|)rt        j                  j                  |)      j-                         }-|-rt        |d      }t        |)      |vr|j5                  dt        |)             t        j                  j                  |      }.|.D ci c]!  }t        |jF                        t        |      # }/}t        |)      g|D 0cg c]%  }0t        |0      t        |)      k7  st        |0      ' c}0z   }1|1D 0cg c]  }0|0|/v s|/|0    }}0t        |-      g}t        |-jF                        }t/        |-jF                        }d
|vr|j3                  d
       t        |      |vr|j5                  dt        |             t6        j                  j                  |      }2|2D 3ci c]!  }3t        |3j8                        t        |3      # }4}3t        |      g|D 0cg c]%  }0t        |0      t        |      k7  st        |0      ' c}0z   }5|5D 0cg c]  }0|0|4v s|4|0    } }0t        |      }#t!        |d      }t        |-jF                        }6d
|6vr|6j3                  d
       |*r(t        |*      |6vr|6j5                  dt        |*             t"        j                  j                  |6      }7|7D 8ci c]!  }8t        |8jH                        t        |8      # }9}8|*r?t        |*      g|6D 0cg c]%  }0t        |0      t        |*      k7  st        |0      ' c}0z   }:n|6D 0cg c]  }0t        |0      d
k7  st        |0       };}0t        t"        j                  j                  |;      j%                  d      j=                  dd             }<|<D 0cg c]  }0t        |0       }:}0d
|6v r|:j3                  d
       |:D 0cg c]  }0|0|9v s|9|0    }}0|sd
d
ddg}tK        | d'||| |#|||d(      S tM        jN                  | d)       tQ        d*      S c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}&w c c}w c c}0w c c}0w c c}3w c c}0w c c}0w c c}8w c c}0w c c}0w c c}0w c c}0w )+Nr&   
focus_typer%   focus_idTr  r  c                     | d   dk(  S r  r}   r  s    r/   r  zupdate_record.<locals>.<lambda>Y  r  r9   r  r'   c              3   h   K   | ]*  }t        |      st        |      d k7  st        |       , ywr  r  r  s     r/   r   z update_record.<locals>.<genexpr>_  r   r  r  r  zplz save company firstr  ra   r  r	  r
  r   c              3   P   K   | ]  }t        |      d k7  st        |         ywr  r  r  s     r/   r   z update_record.<locals>.<genexpr>u  r  r  r;   r`   c              3   V   K   | ]!  }t        |j                  d             dk(   # ywr  r  r  s     r/   r   z update_record.<locals>.<genexpr>  r  r  zSeva company firstr  c                     | d   dk(  S r  r}   r  s    r/   r  zupdate_record.<locals>.<lambda>  r  r9   rP   rQ   rR   r  rB   r   r>   rc   rr   r  r  zupdate_record.html)r  r   r!  r"  r#  rB  r>  r'  r(  ))r  r)  r+   rw  r   rX   rD   rE   rF   r   r   r*  r^   rV   r+  r,  r8   rd   r   r   re   r-  rG   rL   r.  r2   r/  rU   rQ   r   rJ   r  r   r  rt   r<   ra   r   r	   r3  r   )=r  r  r4  r7  r8  r5  r6  r>   r   r7  rK   r8  r9  r:  r%  r&  r  r$  r;  r<  r#  r=  r>  r?  r@  rA  rB  rC  r  rD  rE  rF  r!  rG  rH  r"  forced_contactforced_contact_dictmemberlist_product_denominationlist_id_productforced_company_idforced_project_idrelated_companiesrr   forced_companyforced_companies_qsforced_company_mapr.   ordered_company_idsforced_members_qsrR   forced_members_mapordered_member_idsproject_ids_for_companyforced_projects_qsrc   forced_projects_mapordered_project_idsreal_project_idssorted_project_idss=                                                                r/   update_recordrT  H  s    ||$$c"g+,	 [[__\26
;;??:r2 #?rPT"U0@0H0H0O0O_v0O0w-In"og=#9"o"o"()@Ff"g1 	QJ:#%&&'CJ'OP	Q t}}  -N  -N   N  OBRSbBc?$3$;$;$B$BRa$B$b$k$k  mN  %O!8QR1mA.RR#<?cf  AY  .Z  -[).1#Vs<tQRQ|_<t8u8}8}  B  DF  9G  9O  9O  PS  UW  9X  9`  9`  ad  fh  9i  3i  lo  3o  /p+-?-B,C).1#Vs<tQRQ|_<t8u8}8}  B  DF  9G  9O  9O  PS  UW  9X  9`  9`  ad  fh  9i  3i  lo  3o  /p+!@!H!Hb!Q.JKa.b+3501 	J:#%#j/=`*`;>z?8	 87;  =R_v  =R  TV  8W4+33::Fn:ouuwM]7G)H(Ice%'CDl'm$&BCk&l#-=>Z-[*0@A\ko0p- / 7 7 > >7 !? !

(4
5 	 @U$U!]1%5$U!$U '..555EKKM#gMf#g g%,,]<-HI %*8;_b  }Q  *R  )S% 13
j c"r7*$aR)"1"9"9"@"@PZ"@"[7NO!]1-OO"#4:Z[ )8(?(?(F(F )G )
% >["[=#3"["[%(CZ)[a!L/)[%\%d%dehjl%m%u%uvy{}%~  &G  &G  HK  MO  &P  &X  &X  Y\  ^`  &a"  7
 "x,44;;x;PVVXN-01J1J-K*&3N&C#):%%6::l34N<U<U8VV %! % "((,?@$3$;$;$G$GH^ei$G$j!$()B$C!)11==lQU=V/
 ( $ $Y&$,!y($,!$@$J!$(9!(<%},199@@PX@Y__a{,DbIkNpNptwNw,7,N,N),HIZ,[),0A!0D-,,L[,Y),0A!0D- !1!9!9!@!@L]!@!^!d!d!f!.J2\`.a+,-5LL/66q#>O:PQ*:*B*B*I*IYp*I*q'i|)}^e#g.@.@*A=QXCY*Y)}&)}+./@+A*BVm  FSQRqtuvqw{~  @Q  |R  rRc!f  FS  +S'Na.}efj|e|/A!/D.}+.}5B>5R4S1?B>C\C\?]<!=n>W>W!XJ*,"))#.2wj0"))!SW5(7(?(?(F(FV`(F(a%iz){^e#g.@.@*A=QXCY*Y){&){*-b'j5fTWXYTZ^abd^eTec!f5f)f&HZ(v1^_cu^u);A)>(v%(v14R.<LZfj<k9.J>KdKd.e+"99/66s;(S1B-CKb-b/66q#>O:PQ)8)@)@)G)GWn)G)o&j|*}_f3w/A/A+BMRYDZ+Z*}'*}(/23D/E.FZq  JWUVuxyzu{  @C  DU  @V  vV#a&  JW  /W+<S+eqWZ[\W]adWdCF+e(+e-1+33#V3CVD%X&GH([D[A	.* @R.R!s1v.R+.R"99/66s;Qd  1BAhi  nA  iA1DQ1G  1B-  1B4DGkn  I]  6^  5_1g3)B'>!2*D8`5Z-J	6
 	 		 	"<=M #p S =u =u. %V0 P #\)[%f *~ FS.} *|5f(v +~ JW+e /S 1Bs   jjj#j2jj j%7j*)9j/
&j4j9j94	j>>j>&kk2k	kk+&k$kkk,kk!5	k&?k&c                    | j                   j                  r| j                  j                  d      }t        j
                  j                  |      }t        | j                  xs d |      }|j                         r6|j                  d      }|j                  d d |_
        |j                          t        | dd|i      S t        j                  | d	       t        d
      S )Nr  r`   r  Fcommit   zprojects_mobile.htmlprojects_formr'  r(  )r  r)  rw  r   rd   rE   r1  r  r2  r   r  r   r	   r3  r   )r  r  rJ  rY  projects_instances        r/   update_project_mobiler[  !  s    ||$$kkoom4)11555M&w||';toV!!# - 2 2% 2 @5F5[5[\`]`5a2""$ g57VWW"<=r9   c                    | j                   j                  r| j                  j                  d      }t        j
                  j                  |      }t        | j                  xs d |      }|j                         r6|j                  d      }|j                  d d |_
        |j                          t        | d||d      S t        j                  | d	       t        d
      S )Nr.  r;   r  FrV  rX  company_mobile.html)company_formr.  r'  r(  )r  r)  rw  r   rD   rE   r  r  r2  r   r}  r   r	   r3  r   )r  r.  current_record8r^  company_instances        r/   update_company_mobilera  4  s    ||$$kkoom4*2266+6N&w||';toV  "+000>,<,I,I$3,O)!!# g4lbm6noo"<=r9   c                 >   | j                   j                  rg| j                  j                  d      }t        j
                  j                  |      }t        | j                  xs d ||      }t        | d||d      S t        j                  | d       t        d      S )Ncontact_numrP   r  contacts_mobile.html)contact_formrc  r'  r(  )r  r)  rw  r   rU   rE   r0  r  r   r	   r3  r   )r  rc  rJ  re  s       r/   update_contact_mobilerf  H  s    ||$$kkoom4)11555M%gll&:d_Yde g5|cn7opp"<=r9   c                    | j                   j                  r| j                   j                  }| j                  j	                  d      }| j                  j	                  d      }| j                  j	                  d      }| j                  j	                  d      }| j                  j	                  d      }| j                  j	                  d      }t
        j                  j	                  |      }t        | j                  xs d |||||||d	      }	t        | d
|	||d      S t        j                  | d       t        d      S )Ncurrent_contact_idcurrent_contact_namer  current_company_idcurrent_project_idcurrent_project_namer>  )interaction_userr  interaction_contact_nameinteraction_company_idr  interaction_project_name)r  initialinteraction_mobile.html)new_interaction_formcurrent_userrj  r'  r(  )r  r)  r  rw  r   r  rE   forms_interactionsr  r   r	   r3  r   )
r  rt  rh  ri  r  rj  rk  rl  new_interaction_requestrs  s
             r/   update_interactionrw  V  s<   ||$$||$[[__-AB&{{/EF )9:$[[__-AB$[[__-AB&{{/EF"5"="="A"AQ_"A"`1',,2F$Qh  FR L^ Nb L^ M_ Nbrt  u g8RfJVPb;e f 	f 	"<=r9   c                 v   | j                   j                  st        ddid      S | j                  dk(  rH| j                  j                  d      }| j                  j                  d      }| j                  j                  d      }| j                  j                  d	      }	 |d
k(  rFt        j                  j                  |      }||_        |j                          t        ||d       n|dk(  r=|dk7  r8t        j                  j                  |      }||_        |j                          nA|dk(  r<|dk7  r7t        j                  j                  |      }||_        |j                          t        ddi      S t        ddid      S # t        $ r"}t        dt        |      id      cY d }~S d }~ww xY w)Nr  u   Utilisateur non connectér%  r!  r  r<   id_sales_documentselectbox_idr   selectbox_company_addressr;   Tr  selectbox_billing_addressr'   r   selectbox_delivery_addressr3  rg     Méthode non autorisée  )r  r)  r   r  r  r   rD   rE   company_head_quarter_address_idr   r   r   r$  #sales_documents_delivery_address_idr  r+   )r  r<   ry  rz  r   r>   r   r  s           r/   ,update_sales_documents_and_company_addressesr  t  s   <<((W&AB3OO~~\\%%l3
#LL,,-@A||''7\\%%l3
	?::*2266*6M:D7*:ztL!<<ARVYAY!7!?!?!C!CWh!C!iDNA##%!==BSWZBZ!7!?!?!C!CWh!C!iEOB##%D 122 ";<SII  	?#a& 1#>>	?s   #CF 	F8F3-F83F8c                    | j                   j                  r| j                  j                  d      }t        j
                  j                  |      }t        | j                  xs d |      }|j                         rJ|j                  d      }|j                  d d |_
        |j                  d d |_        |j                          t        | d||d      S t        j                  | d	       t        d
      S )Nr   r   r  FrV  rX  zaddress_mobile.html)form_addressr   r'  r(  )r  r)  rw  r   r   rE   forms_addressesr  r2  r   address_titleaddress_typer   r	   r3  r   )r  r   form_address_queryr  address_instances        r/   update_address_mobiler    s    ||$$[[__\2
-5599Z9P&w||';tFXY  "+000>-=-K-KDS-Q*,<,I,I$3,O)!!# g4|cm6noo"<=r9   c                    t        | dd       }| j                  | j                  | j                  | j                  | j
                  xs d|rt        |dd      nd|rt        |dd      nd|rt        |dd      nd| j                  xs d| j                  xs d| j                  xs d| j                  xs d| j                  xs d| j                  xs d| j                  xs ddS )Nr   r%   product_referencer  product_categoryr   )id_sales_document_linerl   r   r   r   r  r  r  r   r   r   r   r   r   r   )r   r  rl   r   r   r   r   r   r   r   r   r   r   )r   r   s     r/   '_serialize_sales_document_line_for_jsonr    s    dIt,G"&"="=!33'+'G'G)-)K)Koo+JQWW.A2FWYPW1G L]_HOGG-?DUW$($A$A$GR,0,Q,Q,WUW!%!;!;!Ar$($A$A$GR,0,Q,Q,WUW,0,Q,Q,WUW#77<1 r9   c                    | j                   j                  st        ddid      S | j                  j	                  d      xs< | j                  j	                  d      xs | j                  j	                  d      xs dj                         }|st        d	d
dd      S t        j                  j                  |      j                         }|st        d	ddd      S t        t        j                  j                  |      j                  d      j                  ddd            }t        |D cg c]  }|j                   c}d      }t        |D cg c]  }|j                    c}d      }t        d|j"                  t%        |      |dz   |dz   |D cg c]  }t'        |       c}d      S c c}w c c}w c c}w )z
    PALIER D2 : API lecture JSON des lignes document depuis table_sales_document_lines.

    Objectif : poser une base propre pour un futur front dynamique sans toucher au
    front actuel en 25 lignes fixes.
    resultr$  r%  r!  rl   r   /selectbox_update_record_sales_documents_edit_idr%   r  sales_document_id manquantr  rq  r   r   document introuvabler#  r   r   r   r   r  r   r   r3  r
   )r  rl   
line_countnext_line_numbernext_positionr   )r  r)  r   rw  r   r)   r   rE   rF   rG   rV   r   r   r   r   r   r   r   r   r  )r  rl   r  r   r   max_line_numbermax_positions          r/   get_sales_document_lines_jsonr    s    <<((X~6sCC 	+, 	;;??/0	;;??LM	 eg  w;WXadee
 
(
(
/
/CT
/
U
[
[
]Cw;QR[^__#++	s	#			"	13PRj	k	E N4;;NXYZOuMt::MWXYL 33%j+a/%)LQRD9$?R   OM Ss   1F4F9F>c                    | j                   j                  st        ddid      S t        j                  j                         j                  ddd      }g }g }g }|D ]  }t        |dd      xs d}|r&||vr"|j                  |       |j                  |       |j                  t        t        |dd      xs d      |t        |d	d      xs dt        |dd      xs dt        |d
d      xs dt        |dd      xs dt        |dd      xs dt        |dd      xs dd        t        dt        |      ||d      S )u   
    PALIER D3 : API lecture JSON des produits disponibles pour les futures lignes
    document dynamiques.

    Objectif : préparer le futur rendu JS des lignes sans toucher au front actuel.
    Cette route ne modifie aucune donnée.
    r  r$  r%  r!  r  r  r   r%   r  product_prix_achatproduct_prix_venteproduct_prix_locationproduct_vat)r  category	referencer  
prix_achat
prix_venteprix_locationvatr3  )r  product_count
categoriesproducts)r  r)  r   r   rE   r~  r   r   r2   r+   r   )r  products_querysetr  r  seen_categoriesr   r  s          r/    get_sales_document_products_jsonr    s[    <<((X~6sCC'//335>>?QSikwxHJO$ 7$6;Ar7""8,h'gg|R8>B?  *=rBHb#G-CRHNB!'+?DJ!'+?DJ$W.ErJPb7M26<"	
 		" X 	  r9   c                 N    t        | xs d      j                         } || d | S | S r   )r+   r)   )r7   max_lens     r/   _clean_dynamic_line_textr  	  s0    ""$EXgLr9   c                 v   | j                   j                  st        ddid      S | j                  dk7  rt        ddid      S 	 t	        j
                  | j                  j                  d      xs d	      }t        |j                  d      xs |j                  d            }|j                  dg       }|st        d
ddd      S t        |t              st        d
ddd      S t        j                  j                  |      j!                         }|st        d
ddd      S g }t#               }t#               }t%        |d      D ]  \  }}	t        |	t&              st)        |	j                  d      |      }
t)        |	j                  d      |      }|
dk  s|
|v r|}
|
|v r
|
dz  }
|
|v r
|dk  s||v r|}||v r
|dz  }||v r
|j+                  |
       |j+                  |       t        |	j                  d      xs |	j                  d            }d}|r2|dvr.t,        j                  j                  |      j!                         }|j/                  t1        ||
||t        |	j                  d      d       t        |	j                  d!      d"      t        |	j                  d#      d$      t        |	j                  d%      d$      t        |	j                  d&      d'      t        |	j                  d(      d$      t)        |	j                  d)      d*      +              t0        j                  j                  |,      j3                          |rt0        j                  j5                  |       |j                  d-      d.u rt7        |       t        t0        j                  j                  |,      j9                  d/      j;                  ddd0            }t        d1|j<                  t?        |      |D cg c]  }tA        |       c}d2      S # t        $ r t        d
ddd      cY S w xY wc c}w )3u  
    PALIER D2 : API écriture JSON des lignes document vers table_sales_document_lines.

    Cette route n'est pas encore branchée au front actuel. Elle sert de base au futur
    éditeur dynamique : nombre de lignes libre, sans limite 25 côté API.
    r  r$  r%  r!  r  method not allowedr  utf-8{}r  JSON invalider  r   rl   r   r   r  u   lines doit être une lister   r  r#  r
   startr   r   r   sales_documents_descriptionNr   r   r   rK  r   rX  r   r\  r   r   d   r   r   r   r   r   rebuild_legacy_first_25Tr   r  r3  )r  rl   r  r   )!r  r)  r   r  jsonloadsrm  decoder  r  r   
isinstancerV   r   rE   rF   rG   r   r  r+  r   ry   r   r2   r   rw   bulk_creater   r   r   r   r   r  )r  payloadrl   	raw_linesr  clean_linesr   used_numbersr  raw_lineline_numberr   r   r   saved_linesr   s                   r/   save_sales_document_lines_jsonr  	  s    <<((X~6sCC~~X';<SIIY**W\\009ATB 1=P1Q1vU\U`U`auUvwGR(Iw;WXadeei&w;WXadee
 
(
(
/
/CT
/
U
[
[
]Cw;QR[^__KUN5L$Ya8 %x(D)-J KUS!(,,/N"OQVW?k\9K\)1K \) 1 ?!M~-QM ~- 	%=)-hll<.H.wHLLYvLwx
*J6%--44
4KQQSG6(3*7%=hllKe>fhi%j-EhllSuFvx{-|":8<<H_;`bd"e%=hllKe>fhj%k-EhllSuFvx{-|-EhllSuFvxz-{ )(,,7L*Mq Q
 	3%N  ''..c.BIIK#++77D{{,-5;C@#++	s	#			"	13PRj	k	K  33+&LWXD9$?X	  S  Yw?KTWXXYZ Ys   2P <P6P32P3c                 z   | j                   j                  st        ddid      S | j                  dk7  rt        ddid      S i }| j                  j                  dd	      xs d	}d
|v r4	 t        j                  | j                  j                  d      xs d      }n| j                  }t        |j                  d      xs$ |j                  d      xs |j                  d            }|st        dddd      S t        j                  j                  |      j!                         }|st        dddd      S t#        t$        j                  j                  |      j'                  ddd            }|D ch c]  }|j(                   }}|D ch c]  }|j*                   }}t-        |j                  d      d      }	t-        |j                  d      d      }
|	dkD  r|	nt/        |d      dz   }||v r
|dz  }||v r
|
dkD  r|
nt/        |d      dz   }||v r
|dz  }||v r
t        |j                  d      xs |j                  d             }d!}|r2|d"vr.t0        j                  j                  |#      j!                         }t$        j                  j3                  ||||t        |j                  d$      d%      t        |j                  d&      d'      t        |j                  d(      d)      t        |j                  d*      d)      t        |j                  d+      d,      t        |j                  d-      d)      t-        |j                  d.      d      /      }|j                  d0      d1v rt5        |       t#        t$        j                  j                  |      j7                  d2      j'                  ddd            }t        d3|j8                  t;        |      t=        |      |D cg c]  }t=        |       c}d4      S # t        $ r t        dddd      cY S w xY wc c}w c c}w c c}w )5u  
    PALIER D4b : API ajout d'une ligne document dynamique.

    Route volontairement isolée : elle ajoute une ligne dans
    table_sales_document_lines sans toucher au front actuel en 25 lignes fixes.
    Elle n'est pas encore branchée à sales_documents_edit.js.
    r  r$  r%  r!  r  r  r  CONTENT_TYPEr%   application/jsonr  r  r  r  r  r   rl   r   r  r  r   r  r#  r   r   r   r  r   r   r
   r   r  Nr   r   r   rK  r   rX  r   r\  r   r   r  r   r   r   r  Ttrue1r
   r   r3  )r  rl   r  
added_liner   )r  r)  r   r  METAr   r  r  rm  r  r  r  r  r   rE   rF   rG   rV   r   r   r   r   r   r   r   r   r   r   r   r   r  )r  r  rd  rl   r  existing_linesr   r  r   requested_numberrequested_positionr  r   r   r   r   current_lines                    r/   add_sales_document_line_jsonr  {	  s    <<((X~6sCC~~X';<SIIG<<##NB7=2L\)	]jj!4!4W!=!EFG ,,0'( 	J;;+,	J;;HI w;WXadee
 
(
(
/
/CT
/
U
[
[
]Cw;QR[^__#++	s	#	13PRj	kN BPPD44PLPESTTd88TNT -J!KQO"7;;/N#OQRS&6&:"\[\A]`aAaK

%q 
% +=q*@&s>cdGehiGiM
>
) >
) *'++l*C*qw{{SpGqrJGj
2!))00J0GMMO&..55$/&3!9'++F`:acd!e)A'++NpBqsv)w6w{{CZ7[]_`!9'++F`:ace!f)A'++NpBqsv)w)A'++NpBqsu)v%gkk2G&H!L 6 D {{,-1GG;C@#++	s	#			"	13PRj	k	E  33%j=dC\abL9,Gb  G  	]7 OX[\\	]0 QT^ cs$   +2P :P.P34P8P+*P+c                 	   | j                   j                  st        ddid      S | j                  dk7  rt        ddid      S i }| j                  j                  dd	      xs d	}d
|v r4	 t        j                  | j                  j                  d      xs d      }n| j                  }t        |j                  d      xs$ |j                  d      xs |j                  d            }t        |j                  d      xs$ |j                  d      xs |j                  d            }t        |j                  d      d      }t        |j                  d      d      }|st        dddd      S t        j                  j!                  |      j#                         }|st        dddd      S t$        j                  j!                  |      }|r!|j!                  |      j#                         }	nN|dkD  r!|j!                  |       j#                         }	n(|dkD  r!|j!                  |!      j#                         }	nd"}	|	st        dd#dd      S t'        |	      }
	 t)        j*                         5  |	j-                          t/        t$        j                  j!                  |      j1                  d$      j3                  ddd            }|j                  d%      d&v r=|r:t5        t5        d' |D              t5        d( |D              t7        |            }|t7        |      z   d)z   }|D cg c]  }|j8                   }}t$        j                  j!                  ||*      j;                  t=        d      |z   t=        d      |z   +       t?        |d,-      D ]7  \  }}t$        j                  j!                  ||.      j;                  ||/       9 t/        t$        j                  j!                  |      j1                  d$      j3                  ddd            }|j                  d0      d&v rtA        |       d"d"d"       t        d3|jD                  t7              |
|D cg c]  }t'        |       c}d4      S # t        $ r t        dddd      cY S w xY wc c}w # 1 sw Y   hxY w# t        $ r&}t        dd1tC        |      z   dd2      cY d"}~S d"}~ww xY wc c}w )5u  
    PALIER D4c : API suppression d'une ligne document dynamique.

    Route volontairement isolée : elle supprime une ligne dans
    table_sales_document_lines sans toucher au front actuel en 25 lignes fixes.
    Elle n'est pas encore branchée à sales_documents_edit.js.
    r  r$  r%  r!  r  r  r  r  r%   r  r  r  r  r  r  r   rl   r   r  r  sales_document_line_idline_idr   r   r   r  r   r  r#  r   )r  r   r   Nzligne introuvabler   renumber_after_deleter  c              3   4   K   | ]  }|j                     y wr|   r  r   r  s     r/   r   z2delete_sales_document_line_json.<locals>.<genexpr>)
  s     e\@@e   c              3   4   K   | ]  }|j                     y wr|   r  r  s     r/   r   z2delete_sales_document_line_json.<locals>.<genexpr>*
  s     g|BBgr  r  r   id_sales_document_line__in)r   r   r
   r  r   r  )r   r   r  u"   La suppression a été annulée : rg  r3  )r  rl   r  deleted_liner   )#r  r)  r   r  r  r   r  r  rm  r  r  r  r  r   r   rE   rF   rG   r   r  r   atomicrw   rV   r   r   r   r   r  r   r   r  r   r+   r   )r  r  rd  rl   r  r  r   r  line_querysetr   r  remaining_linesmax_existing_valuetemporary_offsetr  remaining_line_idsr  current_line_idr  s                      r/   delete_sales_document_line_jsonr  	  s    <<((X~6sCC~~X';<SIIG<<##NB7=2L\)	]jj!4!4W!=!EFG ,,0'( 	J;;+,	J;;HI
 ',- 	";;/0	";;y!G
 GKK(EFJKgkk*IJANMw;WXadee
 
(
(
/
/CT
/
U
[
[
]Cw;QR[^__/77>>c>RM##7#CIIK	q###LRRT		##-#PVVXw;NOX[\\:4@L;! 4	IKKM"+33s+	*9;XZrs	O {{237MMRa &)eUdeegWfgg(&"
 $6O8L#Ls#R  )8&$ !77&" &
 ,33::#&/A ;  &012O0PSc0c234S2TWg2g  
 /88JRS.T *E?/77>>'*/> ?  f6;49  	 #'/77V3V/#^I.X=?\^vw	# {{459OOCCHi4	Ix  33/*$\klL9,Gl  M  	]7 OX[\\	]@&-4	I 4	Il  ;c%jH
  	 msb   +2R !R1 5B<R%1R C:R%>R1 &S#RR R%%R.*R1 1	S :SS S c                    | j                   j                  st        ddid      S | j                  dk7  rt        ddid      S i }| j                  j                  dd	      xs d	}d
|v r4	 t        j                  | j                  j                  d      xs d      }n| j                  }t        |j                  d      xs$ |j                  d      xs |j                  d            }|st        dddd      S t        j                  j                  |      j!                         }|st        dddd      S t#        t$        j                  j                  |      j'                  ddd            }|D ci c]  }t)        |j*                        | }}|j                  d      }|j                  d      }	g }
t-        |t"              r|D cg c]  }t        |       }
}nt-        |	t"              rg }t/        |	d      D ]  \  }}t-        |t0              st        |j                  d      xs$ |j                  d       xs |j                  d!            }|sZt3        |j                  d      |      }|j5                  |||f        t7        |      D cg c]  \  }}}|
 }
}}}nt        dd"dd      S g }g }|
D ]1  }|s||vr|j5                  |       ||vs!|j5                  |       3 |D ]-  }t)        |j*                        }||vs|j5                  |       / |j                  d#      d$v}	 t9        j:                         5  |rt=        t=        d% |D              t=        d& |D              t?        |            }|t?        |      z   d'z   }|D cg c]  }||   j*                   }}dtA        d      |z   i}|rtA        d      |z   |d<   t%        j                  j                  ||(      jB                  d2i | t/        |d      D ]M  \  }}d|i}|r||d<   t%        j                  j                  |||   j*                  )      jB                  d2i | O |j                  d*      d+v rtE        |       d,d,d,       t#        t$        j                  j                  |      jG                  d/      j'                  ddd            }t        d0|jH                  t?        |      ||D cg c]  }tK        |       c}d1      S # t        $ r t        dddd      cY S w xY wc c}w c c}w c c}}}w c c}w # 1 sw Y   xY w# t        $ r&}t        dd-t)        |      z   dd.      cY d,}~S d,}~ww xY wc c}w )3u  
    PALIER D9b : API de réordonnancement atomique des lignes document dynamiques.

    Payload accepté :
    - sales_document_id
    - ordered_line_ids: [id_sales_document_line, ...]
      ou lines: [{id_sales_document_line: ..., sales_documents_line_position: ...}, ...]

    Les numéros et positions sont déplacés temporairement hors de leur plage avant
    la réattribution 1..N, afin d'éviter toute collision avec les contraintes UNIQUE.
    r  r$  r%  r!  r  r  r  r  r%   r  r  r  r  r  r  r   rl   r   r  r  r   r  r#  r   r   r   r  ordered_line_idsr   r
   r  r  r  z"ordered_line_ids ou lines manquantrenumber_line_numbers)Ffalser'   r   c              3   4   K   | ]  }|j                     y wr|   r  r   r   s     r/   r   z4reorder_sales_document_lines_json.<locals>.<genexpr>
  s     Vt::Vr  c              3   4   K   | ]  }|j                     y wr|   r  r  s     r/   r   z4reorder_sales_document_lines_json.<locals>.<genexpr>
  s     TT88Tr  r  r  r  r  r  Nu'   Le réordonnancement a été annulé : rg  r   r3  )r  rl   r  ignored_idsr   r}   )&r  r)  r   r  r  r   r  r  rm  r  r  r  r  r   rE   rF   rG   rV   r   r   r+   r  r  r  r+  r   r2   r   r   r  r   r   r   r   r   r   r   r  )r  r  rd  rl   r  r  r   existing_by_idraw_ordered_idsr  ordered_idsr7   sortable_linesr  r  r  r   clean_ordered_idsr  r  r  r  ids_for_updatetemporary_updatesupdate_valuesr  reordered_linesr  s                               r/   !reorder_sales_document_lines_jsonr  ^
  s    <<((X~6sCC~~X';<SIIG<<##NB7=2L\)	]jj!4!4W!=!EFG ,,0'( 	J;;+,	J;;HI w;WXadee
 
(
(
/
/CT
/
U
[
[
]Cw;QR[^__#++	s	#	13PRj	kN
 JXXc$556<XNXkk"45OG$IK/4(DST5/6TT	It	$(!< 	>OE8h-.56 +<< 89+<<	*G
  .M!NPUVH!!8UG"<=	> @Fn?UVV#;8UGwVVw;_`ilmmK ..(w'++$$W-.  .d112++$$W-.
 $KK(?@H``-! &	I %(V~VVT^TT'&"
 $6N8K#Kc#Q `q!rU\."9"P"P!r!r
 4Q7V5WZj5j%! )GHIfGgjzGz%&CD+33::#&/= ;  &. -. '00A&K 
.NE77%M -GL&CD/77>>'*/=g/F/]/] ?  f.  -.
. {{459OOCCHM&	I\ #++	s	#			"	13PRj	k	O  33/*"\klL9,Gl  u  	]7 OX[\\	]. Y U WB "s&	I &	IP  @3u:M
  	$ mst   +2T :T5T:T?U AU$U:CU
U ;V	T21T2UUU 	V V;VVc                    | j                   j                  st        ddid      S | j                  j	                  d      }t
        j                  j	                  |      }t        |       t        |      dk(  rd|_	        t        | j                  xs d |	      }t        | j                  xs d |	      }t        | j                  xs d |	      }t        | j                  xs d |	      }t        | j                  xs d |	      }dddd
gdddd
gz   t         j                  j#                         D cg c]&  }|j$                  |j&                  |j(                  d
( c}z   }	t         j                  j#                         D ci c]  }|j$                  |j&                   }
}i }t+        dd      D ].  }d| }t-        ||d      }|
j	                  |d      }||d| <   0 |	t/        t         j                  j1                  dd            t/        t         j                  j1                  dd            d|}t2        j                  j1                  dd      D cg c]4  }t        |      j5                         rt        |      j5                         6 }}|sd}n+d }t7        |D cg c]
  } ||       c}      }d|dz   d}t        t9        dd|i||       t9        dd|i|       t9        d d|i|       t9        d!d|i|       t9        d"d|i|       t/        t         j                  j1                  dd            t/        t         j                  j1                  dd            |d#      S c c}w c c}w c c}w c c}w )$Nr  r$  r%  r!  r  r   r'   r%   r  )r  r  r  r   zAjouter un nouveau produitr
   r   r   selected_denomination_r  TrB   r   )product_listrB  rC  r   FA01c                     | j                  d      d   }t        dj                  t        t        j
                  |            xs d      S )N:r   r%   )r*   r   r3   rF   r+   r   )nn_cleans     r/   extract_numberz3update_sales_documents_edit.<locals>.extract_number8  s7    ggcl1oGrwwvckk7;<ABBr9   FA02dzsales_documents_products.html*context_form_sales_documents_document_editrY  zsales_documents_infos.htmlr  zsales_documents_billing.htmlzsales_documents_delivery.htmlz'sales_documents_payment_conditions.html)	html_edit
html_infoshtml_billinghtml_deliveryhtml_payment_conditionslist_product_denomination_jsonlist_id_product_jsonnext_deposit_number)r  r)  r   rw  r   r   rE   r   r+   r  forms_sales_documents_productsr  forms_sales_documents_infosforms_sales_documents_billingforms_sales_documents_delivery(forms_sales_documents_payment_conditionsr   r~  r   r  r  r   r   rV   rJ   r   r)   r   r   )r  sales_documents_idr  	form_edit
form_infosform_billingform_deliveryform_paymentr  r  r  selected_denomination_varsr   r   r   selected_valuebase_contextnumberr  next_numberr  r  max_nums                          r/   update_sales_documents_editr!  
  s   <<((Wn5cBB )Z[%--11EW1XH=hG
 #%02- /w||/CthWI,W\\-ATHUJ01EPXYL27<<3G4RZ[M;GLL<PD[cdL CDSb~  MO  GP  FQ  Q ((,,.R ||Q-C-CQRQcQcdR L !((,,. 	
a,,,  "$1b\ R3A37
Xz26
+//
B?CQ"%;A3#?@	R %%)/*A*A*M*MNdko*M*p%q 7 7 C CLW[ C \] %	L 5<<HHIiptHuv; 	FG  	C ':Q~a(:;7Q;s+, %&E8)H
H
  ''CJF
 ))GLJ
 **IML
 $44]L`
$ +//F/F/R/RS_aw/x*y $_%<%<%H%H\`%H%a b*+  cR
2 ;s   6+M6M; 9N ,Nc                     | j                   dk(  r| j                  j                  d      }| j                  j                  d      }t        j                  j                  t        j                         t        d      z   j                  d      d d t        j                         t        dd	      z   j                  d      d d | j                  j                  | j                  j                  d
      | j                  j                  d      | j                  j                  d      | j                  j                  d      | j                  j                  d      | j                  j                  d      | j                  j                  d      | j                  j                  d      | j                  j                  d      i i i       }t        d|j                  |j                  d      S t        dddd      S )Nr  
line_indexdocument_idr:  hours%Y%m%d%H%M%S%frZ  r`  r&  secondsr  r  r  r  r  r  product_poidsproduct_volumeproduct_dimensions)r   product_last_modification_dateproduct_last_modification_userr  r  r  r  r  r  r*  r+  r,  product_consommationproduct_quantite_colisproduct_sous_traitantr3  )r"  new_product_idnew_product_denominationr  r~  r"  rq  r  r!  )r  r  r   r   rE   r   r   nowr   strftimer  r  r   r   r  )r  r#  r$  r   s       r/   create_product_ajaxr7  \  s   ~~\\%%l3
ll&&}5 "))00 );;EEFVWX[Y[\,4LLNYQXY=Z,Z+d+deu+vwzxz+{+2<<??$\\--.@A%ll../BC!(!1!12H!I&||//0DE&||//0DE"),,"2"23J"K!,,**?;"<<++,<=&||//0DE!##%"$ 1 
( %00(/(D(D
  	 77PQZ]^^r9   c                    | j                   j                  d      }|st        ddid      S t        j                  j                  |      j                         sAt        j                         t        d      z   j                  d	      d d
 }t        |dd      S 	 t        j                  j                  |      }t        j                         t        d      z   j                  d	      d d
 }||_        |j                          t        |dd      S # t        $ r"}t        dt        |      id      cY d }~S d }~ww xY w)Nrl   r  zID manquantr   r!  r   r:  r%  r'  rZ  not_saved_yet).updated_sales_documents_last_modification_dater"  savedrg  )r  r   r   r   rE   rF   rr  r   r5  r   r6  r  r   r  r+   )r  rl   r-  r  r  s        r/   -update_sales_documents_last_modification_dater<    s,   (()<=Wm4SAA "))00DU0V]]_LLNYQ%77AABRSTWUWX>F%
  	

;$,,00DU0VLLNYQ%77AABRSTWUWX5=2
>F
  	  ;Wc!f-c::;s   A7D 	E D;5E ;E c                 r   | j                   d   }t        j                  j                  |      }t	        j
                         t        d      z   j                  d      d d |_        |j                          t        j                  j                  |      j                  dd	      }t        d
|d   i      S )Nr[   r`   r:  r%  r'  rZ  r  TrB   &updated_project_last_modification_dater   )r  rd   rE   r   r   r5  r   r6  r  r   rF   rJ   r   )r  r[   current_projects_idr>  s       r/   %update_project_last_modification_dater@    s    l+J)11555L:B,,.9[\K]:]9g9ghx9yz}{}9~6-<-D-D-K-KWa-K-b-n-n  pP  W[-n  .\*ABhijBklmmr9   c                 t   | j                   dk7  rt        ddd      S | j                  j                  d      }| j                  j                  d      }| j                  j                  dd      }	 t        j
                  j                  |	      }|j                  |k(  rt        ddi      S 	 t        j
                  j                  t        |j                              }|j                  }|j                  }t        |      j!                         D 	ci c]  \  }}	||	d    }
}}	h d}t        j"                  j$                  D cg c]  }|j&                  |vs|j&                   }}i }|D ]J  }t)        ||      st+        ||      }|dn
t-        |      }|
j                  |d      }||k7  sC||d||<   L |st        dd||d      S t        d|||d      S # t        j                  $ r t        dd
d      cY S w xY w# t        j                  t        t        f$ r d}d}Y 2w xY wc c}	}w c c}w )Nr  r     Requête non valide.r4  r[   current_datecurrent_formr%   r`   u   Projet non trouvé.r"  okr  Inconnur   >   csrfmiddlewaretokenr  project_last_modification_user)anciennenouvelleno_conflictuB   La date a changé, mais les données n’ont pas été modifiées.)r"  rq  user_last_nameuser_first_nameconflict)r"  rM  rN  modifications)r  r   r  r   rd   rE   r*  r  r   r   rI  r  r  r   r   r   r   _metafieldsr]  hasattrr   r+   )r  r[   rC  serialized_formrc   r  rM  rN  r  r  	from_formignored_fieldsfieldall_fields_to_checkrP  r   db_valueclient_values                     r/   $check_project_last_modification_dater[    sT   ~~w;QRSS !!,/J<<##N3Lll&&~r:OS!))---D
 --=Xt,--$||3w'M'M#NO// &.o%>%D%D%FGTQAaDGIGN !0 5 5 < <

R`@`

  M # w$7C(!)2s8} !}}S"- 8#$("M#$ #[,.	
  	 (*&	  { '' Sw;PQRRS z95 $"#$
 Hs7   1 G .AH H/H5H5!HH"H,+H,c                 p   | j                   dk(  r| j                  j                  d      }| j                  j                  d      }	 t        j                  j                  |      }|j                  |k7  r]	 t        |j                        }t        j                  j                  |      }|j                  }|j                  }t        d
||d      S t        ddi      S t        ddd      S # t        j
                  $ r t        ddd      cY S w xY w# t        j
                  t        f$ r d	}d	}Y pw xY w)Nr  rg   rC  r   r  u   Adresse non trouvée.r4  rF  rG  rO  )r"  rM  rN  r"  rE  rB  )r  r  r   r   rE   r*  r   address_last_modification_dater   address_last_modification_userr   r  r  r   )r  rg   rC  r   user_idr  rM  rN  s           r/   $check_address_last_modification_dater`    s2   ~~\\%%l3
||''7	Y&..22j2IG 11\A,gDDE||''7'3!%"&//
  $"0#2!   Xt,--77MNOO+  ,, 	Y7?V WXX	Y %%z2 ,!*"+,s%    C. 7AD .!DDD54D5c                 8   | j                   dk7  rt        ddid      S | j                  j                  d      }| j                  j                  d      }| j                  j                  d      }| j                  j                  d	      }| j                  j                  d
      }d}g }i }| j                  j                  d      xs dj	                         }	|	dvrt        dddgi|d      S |dk(  rt        |      }
d}d}nXt
        j                  j                  |      }
t
        j                  j                  |      }|j                  }|j                  }t        | j                  |
      }t        | j                  |
      }t        | j                  |
      }t        | j                  |
      }t        | j                  |
      }t        |j                         |j                         |j                         |j                         |j                         g      r|j!                          |j!                          |j!                          |j!                          |j!                          t
        j                  j                  |      }||_        ||_        | j"                  j$                  |_        |dv rOt)        j*                         j-                  d      }|dk(  r!d}|j.                  }|dk(  rd}n|dk(  rd}nd}n|dk(  rd}d }n	|d!k(  rd"}d#}t
        j                  j1                  d$%      }g }|D ]p  }|s|j3                  d&      D cg c]#  }|j	                         s|j	                         % }}|D ])  }|j5                   |       s|j7                  |       + r |s | d'}nDd(}|D ]1  } d)| v s	 t9        | j3                  d)      d(         }!t;        ||!      }3  | d)|d(z    }t=        |||       t?        ||d$*       tA        |      }"|"rtC        |"      ng }|d+v rJ||_"        |d,v r?	 tF        j                  j                  |-      }#d.|#_$        d.|#_%        |#j!                          |j!                          tO        || j                         tQ        |       tS        |       d/}n|j                         s|jT                  |d0<   |j                         s|jT                  |d1<   |j                         s|jT                  |d2<   |j                         s|jT                  |d3<   |j                         s|jT                  |d4<   d}t        |||d      S c c}w #  Y xY w# tF        jL                  $ r Y w xY w)5Nr  r  r  r  r!  r   new_sales_documents_tagr  "document_type_number_to_be_creatednext_timeline_stepunknownr  r%   )rentsalesave failedu5   Sélectionnez Location ou Vente avant de sauvegarder.)r  errors$updated_project_sales_documents_listr'   r   r  )r(  r*  r+  z%Y%m%dr(  r  rf  DLrg  DVERRORr*  BLr  r+  r  r  TrB   r&   z/V1r
   z/Vr  r  )r  r*  r+  r`   	Validatedsave successmaininfosbillingdeliverypayment)+r  r   r  r   r)   r   rE   r$  r  r  r  r  r  r  r~  r2  r   r  r  &sales_documents_last_modification_userr   r5  r6  r  rJ   r*   r   r2   r   r   r   r   ro   r8   r  rd   project_maturityproject_credibilityr*  r   r   r  ri  )$r  r   new_tagr  rc  rd  r  rj  ri  #sales_documents_rent_or_sale_choicer  old_billingold_deliveryprevious	form_mainr  r  r  r  r   	today_strcolumn_namer  r   all_numbersnumbers_todayr~  spartspartr  max_versionr  versionupdated_project_idsproject_to_validates$                                       r/   .sales_documents_all_forms_save_without_refreshr    s   ~~X';<SII !))*>?ll89G,,""=1K)0)9)9:^)_& ))*>? F+-(F
 ,3<<+;+;<Z+[+a_a*h*h*j'*2BB#.1h0i 5Y
  	 #~)=OP  *1155I[5\ *1155I[5\AACC /w||hOI,W\\HMJ0QL27<<(SM;GLLS[\L I *"5"5"79N9N9PR_RhRhRjlx  mB  mB  mD  E  F .5599M_9` ;F7;G8>Elloo; .1VV //9I 2W<<+HH6)!F!V+!F$F3FD3y@> 188DD[W[D\KM" 3,/IIcNHqaggiHH! 3D&)'=>%,,T23	3 !!'37& !Aqy!&)!''$-*:&;G*-k7*CK	! "(2kAo5FG L+{; 	*+7ItTA+NXk/?@S/Tqs, !QQ9KL6 "%LL*9*A*A*E*EQ\*E*]';F'8>I';',,.
 	
 	-\7<<H;LI1,?   !!#&--F6N""$(//F7O$$& , 3 3F9%%'!.!5!5F:$$& , 3 3F9 0T  Y I! 8 '33 s*   U55U5)U:>V :U?VVc                    	 | j                   j                  d      }| j                   j                  d      }|r|st        ddid      S t        j                  j                  |      }||_        |j                          t        dd	id
      S # t        j                  $ r t        ddid      cY S t        $ r"}t        dt        |      id      cY d }~S d }~ww xY w)Nry  r  r  zID ou valeur manquante.r   r!  r   rq  u   Mise à jour réussie.rX  zDocument introuvable.r#  rg  )
r  r   r   r   rE   r  r   r*  r  r+   )r  ry  r7   r   r  s        r/   2update_toggle_sales_documents_save_without_refreshr    s    ;#LL,,-@A  !?@ *C DSQQ 077;;O`;a 7<3Y(@A#NN!.. LW&=>sKK ;Wc!f-c::;s+   AB AB "C5C=CCCc                     | j                   dk7  rt        ddid      S | j                  j                  d      }| j                  j                  d      }	 t        j
                  j                  |      }t        |       t        j
                  j                  |	      }t        j                         }t        j                         t        d      z   j                  d      d d }t        j                         t        dd      z   j                  d      d d }t        j                  |      }d |_        ||_        |j                    d|_        d|_        ||_        | j&                  j(                  |_        dD ]  }	t-        ||	d        |j/                          t1        |       t3        ||d       t        d|d      S # t        j                  $ r t        d
dd      cY S t        j                  $ r t        d
dd      cY S w xY w)Nr  r  r  r  r!  source_doc_idtarget_project_idr   r`   r  zDocument source introuvable)r  r  zProjet cible introuvabler:  r%  r'  rZ     )r&  milliseconds_duplicatedr(  )r  r  r  r  r  r  r  r  r   r   r   r   r&  r%   Tr  r3  )r  
new_doc_id)r  r   r  r   r   rE   r   rd   r*  r   r5  r   r6  copyr  r   r  r  r  r  r  rv  r   r   r   r   )
r  r  r  
source_docrc   r5  r+  new_modif_datedoc_copyrW  s
             r/   duplicate_sales_documentr    s   ~~X';<SIILL$$_5M(()<=V+3377=7Y
A*M!))--9J-K ,,.Cllnyq11;;<LMcrRFllnyqr'JJTTUefgjhjkN yy$HHK"(H/9/V/V.WWb,cH)-4H*6DH36=llooH3 %( 	%$)%, MMO,X6 &&7TJ9FCDDe ".. Yw9VWXX'' Vw9STUUVs   AG !H* HHc                    | j                   d   }| j                   d   }| j                   d   }|dk(  rt        j                  j                  ||      j	                         }|rdnd}t        | j                   xs d |      }| j                  d	k(  r|j                         re|j                  d
      }|j                  d d |_	        |j                  d d |_
        |j                          t        ||j                  d       d}nd}t        ||d      S t        | dddi      S t        j                  j!                  |      }	t        | j                   xs d |	|      }| j                  d	k(  rq|j                         rO|j                  d
      }|j                  d d |_	        |j                  d d |_
        |j                          d}d}nd}d}t        ||d      S t        | dddi      S )NrQ   selectbox_current_companynew_contact_tagr'   r  r  OK)r  r  FrV  r  Tr  rp  rh  r  r  rd  r  r   contextrP   r  OK saved existingsave failed existing)r  rH   rE   rF   rr  r0  r  r2  r   rz  ry  rz   rQ   r   r   rU   r   )
r  r@   'create_new_contact_from_serialized_datar  r  r  re  contact_instancer  rJ  s
             r/   *update_contact_mobile_save_without_refreshr  *  s	    l+J.5ll;V.W+ll#45O#
 299@@>! A 
 &( 	
 %4= &gll&:dzJ>>V#$$&#/#4#4E#4#B 6F6Y6YZ^[^6_ 35E5W5WX\Y\5] 2 %%'*+RTdToTouyz'&6h GHH'#9Ha=QQ *11555L%gll&:d_Ycd>>V#$$&#/#4#4E#4#B 6F6Y6YZ^[^6_ 35E5W5WX\Y\5] 2 %%''.&16x HII'#9Ha=QQr9   c                    | j                   d   }| j                   d   }| j                   d   }|dk(  rt        | j                   xs d       }| j                  dk(  r|j                         rf|j	                  d      }|j
                  d d |_        |j	                          t        |j                  |d	
       t        |j                         d}nd}t        d|i      S t        | dddi      S t        j                  j                  |      }t        | j                   xs d |      }| j                  dk(  r|j                         rf|j	                  d      }|j
                  d d |_        |j	                          t        |j                  |d	
       t        |j                         d}nd|z   }t        d|i      S t        | dddi      S )Nr<   selectbox_current_contactnew_company_tagr'   r  FrV  rX  Tr  rp  rh  r  r]  r   r  r;   r  zsave failed )r  r  r  r2  r   r}  rz   r<   r   r   r   rD   rE   r   )r  rK   rh  r  r^  r`  r  rJ  s           r/   *update_company_mobile_save_without_refreshr  c  s   l+J &ABll#45O#&w||';t<>>V#$$&#/#4#4E#4#B 0@0M0Mds0S - %%'*+;+F+FHZ`deFGWGbGbc'&6 233'#88Q-PP +2266*6M&w||';toV>>V#$$&#/#4#4E#4#B 0@0M0Mds0S - %%'*+;+F+FHZ`deFGWGbGbc' (
26 233'#88Q-PPr9   c                    | j                   dk7  rt        ddid      S | j                  j                  d      }| j                  j                  d      }| j                  j                  d      }|r|r|t        dd	id
      S d}d}|dk(  rt        j
                  j                  |      j                         }|st        ddid      S t        |      }t        |      |D cg c]  }t        |       c}vrd}nd}t        | j                  xs d       }	|	j                         rC|	j                  d      }
t        j                         t        d      z   j!                  d      d d }t        j                         t        dd      z   j!                  d      d d }t        j                         t        dd      z   j!                  d      d d }t"        j
                  j%                  ||
j&                  dz   d d ||d      }t)        |       |
j&                  d d |
_        |
j                          t+        ||
j,                  d !       t/        |
j,                  |d !       d"}nd#|	j0                  j3                          }t        ||d$      S 	 t4        j
                  j                  |%      }t        | j                  xs d |'      }	|	j                         r^|	j                  d      }
|
j&                  d d |
_        |
j                          t+        ||d !       t9        |
j,                         d"}d(}nd}d)}t        ||d$      S c c}w # t4        j6                  $ r t        dd&id      cY S w xY w)*Nr  r  zInvalid request methodr  r!  ra   r  new_project_tagzMissing required POST datar   rh  re  r'   r;   r  r#  r  r  FrV  r:  r%  r'  rZ  r;  r(  r?  z V1rX  r%   )r   r  r  r  r  Tr  rp  zsave failed: r  r`   zProject not foundr  r  r  )r  r   r  r   rD   rE   rF   rG   r^   r+   r1  r2  r   r   r5  r   r6  r   r   r  r   r   ra   r   ri  as_jsonrd   r*  r   )r  r[   rK   r  r  r  r>   existing_project_idspidproject_formproject_instancenew_sales_documents_id*new_sales_documents_last_modification_datenew_sales_documents_quote_idnew_sales_documentscurrent_projects                   r/   *update_project_mobile_save_without_refreshr    s   ~~W&>?LL !!,/J!!"=>Jll&&'89OZ?+BW&BCCPP FH#"**11Z1HNNP*= >sKK
  <JGz?7K"L3s8"LLH$H%gll&:d;  "+000>&.llnyq7I&I%S%STd%efigi%j":B,,.9[\fgKh:h9r9r  tD  :E  FI  GI  :J6,4LLNYQXY=Z,Z+d+deu+vwzxz+{("8"@"@"G"G#9.>.S.STY.Y[_\_-`7a)E-/ #H # 55HI4D4Y4YZ^[^4_1!!#&z3C3N3NTXY-.>.I.IKagkl#F$\%8%8%@%@%B$CDFv8DEE	L-5599Z9PO &gll&:d_U  "+000>4D4Y4YZ^[^4_1!!#&z:4H
 CCSC^C^_#F*H"F-Hv8DEE{ #MN ++ 	L*= >sKK	Ls   'M M "N ?N c                    g }t        | j                  j                  dd            D ]  }||vs|j                  |        t	        | j                  j                  dd      xs d      j                         }|r+|dk7  r&t        |      D ]  }||vs|j                  |        t        | j                  xs d       }| j                  dk(  re|j                         rF|j                  d      }|j                  d d |_        |j                          	 t        ||       d	}nd}t        d|i      S t        | dddi      S # t        $ r!}t        d	t	        |      d
      cY d }~S d }~ww xY w)Ninteraction_context_company_idr%   r  r'   r  FrV  ix  rp  )r  sync_warningrh  r  rr  r   r  )r0   r  r   r2   r+   r)   re   ru  r  r2  r   interaction_contentr  r  r   r   )r  posted_company_idsrK   posted_project_idrs  new_interaction_instancer  r  s           r/   'update_interaction_save_without_refreshr    s   
 '(8(89Y[](^_ 2
//%%j12 GLL,,-ErJPbQWWY.#567HI 	6J!33"))*5	6 .gll.BdC~~((*';'@'@'@'N$;S;g;ghnin;o$8 %))+
45MOab $F"FXv.//g88Q-PP  #,$'F%  s   E 	E.E)#E.)E.c                    | j                   dk7  rt        ddi      S | j                  j                  d      }| j                  j                  d      }| j                  j                  d      }| j                  j                  d      }|st        ddi      S t        j
                  j                  |	      j                         }|r8t        j
                  j                  |	      }t        | j                  |
      }nt        | j                        }|j                         r*|s||j                  _        |j                          |s/	 t        j
                  j                  |       t        ||d       |r|dk(  rEt        j
                  j                  |      }||_        |j                          t        ||d       |dk(  sx|dk(  r7t"        j
                  j                  |      }	||	_        |	j                          |dk(  r7t"        j
                  j                  |      }	||	_        |	j                          t        ddi      S t        ddi      S # t        j                  $ r t        ddi      cY S w xY w)Nr  r  zinvalid requestr   r.  ry  div_container_if_new_addresszmissing address_idr   r  r;   Tr  zcompany not found0div_form_update_record_company_address_containerr'   0div_form_update_record_billing_address_containerr   1div_form_update_record_delivery_address_containerrp  rh  )r  r   r  r   r   rE   rF   rr  r  r2  r  r   r   rD   r   r*  r  r   r$  r  )
r  rg   r.  ry  r  address_existsr  address_formr>   r   s
             r/   *update_address_mobile_save_without_refreshr    s@   ~~X'89::!!,/J,,""=1K(()<="),,"2"23Q"R X';<==%--44
4KRRTN+3377:7N&w||>NO&w||4/9L!!, E ((,,,D*;
M
 (+/aa*2266+6N:D7*;
M$+/3ee%;%C%C%G%G[l%G%mNHRNE"'')/3ff%;%C%C%G%G[l%G%mNISNF"'')X~677X}566- $00 E#X/B$CDDEs   .I  J ?J c                 :   | j                   j                  s!t        j                  | d       t	        d      S | j
                  j                  d      }| j
                  j                  d      }|dk(  r!t        j                  j                  |      }n+t        |      }t        j                  j                  |      }|D cg c]  }t        |       }}t        j                  j                  d      j                         }|r,t        d |D              s|j                  t        |             t        |d	 
      }t        j                  j                  |      j                         }|rt!        |j"                        nd}	t%        | d||	d      S c c}w )Nr'  r(  rc  r.  r'   rP   r  c              3   V   K   | ]!  }t        |j                  d             dk(   # yw)rQ   r'   Nr  )r   r  s     r/   r   z2update_selectbox_contact_mobile.<locals>.<genexpr>f  s#     [AAEE,$7 8C ?[r  c                     | d   dk(  S r  r}   r  s    r/   r  z1update_selectbox_contact_mobile.<locals>.<lambda>k  s    ao, r9   r  r%   zselectbox_contact_mobile.html)r!  r"  )r  r)  r	   r3  r   rw  r   rU   rE   rF   rL   r   rG   r.  r2   r   r+   rQ   r   )
r  rc  r.  members_querysetrE  rR   r!  zero_contactdefault_selectedr"  s
             r/   update_selectbox_contact_mobiler  R  sh   <<(("<=++//-0K++//-0K c*2299[9Q1+>
*22999T?OPGw/PP #**11S1AGGILC[IZ[[  |!<=,
 '..555MSSUEU%5%@%@!A[]':.&@=  ! Qs   Fc           	         | j                   j                  s!t        j                  | d       t	        d      S | j
                  j                  d      }| j
                  j                  d      }|dk(  r!t        j                  j                  |      }n-t        |d      }t        j                  j                  |	      }|D cg c]  }t        |       }}t        |d
       }g }|D ]+  }|j                  t        |j                  d                   - dj                  |      }t        j                  j                  |      j!                         }	|	rt        |	      gng }
|	r|	j"                  nd}t%        | d||||d      S c c}w )Nr'  r(  rc  r.  r'   r;   Tr  r  c                     | d   dk(  S r  r}   r  s    r/   r  z1update_selectbox_company_mobile.<locals>.<lambda>  s    AlO_bLb r9   r  r<   r&   r%   zselectbox_company_mobile.html)r   r8  r.  r#  )r  r)  r	   r3  r   rw  r   rD   rE   rF   rX   r   r   r*  r^   r3   rG   r<   r   )r  rc  r.  companies_querysetr  r>   r   r7  r8  r=  r>  r#  s               r/   update_selectbox_company_mobiler  w  sz   <<(("<=++//-0K++//-0K c-55<<<T2;TR-55<<K<XEWX'}W5XX$%<Bbc O* X;GKK<UVWX ?Bhh>W;'//66+6NTTVIY]3C%D$E_a!N^/?/J/Jdf,':#:Cz"4\	=   Ys   F
c                 <   | j                   j                  s!t        j                  | d       t	        d      S | j
                  j                  d      }t        |      }t        j                  j                  |      j                  d      }|D cg c]  }t        |       }}t        j                  j                  d      j                         }|r,t        d |D              s|j                  t        |             |sddd	d
g}t!        | dd|i      S c c}w )Nr'  r(  r.  r  r  r'   r`   c              3   V   K   | ]!  }t        |j                  d             dk(   # ywr  r  r  s     r/   r   z2update_selectbox_project_mobile.<locals>.<genexpr>  s#     cAAEE,$7 8C ?cr  z0To add a project please save new company first !r  zselectbox_projects_mobile.htmlr  )r  r)  r	   r3  r   rw  r   r^   rd   rE   rF   r   r   rG   r.  r2   r   )r  r.  company_projects_idsprojects_querysetrc   r  rD  s          r/   update_selectbox_project_mobiler    s   <<(("<=++//-0K 8D'//66FZ6[dd  fG  HGX YGw!7 Y Y #**11S1AGGILCcIbcc!((|)DE$.1$V&
 %! ';#%>>   !Zs   Dc           	      d   | j                   j                  d      }| j                   j                  d      }t        |      }t        j                  j                  |      }i }|D ]q  }|j                  r|j                  nd}||vrg ||<   ||   j                  |j                  |j                  |j                  |j                  |j                  d       s t        |      }t        j                  j                  |      j                  dd	      j!                         }	t"        j                  j                  |
      j                  dd	      j!                         }
t"        j                  j                  |
      j                  dd	      j!                         }t%        ||	|
|d      S )Nr.  ry  )id_address__inAutre)rg   r  rt  ru  rv  r;   r  TrB   r   r$  r  )all_company_addressescurrent_company_addresscurrent_billing_addresscurrent_delivery_address)rw  r   rj   r   rE   rF   r  r2   r   r  rt  ru  rv  r+  rD   rJ   rG   r   r   )r  r.  ry  address_ids_listaddresses_querysetgrouped_addressesr   r  r  r  r  r  s               r/   update_selectbox_address_mobiler    s   ++//-0K(;< 4K@)1188HX8Y% /6/C/Cw++00.0l+,'..!,,$22%,%B%B#*#>#>#000
 	 !!23.66===Uaa  cD  KOa  P  V  V  X4<<CCWhCiuu  w[  bfu  g  m  m  o5==DDXiDjvv  x]  dhv   i   o   o   q!6$;$;%=	  r9   c                     | j                   j                  d      }	 t        j                  j                  |      }t	        d|j
                  xs di      S # t        j                  $ r t	        ddi      cY S w xY w)Nry  r   r&  r%   )rw  r   r   rE   r   r&  r*  )r  ry  documents      r/   get_sales_documents_ref_contactr    s    (;<D)1155IZ5[,h.U.U.[Y[
  	 ".. D=rBCCDs   :A  A;:A;c                    | j                   dk(  r{| j                  j                  d      }| j                  j                  d      }	 t        j                  j                  |      }||_        |j                          t        ddi      S t        ddd	d      S # t        j                  $ r t        ddd	d
      cY S w xY w)Nr  ry  r@   r   r3  TFu   Document non trouvér3  r  r#  r!  u   Requête invalider   )	r  r  r   r   rE   r&  r   r   r*  )r  ry  r@   r  s       r/    save_sales_documents_ref_contactr    s    ~~#LL,,-@A\\%%l3
	a(0044HY4ZC1;C.HHJD 122 E4GHQTUU &22 	aE<R S\_``	as   AB #C Cc                 x   | j                   j                  s!t        j                  | d       t	        d      S d }|dk(  r|}nB|dk(  rmt
        j                  j                  |      j                  d      j                  d      j                  d      j                         }|r|j                  }n|d	k(  rt        j                  j                  |
      j                  d      j                         }|rt
        j                  j                  |j                        j                  d      j                  d      j                  d      j                         }|r"|j                  }n|dk(  rt        j                  j                  |      j                         }|r'|j                   r|j                   dk7  r|j                   }|s|rt"        j                  j                  |      j                  d      j                         }|rtt
        j                  j                  |j                        j                  d      j                  d      j                  d      j                         }|r|j                  }|rt	        d| d| d|       S t        j                  | d       t	        d      S )Nr'  r(  rR   r>   rS   r'   r?   z(-contact__contact_last_modification_daterc   rZ   r=   rr   r>  rq   z/update_record/z?focus_type=z
&focus_id=u   Aucun contact associé trouvé.)r  r)  r	   r3  r   rH   rE   rF   rI   r   r   rG   r@   r]   r>   r  r  rs   )r  object_type	object_idr@   rS  company_projectrr   company_contacts           r/   "open_update_record_from_any_objectr    sC   <<(("<=Ji
			!#++VyV)WW$^I&X@AUW 	 !,,J			!#++VyV)^I&UW	 	 '// 7 78C(	*DE  %00

 
	%)1188	8RXXZ;==+BdBdhkBk$;;Jk,44K0	*	  +33VH$4$4V5WW,#^I.XHIUW   #!0!;!;J/*\+jYbXcdeeW?@Fr9   c                     t        | d      S )Nr  r   rY  s    r/   r  r  Q      ';''r9   c                     t        | d      S )Nr  r  rY  s    r/   gridr  T  r  r9   c                 F   | j                   j                  r~| j                  j                  d      }t        j
                  j                  |      j                  dd      j                         }|rt        d|d   |d   d      S t        ddd	      S t        dd
d	      S )Nr   r   r  r  T)r3  r  r  Fu   Produit non trouvér  u   Utilisateur non authentifié)
r  r)  rw  r   r   rE   rF   r4   rG   r   )r  r   product_infos      r/   !get_sales_documents_product_pricer  W  s    ||$$[[__\2
&..555LSS 
 %' 	
 &23G&H+M:!    E<Q RSS8VWXXr9   c                    | j                   j                  rb| j                  j                  d      }t        j
                  j                  |      j                  d      }g }|D ]  }t        |      }	 t        j
                  j                  |j                        }|j                   d|j                   }	 t        j
                  j                  |j                        }|j                    d|j"                   }	|j$                  r9	 t&        j
                  j                  |j$                  	      }
|
j(                   }nd}||d<   |	|d<   ||d<   |j+                  |        t-        | dd|i      S t/        j0                  | d       t3        d      S # t        j                  $ r d}Y w xY w# t        j                  $ r d}	Y w xY w# t&        j                  $ r d
}Y w xY w)Nrc  )r  -interaction_full_daterF  r%  Unknown user - errorrP   Unknown contact - errorr`   error projectr%   rm  r  r  zcontact_interaction.html1all_contact_interactions_with_id_replaced_by_namer'  r(  r  r)  rw  r   r  rE   rF   r   r   r   rm  r  r  r*  rU   r  rz  ry  r  rd   r  r2   r   r	   r3  r   )r  rc  all_contact_interactions_queryr  rr   interaction_dictr  user_full_namerR   contact_full_namerc   project_full_names               r/   update_contact_interactionr  n  s   ||$$kkoom4 *=)D)D)K)Kcn)K)o)x)x  zR  *S&<>99 	WK,[98||'';+G+G'H$(OO#4Adnn5E!F>)1155AcAc5d'.'A'A&B!GD]D]C^$_!
 118-5599[EgEg9hG+2+G+G*H% %'! 4B/09J569J56=DDEUV?	WB g9<o  qb  <c  d  	d"<=; $$ 8!78 #// >$=!> '33 8(7%88   6AF<AF67GF32F36GGG)(G)c                    | j                   j                  r| j                  j                  d      }t        j
                  j                  |      j                         }g }|r:t        t        j
                  j                  |      j                  dd            }t        j
                  j                  |      j                  dd	      }g }|D ]  }t        |      }	 t        j
                  j                  |j                  
      }|j                    d|j"                   }		 t&        j
                  j                  |j(                        }
|
j*                   d|
j,                   }|j.                  r9	 t0        j
                  j                  |j.                        }|j2                   }nd}|	|d<   ||d<   ||d<   |j5                  |        t7        | dd|i      S t9        j:                  | d       t=        d      S # t        j$                  $ r d}	Y w xY w# t&        j$                  $ r d}Y w xY w# t0        j$                  $ r d}Y w xY w)Nr.  r;   r=   r  TrB   r  r  z-id_interactionrF  r%  r  rP   r  r`   r  r%   rm  r  r  zcompany_interaction.html1all_company_interactions_with_id_replaced_by_namer'  r(  )r  r)  rw  r   rD   rE   rF   rG   rV   rs   rJ   r  r   r   r   rm  r  r  r*  rU   r  rz  ry  r  rd   r  r2   r   r	   r3  r   )r  r.  r>   relation_idsall_company_interactions_queryr  rr   r  r  r  rR   r  rc   r   s                 r/   update_company_interactionr    sh   ||$$kkoom4 #**11[1IOOQ < D D K K !L !k7dkCEL *=)D)D)K)K+ *L *

(+->
? 	' =?99 	WK,[98||'';+G+G'H$(OO#4Adnn5E!F>)1155AcAc5d'.'A'A&B!GD]D]C^$_! 118-5599[EgEg9hG+2+G+G*H% %'!3A/09J569J56=DDEUV9	W< g9<o  qb  <c  d  	d"<=7 $$ 8!78 #// >$=!> '33 8(7%8s8   #AH)AH#;7H>H H #H;:H;>IIc                    | j                   j                  rb| j                  j                  d      }t        j
                  j                  |      j                  d      }g }|D ]  }t        |      }	 t        j
                  j                  |j                        }|j                   d|j                   }	 t        j
                  j                  |j                        }|j                    d|j"                   }	|j$                  r9	 t&        j
                  j                  |j$                  	      }
|
j(                   }nd}||d<   |	|d<   ||d<   |j+                  |        t-        | dd|i      S t/        j0                  | d       t3        d      S # t        j                  $ r d}Y w xY w# t        j                  $ r d}	Y w xY w# t&        j                  $ r d
}Y w xY w)Nr  )r  r  rF  r%  r  rP   r  r`   r  r%   rm  r  r  zproject_interaction.html1all_project_interactions_with_id_replaced_by_namer'  r(  r  )r  r  all_project_interactions_queryr	  rr   r  r  r  rR   r  rc   r   s               r/   update_project_interactionr    s   ||$$kkoom4 *=)D)D)K)Kcn)K)o)x)x  zR  *S&<>99 	WK,[98||'';+G+G'H$(OO#4Adnn5E!F>)1155AcAc5d'.'A'A&B!GD]D]C^$_!
 118-5599[EgEg9hG+2+G+G*H% %'! 4B/09J569J56=DDEUV?	WD g9<o  qb  <c  d  	d"<== $$ 8!78 #// >$=!> '33 8(7%8r  c                 *   | j                   j                  d      }|st        di i      S t        |d      }t        j
                  j                  |      j                  d      }i }|D ]  }t        |j                        }t        j
                  j                  |      j                  d	      }|D ]M  }|j                  |j                  g       j                  t        |j                        |j                   d
       O  t        d|i      S )Nr@   grouped_projectsFr  r  r'   r;   r  r`   )valeurprojet8list_selectbox_interaction_project_grouped_json_formated)rw  r   r   rX   rD   rE   rF   rI   r^   r<   rd   rP  r}  r2   r+   ra   r  )	r  r@   r  rQ  r  r>   r  projectsrc   s	            r/   $update_selectbox_interaction_projectr    s   .J/455 /zNK ((//{/KSS_bScI?A< 273E3EF"**111MUUadUe 	GDOOPWPdPdfhippg001!66r 		 S  VN  O  P  Pr9   )F)T)r   r|   )django.shortcutsr   r   r   django.contrib.authr   r   r   django.contribr	   formsmodels	django.dbr   r   django.views.decorators.cacher   django.corer   django.httpr   django.template.loaderr   django.forms.modelsr   django_user_agents.utilsr   django.confr   django.db.modelsr   r   r   r   django.core.mailr   r   django.contrib.auth.modelsr   urllib.parser   r   openpyxlr   r   openpyxl.stylesopenpyxl.drawing.imager    $openpyxl.drawing.spreadsheet_drawingr!   r"   rer  r  operator	functoolsr#   r  r  r0   r8   rL   rX   r^   re   rj   ro   rt   rz   r~   rx   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r  r  r  rK  r  r  r  r  r  r  r  r  r  r(  r  r  r  r  r  r  r"  r1  r5  rT  r[  ra  rf  rw  r  r  r  r  r  r  r  r  r  r  r!  r7  r<  r@  r[  r`  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r}   r9   r/   <module>r+     s   A A ; ; #   - 5 # $ 3 - 3       ) $ + ! $ -  ( L 	  	    ! y
F & =  G(H*I*
O*
O
b0d73v,
\
4 D
\4D;L,6) v p^"D|"|@D(VD%R(FT
;$   ")DXy x3Kl5Kp U  U p & (  <JB (*)Z'R]@\@FWv]F!_L;6	nN`P@yv;,=E~6Rr*QXXFt,Q\77v"J"J>$N	DV*L^((Y.- ^3 l. `Pr9   