
    >:hY                     d   d dl 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 d dlmZ ddlmZmZmZmZmZmZmZmZmZmZmZ 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& d dl'm(Z( d dl)m*Z* d dl+m,Z,m-Z- d dl.m/Z/ d dl0m1Z1 d dl2Z2d dl3Z3d dl4m5Z5 d dl6m7Z7 ed             Z8d Z9ed             Z: e2j;        e<          Z=ed             Z>ed             Z?ed             Z@ed             ZAed             ZBed             ZC e2j;        e<          Z=ed             ZDd ZEd ZFed              ZGed!             Z@ed"             ZH e2j;        e<          Z=ed#             ZId dlm	Z	 d dl
mZ d dl0m1Z1 d d$l3m3Z3  e2j;        e<          Z=eed%                         ZJed&             ZKd' ZLd( ZMd) ZNdS )*    )renderredirectget_object_or_404)messages)staff_member_required)JsonResponse)require_GET)reverse   )OrdenCompraFormItemOrdenCompraManualFormSetDevolucionCompraFormDevolucionMuestraComercialFormDevolucionProduccionFormMovimientoDevolucionVentaFormAjusteInventarioFisicoFormMuestraComercialFormRecepcionProduccionFormMovimientoVentaFormPerdidaProcesoForm)	OrdenCompraDevolucionCompraDevolucionMuestraComercialDevolucionProduccionMovimientoDevolucionVentaRecepcionProduccionMovimientoVentaItemOrdenCompraMuestraComercial)Decimal)
Referencia)MaquinaReferencia)ProveedorReferencia)costo_desde_bomcalcular_precio_venta_ponderado)
parse_date)nowN)timezone)formset_factoryc                    | j         dk    rt          | j                  }|                                r|                    d          }| j        |_        t          | j        |          }|                                rS|                                 ||_        |                                 t          j
        | d           t          d          S t          j        | d           nlt          j        | d           |                    d          }t          | j        |          }n*t                      }t          t                                }t          | d	||d
          S )NPOSTF)commit)instancez$Orden de compra creada exitosamente.z(admin:movimientos_ordencompra_changelistu"   Corrige los errores en los ítems.z/Corrige los errores en el formulario principal.z#admin/compras/ordencompra_form.html)formformset)methodr   r+   is_validsaveuser
creada_porr   r-   r   successr   errorr   r   )requestr.   
orden_tempr/   s       :C:\Users\a_gir\Desktop\Interacto\siip\movimientos\views.pyordencompra_manual_viewr:      sR   ~w|,,==?? 	V%00J$+LJ! 37<*UUUG!! N!!!#-  *PQQQ JKKKw(LMMMMN7$UVVV%00J27<*UUUGG  .FFF'7G446 6 6    c                    t          t          |          }t          j                            |                              dd          }g }|D ]\}|                    |j        |j        t          |j
                  |j        |j        |j        t          |j                  d           ]t          ||r|d         d         ndd	          S )
