
    VjM                     f   d Z ddlmZ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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mZmZmZmZ ddlmZ ddlmZ ddlm Z  dZ!d Z"d Z#d Z$d%dZ%d&dZ& ejN                  ddg      ed               Z( ejN                  ddg      ed               Z) ejN                  ddg      ed               Z* ejN                  d dg      ed!               Z+ ejN                  d dg      ed"               Z, ejN                  d#dg      ed$               Z-y)'z<API for quick physical-store sales and the local price list.    )Counterdefaultdict)datetime)uuid4)jsonifyrequest)api_bp)require_auth)SessionLocal)Ad)MonthlyTaxConfigProductTaxProfile)InventoryMovementLocalProductPrice	LocalSaleLocalSaleItemSalesChannel)TinyProduct)	TinyStock)PricingDataResolverg      $@c                 4    t        t        | xs d      d      S )Nr      )roundfloat)values    K/var/www/hypershopcomercio.com.br/hyper-ai/app/api/endpoints/local_sales.py_moneyr      s    uz"A&&    c                     | j                  t              j                  t        j                  dk(        j	                         }|s0t        dddd      }| j                  |       | j                          |S )Nlocalu   Loja físicaT)keynamechannel_type	is_active)queryr   filterr!   firstaddflush)dbchannels     r   _ensure_local_channelr,   !   s\    hh|$++L,<,<,GHNNPG7gaef
w

Nr   c                    | j                  t              j                  t        j                  j	                  d      t        j                  dk7        j                         }i }| j                  t              j                  t        j                  j	                  d      t        j                  dk7        j                         D ],  }|j                  |j                  j                         |       . t        t              }t        t              }i }| j                  t              j                  t        j                  j	                  d      t        j                  dk7        j                         D ]  }|j                  j                         }t        |j                  |j                  n|j                  xs d      }	||xx   |	z  cc<   ||   j                  |j                   xs d|	d       |j"                  s||vs|j"                  ||   kD  s|j"                  ||<    i }
|D ].  }|j                  j                         }|
j                  ||       0 |
||||fS )zReturn the one local product catalog keyed by SKU.

    Tiny is the catalog and stock source. Ads are optional enrichments used to
    resolve the existing fiscal cost profile.
    N r   Estoque localr"   	available)r%   r   r&   skuisnotallr   
setdefaultstripr   intlistr   r1   quantityappend	warehouselast_updated)r*   products
ads_by_skuadstock_by_skulocations_by_skulast_updated_by_skurowr2   r9   products_by_skuproducts               r   _product_mapsrF   *   s    xx$++KOO,A,A$,G\^I^_cceHJhhrl!!"&&,,t"4bfflCGGI 2bffllnb12 s#L"4(xx	")))--*=*=d*CY]]VXEXY]]_ 8ggmmo(As}}HYXY[SX%$$cmm.N]e%fg,?!?3CSCSVijmVnCn'*'7'7$8 O 1kk! 	""30	1
 J6FH[[[r   Nc                 r   g }d}d}d}| j                  t              j                  t        j                  dk(        j	                  t        j
                  j                               j                         }	|	sd}|j                  d       d}
|r| j                  t              j                  t        j                  |j                  k(  t        j                  dk(        j                         }
	 t        |       j                  |j                        }t        |j                  di       j                  d      xs d	      }|d	kD  r|}|j!                  |j                  d
      xs g        |d	k  r+t        |j$                  xs |r|j$                  nd	xs d	      }|	rBt        |
