
    h                          G d  d      Z  G d d      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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
)c                       e Zd Zd Zy)Productc                      || _         || _        y N)idquantity)selfr   r   s      aC:\Users\jesus\OneDrive\Escritorio\backend-lacasadelvitrificado\app\backend\classes\sale_class.py__init__zProduct.__init__   s         N__name__
__module____qualname__r
    r   r	   r   r      s    !r   r   c                       e Zd Zd Zy)ProductInputc                     |g| _         y r   )cart)r   products     r	   r
   zProductInput.__init__   s    I	r   Nr   r   r   r	   r   r      s    r   r       )	SaleModelCustomerModelSaleProductModelProductModelInventoryModelUnitMeasureModelSupplierModelCategoryModelLotItemModelLotModelInventoryMovementModelInventoryLotItemModelUnitFeatureModelKardexValuesModelSettingModel	UserModeldatetime)funcc                   p    e Zd Zd ZdedefdZddZd Zd Zd	 Z	d
 Z
d ZddZd Zd Zd Zd ZddZy)	SaleClassc                     || _         y r   )db)r   r-   s     r	   r
   zSaleClass.__init__   s	    r   
product_idr   c                     t        t        ||            }t        | j                        j	                  |      \  }}|dk(  rdddS dd| dS )N   okzStock suficientestatusmessageerrorzStock insuficiente para: )r   r   r+   r-   validate_inventory_existence)r   r.   r   product_inputr3   insufficients         r	   check_product_inventoryz!SaleClass.check_product_inventory   sW    $WZ%BC(1NN}]Q;"/ABB%4Ml^2\]]r   Nc                    | j                   j                  t              j                  t        j                  |k(        j                         }	 |dk(  s|dk(  r| j                   j                  t        j                  t        j                  t        j                  t        j                  t        j                  t        j                  t        j                        j                  t        j                  j                               }n| j                   j                  t        j                  t        j                  t        j                  t        j                  t        j                  t        j                  t        j                        j                  |rt        j                   |j                  k(  nd       j                  t        j                  j                               }|dkD  r|j#                         }||z   d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]a  }
|
j                  |
j                  |
j                  |
j                  |
j                  |
j                  |
j                  j+                  d      d	c }}
|||||d
S |j)                         }	|	D 
cg c]a  }
|
j                  |
j                  |
j                  |
j                  |
j                  |
j                  |
j                  j+                  d      d	c }}
|S c c}
w c c}
w # t,        $ r}t/        |      }d|dcY d }~S d }~ww xY w)Nr0      r   r5   zInvalid page numberr2   No data foundz%Y-%m-%d %H:%M:%S)r   subtotalshipping_costtaxtotal	status_id
added_date)total_itemstotal_pagescurrent_pageitems_per_pagedata)r-   queryr   filteridentification_numberfirstr   r   r=   r?   r>   r@   rA   rB   order_bydesccustomer_idcountoffsetlimitallstrftime	Exceptionstr)r   rol_idrutpagerF   customerrH   rC   rD   rG   saleserialized_dataeerror_messages                 r	   get_allzSaleClass.get_all   s   77==/66}7Z7Z^a7abhhjL	A{fkGGMM!!**!!//!!++!,, Xi22779:  GGMM!!**!//!!!++!,, VHI11X[[@RVWXi22779:  ax#kkm*^;a?!8tk1&-:OPP||TAX$?@FF~VZZ\&-/JJ ##$  '' $%)%7%788!ZZ!%"&//":":;N"O$ #$ #$ $/#.$(&4+  yy{ ##$  '' $%)%7%788!ZZ!%"&//":":;N"O$ #$ #$ '&?#$*#$  	AFM%-@@	AsQ   G M :M M A&L=5	M ?M A&M9M =
M 	M*M%M*%M*c           
         g }|j                   D ]=  }| j                  j                  t        j                  t
        j                        j                  d            j                  t        t        j                  t
        j                  k(        j                  t
        j                  |j                  k(        j                  t
        j                  dkD        }|j                         xs d}| j                  j                  t        j                   j                  d      t"        j$                        j                  t"        t"        j                  t        j                  k(        j                  t        j                  |j                  k(        j'                         }|s!|j)                  d|j                   d       |\  }}||j                  k  r&|j)                  | d| d|j                   d       ||j                  z
  }	|	|k  r|j)                  | d	|	 d
