
    nh                     \    d dl mZmZmZmZmZmZmZmZm	Z	 d dl
m
Z
 d dlmZ  G d d      Zy)    )	InventoryModelProductModelLotModelLotItemModelPreInventoryStockModelInventoryLotItemModelInventoryMovementModelInventoryAuditModelKardexValuesModel)datetime)funcc                   V    e Zd Zd ZddZd ZdefdZd Zd Z	defd	Z
d
 Zd Zd Zy)InventoryClassc                     || _         y )N)db)selfr   s     fC:\Users\jesus\OneDrive\Escritorio\backend-lacasadelvitrificado\app\backend\classes\inventory_class.py__init__zInventoryClass.__init__   s	        c                 Z   	 | j                   j                  t        j                  t        j
                        j                  d      t        j                  t        j                  t        j                        j                  d      t        j                  t        j                        j                  d      t        j                  t        j                        j                  d      t        j                  t        j                        j                  d      t        j                  t        j                        j                  d      t        j                  t        j                  t        j                         j                  d      t        j                  t        j"                        j                  d      t        j$                  t        j&                        j                  d	      t        j$                  t        j(                        j                  d
            j+                  t        t        j
                  t        j                  k(  d      j+                  t        t        j                  t        j
                  k(  d      j+                  t,        t,        j
                  t        j.                  k(  d      j1                  t        j                  t        j                  t,        j2                        j5                  t        j                  t        j
                              }|dkD  rS|j7                         }||z   dz
  |z  }|dk  s||kD  rdddS |j9                  |dz
  |z        j;                  |      j=                         }|sdddS |D cg c]  }|j
                  |j                  |j                  |j                   |j"                  |j                  |j>                  |j                  |j                  r|j                  jA                  d      nd |j                  r|j                  jA                  d      nd |j                  |jB                  tE        |jB                  d      nd d }}|||||dS |j=                         }|D cg c]  }|j
                  |j                  |j                  |j                   |j"                  |j                  |j>                  |j                  |j                  r|j                  jA                  d      nd |j                  r|j                  jA                  d      nd |j                  |jB                  tE        |jB                  d      nd d }}|S c c}w c c}w # tF        $ r}	dtI        |	      dcY d }	~	S d }	~	ww xY w)Nidlocation_idminimum_stockmaximum_stock
