
    7iH0                         S r SSKrSSKrSSKrSSKrSSKrSSKJr  SSK	J
r
  SSKJr   SSKrSSKrS rS rS rSS	 jrS
 rS rS rSS jrSS jrg! \ a    SrSr N.f = f)z:Shared helpers: geo, taxa, printing, delivery persistence.    N)session)conectar)obter_dados_lojac                 *   Sn[         R                  " X -
  5      n[         R                  " X1-
  5      n[         R                  " US-  5      S-  [         R                  " [         R                  " U 5      5      [         R                  " [         R                  " U5      5      -  [         R                  " US-  5      S-  -  -   nS[         R                  " [         R
                  " U5      [         R
                  " SU-
  5      5      -  n[        XH-  S5      $ )Ng     @      )mathradianssincosatan2sqrtround)	lat1lon1lat2lon2Rdlatdlonacs	            .\helpers_app.pyhaversine_kmr      s    A<<$D<<$Da$((4<<+=">$,,W[J\A]"]`d`h`himpqiq`rvw`w"wwA	DJJtyy|TYYq1u%566A?    c                 n   U (       a  [        U R                  5       5      S:  a  gSnU SSS.nSS0n [        R                  " XUS	S
9nUR                  S:w  a  gUR                  5       nU(       d  g[        US   S   5      [        US   S   5      4$ ! [         a  n[        SU5         S nAgS nAff = f)N   NNz*https://nominatim.openstreetmap.org/searchjsonr   )qformatlimit
User-Agentznovaloja-geocoder/1.0   )paramsheaderstimeout   r   latlonz[GEOCODE ERRO])	lenstriprequestsgetstatus_coder   float	Exceptionprint)enderecourlr%   r&   rdataes          r   geocodificarr8      s    s8>>+,q0
6Cv:F45G
LLWaH==CvvxT!WU^$eDGEN&;;; "s#   &B B 2!B 
B4B//B4c           
          SnU SU SU  SU SU S3
n[         R                  " USSS0S	9nUR                  S
:w  a  g UR                  5       nU(       a  UR                  S5      S:w  a  g UR                  S5      =(       d    / nU(       d  g US   R                  S5      n	U	c  g [	        U	S-  S5      $ ! [
         a  n
[        SU
5         S n
A
g S n
A
ff = f)Nz/http://router.project-osrm.org/route/v1/driving/,;z.?overview=false&alternatives=false&steps=falser$   r#   znovaloja-osrm/1.0)r'   r&   r(   codeOkroutesr   distanceg     @@r   z[OSRM ERRO])r-   r.   r/   r   r   r1   r2   )lat_lojalon_lojalat_clilon_clibaser4   r5   r6   r?   dist_mr7   s              r   distancia_osrm_kmrG   1   s    @az8*AgYay@noLLa,@S1TU==Cvvxtxx'4/(#)rz*>Vf_a(( mQs.   ;B4 ,B4 +!B4 B4 %B4 4
C>CCc                    [        U5      nUS   nUS   nU R                  SS5      U R                  SS5      U R                  SS5      U R                  SS5      U R                  SS5      S	/nS
R                  U Vs/ s H  of(       d  M  UPM     sn5      n[        U5      u  pUb'  U	b$  [	        X4X5      n
U
b  XU	4$  [        X4X5      nXU	4$ gs  snf ! [         a  n[        SU5        SX4s SnA$ SnAff = f)uD   Calcula distância entre a loja e o cliente usando dados cadastradoslatitude	longituder3    nrocasabairrocidadeestadoBrasil, Nz[HAVERSINE ERRO]r   )r   NN)r   r.   joinr8   rG   r   r1   r2   )dados
id_clientelojaloja_latloja_lonpartespendereco_strrC   rD   	dist_osrmdist_havr7   s                r   calcular_distancia_clienter]   G   s   J'DJHK H 			*b!		)R 		(B		(B		(BF 995A1a56L#L1Gw2%h'K	 w..	'#HIHg--  6  	'$a(g&&	's*   =
CC?C 
C9C4.C94C9c           	         SnSn [        5       nUR                  SS9nUR                  S5        UR                  5       nU(       d>  [	        S5          U(       a  UR                  5          U(       a  UR                  5         ggUR                  S5      nUR                  S5      nUb\  X:  aW  Ub  [        U5      OSn[	        S	U  S
U SU 35        U U(       a  UR                  5          U(       a  UR                  5         $ $ [        SS5       H  nUR                  SU S35      nUR                  SU S35      n	Uc  M2  X::  d  M9  U	b  [        U	5      OSn[	        S	U  SU SU 35        Us   U(       a  UR                  5          U(       a  UR                  5         $ $    UR                  S5      n
U
b  [        U
5      OSn[	        S	U  SU 35        U U(       a  UR                  5          U(       a  UR                  5         $ $ ! [         a     GNf = f! [         a     gf = f! [         a     GNMf = f! [         a     $ f = f! [         a     Nf = f! [         a     $ f = f! [         a     Nf = f! [         a     $ f = f! [         ah  n[	        SU5         SnA U(       a  UR                  5         O! [         a     Of = f U(       a  UR                  5         gg! [         a     gf = fSnAff = f!  U(       a  UR                  5         O! [         a     Of = f U(       a  UR                  5         f f ! [         a     f f = f= f)uF   Calcula taxa de entrega baseado na distância usando tabela txentrega.NT
dictionaryz'SELECT * FROM txentrega WHERE chave = 1z5[TAXA ENTREGA] Nenhuma faixa configurada em txentregag        faixa1_dfaixa1_vu   [TAXA ENTREGA] Distância u   km é menor que faixa1_d (u!   km), retornando taxa mínima: R$ r      faixa_d_vzkm cai na faixa z: R$ 	faixa10_vz"km ultrapassa todas as faixas: R$ z[TAXA ENTREGA ERRO])
r   cursorexecutefetchoner2   closer1   r.   r0   range)	distanciaconnrh   rd   	faixa_1_d	faixa_1_vtaxaifaixa_dfaixa_v
faixa_10_v
taxa_finalr7   s                r   calcular_taxa_entregarw   d   sc   DF/z-@A!IJ<		

 E IIj)	IIj)	 Y%:'0'<5##D,YK7QR[Q\\}  C  ~D  E (		

 1 q"Aii%s".Gii%s".G"y';)0)<uW~#29+=MaSPUVZU[\]		

 1  YY{+
*4*@U:&c
*9+5WXbWcde		

   		
  		  		
  		  		
  		  		
  		  #Q'	 			

  			 			

  		sE  AJ H ,H AJ H,-H=:J J 'J 3II$5J I-2I=
HH
H)(H),
H:9H:=
I
	I

II
I*)I*-
I:9I:=
J
	J

K?K:#L (K   
KKK* *
K76K7:K??L MLM
L)&M(L))M-MM
MMMMc                     U (       d  U $ 0 nU R                  5        H7  u  p#[        U[        R                  5      (       a  [	        U5      X'   M3  X1U'   M9     U$ )z6Converte Decimal para float para que jsonify funcione.)items
isinstancedecimalDecimalr0   )rowoutkvs       r   convert_typesr      sK    

C		a))1XCFF	 
 Jr   c                     Sn Sn [        5       n U R                  5       nUR                  S5        UR                  S5        UR                  5       nU(       a  US   OS  U(       a  UR	                  5          U (       a  U R	                  5         $ $ ! [
         a     N&f = f! [
         a     $ f = f! [
         ah  n[        SU5         SnA U(       a  UR	                  5         O! [
         a     Of = f U (       a  U R	                  5         gg! [
         a     gf = fSnAff = f!  U(       a  UR	                  5         O! [
         a     Of = f U (       a  U R	                  5         f f ! [
         a     f f = f= f)uE   Obtém o nome da impressora ativa da tabela impressoras (imprenro=1).Nz
            CREATE TABLE IF NOT EXISTS impressoras (
                id INT AUTO_INCREMENT PRIMARY KEY,
                nomedaimpressora VARCHAR(255) NOT NULL,
                imprenro TINYINT NOT NULL DEFAULT 0
            )
        zCSELECT nomedaimpressora FROM impressoras WHERE imprenro = 1 LIMIT 1r   z[IMPRESSORA DB ERRO])r   rh   ri   rj   rk   r1   r2   )rn   rh   r}   r7   s       r   get_printer_from_dbr      s_   DFz	
 	\]oos1v$&
		

   		
  		  $a(	 			

  			 			

  		s   AB2 !B9B"
BB"
B/.B/2
D$<DD' C% %
C21C26D 
DDD$$D' 'E;)E E;
EE;EE;E+)E;+
E85E;7E88E;c                    [         R                  S:w  d  [        c  g U=(       d    [        R                  " 5       n[        R                  " U5      n [        R
                  " USS5      n [        R                  " U5        [        U [        5      (       a  U nO[        U 5      R                  SSS9nUS	-  nU(       aZ  UR                  5       R                  5       nS
U;   d  SU;   a  US-  nO/SU;   a  US-  nO#SU;   d  SU;   d  SU;   a  US-  nOUS-  nOUS-  n[        R                  " XF5        [        R                  " U5        [        R                  " U5         [        R                   " U5        g! [        R                  " U5        f = f! [        R                   " U5        f = f! ["         a  nS[        U5      4s SnA$ SnAff = f)z+Envia texto RAW para impressora no Windows.win32N)Fu>   Impressão silenciosa disponível apenas no Windows (pywin32).r   )PedidoNRAWcp1252replace)errorss   dbematechdarumas   mepsons   ielgintancadiebolds   V )TNF)sysplatform
win32printGetDefaultPrinterOpenPrinterStartDocPrinterStartPagePrinterrz   bytesstrencoder,   lowerWritePrinterEndPagePrinterEndDocPrinterClosePrinterr1   )	conteudoprinter_namemarca_impressoranomehPrinterhJobr6   marcar7   s	            r   send_to_printerr      s   
||w*"4V =z;;=))$/	.--h;RSD3++H5h..#Dx=///KDO+D' 0 6 6 8 > > @%.(e2C K/D$- K/D$-E1AYRWEW O3D K/D+''7))(3((2##H- ((2##H- c!f}sN   4F. F ,CE8 
F !F. 8FF F++F. .
G8G
G
Gc                 l	   SnSn U R                  S5      nSSSSSSSS.nU GH  nUR                  S5      (       a%  UR                  SS5      R                  5       US'   M?  UR                  S5      (       a%  UR                  SS5      R                  5       US	'   Mz  UR                  S
5      (       a%  UR                  S
S5      R                  5       US'   M  UR                  S5      (       a%  UR                  SS5      R                  5       US'   M  UR                  S5      (       a  UR                  SS5      R                  5       nUR                  S5      n	[	        U	5      S:  a  U	S   R                  5       US'   [	        U	5      S:  a  U	S   R                  5       US'   GM  GM  SU;   d  GM  UR                  SS5      R                  5       n
 [        U
5      US'   GM     US   (       d>  [        S5         U(       a   UR                  5         U(       a   UR                  5         gg[        5       nUR                  SS9nU GHd  nUR                  SS5      n[        UR                  SS5      5      n[        UR                  SS5      5      nUR                  SS5      nUR                  SS5      nSU;   a  SnSn[        R                  " S5      n/ S QnUS   US   US	   US   US   US   US   UUUUUUR                  S!US   5      U/nUb"  UR                  S"5        UR                  U5        S#S$R                  U5       S%S$R                  S&/[	        U5      -  5       S'3nUR!                  UU5        UR#                  5         [        S(U S)U S*U S+US    S,U 3
5        GMg      U(       a   UR                  5         U(       a   UR                  5         gg! [         a
    SUS'    GM  f = f! [         a     GNf = f! [         a     gf = f! [         a  n[        S-U 35        e SnAff = f! [         a     Nf = f! [         a     gf = f! U(       a"   UR                  5         O! [         a     Of = fU(       a"   UR                  5         f ! [         a     f f = ff = f).z1Grava dados do pedido na tabela deliverypendente.N
rK   r   )telefonecepr   r3   rL   complemento	nropedidozTel:r   zCEP:r   zNome:r   zCompl:r   zEnd:r;   r   r3   r   rL   zPEDIDO NRO:r   u/   [DELIVERY PENDENTE] Sem telefone, não gravandoTr_   precoqtdchaveclassezTAXA ENTREGA	TXENTREGArT   )r   r   r   r   r3   rL   r   produtor   
quantidadecodigoprodutor   clienterT   r   formapagamentozINSERT INTO deliverypendente (rQ   z
) VALUES (z%s)z[DELIVERY PENDENTE] z	 (chave: z
, classe: z) gravado para z
 | Forma: z[DELIVERY PENDENTE ERRO] )split
startswithr   r,   r+   intr1   r2   rk   r   rh   r.   r0   r   appendrR   ri   commit)r   produtosforma_pagamentorn   rh   linhascliente_datalinhaend_inforX   nro_strprod	prod_nome
prod_precoprod_qtd
prod_chaveprod_classerT   colunasvaloressqlr7   s                         r   gravar_delivery_pendenter      s   DFf%
 E''+0==+D+J+J+LZ(!!&))&+mmFB&?&E&E&GU#!!'**',}}Wb'A'G'G'IV$!!(++.3mmHb.I.O.O.Q]+!!&)) ==4::<!,v;!#/5ay/@L,v;!#.4Qioo.?L+ $%'--r:@@B203GL-' , J'CDt  

 } z-D,Itxx34J488E1-.H'2.J((8R0K*(
) \2JG" [)Z(U#V$Z(Y']+  L,@AG  */0/2499W3E2FjQUQZQZ\`[adghodp[pQqPrrstCNN3(KKM&yk:,jQ\P]]lmy  {E  nF  mG  GQ  Ra  Qb  ca n  

 G ! 201L-2B  
    )!-.  
    

  s   F(P 3 P O&"P O= P /FP <P? Q &O:5P 9O::P =
P
P
PP
P<(P77P<<Q ?
QQ
QQR3(Q98R39
RR3R
R3R"!R3"
R/,R3.R//R3)Nr   )__doc__r{   r	   r   mysql.connectormysqlr-   flaskr   databaser   services.dados_lojar   r   win32apir1   r   r8   rG   r]   rw   r   r   r   r    r   r   <module>r      sx    @   
     0&,:3l
 F$NjC  JHs   A 
A! A!