| d       t+        d| d| d|j                   d       @ |rd|fS dg fS )Ntotal_stockr   product_namez	Producto z no encontradoz (disponible: z, solicitado: )u    (quedaría u   , mínimo requerido: z [+] Stock validation passed for : z available, z
 requestedr0   )r   r-   rH   r)   sumr   r   labeljoinr    r   lot_idrI   r.   scalarr   r   r   minimum_stockrK   appendprint)
r   sale_inputsinsufficient_productsitemtotal_stock_queryr`   product_infora   ri   remaining_stocks
             r	   r6   z&SaleClass.validate_inventory_existencek   s    "$$ '	yD dhh|'<'<=CCMRSh|/B/B BC//477:;--12	  ,2249K  ((..~>"00 nn&?&?<??&RS47723   %,,y	-PQ*6'L- T]]*%,,~^K=Xfgkgtgtfuuv-wx *DMM9O.%,,~\/IZZop}o~~  .A  B4\N"[MQ]^b^k^k]llvwxO'	yR !+++"ur   c           	      ~   	 | j                   j                  t              j                  t        j                  |k(        j                         }|r|j                  |z
  }|dk  rd}||_        t        j                         |_	        t        d| d       t        d|j                  |z           t        d|        t        d|        t        d|j                          | j                   j                          yt        d|        y# t        $ r$}t        d	| d
t        |              Y d}~yd}~ww xY w)zp
        Actualiza el kardex cuando se vende un producto.
        Resta la cantidad vendida del kardex.
        r   z/[+] Kardex actualizado por venta para producto :z    - Cantidad anterior: z    - Cantidad vendida: z    - Nueva cantidad: z"    - Costo promedio se mantiene: u5   [!] No se encontró registro de kardex para producto z6[!] Error actualizando kardex por venta para producto rc   N)r-   rH   r$   rI   r.   rK   r   r(   nowupdated_daterk   average_costcommitrT   rU   )r   r.   sold_quantity	unit_costkardex_recordnew_quantityr\   s          r	   update_kardex_for_salez SaleClass.update_kardex_for_sale   s1   
	c /0)44
BC  ,55E  !##$L *6&-5\\^*G
|STUV1-2H2H=2X1YZ[0@A.|n=>:=;U;U:VWX Mj\Z[ 	cJ:,VXY\]^Y_X`abb	cs   C=D  D 	D<D77D<c                    |j                   D ]  }t        d|j                   d|j                          t        d|j                          |j                  r|j                  j                         dk(  r| j                  j                  t        t              j                  t        t        j                  t        j                  k(        j                  t        j                  |j                  k(        j                  t        j                  dkD        j                  t        j                  j!                               j#                         }|st        d|j                          `|}nB|j                  j%                  d      D cg c]#  }|j                         s|j                         % }}g }|D ]  }| j                  j                  t        t              j                  t        t        j                  t        j                  k(        j                  t        j&                  |k(        j                  t        j                  |j                  k(        j)                         \  }}	|r#|j                  dkD  r|j+                  ||	f       t        d| d	|j                           |j                  }
d}|D ]  \  }}	|
dk  r nt        d
|	j&                   d|j                          t        d|j                          t-        |
|j                        }|dk  rh| j                  j                  t.              j                  t.        j                  |j                  k(        j)                         }|st        d|j                          | j                  j                  t0              j                  t0        j                  |j                  k(        j)                         }|r|j2                  n|j4                  }t        d| d|r|j2                  nd d       t7        |j                  |j                  d|dz  |dt9        j:                               }| j                  j=                  |       | j                  j?                          |j@                  dk(  s|j@                  dk(  r|}n(|j@                  dk(  r|jB                  }n|jD                  }tG        ||j                  |j                  |j                  |j                  ||      }| j                  j=                  |       | j                  j?                          t        d| d|	j&                   d|j                          t        d       |
|z  }
||z  }|
dk  s n |dkD  r| jI                  |j                  |d       ||j                  k  st        d| d|j                   d|j                           y c c}w )Nz[+] Processing product z with quantity z[+] Lot numbers:  r   z.[!] No hay lotes disponibles para el producto ,z	[!] Lote z) no encontrado o sin stock para producto z[+] Processing lot z for product z[+] Available quantity in lot: u0   [!] No se encontró inventario para el producto z([+] Unit cost para movimiento de venta: z (del kardex: zN/Arb   r;   Venta)inventory_idlot_item_idmovement_type_idr   ry   reasonrB   r0   )sale_idr.   inventory_movement_idr   r   r   pricez[+] Processed z
 from lot z3[+] Created movement record and sale product record)r.   rx   ry   u   [!] Warning: Solo se procesó z de z para el producto )%r   rk   r   r   lot_numbersstripr-   rH   r   r    rf   rg   rI   r.   rL   arrival_dateascrR   split