added_datelast_updatepublic_sale_priceprivate_sale_priceaverage_coststockTisouterr      errorzInvalid page numberstatusmessagezNo data foundz%Y-%m-%d %H:%M:%S   )r   
product_idr   r   r   r   r    r   r   r   productr   )total_itemstotal_pagescurrent_pageitems_per_pagedata)%r   queryr   minr   r   labelr)   r   r   r   r   r   r   r*   r   r   r   avg	unit_costquantityjoinr   lot_idgroup_by
lot_numberorder_bycountoffsetlimitallr    strftimer   round	Exceptionstr)
r   pager.   r0   r+   r,   r/   	inventoryserialized_dataes
             r   get_allzInventoryClass.get_all	   s`   O	:HH^../55d;"--HH^778>>}MHH^99:@@QHH^99:@@QHH^667==lKHH^778>>}M ((HH\;;<BBCVWHH\<<=CCDXYHH\334::>JHH\22399'B lLOO~7P7P$PZ^_lL$;$;|$NX\]h|/B/B BDQ.33\5I5I8K^K^_$((>#4#456' , ax#kkm*^;a?NR!8tk1&-:OPP||TAX$?@FF~VZZ\&-/JJ $(#)   $,,"+"6"6#,#8#8)2)D)D*3*F*F%.%<%<&__%.%<%<XaXlXl)"6"6"?"?@S"TrvZcZoZo9#8#8#A#ABU#Vuy(00HQH^H^HjE)*@*@!$Dpt$ #) #)  $/#.$(&4+  yy{ $(#)   $,,"+"6"6#,#8#8)2)D)D*3*F*F%.%<%<&__%.%<%<XaXlXl)"6"6"?"?@S"TrvZcZoZo9#8#8#A#ABU#Vuy(00HQH^H^HjE)*@*@!$Dpt$ #) #) '&S#)4#)"  	:%#a&99	:sP   MV	 :V	 V	 C U?=	V	 V	 C V;V	 ?
V	 		V*V%V*%V*c                 L   	 | j                   j                  t        j                  t        j                  t        j
                  t        j                  j                  d      t        j                  t        j                  t        j                  j                  d      t        j                  t        j                  t        j                  
      j                  t        t        j                  t        j                  k(  d      j                  t        t        j                  t        j                  k(  d      j!                  t        j                        j#                  t        j                  |k(        j%                         }|ru|j                  |j&                  |j                  |j
                  |j(                  |j                  |j                  |j                  |j                  |j                  d
}d|iS ddiS # t*        $ r}t-        |      }d|d	cY d }~S d }~ww xY w)
Nr    lot_item_idTr!   )
r   rI   r)   r   r    r   r   r   r   r4   inventory_datar$   z3No se encontraron datos para el campo especificado.r%   )r   r0   r   r   r)   r   r   r5   r2   r   r   r   r   r4   r6   r   r:   filterfirstrI   r    rA   rB   )r   r   
data_queryrJ   rF   error_messages         r   getzInventoryClass.get\   s   (	A"%%"--".. ))//8"00"00 OO))-8 22 33 ** lLOO~7P7P$PZ^_lL$;$;|$NX\].++,f^&&",-eeg! $ $--#-#9#9","7"7#-#9#9'--%/%=%=%/%=%=)3)E)E*4*G*G!+!5!5" ).99  !VWW 	AFM%-@@	As$   G9H  <H   	H#	HH#H#r   c                    	 | j                   j                  t              j                  |      j	                         }|sdddS |j
                  |_        |j                  |_        |j                  |_        |j                  |_        t        j                         |_        | j                   j                  t              j                  |j                        j	                         }|r| j                   j                  t              j                  |j                        j	                         }|r^| j                   j                  t               j                  |j"                        j	                         }|r| j                   j                  t$              j'                  t$        j                  |j
                  k(        j	                         }|r|j(                  nd |_        |j*                  |_        |j,                  |_        t        j                         |_        |j
                  |_        |j0                  |_        |j4                  |_        |j6                  |_        |j8                  |_        t        j                         |_        |j0                  |_        t        j                         |_        | j                   j;                          | j                   j=                  |       dd|j                  dS # t>        $ r2}| j                   jA                          dtC        |      dcY d }~S d }~ww xY w)	Nr   r$   Inventario no encontrado.r%   inventory_idsuccessz%Inventario actualizado correctamente.)r&   r'   rT   )"r   r0   r   	filter_byrL   r)   r   r   r   r   nowr   r   r   r   rI   r   r7   r   rK   supplier_idr9   arrival_dateupdated_dater    r5   r4   r   r   commitrefreshrA   rollbackrB   )	r   r   inventory_inputsrD   inventory_lotlot_itemlotr*   rF   s	            r   updatezInventoryClass.update   sm   3	:n5??2?FLLNI")6QRR $4#>#>I $4$@$@I!&6&D&DI#&6&D&DI#$,LLNI! !GGMM*?@JJXaXdXdJekkmM77==6@@MD]D]@^ddf''--1;;x;OUUWC "&''--"="D"D\__XhXsXsEs"t"z"z"|AH'*=*=d)9)D)D+;+H+H(+3<<>( +;*E*EH'(8(>(>H%)9)C)CH&1A1S1SH.2B2U2UH/,4LLNH) *:)?)?&-5\\^*GGNNGGOOI& $B )   	:GG%#a&99	:s%   AL J=L 	L?'L:4L?:L?c           
         	 t        d|       | j                  j                  t              j	                  |j
                        j                         }|sdddS |j                  xs |j                  }|sdddS t        j                         |_
        | j                  j                          | j                  j                  t        j                  t        j                        j!                  d      t        j                  t        j"                        j!                  d            j%                  t        j                  |k(        j                         }t'        |j(                  xs d	      }t'        |j*                  xs d	      }t        d
| d       t        d|        t        d|        | j                  j                  t,              j%                  t,        j                  |k(        j                         }|sdddS |j.                  }t        d|        |j0                  |j2                  z
  }	|	d	k  rd	}	|	|_        t        j                         |_        | j                  j                          t        d| d       t        d|j0                  |j2                  z           t        d|j2                          t        d|	        t        d|j.                          t7        |j8                  d	d|j2                  dz  |dt        j                               }
| j                  j;                  |
       | j                  j                          dd|j8                  |
j8                  |j0                  |j2                  z   |j2                  |	|j.                  ddS # t<        $ r2}| j                  j?                          dtA        |      dcY d }~S d }~ww xY w)NzAjuste de inventario (salida):rQ   r$   rR   r%   Product ID no encontrado.avg_public_priceavg_private_pricer   z.[+] Precios promedio calculados para producto :u        - Precio público promedio: z    - Precio privado promedio: u6   No se encontró registro de kardex para este producto.z[+] Costo obtenido del kardex: %[+] Kardex actualizado para producto     - Cantidad anterior: z    - Cantidad removida: z    - Nueva cantidad: z"    - Costo promedio se mantiene:    z(Ajuste de inventario (salida) realizado.rT   rI   movement_type_idr5   r4   reasonr   rU   zKAjuste de inventario (salida) registrado correctamente. Kardex actualizado.)previous_quantityremoved_quantitynew_quantityr   )r&   r'   rT   movement_idkardex_updated)!printr   r0   r   rV   rT   rL   r)   r   rW   r   r[   r   r3   r   r   r2   r   rK   intre   rf   r   r   r5   r    rZ   r	   r   addrA   r]   rB   )r   r^   rD   r)   lot_items_pricesre   rf   kardex_recordr4   rq   inventory_movementrF   s               r   remove_adjustmentz InventoryClass.remove_adjustment   sh   Y	:24DEn5??CSC`C`?aggiI")6QRR *44L	8L8LJ")6QRR %-LLNI!GGNN HH\;;<BBCUVHH\<<=CCDWX //:=>   ##3#D#D#IJ #$4$F$F$K! LB:,aPQ45E4FGH34E3FGH /0)44
BC  !")6noo%22I3I;?@ )114D4J4JJLa %1M")1M&GGNN9*QGH-m.D.DGWG]G].]-^_`-.>.D.D-EFG*<.9:6}7Q7Q6RST "8&\\!"*0025#A#<<>" GGKK*+GGNN $h )144)6)?)?BRBXBX)X(8(>(>$0$1$>$>	#   	:GG%#a&99	:s2   AN-  N- =FN- F!N- -	O(6'O#O(#O(c                    	 t        d|       | j                  j                  t              j	                  |j
                        j                         }|sdddS |j                  xs |j                  }|sdddS t        j                         |_
        | j                  j                          | j                  j                  t              j                  t        j                  |j                  k(        j                  t        |d      rt        j                   |j                   k(  nd       j                         }|st        t        |d      r|j                   nd|j                  t        j                         t        j                         t        j                         	      }| j                  j#                  |       | j                  j                          | j                  j%                  |       t        d