a{  
    GET /movimientos/ordencompra/api/ref/<pk>/
    JSON:
      - proveedores: [
          {
            prov_ref_id,
            proveedor_id,
            proveedor_nombre,
            lead_time_total,
            esta_certificado,
            empaque_id,
            empaque_nombre,
          },
          ...
        ]
      - proveedor_referencia_id: el primero (o None)
    pk
referencia	proveedorempaque)prov_ref_idproveedor_idproveedor_nombrelead_time_totalesta_certificado
empaque_idempaque_nombrer   rC   N)proveedoresproveedor_referencia_id)r   r!   r#   objectsfilterselect_relatedappendidrD   strrA   rF   rG   rH   rB   r   )r7   r>   refqsrJ   prs         r9   api_referencia_proveedorrU   :   s    $ J2
.
.
.C		$	+	+s	+	;	;	J	J;W`	a	aBK 	 	 " " #BL 1 1 " 2 " 3 " #BJ
 
 	 	 	 	 "DO#Y;q>-#@#@UY    r;   c                 F   | j         dk    rvt          | j                  }|                                r8|                                 t          j        | d           t          d          S t          j        | d           nt                      }t          | dd|i          S )uA   
    Vista personalizada para “Add” de DevolucionCompra.
    r+   u-   Devolución de compra guardada correctamente.-admin:movimientos_devolucioncompra_changelist#Corrige los errores del formulario.&admin/devolucion_compras/add_form.htmlr.   )
r0   r   r+   r1   r2   r   r5   r   r6   r   r7   r.   s     r9   devolucion_compra_manual_viewr[   _   s    
 ~#GL11==?? 	KIIKKKW&UVVVKLLLN7$IJJJJ#%%':4." " "r;   c                     t          t          |          }|j        }t          t	          |j                  t	          |j                  t	          |j        pd          d          S )u   
    Devuelve JSON con:
      - stock_item:        cantidad disponible en el ítem de orden (cantidad antes)
      - stock_referencia:  stock total actual de la referencia
      - precio_ponderado:  precio de costo actual de la referencia
    r=   r   )stockstock_referenciaprecio_ponderado)r   r   r@   r   floatcantidadr]   precio_costo)r7   r>   itemrR   s       r9   api_item_info_devolucion_comprard   v   sf     _444D?C#DM22#CI..#C$4$9::    r;   c                    t           j        }t          d|j         d|j         d          }| j        dk    rvt          | j                  }|                                r8|	                                 t          j        | d           t          |          S t          j        | d           nt                      }t          | d||d          S )	Nadmin:__changelistr+   u6   Devolución de muestra comercial creada correctamente.-Por favor corrige los errores del formulario.zRadmin/mov_devolucion_muestras_comerciales/devolucionmuestracomercial/add_form.htmlr.   
cancel_url)r   _metar
   	app_label
model_namer0   r   r+   r1   r2   r   r5   r   r6   r   r7   optsrk   r.   s       r9   (devolucion_muestra_comercial_manual_viewrq      s    +1DO$.OO4?OOOPPJ~-gl;;==?? 	UIIKKKW&^___J'''N7$STTTT-//'f ",   r;   c                 X   t          t          |          }|j        pt          d          }|j        dv s|dk    rt          |          }n|}t                              d|j         d|j	         d|            t          t          |j	                  t          |          d          S )	Nr=   0PTPPr   zAPI muestra ref=: stock=z, costo=r]   costo_unitario)r   r!   rb   r    tipor$   loggerdebugr>   r]   r   r`   r7   r>   rR   precio_directoprecios        r9   api_referencia_info_muestrar      s    
J2
.
.
.C%5N
x;.A"5"5 %%
LLOCFOOCIOOvOOPPPsy!!--    r;   c                 B   t           j        }t          d|j         d|j         d          }| j        dk    rt          | j                  }t          d| j        	                                           |
                                rMt          d|j                   |                                 t          j        | d           t          |          S t          d|j                   t          j        | d	           nt                      }t%          | d
||d          S )Nrf   rg   rh   r+      🐞 POST DATA:u   🐞 CLEANED:u#   Devolución guardada correctamente.u   🐞 ERRORS:rX   zBadmin/mov_devolucion_produccion/devolucionproduccion/add_form.htmlrj   )r   rl   r
   rm   rn   r0   r   r+   printdictr1   cleaned_datar2   r   r5   r   errorsr6   r   ro   s       r9   !devolucion_produccion_manual_viewr      s   %+DO$.OO4?OOOPPJ~'55!2!2!4!4555==?? 	K/4#4555IIKKKW&KLLLJ'''.$+...N7$IJJJJ'))'Vz::< < <r;   c                 8   t          d|            t          t          |          }t          d|j         d|j         d|j                    t          |j                  t          |j        pd          d}t          d|            t          |          S )	up   
    Devuelve JSON con stock y precio_costo de la referencia,
    para poblar los campos de la devolución.
    u(   🐞 api_referencia_info called with pk=r=   u   🐞 Referencia encontrada: id=z, stock=z, precio_costo=r   r]   rb   u   🐞 Data a retornar: )r   r   r!   rP   r]   rb   r`   r   )r7   r>   rR   datas       r9   api_referencia_info2r      s     

9R
9
9:::
J2
.
.
.C	
hCF
h
hCI
h
hVYVf
h
hiiisy!!c.3!44 D 

)4
)
)***r;   c                    t           j        }t          d|j         d|j         d          }| j        dk    rt          | j                  }t          	                    d| j        
                                           |                                r8|                                 t          j        | d           t          |          S t          j        | d           nt                      }t#          | d||d	          S )
Nrf   rg   rh   r+      🐞 POST DATA: %su,   Devolución de venta guardada correctamente.rX   zBadmin/mov_devolucion_venta/movimientodevolucionventa/add_form.htmlrj   )r   rl   r
   rm   rn   r0   r   r+   r{   r|   r   r1   r2   r   r5   r   r6   r   ro   s       r9   devolucion_venta_manual_viewr      s    *0DO$.OO4?OOOPPJ~,W\::)7<+<+<+>+>???==?? 	KIIKKKW&TUUUJ'''N7$IJJJJ,..'Vz::< < <r;   c                    t          t          |          }|j        }| j                            d          }| j                            d          }|rt          |          n3t                                                                          d          }|rt          |          nt                                                      }t          |||d          \  }}	}
t          |j        t          |j                  t          |j                  t          |j                  t          |          t          |	          t          |
          d          S )	u  
    GET params (opcionales): inicio=YYYY-MM-DD, fin=YYYY-MM-DD
    Dado el PK de una Venta, devuelve JSON con:
      - referencia:                 pk de la referencia vendida
      - stock_venta:                cantidad originalmente vendida en esa Venta
      - stock_referencia:           stock total actual de la referencia
      - precio_venta_unitario:      precio unitario de la venta original
      - precio_venta_ponderado:     precio ponderado calculado entre inicio→fin
      - historical_unidades:        suma de cantidades devueltas en el rango
      - historical_valor:           suma de (cantidad * precio_unitario) en el rango
    r=   iniciofinr   dayT)return_history)r@   stock_ventar^   precio_venta_unitarioprecio_venta_ponderadohistorical_unidadeshistorical_valor)r   r   r@   GETgetr&   r'   datereplacer%   r   r>   r`   ra   r]   precio_unitario_venta)r7   r>   ventarR   
