
    ]Ehl                         d dl mZmZmZmZmZmZmZ d dlm	Z	 d dl
mZ d dlmZ d dlmZmZmZ d dlmZ d dlmZ d dlZd dlZd dlZd dlZ G d	 d
      Zy)    )MovementModelMovementProductModelProductModelBranchOfficeModelSupplierModelProductCategoryModelKardexValueModel)ProductClass)KardexValueClass)Session)descfuncor_)WhatsappClass)datetimeNc                   J    e Zd ZdefdZddZd Zd Zd Zd Z	d	 Z
d
 Zd Zy)MovementClassdbc                     || _         y )N)r   )selfr   s     N/var/www/intrajisbackend.com/public_html/app/backend/classes/movement_class.py__init__zMovementClass.__init__   s	        Nc                 l   	 g }|r"|j                  t        j                  |k(         |"|j                  t        j                  |k(          | j                  j                  t        j                  t        j                  t        j                  t        j                  t        j                  t        j                  d      j                  d      t        j                  j                  d            j                  t        t        j                  t        j                  k(        j                  | j!                  t        j                  j#                               }|dkD  r|j%                         }||z   dz
  |z  }|dk  s||kD  rddd	S |j'                  |dz
  |z        j)                  |      j+                         }	|	sdd
d	S |	D 
cg c]G  }
|
j                  |
j                  |
j                  |
j,                  |
j                  |
j                  dI }}
d||||dS |j+                         }	|	D 
cg c]G  }
|
j                  |
j                  |
j                  |
j,                  |
j                  |
j                  dI }}
|S c c}
w c c}
w # t.        $ r}ddt1        |       d	cY d}~S d}~ww xY w)uT   
        Obtiene todos los movimientos con paginación y filtros opcionales
        N%d-%m-%Y %H:%i:%s
added_datebranch_office_namer      errorzInvalid page numberstatusmessagezNo data found)idtype_idbranch_office_idr   	status_idr   success)r!   datatotal_itemstotal_pagescurrent_pagezError retrieving movements: )appendr   r$   r%   r   queryr#   r&   r   date_formatr   labelr   branch_office	outerjoinfilterorder_byr   countoffsetlimitallr   	Exceptionstr)r   pageitems_per_pager$   r%   filtersr-   r)   r*   r(   movementserialized_dataes                r   get_allzMovementClass.get_all   s   C	[G}44?@+}==AQQR	DGGMM  %%..''  !9!9;NOUUVbc!//556JK i!#4#7#7=;Y;Y#Yf h  %%'  ax#kkm*^;a?NR!8tk1&-:OPP||TAX$?@FF~VZZ\&-/JJ #'#(  #++'//(0(A(A*2*E*E!)!3!3"*"5"5$ #( #( (+#.#.$(  yy{ #'#(  #++'//(0(A(A*2*E*E!)!3!3"*"5"5$ #( #( '&9#(&#(  	[%4PQTUVQWPX2YZZ	[sP   F	J :J J AJ	J !J 5AJ
J 
J 	J3J.(J3.J3c                    	 | j                   j                  t        j                  t        j                  t        j
                  t        j                  t        j                  t        j                  t        j                  t        j                  t        j                  t        j                  d      j                  d      t        j                  t        j                  d      j                  d      t         j"                  j                  d      t$        j&                  j                  d            j)                  t         t         j                  t        j                  k(        j)                  t$        t$        j                  t        j                  k(        j+                  t        j,                  |k(        j/                         }|sdddS | j                   j                  t0        j2                  t0        j4                  t0        j6                  t0        j8                  t:        j<                  j                  d	      t:        j
                  j                  d
      t:        j>                  j                  d            jA                  t:        t:        j4                  t0        j4                  k(        j+                  t0        j,                  |k(        jC                         }|j,                  |jD                  |j
                  |j                  |j                  |jF                  |j                  |jH                  |j                  |j                  |j                  |j                  |D cg c]j  }|j2                  |j4                  |jJ                  |jL                  |jN                  |j6                  |j8                  |j6                  |j8                  z  dl c}d}d|dS c c}w # tP        $ r}ddtS        |       dcY d}~S d}~ww xY w)uE   
        Obtiene un movimiento específico con sus productos
        r   movement_dater   r   supplier_namer   Movement not foundr    product_nameproduct_descriptionproduct_barcode)movement_product_id