r|
j&                  r|	j(                  n|	j*                        }|
s|j                  d       |d	k  rd}|j                  d       t        ||n|r|j,                  nt.              }t1        dt3        |d            }d|dz  z
  |dz  z
  }d}|d	kD  r|d	kD  rt5        ||z        }n|d	k  rd}|j                  d       |}|r"|j6                  rt        |j8                        }n(|r&|$|j:                  dk(  rt        |j8                        }t5        |      ||t5        |      t5        |      |t=        t>        jA                  |            tC        |xr |j6                        dS # t"        $ r |j                  d       Y w xY w)zHResolve local selling price using existing fiscal data, without ML fees.        readyTfiscal_pendingu=   Cadastre a alíquota mensal para calcular o imposto da venda.Ncalculator_inputsfinal_product_costr   warningsuZ   Não foi possível resolver todo o custo fiscal; usando o custo do ERP quando disponível.uF   Perfil fiscal do produto não cadastrado; aplicado DAS padrão sem ST.cost_pendingu\   Produto sem custo. Informe o custo no Tiny ou concilie a NF-e antes de automatizar o preço.g     W@         Y@invalid_marginz>Margem e imposto somam 100% ou mais; reduza a margem desejada.)selling_pricesuggested_pricetarget_margin_percentcalculated_costtax_rate_percentstatusrM   is_manual_price)"r%   r   r&   r$   order_byreference_monthdescr'   r:   r   mlb_ididr   resolver   getextend	Exceptioncosthas_stdas_without_icms_ratefull_das_raterT   DEFAULT_MARGIN_PERCENTmaxminr   rX   rR   rW   r8   dictfromkeysbool)r*   rE   r?   saved_pricerequested_marginrM   rb   tax_ratefiscal_statusconfigprofileresolvedresolved_costmargindenominatorrS   rR   s                    r   _price_for_productrv   I   s   HDHMXX&'../?/I/IT/QR[[((--/eg  (WXG	((,-44$$-''4/
 %' 		z*2.66ruu=H!(,,/BB"G"K"KL`"a"fefgMq $OOHLL4:; qyW\\@bgg@qAW^^55Y_YmYmnOOdeqy&vw'7'C#-8))>TF c&$'(Fv~&(U*:;KOaxK!O !34		(XY#M{22k778	)1k6H6HG6Sk778  .*!'!$<"8,x01 K0K0KL	 	E  	zOOxy	zs   0A=L L65L6c                    t        |       \  }}}}}| j                  t              j                  t        j                  dk(        j                         D 	ci c]  }	|	j                  |	 }
}	|xs dj                         j                         }g }|j                         D ]  \  }}|j                  xs |}| d| j                         }|r||vr3|rd|vr:|j                  |      }t        | |||
j                  |      |      }|j                  |||j                  |r|j                  nd |r|j                  r|j                  nd |j                  |t!        |j"                  xs d            |j                  |dt!        |j"                  xs d      dg      ||v r||   j%                         nd t'        |j(                        t+        |xri | j                  t,        j                        j                  t,        j.                  |j                  k(  t,        j0                  dk(        j3                               d	
|        t5        |d
       S c c}	w )Nr    r.    bacr   r/   r0   T)
r2   r"   tiny_product_idad_id	thumbnailstock_availablestock_locationsstock_last_updated	tiny_costhas_fiscal_profilec                 (    | d   j                         S )Nr"   )lower)items    r   <lambda>z_catalog_rows.<locals>.<lambda>   s    4<+=+=+? r   )r!   )rF   r%   r   r&   channel_keyr4   r2   r6   r   itemsr"   r_   rv   r:   r]   r|   r7   stock	isoformatr   rb   rk   r   r\   r$   r'   sorted)r*   searchonly_bacrm   rD   r>   r@   rA   rB   pprices_by_skutermresultr2   rE   r"   
searchabler?   pricings                      r   _catalog_rowsr      s0   WdegWhTOZ/?AT((#45<<=N=Z=Z^e=efjjlqM  Lb!'')DF'--/ W||"suAdV_**,
D
*Z/^^C $R"m6G6G6LN^_&zz RUUd)+$+//S9K!5LM/33C?adelererewvwax:y9z{JMQdJd"5c":"D"D"Fjn-"&r (bhh7H7K7K.L.S.S!((BEE13D3N3NRV3V/eg#
 
 	0 &?@@;s   Iz/local/productsGET)methodsc                     t               } 	 t        j                  j                  dt              }t        | t        j                  j                  d      t        j                  j                  dd      j                         dk(  |      }t        d|t        |      d	      | j                          S # t        $ r3}t        d