inicio_strfin_strr   r   pondhist_unidades
hist_valors              r9   api_venta_info_devolucionr      s/    o"555EC **J''G'1RZ
###suuzz||7K7KPQ7K7R7RF'.CZ   suuzz||C 'FVS' ' '#D- $'F$)%.$9$9$)#)$4$4$)%*E$F$F$)$KK$)-$8$8$)*$5$5    r;   c                    t          t          |          }t          |j                  t          |j        pd          d}t
          j                            |                              d          }g }|D ]C}|j	        j
        }|j	        }|                    |j        |j        |j        |j        d           Dt          d| d|j         d	|            ||d
<   t          |          S )a  
    GET /movimientos/api/stock-referencia/<idreferencia>/

    Devuelve JSON con:
      - stock: float
      - precio_costo: float (opcional)
      - opciones_planta_maquina: [
          { planta_id, planta_nombre, maquina_id, maquina_nombre }, ...
        ]
    r=   r   r   r?   maquina__planta	planta_idplanta_nombre
maquina_idmaquina_nombre   🐞 API ref=rw   , opciones=opciones_planta_maquina)r   r!   r`   r]   rb   r"   rL   rM   rN   maquinaplantarO   rP   nombrer   r   )	r7   idreferenciarR   r   rS   opcionesmrr   r   s	            r9   api_stock_referenciar     s    J<
8
8
8C sy!!c.3!44 D 	!	3			)	*	* 
 H  *#*#Y#]$Z%n	
 
 	 	 	 	 

P,
P
P	
P
Ph
P
PQQQ&.D	"#r;   c                     | j         dk    rLt          | j                  }|                                r#|                                 t          d          S nt                      }t          | d|dd          S )Nr+   zmovimientos:ajuste_manualz*admin/inventario_fisico/ajuste_manual.htmlzAjuste de Inventario Manual)r.   titulo)r0   r   r+   r1   r2   r   r   rZ   s     r9   ajuste_manual_viewr   :  s    ~)',77==?? 	9IIKKK7888	9 *++'G/J J   r;   c                 b   | j         dk    rvt          | j                  }|                                r8|                                 t          j        | d           t          d          S t          j        | d           nt                      }t          | d|t          d          d          S )uu   
    Formulario propio para crear una MuestraComercial,
    con cálculos de stock y valor de salida en cliente.
    r+   z'Muestra comercial creada correctamente.z-admin:movimientos_muestracomercial_changelistri   z:admin/mov_muestra_comercial/muestracomercial/add_form.htmlrj   )r0   r   r+   r1   r2   r   r5   r   r6   r   r
   rZ   s     r9   muestra_comercial_manual_viewr   H  s     ~#GL11==?? 	UIIKKKW&OPPPKLLLN7$STTTT#%%'N ")*Y"Z"Z   r;   c                     t          t          |          }|j        pd}|j        dv s|dk    rt	          |          }n|}t          t          |j                  t          |          d          S )z
    API que devuelve JSON con:
      - stock actual de la referencia
      - costo unitario: si es PT/PP o tiene precio_costo=0, lo recalcula desde el BOM;
                         en caso contrario usa precio_costo directo.
    r=   r   rt   rx   )r   r!   rb   rz   r$   r   r`   r]   r}   s        r9   r   r   _  s     J2