product_idrE   rF   rG   costqtysubtotal)movement_idmovement_typedescriptiontotal_amountr%   r   supplier_idrC   user_rutr&   rB   r   productsr'   r!   r(   zError retrieving movement: N)*r   r-   r   r#   r$   rO   rP   r%   rQ   rR   r&   r   r.   rB   r/   r   r   r0   r   supplierr1   r2   rM   firstr   rH   rI   rJ   rK   r   namebarcodejoinr7   rN   r   rC   rE   rF   rG   r8   r9   )r   rM   movement_queryproducts_queryproductmovement_datar?   s          r   getzMovementClass.getZ   s   E	Z!WW]]  %%))**..))&&''  !<!<>QRXXYhi  !9!9;NOUUVbc!//556JK&&,,_= i!#4#7#7=;Y;Y#Yi}//=3L3LLf))[8eg' * "")6JKK "WW]]$88$//$))$((!!''7((../DE$$**+<= dl559M9X9XXf$00K?ce   .99!/!=!=-99 . ; ;$2$C$C&4&G&G-99!/!=!=*33+55!/!=!=,77 "0	1  ,3+F+F")"4"4$+$8$8+2+F+F'.'>'>#LL";; 'w{{ :	 	1M2 (??	1  	Z%4OPSTUPVx2XYY	Zs8   GO& FO& (A/O!	O& !O& &	P
/P?P
P
c           
         	 t        |j                  |j                  dt        j                         t        j                               }| j
                  j                  |       | j
                  j                          | j
                  j                  |       t        | j
                        }t        | j
                        }|j                  D ]  }|j                  dv r$t        |j                         }|j                   }n!t        |j                        }|j                  }t        |j                  |j                   ||j"                  t        j                         t        j                               }| j
                  j                  |       |j                  dv r(|j%                  |j                  |j                  d      }	ny|j                  dv rk|j%                  |j                  |j                  d      }	|	rBt'        |	t(              r2|	j+                  d      d	k(  r| j
                  j-                          |	c S |j/                  |j                  ||j"                  
      }
|
rBt'        |
t(              r2|
j+                  d      d	k(  r| j
                  j-                          |
c S |j                  dk(  s	 |j0                  dk(  r0t3        | j
                        }|j5                  |j                          | j
                  j7                  t8              j;                  t8        j                   |j                  k(        j=                         }| j
                  j7                  t>              j;                  t>        j                   |j                  k(        j=                         }| j
                  j7                  t@              j;                  t@        j                   |jB                  k(        j=                         }|r|jD                  rtG        |jD                        jI                         }| j
                  j7                  tJ              j;                  tJ        j                  |j                  k(        j=                         }|r|j"                  n|j"                  }t        jL                         }d}|jN                  d}tG        |jP                        }| d| d| }|jR                   d| d| d|j                    d|j                    	}d}d}d}tU        ||j                  z        }| d| d| |||id|idddd|j                   dgid}dd| d}tW        jX                  | d| ||d !      }|jZ                  d"k7  rt]        d#|j^                           | j
                  j                          d&d'|j                   d(S # t`        $ r"}t]        d$tG        |              Y d%}~0d%}~ww xY w# t`        $ r5}| j
                  j-                          d	d)tG        |       d*cY d%}~S d%}~ww xY w)+z9
        Crear un nuevo movimiento con productos
           )r$   r%   r&   r   updated_date      rI   rM   rK   rJ   r   ra   r      addsubtractr!   r   rI   