|j                          | j                  j                  t&              j                  t&        j(                  |j*                  k(        j                  t&        j                  |k(        j                         }|st'        |j*                  ||j,                  |j.                  |j0                  |j2                  t        j                         t        j                               }| j                  j#                  |       | j                  j                          | j                  j%                  |       t        d|        n|j4                  |j,                  z   |_        |j.                  |_        |j0                  |_        |j2                  |_        t        j                         |_        | j                  j                          t        d|        | j                  j                  t8              j                  t8        j
                  |j*                  k(        j                  t8        j:                  |j*                  k(        j                         }|st9        |j*                  |j*                  |j,                  t        j                         t        j                               }| j                  j#                  |       | j                  j                          | j                  j%                  |       t        d       n\|j4                  |j,                  z   |_        t        j                         |_        | j                  j                          t        d       | j=                  ||j,                  |j.                         | j                  j                  t>              j                  t>        j                  |k(        j                         }|r|j@                  n|j.                  }t        d| d|r|j@                  nd d       tC        |j*                  |j*                  d|j,                  |dt        j                               }	| j                  j#                  |	       | j                  j                          dd|j*                  |j*                  |j*                  |j*                  dS # tD        $ r2}
| j                  jG                          dtI        |
      dcY d }
~
S d }
~
ww xY w)NzAjuste de inventario:rQ   r$   rR   r%   rd   rX   r#   rX   r9   rY   r   rZ   z[+] Nuevo lote creado: r7   r)   r5   r4   r   r   r   rZ   z([+] Nuevo lot_item creado para producto z'[+] Lot_item actualizado para producto rT   rI   r5   r   rZ   z[+] Nuevo inventory_lot creadoz[+] Inventory_lot actualizador)   rq   new_unit_cost[+] Unit cost para movimiento:  (del kardex: N/A)   zAjuste de inventario realizado.rl   rU   zBAjuste de inventario registrado correctamente. Kardex actualizado.r&   r'   rT   r7   rI   inventory_lot_id)%rt   r   r0   r   rV   rT   rL   r)   r   rW   r   r[   r   rK   r9   hasattrrX   rv   r\   r   r7   r   r    r4   r   r   r5   rZ   r   rI   update_kardex_valuesr   r   r	   rA   r]   rB   )r   r^   rD   r)   ra   r`   r_   rx   movement_unit_costry   rF   s              r   add_adjustmentzInventoryClass.add_adjustment  sN   M	:)+;<n5??CSC`C`?aggiI")6QRR *44L	8L8LJ")6QRR %-LLNI!GGNN h'++/?/J/JJKQZ\iIj,,	0E0EEptu	  9@M9Z	 5 5`a/::!)'||~!) C  $/0@0K0K/LMN l+++svv56//:=>	  '66)-33.88&6&H&H'7'J'J'||~!)	 H% )@MN %-$5$58H8N8N$N!%5%?%?"-=-O-O*.>.Q.Q+(0% ?
|LM 34-::illJK-99X[[HI	  ! 5!* (-33'||~!)! M* .68 *7)?)?BRBXBX)X&-5\\^* 57 %%%-33.88 &  /0)44
BC  @M!;!;RbRlRl34F3G~  uBVcVpVp  HM  VN  NO  P  Q "8&\\$KK!")//,8#<<>" GGKK*+GGNN $_ )&&'{{$1$4$4   	:GG%#a&99	:s+   A[  [ =Y
[ 	\'[>8\>\shopping_idc                 R   	 |j                   D ]Y  }t        |j                  ||j                        }| j                  j                  |       | j                  j                          [ y # t        $ r2}| j                  j                          dt        |      dcY d }~S d }~ww xY w)N)r)   r   r    r$   r%   )
itemsr   r)   r    r   rv   r[   rA   r]   rB   )r   r   r/   itemnew_pre_inventory_stockrF   s         r   pre_save_inventory_quantitiesz,InventoryClass.pre_save_inventory_quantities  s    	:

 !*@# +**+'
 34 !  	:GG%#a&99	:s   A(A+ +	B&4'B!B&!B&c           	      "   	 | j                   j                  t              j                  t        j                  |k(        j                         }|r|j                  }t        |j                        }||z  }||z  }||z   }	||z   }
|	dkD  r|
|	z  }n|}|	|_        t        t        |            |_        t        j                         |_        t        d| d       t        d|        t        d|        t        d|	        t        d|        t        d|        nt        ||t        t        |            t        j                         t        j                         	      }| j                   j                  |       t        d
| d       t        d|        t        d|        | j                   j!                          |S # t"        $ r;}| j                   j%                          t        d| dt'        |              |d}~ww xY w)u  
        Actualiza los valores del kardex para un producto específico.
        Calcula el costo promedio usando el método kardex.
        
        Ejemplo:
        Saldo inicial: 100 unidades × 36.000 = 3.600.000
        Compra: 50 unidades × 42.000 = 2.100.000
        Nuevo total disponible:
        - Unidades: 100 + 50 = 150
        - Valor: 3.600.000 + 2.100.000 = 5.700.000
        - Costo promedio unitario nuevo: 5.700.000 / 150 = 38.000
        r   rh   rg   ri   z    - Cantidad nueva: z    - Total cantidad: z    - Costo promedio anterior: z    - Costo promedio nuevo: )r)   r5   r   r   rZ   z&[+] Nuevo kardex creado para producto z    - Cantidad: z    - Costo promedio: z,[!] Error actualizando kardex para producto z: N)r   r0   r   rK   r)   rL   r5   floatr   ru   r@   r   rW   rZ   rt   rv   r[   rA   r]   rB   )r   r)   rq   r   rx   current_quantitycurrent_average_costcurrent_total_valuenew_total_valuenew_total_quantitynew_total_value_sumnew_average_costrF   s                r   r   z#InventoryClass.update_kardex_values  s   <	 /0)44