.
.
.C%*N
x<>Q#6#6 %%sy!!--    r;   c                 B   t           j        }t          d|j        d|j        d          }| j        dk    rt          | j                  }t          d| j        	                                           |
                                rMt          d|j                   |                                 t          j        | d           t          |          S t          d|j                   t          j        | d	           nt                      }t%          | d
||d          S )Nrf   rg   rh   r+   r   u   🐞 CLEANED DATA:u   Recepción guardada.u   🐞 FORM ERRORS:zCorrige los errores.z6admin/mov_produccion/recepcionproduccion/add_form.htmlrj   )r   rl   r
   rm   rn   r0   r   r+   r   r   r1   r   r2   r   r5   r   r   r6   r   ro   s       r9    recepcion_produccion_manual_viewr   t  s   $DT^^^T___UVVJ~&w|44!2!2!4!4555==?? 	<&(9:::IIKKKW&<===J'''%t{333N7$:;;;;&(('Jz::< < <r;   c                    t           j        }t          d|j         d|j         d          }| j        dk    rt          | j                  }t          	                    d| j        
                                           |                                rXt          	                    d|j                   |                                 t          j        | d           t!          |          S t          	                    d|j                   t          j        | d	           nt                      }t'          | d
||d          S )Nrf   rg   rh   r+   r   u   🐞 CLEANED: %szVenta registrada correctamente.u   🐞 ERRORES FORM: %srX   z)admin/venta/movimientoventa/add_form.htmlrj   )r   rl   r
   rm   rn   r0   r   r+   r{   r|   r   r1   r   r2   r   r5   r   r   r6   r   ro   s       r9   venta_manual_viewr     s     &DO$.OO4?OOOPPJ~"7<00)7<+<+<+>+>???==?? 	KLL+T->???IIKKKW&GHHHJ'''LL0$+>>>N7$IJJJJ"$$'=z::< < <r;   )datetimec           
      8   t          t          |          }t                                                      }d } || j                            d                    p|                    d          } || j                            d                    p|}t          |||          }t          j	        
                    |                              d          }g }	|D ]C}
|
j        j        }|
j        }|	                    |j        |j        |j        |j        d	           Dt#          d
| d|j         d| d|	            t'          t)          |j                  t)          |          |                                |                                |	d          S )u  
    GET params:
      - inicio=YYYY-MM-DD   (opcional; default: primer día del mes actual)
      - fin=YYYY-MM-DD      (opcional; default: hoy)
    Devuelve JSON con:
      - stock
      - precio_venta_ponderado
      - opciones_planta_maquina: [
            {
              planta_id,
              planta_nombre,
              maquina_id,
              maquina_nombre
            }, ...
        ]
    r=   c                 t    	 t          j        | d                                          S # t          $ r Y d S w xY w)Nz%Y-%m-%d)r   strptimer   	Exception)ss    r9   r&   z-api_referencia_info_venta.<locals>.parse_date  sH    	$Q
3388::: 	 	 	44	s   &) 
77r   r   r   r   r?   r   r   r   rw   z, precio_pond=r   )r]   r   r   r   r   )r   r!   r'   r   r   r   r   r%   r"   rL   rM   rN   r   r   rO   rP   r   r   r]   r   r`   	isoformat)r7   r>   rR   hoyr&   r   r   precio_pondrS   r   r   r   r   s                r9   api_referencia_info_ventar     s   ( J2
.
.
.C C   Z1122Hckkak6H6HFZ..//9cC1#vsCCK 	!	3			)	*	* 
 H  "*#Y#]$Z%n	
 
 	 	 	 	 

a"
a
aci
a
a{
a
aW_
a
abbb&+CI&6&6&+K&8&8&,&6&6&8&8&)mmoo&.    r;   c           	         t           j                                        }| j                            d          p| j                            d          }t          t          d          }d}| j        dk    r || j                  }|	                                rd}|D ]=}|j
                            d          pd}|dk    r|                                 |dz  }>|r't          j        | | d           t          d	          S t          j        | d
           nt          j        | d           n|rt#          t           |          }|j                            d                                          }	g }