t        |      d      dfcY d }~| j                          S d }~ww xY w# | j                          w xY w)Nrt   typeqr   falsetrue)r   r   rm   T)successdatacountFr   error  )r   r   argsr_   r   r   r   r   lenclosera   str)r*   rt   rowsexcs       r   list_local_productsr      s     
B!!(!7<<##C(\\%%j':@@BfL#	
 4D	JK 	
  C53s8<=sBB

C 	
s0   BB4 4	C0=C+C0C3 +C00C3 3Dz/local/pricing/bulkPOSTc                     t        j                  d      xs i } t        | j                  dt                    }|dk  s|dk\  rt        ddd      d	fS t        | j                  d
      xs g       }t               }	 t        |       t        ||      }d}d}|D ]  }|r|d   |vr|j                  t              j                  t        j                  |d   k(  t        j                  dk(        j                         }|s"t        |d   dd      }|j!                  |       |d   |_        ||_        |d   |_        |d   |_        |d   |_        d|_        |d   |_        |d   dk(  r|dz  }|dz  } |j1                          t        d|||d      |j3                          S # t4        $ rC}	|j7                          t        dt9        |	      d      dfcY d }	~	|j3                          S d }	~	ww xY w# |j3                          w xY w)NTsilentrT   r   d   Fz&A margem deve estar entre 0% e 99,99%.r     skus)rm   r2   r    r2   r   rR   r{   rU   rV   rW   rS   rI   rO   )r   updatedpendingrt   r   )r   get_jsonr   r_   rf   r   setr   r,   r   r%   r   r&   r2   r   r'   r(   r{   rT   rU   rV   rW   rX   rR   commitr   ra   rollbackr   )
r   rt   selected_skusr*   r   r   r   rC   pricer   s
             r   apply_local_pricing_bulkr      s    4(.BD48835KLMFzVs]53[\]_bbb(.B/M	Bb!R&9 	CU=!@HH./66!%%U35F5R5RV]5]eg  )c%jg]^_ug,EK*0E'$'(9$:E!%();%<E"x=EL$)E!"%&7"8E8}'11'	( 			4G[abc
 	
	  C
53s8<=sBB

	C 	
s1   =DF) )	G52(G0G5G8 0G55G8 8H
z/local/pricing/<sku>PUTc                     t        j                  d      xs i }t               }	 t        |       t	        |      \  }}}}}|j                  |       }|s t        ddd      df|j                          S |j                  t              j                  t        j                  | k(  t        j                  dk(        j                         }|st        | dd	      }|j                  |       |j                  d
      }t        |||j                  |       ||      }	| |v r||    j                   nd |_        |	d
   |_        |	d   |_        |	d   |_        |	d   |_        |j                  d      |_        |j                  d      Kt/        |d         }
|
dk  r t        ddd      df|j                          S t1        |
      |_        d|_        n|	d   |_        d|_        |j7                          t        dd| it        |||j                  |       |      d      |j                          S # t8        $ rC}|j;                          t        dt=        |      d      dfcY d }~|j                          S d }~ww xY w# |j                          w xY w)NTr   Fu&   Produto não encontrado para este SKU.r     r    r   r   rT   rU   rV   rW   notesrR   u'   O preço local deve ser maior que zero.r   rS   r2   r   r   r   )r   r   r   r,   rF   r_   r   r   r%   r   r&   r2   r   r'   r(   rv   r]   r{   rT   rU   rV   rW   r   r   r   rR   rX   r   ra   r   r   )r2   r   r*   rD   r>   _rE   r   rt   r   rR   r   s               r   update_local_product_pricer      sc    4(.BD	B$b!/<R/@,Q1!%%c*u7_`acff> 	