lot_numberrK   rj   minr   r$   rv   ry   r!   r(   rt   addrw   rV   private_sale_pricepublic_sale_pricer   r|   )r   r   rl   rn   available_lotslot_items_to_processrg   lot_idslot_itemlotquantity_to_processtotal_processedprocess_qty	inventoryrz   movement_unit_costinventory_movementr   sale_products                      r	   store_inventory_movementz"SaleClass.store_inventory_movement   s.   $$ I	xD+DGG9ODMM?ST%d&6&6%789 ##t'7'7'='='?2'E GGMM,9T(HKK<3F3F$FGVL33tww>?VL11A56Xh33779:SU  &J477)TU (6$ 9=8H8H8N8Ns8SffW]WcWcWe6<<>ff')$% fFlH=h|7J7J(JK 3 3v => 7 7477 BC "Hc  H$5$5$9,33XsOD	&1Z[_[b[bZcdef #'--O!5 Q#&!++CNN+;=	RS78I8I7JKL ""5x7H7HI!# GGMM.1VN55@AUW  !LTWWIVW GGMM"34V-88DGGCDUW  DQ]%?%?V^VhVh"@AS@TTb  BOcpc}c}  UZ  c[  [\  ]  ^ &<!* (%&)B.0"'||~&" ./  %%*k.@.@A.E.E"))Q. $ 7 7 $ 6 6  0##ww*<*?*?!* ((  L) {m:cnn=M][_[b[bZcdeKM ${2#;.&!+cQh "++#ww"1 ,  .66GtDMM?ZlmqmtmtluvwSI	x0 gs   W=$W=c                     	 | j                   j                  t              j                         }|r!|j                  rt        |j                        S y# t        $ r!}t        dt        |              Y d}~yd}~ww xY w)u2   Obtiene el costo de envío desde la tabla settingsg        z3[!] Error obteniendo shipping_cost desde settings: N)	r-   rH   r%   rK   delivery_costfloatrT   rk   rU   )r   settingr\   s      r	   get_shipping_costzSaleClass.get_shipping_costO  sh    	ggmmL1779G700W2233 	GAxPQ	s   AA 	A=A88A=c                    	 d}|D ]  }| j                   j                  t              j                  t        j                  |j
                  k(        j                         }|r|j                  }n|j                  }|j                  |z  }||z  }t        d|j
                   d|j                   d| d|         d}||z  }||z   }	t        d| d| d	|	        |||	fS # t        $ r!}
t        d
t        |
              Y d}