qty_changenew_costrc   r   0102d-__SalidaInventario_https://libredte.cl JXou3uyrc7sNnP2ewOCX38tWZ6BTm4D1z
76063822-6	111000102debehaberIemitidos dtefoliofechaglosadetalle	operacion
documentosapplication/jsonBearer )Content-TypeAuthorizationz/lce/lce_asientos/crear/   )jsonheaderstimeout   z!Error al crear asiento contable: u(   Error en creación de asiento contable: Nr'   zMovement created successfully)r!   r"   rM   zError creating movement: r    )1r   r$   r%   r   utcnowr   rh   commitrefreshr
   r   rS   absquantityr   rI   r#   rJ   update_stock
isinstancedictr^   rollbackstore_kardex_entryalert_idr   	movementsr-   r   r2   rV   r   r   product_category_idaccounting_accountr9   stripr	   nowmonthyearr0   roundrequestspoststatus_codeprinttextr8   ) r   	form_datanew_movementproduct_classkardex_classproduct_dataqty_to_saveqty_for_kardexmovement_productstock_resultkardex_resultwhatsapp_classr\   r0   product_categoryr   kardex_valuecost_to_user   dayr   r   	utf8_dater"   url
hash_valueemisoramountdatosr   responser?   s                                    r   storezMovementClass.store   s   R	X(!))!*!;!;#??,%__.L GGKK%GGNNGGOOL) )1M+DGG4L ) 2 2 vS $$.#&|'<'<#="=K&2&;&;%;N"%l&;&;"<K%1%:%:N $8+66 ,#%**'0!)!2$  ,- $$.#0#=#=l>U>UWcWlWlns#tL&&&0#0#=#=l>U>UWcWlWlnx#yL#
<(F<K[K[\dKeipKp((*++ !- ? ?+66-).. !@ ! !Zt%DIZIZ[cIdhoIoGG$$&(( $$)FS$--2-:477-CN*44\__E #'''--"="D"D\__XdXoXoEo"p"v"v"x(,6G(H(O(OPaPdPdhq  iC  iC  QC  )D  )J  )J  )L+/77==9M+N+U+UVjVmVmqx  rM  rM  WM  ,N  ,T  ,T  ,V(+0@0S0S145E5X5X1Y1_1_1a. ,077==9I+J+Q+QRbRmRmq}  rI  rI  SI  ,J  ,P  ,P  ,RL?K,*;*;Q]QbQbK #+,,.C"&C'*yyoE#&sxx=D+.%qq(?I *7)D)D(EQGYFZZ[\e[ffx  zF  zI  zI  yJ  JK  L\  L_  L_  K`  'aG"7C)KJ%1F%*;9N9N+N%OF -165'3%)@)0 );F-& )4V.&	," .1$.loo1V0W/"%E& 1C3::,1G'G
 (0}}#&%'?x H%*(/(*	(H  (33s: %(I(--&Y ZevSr GGNN'4Sdpdsdstt % S HQQRRS  	XGG%4McRSfX2VWW	XsV   IX A+X 0X K+W-,X 	X#X :X  XX 	Y*Y;YYc                 \   	 | j                   j                  t              j                  t        j                  |k(        j                         }|sdddS |j                  |j                  |_        |j                  |j                  |_        |j                  |j                  |_        |j                  |j                  |_	        |j                  |j                  |_
        |j                  |j                  |_        |j                  %t        j                  |j                  d      |_        t        j                         |_        | j                   j#                          dddS # t$        $ r5}| j                   j'                          ddt)        |       dcY d}~S d}~ww xY w)	z4
        Actualizar un movimiento existente
        r   rD   r    Nz%Y-%m-%d %H:%M:%Sr'   zMovement updated successfullyzError updating movement: )r   r-   r   r2   rM   rV   rN   rO   r%   rQ   rR   r&   rB   r   strptimer   
updated_atr   r8   r   r9   )r   rM   r   r=   r?   s        r   updatezMovementClass.update=  sw    	Xww}}]3::))[8eg  ")6JKK &&2)2)@)@&$$0'0'<'<$))5,5,F,F)$$0'0'<'<$!!-$-$6$6!"".%.%8%8"&&2)1):):9;R;RTg)h&"*//"3HGGNN'4STT 	XGG%4McRSfX2VWW	Xs%   AE- DE- -	F+6*F& F+&F+c                 Z   	 | j                   j                  t              j                  t        j                  |k(        j                         }|sdddS | j                   j                  t              j                  t        j                  |k(        j                         }t        | j                         }|D ]p  }|j                  dk(  r(|j                  |j                  |j                  d       :|j                  dk(  sJ|j                  |j                  |j                  d       r d|_        t        j                         |_        | j                   j#                          d	d
dS # t$        $ r5}| j                   j'                          ddt)        |       dcY d}~S d}~ww xY w)z\
        Eliminar un movimiento (cambiar status_id a 0) y revertir cambios de stock
        r   rD   r    INri   OUTrh   r   r'   z0Movement deleted successfully and stock revertedzError deleting movement: N)r   r-   r   r2   rM   rV   r   r7   r
   rN   r   rI   rK   r&   r   r   r   r   r8   r   r9   )r   rM   r=   movement_productsr   r   r?   s          r   deletezMovementClass.deletec  su   "	Xww}}]3::))[8eg  ")6JKK !%.B C J J$00K?!ce  )1M %6 i ))T1!../?/J/JL\L`L`blm++u4!../?/J/JL\L`L`bghi "#H"*//"3HGGNN'4fgg 	XGG%4McRSfX2VWW	Xs,   AE, B-E, A'E, ,	F*5*F%F*%F*c                    	 | j                   j                  t        j                  t        j                  t        j
                  t        j                  t        j                  j                  d      t        j                  j                  d      t        j                  j                  d      t        j                  j                  d            j                  t        t        j                  t        j                  k(        j                  t        j                  |k(        j!                         }|sdddS |D cg c]u  }|j                  |j                  |j"                  |j$                  |j&                  |j
                  |j                  |j
                  |j                  z  |j(                  d	w }}d	|d