= *+22!!S(*;*G*G7*R

%' 	 %#7RSTEFF5M12$R*..2EufU,/:,=jo((4&-.E&F# '(9 :!();!<x(hhw'88O$0!$"78M!5;defhkk 	
 #)"7E$(E!")*;"<E$)E!
		4%1|@RSUW^`j`n`nor`suz@{1|}~
 	
	  C
53s8<=sBB

	C 	
s=   >H, 5D0H, 6A%H, ,	I85(I3I8I; 3I88I; ;Jz/local/salesc                  d   t               } 	 t        t        t        j                  j                  ddt              d      d      }| j                  t              j                  t        j                  j                               j                  |      j                         }|D cg c]  }|j                   }}t        t               }|r| j                  t"              j%                  t"        j&                  j)                  |            j                         D ]j  }||j&                     j+                  |j,                  |j.                  |j0                  t3        |j4                        t3        |j6                        d       l |D cg c]  }|j                  |j8                  |j:                  t3        |j<                        t3        |j>                        t3        |j@                        |jB                  |j                  r|j                  jE                         nd ||j                     d	 }}tG        d|d	      | jI                          S c c}w c c}w # tJ        $ r3}tG        d
tM        |      d      dfcY d }~| jI                          S d }~ww xY w# | jI                          w xY w)Nlimit   r   rO   r   )r2   product_namer9   
unit_price
line_total)	r]   customer_namepayment_methodsubtotaldiscount_amounttotal_amountrW   completed_atr   Tr   Fr   r   )'r   rh   rg   r   r   r_   r7   r%   r   rY   r   r[   r   r4   r]   r   r8   r   r&   sale_idin_r:   r2   r   r9   r   r   r   r   r   r   r   r   rW   r   r   r   ra   r   )	r*   r   salessalesale_idsitems_by_saler   r   r   s	            r   list_local_salesr     s    
BC(("3(?CSI#,,Y-C-C-H-H-JKQQRWX\\^(-.DGG..#D)/66}7L7L7P7PQY7Z[__a dll+2288T5F5FTXTaTa"("9PTP_P_I`4    ''D,>,>RVReRet}}-&I]I]B^"4#4#45=A=N=ND--779TX"477+
   467 	
' /  C53s8<=sBB

C 	
sP   BI 'I:CI B'I4I 
I 	J'J?J J JJ J/c                     t        j                  d      xs i } | j                  d      xs g }|st        ddd      dfS t	               }|D ]r  }t        |j                  d      xs d	      j                         }t        |j                  d
      xs d      }|r|dk  rt        ddd      dfc S ||xx   |z  cc<   t t               }	 t        |       t        |      \  }}}	}	}	i }
|j                         D ]  \  }}|j                  |      }|s&t        dd| dd      dfc |j                          S |j                  t              j                  t        j                   |k(        j#                         j%                         }t        |r|j&                  |j&                  n|j(                  xs d      }||k  r7t        dd|j*                  xs | d| dd      dfc |j                          S |||f|
|<   
 t-        |
j                               D ]5  \  }\  }}}|rt        |d|d|      }|j/                  |       |||f|
|<   7 t1        dt3               j4                  d d j7                          | j                  d      xs d	j                         xs d | j                  d      xs d	j                         xs d | j                  d      xs d	j                         xs d dt9        j:                               }|j/                  |       |j=                          d}|D ]/  }t        |d         j                         }t        |d
         }|