BC  #0#9#9 ',]-G-G'H$ '79M&M#"."> &6%D"&9O&K# &)':=O'O$'4$ *<&-07G1H-I*-5\\^*=j\KL12B1CDE.|n=>./A.BCD78L7MNO45E4FGH !2))!$U=%9!:'||~!)! M*>zl!LM(78.}o>?GGNN   	GG@BsSTvhWXG	s   GG
 
	H6H		Hc                    	 | j                   j                  t              j                  t        j                  |j                  k(        j                         }|st        |j                  |j                  |j                  |j                  t        j                         t        j                               }| j                   j                  |       | j                   j                          | j                   j                  |       |j                  }t        d|        n|j                  }t        d|        | j                   j                  t               j                  t         j                  |j                  k(        j                         }t#        |j$                  |j&                  |j(                  t        j                         t        j                               }| j                   j                  |       | j                   j+                          | j                   j                  |       |j,                  }t/        |d      r|j0                  rddlm} ddlm}	  || j                         }
|
j;                  |j0                  |j                  |j<                        }t        d	|d
       | j                   j                  |	      j                  |	j                  |j0                  k(        j                         }|rSd|_        t        j                         |_         | j                   j+                          t        d|j0                   d       tC        |j                  |j                  |j<                  tE        |      |jF                  |jH                  t        j                         t        j                               }| j                   j                  |       | j                   j+                          | j                   j                  |       | jK                  |j                  |j<                  |       tM        ||j                  |j<                  t        j                         t        j                               }| j                   j                  |       | j                   j+                          | j                   j                  |       | j                   j                  tN              j                  tN        j                  |j                  k(        j                         }|r|jP                  n