S c c}w # t*        $ r}ddt-        |       dcY d}~S d}~ww xY w)uD   
        Obtiene los productos de un movimiento específico
        rE   rF   rG   current_stockr   #No products found for this movementr    )	rH   rI   rE   rF   rG   rJ   rK   rL   r   r'   rT   z$Error retrieving movement products: N)r   r-   r   rH   rI   rJ   rK   r   rW   r/   rO   rX   stockrY   r2   rM   r7   rE   rF   rG   r   r8   r9   )r   rM   r[   r\   products_datar?   s         r   get_movement_productsz#MovementClass.get_movement_products  s   "	c!WW]]$88$//$))$((!!''7((../DE$$**+<=""((9	 dl559M9X9XXf$00K?ce  "")6[\\ ,
-  (/'B'B%00 ' 4 4'.'B'B#*#:#:{{#LL7;;6!(!6!6
 
-M 
- (??
-  	c%4XY\]^Y_X`2abb	cs7   D5G 8G <A:F=6G =G 	G&G!G&!G&c                    	 |j                   j                  d      sdddS |j                  j                         }t	        j
                  t        j                  |            }g d}|D cg c]  }||j                  vs| }}|rdddj                  |       dS t        |      }d}	g }
|j                         D ]  \  }}	 |d	   }t        |d
         j                         }t        |d         }t        |d         }t        |d         j                         }| j                  j!                  t"              j%                  t"        j&                  |k(        j)                         }|s|
j+                  d|dz    d| d       | j                  j!                  t,              j%                  t,        j&                  |k(        j)                         }|s|
j+                  d|dz    d| d       8|dvr|
j+                  d|dz    d| d       Y|dk  r|
j+                  d|dz    d       xt/        ||j&                  ddt1        j2                         t1        j2                               }| j                  j5                  |       | j                  j7                          |dv rt9        |       }| }nt9        |      }|}t;        |j&                  |j&                  |dt1        j2                         t1        j2                               }| j                  j5                  |       t=        | j                        }|dv r|j?                  |j&                  |d      }nn|j?                  |j&                  |d      }|rOtA        |tB              r?|jE                  d      dk(  r+|
j+                  d|dz    d|jE                  d               tG        | j                        }|jI                  |j&                  |d!      }|rOtA        |tB              r?|jE                  d      dk(  r+|
j+                  d|dz    d"|jE                  d               |dk(  r:	 | j                  j!                  tJ              j%                  tJ        j&                  |jL                  k(        j)                         }|r|jN                  rd#}d$}d%}| j                  j!                  tP              j%                  tP        jR                  |j&                  k(        j)                         }|r|jT                  r|jT                  nd&} 	 |jW                  d'      \  }!}"t        |!      }#t        |"      }$t1        jX                         jZ                  }%|%d(kD  r|$d)z  }$|$d*kD  rd)}$|#d)z  }#|# d'|$d+d,}&d-|$d+d'|# }'t        |jN                        j                         }(|j\                   d.|( d.|' d/|j&                   d.|j&                   	})t_        | |z        }*|&|)|(|*id0|*id1d2d3d4t        |j&                        d5gid6}+| d7| },ta        jb                  |,|+d8| d9d:;      }-|-jd                  d<k(  rd=|_3        n%ti        d>|j&                   d|-jj                          |	d)z  }	 |	dkD  r| j                  jo                          n| j                  jq                          |	dkD  rdDnddE|	 dF| dG||	t        |
      |
r|
dAdH ng dIdJS c c}w # tl        $ r1}.ti        d?| d@|j&                   dt        |.              Y dA}.~.dA}.~.ww xY w# tl        $ r.}/ti        dB|j&                   dt        |/              Y dA}/~/dA}/~/ww xY w# tl        $ r.}0|
j+                  d|dz    dCt        |0              Y dA}0~0dA}0~0ww xY w# tl        $ r5}0| j                  jq                          ddKt        |0       dcY dA}0~0S dA}0~0ww xY w)Lz
        Carga masiva de movimientos desde archivo Excel
        Columnas esperadas: sucursal, codigo, tipo de movimiento, cantidad, periodo
        )z.xlsxz.xlsr   z*File must be an Excel file (.xlsx or .xls)r    )sucursalcodigotipo de movimientocantidadperiodozMissing required columns: z, r   r   r   r   r   r   zRow rc   z: Branch office 'z' not foundz: Product with code ')r   rc   rg   rd   z: Invalid movement type 'z'. Must be 1, 2, 3, or 4z!: Quantity must be greater than 0r`   )r$   r%   r&   document_numberr   ra   rb   re   rf   rh   ri   r!   : r"   rj   z: Kardex error - rs   rr   76063822d   ro      r      rn   -0101-rp   _SalidaInventario_Masiva_rt   ru   rx   ry   rz   r{   r~   /api/lce/lce_asientos/crear/r   r   r   r   r   r   r      z8Warning: Failed to create accounting entry for movement Error processing period z for movement Nz-Error creating accounting entry for movement z: Error processing row - r'   z