~
yd}
~
ww xY w)zPCalcula el subtotal de la venta basado en los costos del kardex para roles 1 y 2r   z[+] Producto rc   z x z = RQ?z[+] Subtotal kardex: z, Tax: z	, Total: z-[!] Error calculando total basado en kardex: N)r   r   r   )r-   rH   r$   rI   r.   r   rK   rv   r   r   rk   rT   rU   )r   
cart_itemsr=   rn   rz   ry   item_subtotaltax_rater?   r@   r\   s              r	   calculate_kardex_based_totalz&SaleClass.calculate_kardex_based_totalZ  s"   $	H" b GGMM"34V-88DGGCDUW  ! - : :I !% 6 6I !%	 9M)dggYbs9+SQ^P_`a'b, HX%CsNE)(73%yPQS%'' 	A#a&JK	s   CC! !	D*DDc                    	 t        |d      r|j                  sdddS g }|j                  D ]g  }|t        |d      rt        |d      s|j                  |j                  8|j                  dk  s|j                  dk  rW|j	                  |       i |sdddS ||_        | j                  |      \  }}|dk(  rdd	d
j                  |       dS |j                  dk(  s|j                  dk(  rd}d}ni| j                  j                  t              j                  t        j                  |j                  k(        j                         }	|	sd}|	j                  }d}| j                         }
|j                  dk(  s|j                  dk(  r | j!                  |j                        \  }}}n$|j"                  }|j$                  }|j&                  }|
dkD  rd}||
z   |z  }||
z   |z   }n||z   }t)        ||j*                  |j,                  ||||
|||j.                  t1        j2                               }| j                  j5                  |       | j                  j7                          | j                  j9                          | j                  j;                  |       | j=                  |j                  |       d|j                  dS # t>        $ r!}| j                  jA                          |d }~ww xY w)Nr   r5   zCart is empty or invalidr2   r   r   r   zNo valid items in cartz'Stock insuficiente para los productos: z, r0   r;      r   )rN   shipping_method_iddte_type_idrA   r=   r?   r>   r@   payment_supportdelivery_addressrB   zVenta registrada exitosamente.)r3   r   )!hasattrr   r   r   rj   r6   rf   rV   r-   rH   r   rI   rJ   customer_rutrK   r   r   r=   r?   r@   r   r   document_type_idr   r(   rt   r   flushrw   refreshr   rT   rollback)r   rl   
photo_pathvalid_cart_itemsrn   r3   failed_productsrN   rA   customer_datar>   r=   r?   r@   r   new_saler\   s                    r	   storezSaleClass.store  s   \	;/{7G7G%9   "#(( 	.<tT*'$
2K77?dmm&;77a<4==A#5 ''-	. $%7   0K&*&G&G&T#FO{%!HSbIcHde 
 !!Q&+*<*<*A	 $m < C CMDgDgkv  lD  lD  ED  !E  !K  !K  !M$"#K+..	 !224M !!Q&+*<*<*A'+'H'HIYIY'Z$#u&//!oo#)) q -/8; =036 !3 '#.#A#A'88#!+ *!,!=!=#<<>H GGKK!GGMMOGGNNGGOOH%))(++{C>8;;WW 	GGG	s*   K A>K 6K G5K 	K5K00K5c                 L   | j                   j                  t              j                  t        j                  |k(        j                         }	 |D ]   }| j                   j                  t              j                  t        j                  |j                  k(        j                         }| j                   j                  t              j                  t        j                  |j                  k(        j                  t        j                  |j                  k(        j                         }|j                  |j                  dz  z   }||_        t        j                         |_        | j                   j#                          | j                   j                  t$              j                  t$        j                  |j                  k(        j                         }t'        |j                        t'        |j                        z   |_        t        j                         |_        | j                   j#                          | j                   j)                  |       | j                   j#                          # y# t*        $ r$}| j                   j-                          Y d }~yd }~ww xY w)Nr   zInventory reject successfullyz Error trying to reject inventory)r-   rH   r   rI   r   rR   r!   r   r   rK   r"   r   r   r   r(   rt   ru   rw   r   intdeleterT   r   )	r   r   sales_productssales_productr   inventory_lot_itemr{   	lot_itemsr\   s	            r	   reversezSaleClass.reverse  s!   '78??@P@X@X\c@cdhhj	6!/ !%)WW]]3I%J%Q%Q*--1T1TT&%' # &*WW]]3H%I%P%PQfQsQs  xE  xR  xR  RR  &S  &Z  &Z  [p  [|  [|  @R  @^  @^  [^  &_  &e  &e  &g"1::>P>Y>Y\^>^_.:"+2:,,."/  GGMM,7>>|R_RkRk?klrrt	%(););%<s=CYCY?Z%Z	")1	& 12 #!& 3 	6GG5	6s   H&I6 6	J#?JJ#c                    	 | j                   j                  t        j                  t        j                  t        j
                  t        j                  t        j                  t        j                  t        j                  t        j                  t        j                  t        j                  t        j                  t        j                        j!                  t        t        j                  t        j"                  k(  d      j%                  t        j                  |k(        j'                         }|r|j                  |j                  |j
                  |j                  |j                  |j                  |j                  |j                  |j                  |j                  |j                  j)                  d      |j                  d}d|iS ddiS # t*        $ r}dt-        |      icY d }~S d }~ww xY w)NTisouter%d-%m-%Y %H:%M:%S)r   r=   r?   r@   r>   rA   r   r   r   r   rB   social_reason	sale_datar5   3No se encontraron datos para el campo especificado.)r-   rH   r   r   r=   r?   r>   r@   rA   r   r   r   r   rB   r   r   rf   rN   rI   rK   rS   rT   rU   )r   r   