tE        |      }t        d| d|r|jP                  nd d       tS        ||j                  d|j<                  |dt        j                               }| j                   j                  |       | j                   j+                          | j                   j                  |       tU        |jV                  |d|j<                  |sdndt        j                               }| j                   j                  |       | j                   j+                          |sdnd}d|||j                  |j                  |j                  dS # tX        $ r2}| j                   j[                          dt]        |      d cY d }~S d }~ww xY w)!N)r)   r   r   r   r   r   z$[+] Nuevo inventario creado con ID: z([+] Usando inventario existente con ID: r|   r   r   )ShoppingClass)ShoppingModelu'   Unit cost calculado automáticamente: $z.2f   z	Shopping z actualizado a status_id = 7r}   r   r~   r   r   r   r   r#   z Agregado producto al inventario.rl   u   Creación de inventario y lote.z%Agregado lote a inventario existente.)user_idrT   previous_stock	new_stockrn   r   z'Inventario y lote creados exitosamente.z%Lote agregado a inventario existente.rU   r   r$   r%   )/r   r0   r   rK   r)   rL   r   r   r   r   rW   rv   flushr\   r   rt   r   r   rX   r9   rY   r[   r4   r   r   "app.backend.classes.shopping_classr   app.backend.db.modelsr   calculate_unit_cost_for_productr    	status_idrZ   r   ru   r   r   r   r   r   r   r	   r
   r   rA   r]   rB   )r   r^   existing_inventorynew_inventoryrT   r*   new_lotcalculated_unit_costr   r   shopping_classshoppingnew_lot_itemnew_inventory_lotrx   r   new_inventory_movementnew_inventory_auditr'   rF   s                       r   storezInventoryClass.store  s[   _	: n-115E5P5PPQ  & ./:: 0 < <"2"@"@"2"@"@'||~ (! M*.,//<\NKL  244@OPggmmL188L\LgLg9ghnnpG #//+66-::#<<>%\\^G GGKK  GGNNGGOOG$ $4#=#= '7<L<X<XL?!.tww!7 (6'U'U$00$//$**($
 ?@TUX?YZ[  77==7>>}?O?OScSoSo?opvvx)*H&,4LLNH)GGNN$I&6&B&B%CC_`a (zz+66)//23"2"D"D#3#F#F#<<>%\\^	L GGKK% GGNNGGOOL) %%+66-332 &  !6)(OO)//#<<>%\\^! GGKK)* GGNNGGOO-. /0)448H8S8SST  @M!;!;RUVjRk34F3G~  uBVcVpVp  HM  VN  NO  P  Q &<)(OO!")//,9#<<>&" GGKK./ GGNNGGOO23 #6(00) *00@R8X#<<># GGKK+, GGNNGY?  `GG $" ,!**+$5$8$8   	:GG%#a&99	:s   ZZ 	['[[[c                    	 | j                   j                  t              j                  |      j	                         }|sdddS | j                   j                  t
              j                  |j                        j	                         }|r| j                   j                  t              j                  |j                  |j                        j                         }|D ]  }| j                   j                  |        | j                   j                  t              j                  |j                        j                         }|D ]  }| j                   j                  |        | j                   j                  t              j                  |j                        j	                         }|r| j                   j                  t              j                  |j                        j	                         }	| j                   j                  |       |	r| j                   j                  |	       | j                   j                  |       | j                   j                  |       | j                   j                          dddS # t         $ r2}
