
    6i                         d dl Z d dlmZmZ d dlmZ 	 d dlmZ  e j                  e      Z ej                  dd      dd	edz  d
eeef   fd       Zy# e$ rZ	 e
de	        dZY dZ	[	RdZ	[	ww xY w)    N)DictAny)
celery_app)get_db_sessionz,Warning: Could not import required modules: TzBsrc.smart_inventory.tasks.slow_movers_task.compute_slow_movers_90d)bindnamesnapshot_date_strreturnc                 J   ddl m}m}m } ddlm}m}m} ddlm} |r|j                  |      }	n|j                         }	d}
|	 ||
      z
  }t        sddd	S t               }	 |j                  |      j                  |j                  |	k(        j                  d
       |j!                          |j                  |j"                  j%                  d      |j&                  j%                  d      |j(                  j%                  d      |j+                  |j-                  |j.                        d      j%                  d      |j1                  |j2                        j%                  d            j                  |j                  |j2                        |k\  |j                  |j2                        |	k        j5                  |j"                  |j&                  |j(                        j7                         }|j                  |j"                  j%                  d      |j&                  j%                  d      |j(                  j%                  d      |j-                  |j8                        j%                  d      |j+                  |j:                  j<                  d      j%                  d      |j:                  j>                  j%                  d            jA                  ||j"                  |j:                  j"                  k(  |j&                  |j:                  j&                  k(  z  |j(                  |j:                  j(                  k(  z        j5                  |j"                  |j&                  |j(                  |j:                  j<                  |j:                  j>                        }|jC                         }g }|D ]$  }|j"                  }|j&                  }|j(                  }tE        |jF                  xs d      }tE        |j<                  xs d      }|j>                  }|dkD  r|tE        |
      z  }nd}|dkD  r||z  }n	|dkD  rdnd}|,tI        ||      r|j                         }|	|z
  jJ                  }nd}d}d}d}|dkD  r5|dkD  rd}d}d|dd| }n"|dkD  rd}d}d|dd| }n|dkD  r
d}d}d| d } ||	|||||||||||!      }|jM                  |       ' |r!|jO                  |       |j!                          d|	jQ                         tS        |      d"|jU                          S # tV        $ rR}|jY                          tZ        j]                  d#| d$       dt_        |      d	cY d}~|jU                          S d}~ww xY w# |jU                          w xY w)%a  
    Celery task to:
      - aggregate current inventory per company/location/product
      - compute 90-day sales metrics
      - identify slow movers
      - save snapshot into slow_mover_snapshot

    snapshot_date_str: optional 'YYYY-MM-DD'. Defaults to today.
    r   )date	timedeltadatetime)InventoryBatch
DailySalesSlowMoverSnapshot)funcZ   )daysFzDatabase session not available)successerror)synchronize_session
company_idlocation_id
product_idg        total_sold_90dlast_sale_dateon_hand_qtyg    @Ni     TdeadzDOH z.1fz > 180 days, on_hand=slowz > 90 days, on_hand=<   	watchlistzNo sales in z days)snapshot_dater   r   r   r   r   ads_90ddoh_90ddays_since_last_saleis_slow_moverslow_mover_severityslow_mover_reason)r   r#   
total_rowsz"Error in compute_slow_movers_90d: )exc_info)0r   r   r   )src.smart_inventory.apps.inventory.modelsr   r   r   
sqlalchemyr   fromisoformattodayr   queryfilterr#   deletecommitr   labelr   r   coalescesumquantity_soldmax	sale_dategroup_bysubqueryquantity_on_handcr   r   	outerjoinallfloatr   
isinstancer   appendbulk_save_objects	isoformatlenclose	Exceptionrollbackloggerr   str) selfr	   r   r   r   r   r   r   r   r#   lookback_days
start_datedb
sales_subqinv_qresults	snapshotsrowr   r   r   r   r   r   r$   r%   r&   r'   severityreasonsnapshotes                                    I/var/www/html/hubwallet-dev/src/smart_inventory/tasks/slow_movers_task.pycompute_slow_movers_90drY      s0    32gg**+<=

M!>>J +KLL		BI
"#**++}<	

&U&
+
		 HH%%++L9&&,,];%%++L9dhhz'?'?@#FLLM]^--.445EF V		*../:=		*../-? X%%&&%%
 XZ# 	. HH))//=**00?))//=889??Njll993?EEFVW++112BC Y**jll.E.EE!--1I1IIK!,,
0G0GGI X))**))++++ 	0 ))+-/	 >	'CJ//KJ 637K"3#5#5#<=N //N !(5+??{%/ %0!O&)nh7%3%8%8%:N(5(F'L'L$ (+$ "MHFQS=$(M%H#GC=0Ek]SFr\$(M%H#GC=0D[MRF)B.$(M*H+,@+AGF(+%'%'-%9+$,"(H X&}>	'@   +IIK *446i.
 	
  3
9!=M 3q622

3
 	
s1   #R>T2 2	V;7V2V3V VV V")N)loggingtypingr   r   src.utils.celery_workerr   src.utils.dbr   ImportErrorrW   print	getLogger__name__rI   taskrJ   rY        rX   <module>re      s      .+
 
		8	$ d!efcS4Z c4PSUXPX> c gc  	8
<=Ns   A A1A,,A1