|   \  }}}	|j                  t>              j                  t>        j                   |k(  t>        j@                  dk(        j%                         }tC        |||j                  |      |      }tE        |j                  d      |j                  d      n|d          }|dk  r3t        d|j*                  xs | d!d      dfc |j                          S tE        ||z        }||z  }tE        ||d"   z  d#z        }|j/                  tG        |jH                  ||j*                  xs ||jH                  ||v r||   jH                  nd |||d$   |d%   |d"   ||&             t        |r|j&                  |j&                  n|j(                  xs d      }||z
  }||_        |j/                  tK        d't3               j4                  d d j7                          |d(| ||d(|jH                  d)d*+
             2 tE        | j                  d,            }|dk  s||kD  r t        dd-d      df|j                          S tE        |      |_&        ||_'        tE        ||z
        |_(        |jS                          t        d|jH                  |jP                  |jT                  d.d/      d0f|j                          S # tV        $ rC}|jY                          t        dt        |      d      d1fcY d }~|j                          S d }~ww xY w# |j                          w xY w)2NTr   r   Fz)Adicione ao menos um produto ao carrinho.r   r   r2   r.   r9   r   z/Cada item precisa de SKU e quantidade positiva.zProduto u#    não encontrado no catálogo Tiny.r   zEstoque insuficiente para u   . Disponível: .  Local (Tiny + Hyper)r2   r;   r9   reservedr1   zLS-   r   r   r   	completed)r]   r   r   r   rW   r   rH   r    r   rR   u"    não possui preço local válido.rV   rP   rU   rT   )r   r2   r   rz   r{   r9   r   	unit_costrT   rV   
tax_amountr   IM-
local_saler   uC   Baixa por venda local; aguardando integração de escrita com Tiny.
r]   r2   movement_typequantity_deltaquantity_beforequantity_afterreference_typereference_idsync_statusr   r   u,   Desconto inválido para o total do carrinho.)r]   r   rW   r      r   )-r   r   r_   r   r   r   r6   r7   r   r,   rF   r   r   r%   r   r&   r2   with_for_updater'   r1   r   r"   r8   r(   r   r   hexupperr   utcnowr)   r   r   rv   r   r   r]   r   r   r   r   r   rW   ra   r   )r   	raw_itemsrequested_quantitiesrawr2   r9   r*   rD   r>   r   locked_stockrE   r   r1   r   r   rl   r   r   r   r   beforeafterdiscountr   s                            r   create_local_saler   :  su    4(.BD!'RI53^_`beee"9 .#''%.&B'--/swwz*/a0h!mu7hijloooS!X-!. 
BPb!/<R/@,Q11779 	<MC%))#.G5XcUJm;nopruuuR 	
Q HHY'..y}}/CDTTV\\^E%//:UU__\c\i\i\nmnqI8#5=WX_XdXdXkhkWll{  }F  |G  GH  <I   J  K  MP  P  PJ 	
I "' ;L	< 15\5G5G5I0J 	@,C,%)!'=	) u%*GY$?S!	@ UW[["%++-./88O4:AACKt HH%56<"CCEM88G$*113;t!*
 	t

 	Cc%j/'')C3z?+H ,S 1E7A((#45<<!%%,.?.K.Kw.Veg  )WjnnS6I;WG9N9Z 5`ghw`xyJQ5gll>Qc=RRt;uvwy|||B 	
A  
X 56J
"H
W5G-H H5 PQJFF=Sw||7Js\c\f\f,/:,=jo((4RZ%9J1K&-.E&FY`asYt%*  Eeoo6QX_XeXeXjijlFX%E#EOFF$Sb)//123L (y&QV+$''y[	 1	> $((#456a<8h.u7efgill 	
 x('"8h#67
		4QUQbQbnrnyny1z{|  B  B
 	
	  C
53s8<=sBB

	C 	
sS   AX( <B/X( <0X( -HX( EX( ,A+X( (	Y41(Y/Y4Y7 /Y44Y7 7Z	z/local/sales/<sale_id>/cancelc                    t               }	 |j                  t              j                  t        j                  | k(        j                         j                         }|s t        ddd      df|j                          S |j                  dk(  r t        ddd      df|j                          S |j                  t              j                  t        j                  |j                  k(        j                         }|D ].  }|j                  t              j                  t        j                  |j                  k(        j                         j                         }t        |r|j                   |j                   nd      }||j"                  z   }|s+t        |j                  d	ddd
      }|j%                  |       ||_        |j%                  t'        dt)               j*                  d d j-                          |j                  d|j"                  ||d|j                  dd
             1 d|_	        t/        j0                         |_        |j5                          t        d|j                  |j                  dd      |j                          S # t6        $ rC}|j9                          t        dt;        |      d      dfcY d }~|j                          S d }~ww xY w# |j                          w xY w)NFu   Venda não encontrada.r   r   	cancelledu   Esta venda já foi cancelada.r   r   r   r   r   r   local_sale_cancelr   r   uU   Estorno por cancelamento de venda local; aguardando integração de escrita com Tiny.r   T)r]   rW   r   r   )r   r%   r   r&   r]   r   r'   r   r   rW   r   r   r4   r   r2   r7   r1   r9   r(   r   r   r   r   r   r   cancelled_atr   ra   r   r   )	r   r*   r   r   r   r   r   r   r   s	            r   cancel_local_saler     sO    
Bxx	"))),,'*ABRRTZZ\u7OPQSVV4 	
3 ;;+%u7VWXZ]]0 	
/ '..}/D/D/OPTTV 	DHHY'..y}}/HIYY[aacEEeoo6QWXYFT]]*E!dhh:P[\ghtuvu#EOFF$Sb)//123Qd#}}fUZ+$''ym	 	 "$OO-
		44;;1WXY
 	
	  C
53s8<=sBB

	C 	
s=   A"J ?J .GJ 	K (KK K# K  K# #K5)NN)NFN).__doc__collectionsr   r   r   uuidr   flaskr   r   app.apir	   app.api.endpoints.authr
   app.core.databaser   app.models.adr   app.models.fiscalr   r   app.models.local_salesr   r   r   r   r   app.models.tiny_productr   app.models.tiny_stockr   app.services.pricing.resolverr   rf   r   r,   rF   rv   r   router   r   r   r   r   r    r   r   <module>r	     sj   B ,   "  / *  A  0 + =  '\>EPAD %1  2" #fX6&  7&R $ug6'  7'T nug.  /6 nvh/_  0_D -x@  Ar   