| j                   j#                          dt%        |
      dcY d }
~
S d }
~
ww xY w)	NrQ   r$   rR   r%   rS   )rT   rI   rU   z1Inventario y relaciones eliminadas correctamente.)r   r0   r   rV   rL   r   r   r	   rI   r>   deleter
   r   r   r7   r[   rA   r]   rB   )r   r   rD   r_   	movementsmovementauditsauditr`   ra   rF   s              r   r   zInventoryClass.delete  s   1	:n5??2?FLLNI")6QRR !GGMM*?@JJXaXdXdJekkmM GGMM*@AKK!* - 9 9 L  #%  !* -HGGNN8,- ':;EES\S_S_E`ddf# *EGGNN5)*  77==6@@MD]D]@^ddf''--1;;x;OUUWC GGNN8, s+ }- GGNN9% GGNN'4ghh 	:GG%#a&99	:s%   AJ
 IJ
 
	K'K :K KN)r   
   )__name__
__module____qualname__r   rG   rO   ru   rb   rz   r   r   r   r   r    r   r   r   r      sO    P:f)AV4: 4:lZ:xN:`: :IV`:D2:r   r   N)r   r   r   r   r   r   r   r	   r
   r   r   
sqlalchemyr   r   r   r   r   <module>r      s)    F  F  F  R: R:r   