t)          j                                                    }|	D ]6}|
                    |j        |j        j        ||j        |j        d           7 ||
          }t9          | d|||d          S )uO   
    Permite devolver varios ítems de una OrdenCompra de forma unificada.
    orden_selectr   )extraNr+   cantidad_devueltar   z$ devoluciones creadas correctamente.rW   u!   No se devolvió ninguna cantidad.rX   r=   r@   )rc   r@   fechacantidad_antesprecio_unitario_devuelto)initialrY   )ordenesorden_selectedr/   )r   rL   allr+   r   r   r)   r   r0   r1   r   r2   r   r5   r   infor6   r   itemsrN   r(   r'   r   rO   r>   r@   ra   precio_unitarior   )r7   r   r   DevolucionFormSetr/   creadasr.   dvordenr   r   r   rc   s                r9   devolver_orden_unificador     s&    !%%''G \%%n55X9X9XN ((<AFFFG~##GL11 	KG ! !&**+>??D166IIKKKqLG L W*Z*Z*Z[[[ OPPPg'JKKKKN7$IJJJJ	 5!+.AAA**<88<<>>lnn!!## 	 	DNN-1W-1_-?-0-1]-1-A      $#G444':(/(6(/   r;   c                     t          t          |          }|j        }t          |j        t          |j                  t          |j                  t          |j                  |j	        j        d          S )u   
    Retorna JSON con:
      - referencia: pk de la referencia asociada
      - stock_muestra: cantidad de esta muestra
      - stock_referencia: stock total de la referencia
      - costo_unitario: costo unitario de la referencia
      - usuario: pk del usuario que creó la muestra
    r=   )r@   stock_muestrar^   ry   usuario)
r   r   r@   r   r>   r`   cantidad_entregadar]   rb   entregado_por)r7   r>   muestrarR   s       r9   muestra_info_apir   $  sr       0R888G

Cfw9::!#),, 011(+    r;   c           	         t          t          |          }|j        }t          |j        t          |j                  t          |j                  t          |j        pd          t          |j	                  d          S )Nr=   r   )r@   stock_recepcionr^   rb   costo_unitario_produccion)
r   r   r@   r   r>   r`   cantidad_despuesr]   rb   r   )r7   r>   	recepcionrR   s       r9   recepcion_info_apir   :  sz    !"5"===I$C),).y/I)J)J).sy)9)9).s/?/D1)E)E).y/R)S)S    r;   c                 x   t           j                                        }| j        dk    r^t	          | j                  }||j        d         _        |                                r#|	                                 t          d          S n t	                      }||j        d         _        t          | d||d          S )Nr+   r@   zmovimientos:perdida_addz'admin/mov_perdida_proceso/add_form.html)r.   referencias)r!   rL   r   r0   r   r+   fieldsquerysetr1   r2   r   r   )r7   r   r.   s      r9   perdida_addr   F  s    $((**K~!',//-8L!*==?? 	7IIKKK5666	7 "##-8L!*'D"G G   r;   )Odjango.shortcutsr   r   r   django.contribr   %django.contrib.admin.views.decoratorsr   django.httpr   django.views.decorators.httpr	   django.urlsr
   formsr   r   r   r   r   r   r   r   r   r   r   modelsr   r   r   r   r   r   r   r   r   decimalr    r!   fabricacion.modelsr"   proveedores.modelsr#   
siip.utilsr$   r%   django.utils.dateparser&   django.utils.timezoner'   loggingr   django.utilsr(   django.formsr)   r:   rU   r[   	getLogger__name__r{   rd   rq   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r;   r9   <module>r     s   A A A A A A A A A A # # # # # # G G G G G G $ $ $ $ $ $ 4 4 4 4 4 4       f  f  f  f  f  f  f  f  f  f  f  f  f  f  f  f  f  f  f  f  f  f  f  f  f  f H  H  H  H  H  H  H  H  H  H  H  H  H  H  H  H  H  H  H  H  H  H             0 0 0 0 0 0 2 2 2 2 2 2 G G G G G G G G - - - - - - % % % % % %   ! ! ! ! ! ! ( ( ( ( ( ( 6 6 6D$ $ $J " " "& 
	8	$	$      .    < < <.     < < <( 
	8	$	$" " "F' ' 'R     ,   ( < < <, 
	8	$	$< < <* / . . . . . 4 4 4 4 4 4 % % % % % %       
	8	$	$8 8  8t 8 8 8v  ,
 
 
    r;   