data_queryr   r\   s        r	   getzSaleClass.get  s   &	%""''##%%,,))**$$++ d=-"2"2i6K6K"KUYdZ[a[abkbnbnrtbt[uv{v{v}  $-- * 3 3%>>'--%/%=%=!+!5!5#-#9#9*4*G*G'1'A'A(2(C(C","7"7"@"@AT"U%/%=%=	 $Y//  !VWW 	%SV$$	%s$   GG G 	G3G.(G3.G3c                    	 | j                   j                  t        j                  t        j                  t
        j                  t
        j                  t
        j                  t
        j                  t
        j                  t
        j                  t
        j                  t
        j                  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                  |k(        j-                         }|sddiS g }|D ]  }|j                  |j                  |j                  |j                  |j                  |j                  |j                  |j                  |j                  |j                  |j                  |j                  j/                  d      |j"                  d}|j1                  |        d|iS # t2        $ r}dt5        |      icY d }~S d }~ww xY w)NTr   r5   r   r   )r   r   r=   r?   r>   r@   rA   r   r   r   r   rB   r   r   )r-   rH   r   r   r   r   r=   r>   r?   r@   rA   r   r   r   r   rB   r   r   rf   r   r.   rI   rR   rS   rj   rT   rU   )r   r   r   r   rG   sale_detailsr\   s          r	   detailszSaleClass.details'  s   ,	% ## ))""''##%%,,))**$$$$ d9ill.>.F.FFPTdUVZVZ[giuixix  }M  }X  }X  jX  bfVZ  Wg  hn  hn  ox  o{  o{  A  oA  hB  CF  CF  CH   !VWWI" /'' $ $88%)%7%7!ZZ!%#'#3#3*.*A*A'+';';(,(=(="&//":":;N"O#||     .#/&  ++ 	%SV$$	%s%   E:H< =B>H< <	IIIIc                    | j                   j                  t              j                  t        j                  |k(        j                         }|sy	 ||_        t        j                         |_	        | j                   j                          | j                   j                  |       y# t        $ r4}| j                   j                          t        |      }d|dcY d }~S d }~ww xY w)Nr<   zSale updated successfullyr5   r2   )r-   rH   r   rI   r   one_or_nonerA   r(   utcnowru   rw   r   rT   r   rU   )r   r   rA   existing_saler\   r]   s         r	   change_statuszSaleClass.change_statusW  s    i077	8JKWWY"
	A&/M#)1):M&GGNNGGOOM*. 	AGGFM%-@@	As   AB( (	C%1)C C% C%c                    	 ddl m } | j                  j                  t        j                  j                  d      t        j                  j                  d      t        j                  j                  d      t        j                  t        j                  t        j                  t        j                  t        j                  j                  d      t         j"                  t         j$                  t&        j(                  t         j                  j                  d      t*        j,                  t*        j.                  t0        j2                  t4        j6                  j                  d            j9                  t        t        j:                  t        j                  k(        j9                  t0        t0        j                  t        j<                  k(        j9                  t&        t&        j                  t        j>                  k(        j9                  t         t         j                  t        j@                  k(        j9                  t*        t*        j                  t         jB                  k(        j9                  t        t        j                  t        j                  k(  d	
      j9                  t        t        j:                  t        j                  k(  d	
      j9                  tD        tD        j                  t0        jF                  k(  d	
      j9                  t4        t4        jH                  tD        jJ                  k(  d	
      }|rF|jM                         r6	  |jN                  |d      }|jQ                  t0        j2                  |k\        }|rZ|jM                         rJ	  |jN                  |d      }|jU                  ddd      }|jQ                  t0        j2                  |k        }|jW                         }d}|r|r
