
    >:h                         d dl Z d dlmZmZ d dlmZ d dlmZ d dlmZ d dl	m
Z
 de
defd	Zde
defd
Zd dlmZ 	 ddefdZdS )    N)MovimientoVentaMovimientoDevolucionVenta)Decimal)ListaMateriales)ItemOrdenCompra)
Referenciarefreturnc                 *   t           j                            |                               d                                          }|r&t          d| j         d|j                    |j        S t          d| j         d           t          d          S )u@   Fallback: devuelve el precio_unitario de la última compra, o 0.)
referenciaz-orden__fecha_requeridau"       ↳ Fallback precio compra de z: u!       ↳ Sin compras previas para u    ⇒ 00)	r   objectsfilterorder_byfirstprintskuprecio_unitarior   )r	   ultimas     3C:\Users\a_gir\Desktop\Interacto\siip\siip\utils.pyobtener_ultimo_precio_comprar      s     		3			+	,	,		   &V37VVf>TVVWWW%%	
=cg
=
=
=>>>3<<    c           	      D   t          d| j         d| j         d           	 t          j                            | d          }t          d|j         d| j                    nG# t          j        $ r5 | j        pt          |           }t          d| d| j                    |cY S w xY wt          d	          }|j
                            d
                                          D ]}|j        }|j        }t          d|j         d|            |j        r%|j        dk    r|j        }t          d|            n't          d|j         d           t          |          }||z  }t          d| d| d|            ||z  }t          d| j         d| d           |S )u   
    Para ref tipo PT/PP recorre su BOM 'A' y suma:
      cantidad_total * costo_sub.
    Donde costo_sub = sub.precio_costo (si >0) o recursión.
    Si no hay BOM, usa precio_costo o fallback a última compra.
    u!   
⟳ costo_desde_bom: inicio SKU=z (id=)A)r   estadou     ↳ Encontrado BOM id=z para u     ↳ Sin BOM: uso base=r   r   u      • Componente z: qty=r   u           → usa sub.precio_costo=u          → precio_costo de u    vacío o cero, recursión...u          → contribución: u    × z = u	    ← FIN z: total BOM cost = 
)r   r   pkr   r   getDoesNotExistprecio_costor   r   componentesselect_relatedallr   cantidad_totalcosto_desde_bom)	r	   bombasetotalcompsubqty	costo_subcontribs	            r   r&   r&      s    

Fsw
F
FSV
F
F
FGGG%))S)EE@@@sw@@AAAA'   D#?#D#D>>>SW>>???
 CLLE..|<<@@BB  o!73777#77888  	- 01 4 4(I@Y@@AAAA VVVVWWW',,I	/K3KKIKK'KKLLL	
;cg
;
;%
;
;
;<<<Ls   A A# #AB'&B'Freturn_historyc                    t          d          }t          d          }t          d| j         d| d|            t          j                            | ||f                              d          }t          d|                                 d           |D ]J}|j        |j	        z  }t          d	|j
         d
|j         d|j	         d|            ||j        z  }||z  }Kt          j                            | ||f                              d          }	t          d|	                                 d           |	D ]J}
|
j        |
j        z  }t          d|
j
         d
|
j         d|
j         d|            ||
j        z  }||z  }Kt          d| d|            |dk    r2t          d           |rt          d          ||fS t          d          S ||z  }t          d| d           |r|||fS |S )u~  
    Calcula el precio de venta ponderado para una referencia entre fecha_inicio y fecha_fin,
    incluyendo tanto ventas como devoluciones de venta.

    Si return_history=True, devuelve una tupla:
        (precio_ponderado: Decimal,
         total_unidades: Decimal,
         total_valor: Decimal)
    En caso contrario, devuelve sólo precio_ponderado (para compatibilidad).
    r   u   
▶▶ ponderado: ref=z, rango=u   →)r   fecha__rangefechaz   Vendidos: z movimientosz	     [V] z qty=z @ u    ⇒ z   Devueltos: z	     [D] u      Totales → unidades=z, valor=r   u6      ¡No hubo movimientos en el rango! Precio pond = 0
z    Precio ponderado calculado = r   )r   r   r   r   r   r   r   countcantidadprecio_unitario_ventar2   r   precio_venta_unitario)r   fecha_inicio	fecha_finr/   total_unidadestotal_valorventasvr.   devsdprecio_ponds               r   calcular_precio_venta_ponderador@   E   s|   $ S\\NS\\K	
YZ^
Y
Y\
Y
Yi
Y
YZZZ $++"I. ,   hw  

6&,,..
6
6
6777 " "*q66^!'^^
^^q7N^^U\^^___!*$'! %,33"I. 4   hw 	 

54::<<
5
5
5666 " "*q66^!'^^
^^q7N^^U\^^___!*$'!	
J^
J
J[
J
JKKKGHHH 	=3<<<<s||.K	
<[
<
<
<=== 8NK77r   )F)loggingmovimientos.modelsr   r   decimalr   lista_de_materiales.modelsr   r   referencias.modelsr   r   r&   boolr@    r   r   <module>rH      s     J J J J J J J J       7 6 6 6 6 6 . . . . . . ) ) ) ) ) )j W    $ $ $ $ $ $R       !	< < 	< < < < < <r   