Processed z of z rows
   )
total_rowsprocessed_rows
error_rowserrors)r!   r"   detailszError processing Excel file: )9filenameendswithfilereadpd
read_excelioBytesIOcolumnsrY   leniterrowsr9   r   intr   r-   r   r2   r#   rV   r,   r   r   r   r   rh   flushr   r   r
   r   r   r   r^   r   r   r   r   r   r	   rI   rJ   splitr   r   r0   r   r   r   r   r&   r   r   r8   r   r   )1r   r   rR   contentsdfrequired_columnscolmissing_columnsr   r   r   indexrowr0   product_coderN   r   periodr\   r   r   r   r   r   r   r   r   categoryTOKENurl_baser   r   r   year_str	month_strr   r   current_dayfecha_libredtefecha_mensajer   r"   rP   r   
url_creater   
date_errorimpute_errorr?   s1                                                    r   massive_uploadzMovementClass.massive_upload  s   
n	\==))*;<")6bcc yy~~'Hrzz(34B  c.>Xs#RZZBWsXOX")8RSWS\S\]lSmRn6opp RJNJ !kkm C
sB$'
OM#&s8}#5#;#;#=L$',@(A$BM"3z?3H Y0668F %)GGMM2C$D$K$K),,=%eg " )"))D;L]O[f*gh  #ggmmL9@@$<7eg  #"))D;PQ]P^^i*jk  %L8"))D;TUbTcc{*|}   1}"))D;\*]^  $1 -)6)9)9"$()#+??#4%-__%6$L GGKK-GGMMO %.'*8}n*2&)(m)1 (<#*::$0OO'#+??#4%-__%6($ GGKK 01 %1$9M$.'4'A'A'**hX]'^'4'A'A'**hXb'c'J|T,J|O_O_`hOimtOt&--UQYKr,BRBRS\B]A^._`$ $4DGG#<L$0$C$C#*::#1!" %D %M %M4)H]M^M^_gMhlsMs"))D;L]M^M^_hMiLj*kl  %)^z'+ww}}5I'J'Q'Q 4 7 77;V;V V(#eg %  (H,G,G(J+@)3 04ww}}=M/N/U/U$4$?$?7::$M0""'%' !-
 DPT`TeTel.?.?knF!A:@,,s:K$7Hi+.x=D,/	NE 3;,,.2D2DK (3R'7(-
+02:45E,0AID 9=vQuSk5MN 7:%AdV4LM :=X=X=X9Y9_9_9a$61>1L1L0MQOaNbbcdqcr  sL  MY  M\  M\  L]  ]^  _o  _r  _r  ^s  /tG 49x9O3PL 2@18 1CL5. 1<\6.	4* 69,6;==@=Q129.7*-&E. 5=:=YZ`Ya1bJ/7}}(2-2?Fug=N<N1*0&H (0';';s'BAC(>(-0hiuixixhyy{  }E  }J  }J  |K  /L  )M #a'NCL !   " (6'9)w''7tJ<uM",&4"%j/1;j"o		 	m YF (1 !A$),DVHN[g[j[jZkkmnqr|n}m~*  %A  %A!A  ) z!$QR^RaRaQbbdehiuevdw"xyyz ! %%UQYK7PQTUVQWPX&YZ*  	\GG%4QRUVWRXQY2Z[[	\s  ^9 A
^9 ,\ \^9 &^9 C]?	^9 
A*]?4^9 6]?^9 ]?4^9 6F]?^9 B]?^9 ]?C ] E\]?A%^9 ^9 	]'\=8]=]]	]<$]72]?7]<<]??	^6#^1+^9 1^66^9 9	_7*_2,_72_7c           
      F
   	 | j                   j                  t              j                  t        j                  |k(        j                         }|sdddS d|_        t        j                         |_	        | j                   j                  t              j                  t        j                  |k(        j                         }|sdddS d}d}d}|D ]  }	 | j                   j                  t        j                  j                  d	            j!                  t"        t"        j                  t        j$                  k(        j                  t"        j                  |j$                  k(        j                         }	|	j&                  rt)        |	j&                        nd
}
| j                   j                  t"              j                  t"        j                  |j$                  k(        j                         }|s&| j                   j                  t*              j                  t*        j                  |j,                  k(        j                         }|r|j.                  s| j                   j                  t0              j                  t0        j                  |j2                  k(        j                         }|r|j4                  nd}|j.                  j7                         }	 |j9                  d      \  }}t;        |      }t;        |      }t        j                         j<                  }|dkD  r|dz  }|dkD  rd}|dz  }|d}| d| d}d| d| }| d| d| d|j                   d|j                   	}tC        |jD                        }t)        |
|z        }||tA        |      |id|idddd|jF                  rtA        |jF                        nddgid}| d| }tI        jJ                  ||d | d!d"#      }tM        d$|j                   d|jN                          |jP                  d%k7  r'tM        d&|j                   d|jN                           | j                   jS                          d(d)dS # t>        $ r }dd| dtA        |       dcY d}~c S d}~ww xY w# t>        $ r/}tM        d'|j                   dtA        |              Y d}~d}~ww xY w# t>        $ r5}| j                   jU                          dd*tA        |       dcY d}~S d}~ww xY w)+z
        Imputa un movimiento creando asientos contables en LibreDTE
        Actualiza el status_id del movimiento y crea asientos contables para cada producto
        r   rD   r    r   r   rs   rr   r   pmpr   Unknownro   r   r   r   rn   r   r   r   r   Nrp   rq   rt   ru   rx   ry   rz   r{   r~   r   r   r   r   r   zLibreDTE Response for product r   z7Warning: Failed to create accounting entry for product zError processing product r'   z:Movement imputed successfully. Accounting entries created.zError imputing movement: )+r   r-   r   r2   r#   rV   r&   r   r   ra   r   rM   r7   r	   rJ   r/   rY   r   rI   r	  r   r   r   r   r   r%   r0   r   r   r   r   r8   r9   r   rK   r   r   r   r   r   r   r   r   ) r   rM   r   r=   r   r   r   r   r   
pmp_resultr	  r\   r   r0   r   r   r   r   r   r   r  r  r  r  r"   rK   rP   r   r  r   product_errorr?   s                                    r   imputezMovementClass.impute  s.   
Z	Xww}}]3::=;K;K{;Z[aacH")6JKK "$H$,LLNH! !%.B C J J$00K?!ce  %")6[\\ 7E,HF %6 v u!%(--33E:"d$loo9I9T9T&Tf$+;+F+FFeg  4>>>%
/qC #ggmmL9@@$+;+F+FFeg  # #ww}}-ABII,//73N3NN eg  $8+F+F  %)GGMM2C$D$K$K),,0I0II%eg " IV)D)D[d&)1)D)D)J)J)L&v.4ll3.?+)"8} #I '/lln&8&8 '+!QJE$rz() $	 (-Sk	 -169+S)A +.i[$(@ "4 4A6H5I=/Ykltlwlwkxxy  {K  {N  {N  zO  PG .223C#(s#3L "0!( !$$6 7% !,\&	$ &)&+-NVNfNfS1I1I-Jln!")'E. %-:-I&!RJ'}}""/6ug->,>! H :;K;N;N:OrRZR_R_Q`ab  ++s2 WXhXkXkWllnowo|o|n}~  3]vr GGNN $W { % v*1@XY_X``bcfgqcrbs>tuuvj ! 56F6I6I5J"SQ^M_L`ab  	XGG%4McRSfX2VWW	Xs   AS" A3S" 
S" DR'6S" 8A%R'S" BR'!A2Q;DR'#S" ;	R$RR$R'S" R$$R''	S0$SS" SS" "	T +*TT T )r   r   NN)__name__
__module____qualname__r   r   r@   r^   r   r   r   r   r  r   r   r   r   r      sJ    7 G[RIZVVXp$XL&XP&cPs\j_Xr   r   )app.backend.db.modelsr   r   r   r   r   r   r	   !app.backend.classes.product_classr
   &app.backend.classes.kardex_value_classr   sqlalchemy.ormr   
sqlalchemyr   r   r   "app.backend.classes.whatsapp_classr   r   r   pandasr   r   r   r   r  r   r   <module>r     sF    ^  ^  ^ : C " & & <    	 zX zXr   