d| d| d}n|rd| d}n|rd| d}|sdd| ||dg dS i }	|D ]  }
|
j:                  }|
j@                  }||	vr|
j                  rtY        |
j                        nd}|
j                  r|
j                  nd}|
j"                  r|dkD  rtY        |
j"                        |z  nd}|
j$                  r|dkD  rtY        |
j$                        |z  nd}||
jZ                  |
j\                  ||dddddddddddddd|
j"                  rtY        |
j"                        nd|
j$                  rtY        |
j$                        nd||dd d!|	|<   |
j                  }|	|   d"   }||z  }|
j(                  }|dkD  r||z  n|}|dkD  r|
j^                  |z  n|
j^                  }||z  }||z  }|	|   d#xx   |z  cc<   |	|   d$xx   |z  cc<   |	|   d%xx   |z  cc<   |	|   d&xx   |z  cc<   |
j`                  d'k(  rd(}n|
j`                  d)v rd*}nd(}|d(k(  rN|	|   d+   d,xx   |z  cc<   |	|   d+   d-xx   |z  cc<   |	|   d+   d.xx   |z  cc<   |	|   d+   d/xx   d0z  cc<   ?|	|   d1   d,xx   |z  cc<   |	|   d1   d-xx   |z  cc<   |	|   d1   d.xx   |z  cc<   |	|   d1   d/xx   d0z  cc<    g }d}d}d}|	jc                         D ]z  }|d$   dkD  r|d&   |d$   z  nd}te        |d2      |d3   d4<   |d%   |d&   z
  }|d#   } | dkD  r|d+   d,   | z  d5z  nd}!| dkD  r|d1   d,   | z  d5z  nd}"|d   |d   |d   |d6   |d"   |d#   te        |d$   d2      |d3   |d+   d,   te        |d+   d-   d2      te        |!d0      te        |d+   d.   d2      |d+   d/   d7|d1   d,   te        |d1   d-   d2      te        |"d0      te        |d1   d.   d2      |d1   d/   d7d8te        |d%   d2      te        |d&   d2      te        |d2      |d%   dkD  rte        ||d%   z  d5z  d2      ndd9d:
}#|jg                  |#       ||d%   z  }||d&   z  }||z  }} |ji                  d; d	<       tk        |      te        |d2      te        |d2      te        |d2      |dkD  rte        ||z  d5z  d2      ndd=}$dd>tk        |       d?||d|$|d@S # tR        $ r dddcY S w xY w# tR        $ r dddcY S w xY w# tl        $ r}%ddAto        |%       dcY d }%~%S d }%~%ww xY w)BNr   r'   r.   ra   product_code
sale_pricer   user_rol_idTr   z%Y-%m-%dr5   u:   Formato de fecha inválido para start_date. Use YYYY-MM-DDr2      ;   )hourminutesecondu8   Formato de fecha inválido para end_date. Use YYYY-MM-DDr~   u    (período: z a rb   z	 (desde: z	 (hasta: successzNo se encontraron ventas)
start_dateend_date)r3   r4   periodrG   g      ?unidades)r   revenuerO   unit_measure_quantity)public_price_per_packageprivate_price_per_packagepublic_price_per_unitprivate_price_per_unitaverage_unit_cost_per_unit)r.   ra   r   unit_measurequantity_per_packagetotal_quantitytotal_unit_measure_quantitypublic_salesprivate_salestotal_revenue
total_costpricesr   r   r   r   r      public)r0   r;   privater   r   r   r   rO   r0   r   r;   r   r   d   r   )r   r   
percentager   transactions)r   r   )r   r   total_profitprofit_margin_percent)
r.   ra   r   r   r   quantity_soldunit_measure_quantity_soldr   sales_breakdowntotalsc                     | d   S )Nr   r   )xs    r	   <lambda>z,SaleClass.get_sales_report.<locals>.<lambda>@  s    a.@ r   )keyr   )total_productsr   r   r   overall_margin_percentzReporte generado para z
 productos)r3   r4   r   summaryrG   zError al generar reporte: )8r(   r-   rH   r   r   re   r   codeunit_measure_idr   r   r#   r   r   r   r   r   r   r   r!   ry   r    r   r   r   rB   r&   rV   rf   r.   r   r   r   rg   r   rN   rW   rJ   r   strptimerI   
ValueErrorreplacerR   r   ra   r   r   r   valuesroundrj   sortlenrT   rU   )&r   r   r   r(   individual_sales_querystart_datetimeend_datetimeindividual_salesfilter_infoproducts_datarZ   r.   r   r   unit_measure_namer   r   r   r   cost_per_packagecost_per_unitunit_measure_sale_pricer   cost
price_typeformatted_datar   r   r   product_dataavg_unit_cost_per_unitactual_profit	total_qtypublic_percentprivate_percentproduct_summaryr  r\   s&                                         r	   get_sales_reportzSaleClass.get_sales_reporti  s7
   j	Y)  OO)),7 ((..~> %%++N; 00$11$99$--$**00> 22 33*44 OO))-8''))(($$**=9!$ &(8(C(C|(VWi1A1I1I!IJ,.D.G.GK[KqKq.qrlLOO7G7S7S$STh|/B/B BC&(8(;(;|?[?[([eij&(8(C(C|(V`dem]%5%59N9N%NX\]i-2U2U!U_cd7 #> j..0x%6X%6%6z:%NN-C-J-J9K_K_cqKq-r* HNN,v#48#4#4Xz#JL#/#7#7RSU#7#VL-C-J-J9K_K_coKo-p*  699; Kh ,ZLH:QG )*Q7 )(15#'!9+G-7XN	  M( OM!__
"..]2OSOhOh51J1J+Knq(=A=N=N(9(9T^% eidzdz  @T  WX  @XE$2H2H,IL`,`  ^_)fjf}f}  CW  Z[  C[U43J3J-KNb-b  ab* '1(,(9(9(,(9(9(90D*+78561qkl(m67APQlm)n)*&'Y]YoYod>T>T8Uuv[_[r[rt?V?V9Wxy5J6L:;#1M*-.  =='4Z'@AW'X$(03G(G% $(>> K_bcKc 03G Giy UiklTl$//<P*Prv  sB  sB' 02II,}< j)*:;xG;j)*GHLaaHj)/:gE:j),74?7 ##q(!)J%%/!*J!)J )!*-n=jIXUI!*-n=>UVZooV!*-n=iHGSH!*-n=gF!KF!*-o>zJhVJ!*-o>?VW[ppW!*-o>yIWTI!*-o>wG1LG_OMd  NMJL - 4 4 6 4. vB  C`  va  de  vel)ClSpFq)q  kl&GLMcefGgX&'CD !-_ =\@Z Z ))9:	ajmnan,~">z"JY"VY\"\tuclopcp<#@#Ly#X[^#^vw #/|"<$0$@$0$@$0$@,89O,P%12B%C27Eb8cef2g*84 )5^(DZ(P5:<;WXo;prs5t*/*B',\.-I)-TVW'X,8,H,Q) )5_(Ej(Q5:<;XYp;qst5u*/*C',\/-J9-UWX'Y,8,I',R*(" */|O/La)P&+L,F&J(-mQ(? uA  BQ  uR  UV  uVUdHe8ehk8kno1p  \]	3#B %%o6 o!>>l<88
-i4.n $@$O #&n"5!&}a!8#J2 %lA 6\ilm\m%1MPS1SVW*XstG $3C4G3H
S)3J"& u " x&-:vwwx " v&-:tuuvt  	Y%4NsSTvh2WXX	Ysn   Mc% 5b= c% A	c #?c% #Rc% =cc% cc% c"c% !c""c% %	d	.d>d	d	)NNr   
   r   )NN)r   r   r   r
   r   r9   r^   r6   r|   r   r   r   r   r   r   r   r   r$  r   r   r	   r+   r+      sj    ^# ^ ^OAb/b$cLJxZ	&P]~68'%T-%`A$kYr   r+   N)r   r   app.backend.db.modelsr   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r(   
sqlalchemyr)   r+   r   r   r	   <module>r(     sK   ! !
  `  `  `  `  `  FY FYr   