o
     i]                     @   s  d dl mZmZmZmZmZ d dlmZ d dlZd dl	Z	d dl
m
Z
 d dlZd dlZd dlZd dl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
lmZmZ d dlmZmZm Z mZ! d dl"m#Z#m$Z$ d dl%m&Z& d dl'Z(d dl)Z)ee*Z+ee+ dZ,dZ-dZ.dZ/dZ0ej1e,dd ej1e-dd ej1e.dd ej2ej3d e4e*Z5dd Z6dd Z7dd Z8dd Z9e+:ddd  Z;e+j:d!d"gd#d$d% Z<e+j:d&d"gd#d'd( Z=e+j:d)d"gd#d*d+ Z>e+j:d,d"gd#d-d. Z?e+j:d/d0gd#d1d2 Z@e+j:d3d"gd#d4d5 ZAe+j:d6d"gd#d7d8 ZBe+Cd9d:d; ZDe+Cd<d=d> ZEe*d?krjejFGe0sBe5Hd@e0  e5IdA e5IdB e5IdC e5IdD e5IdE e5IdF e+jJddGdHdI dS dS )J    )Flaskrequestjsonify	send_filerender_template)CORSN)datetime)BytesIO)Imagecanvas)letterA4)inch)blackblue)SimpleDocTemplate	ParagraphSpacerr
   )getSampleStyleSheetParagraphStyle)secure_filename
documentoszdocumentos/firmadoszdocumentos/firmas_digitalesz'documentos/firmados/registro_firmas.logz6documentos/Terminos_y_Condiciones_Sistemas_MiG_SAS.pdfT)exist_ok)levelc                 C   sL   t d| } | ddd} tdd| }tdd|}|ddd	 S )
z2Limpia un texto para usarlo como nombre de archivoNFKDASCIIignorez[^\w\s-] z[-\s]+_N2   )unicodedata	normalizeencodedecoderesubstrip)textotexto_limpio r*   ,/var/www/html/TerminosYCondicionesMig/app.pylimpiar_nombre_archivo*   s
   r,   c                 C   sZ   t  d}ttddd}|d| d|  d W d   dS 1 s&w   Y  dS )	z%Registra eventos en el archivo de log%Y-%m-%d %H:%M:%Sazutf-8)encoding[z] 
N)r   nowstrftimeopenLOG_FILEwrite)mensaje	timestampfr*   r*   r+   
log_evento4   s   "r:   c           	      C   s   zQt | }t |}g }ttD ].}|dr>|| d| dr>tjt|}t	tj
|}|||d|d q|rO|jdd dd |d	 W S W d
S  tyt } ztd|  d| dt|  W Y d
}~d
S d
}~ww )uj   
    Busca si existe una firma/aceptación para la combinación específica de NIT + Nombre Comercial
    .pdfr   r-   )archivofechar8   c                 S      | d S )Nr8   r*   xr*   r*   r+   <lambda>Q       z2buscar_firma_por_nit_y_comercial.<locals>.<lambda>Tkeyreverser   NzError buscando firma para NIT z y comercial : )r,   oslistdirFIRMADOS_FOLDERendswith
startswithpathjoinr   fromtimestampgetctimeappendr3   sort	Exceptionloggererrorstr)	nitnombre_comercial
nit_limpiocomercial_limpioarchivos_coincidentesr<   ruta_completafecha_creacioner*   r*   r+    buscar_firma_por_nit_y_comercial:   s0   

 r^   c           '      C   s&  zet d t| }t|}t|}t d}| d| d| d| d}tjt	|}tj
trzDddl}	ddlm}
 ddlm} ddl}t d	 | }|
j||d
}|\}}|dd ||d |d d ||d |d d |dd |d }|d|d|  |d|d d|  |d|d d|   |d|d dt d  |d|d dtrtjnd  |dd |d|d  d! |d|d" d# |d|d$ d% |d|d& d' |d|d( d) |dd |d|d* d+ |d|d, d- |  |d |	 }ttd.}|	|}|jD ]}|| q0W d   n	1 sDw   Y  |	|}||jd  t|d/}| | W d   n	1 slw   Y  t d0 ||fW W S  t!y } zt "d1|  W Y d}~nd}~ww t d2 t#||ddd3}g }t$ }t%d4|d5 d6d7d8t&d9}t%d:|d; d<d=t&d>}t%d?|d@ dAddBt&d9}t'dC|}|(| t'dD|} |(|  |(t)d8dE dF| dG| dH|  dIt d dJtr tjnd dK}!|(t'|!| |(t)d8dE dL}"|(t'|"| |(t)d8dE dM}#|(t'|#| |(t)d8dE dN}$|(t'|$| |(t)d8dO dP}%|(t'|%| |*| t dQ|  ||fW S  t!y } zt +dRt,|  ddl-}&t +dS|&.   W Y d}~dTS d}~ww )UuL   
    Crea un certificado de aceptación de términos sin firma dibujada
    u*   === CREANDO CERTIFICADO DE ACEPTACIÓN ===z%Y%m%d_%H%M%Sr   r;   r   Nr   )r   u5   Combinando PDF original con página de aceptación...)pagesizezHelvetica-Bold      d   u   CERTIFICADO DE ACEPTACIÓN   u   TÉRMINOS Y CONDICIONES	Helvetica      r    z	Empresa:    zNombre Comercial: zNIT: K   u   Fecha de Aceptación: z%d/%m/%Y %H:%M:%Su   Dirección IP: N/A
      z<El representante legal de la empresa mencionada declara que:   u7   ✓ Ha leído completamente los términos y condiciones   u8   ✓ Comprende y acepta todas las cláusulas establecidas   u;   ✓ Tiene autoridad para representar y obligar a la empresa   u,   ✓ Acepta que este acto tiene validez legali  uS   Este documento certifica la aceptación electrónica de los términos y condicionesi,  z2de MIG SISTEMAS SAS conforme a la Ley 527 de 1999.rbwbu5   ✓ Certificado creado con PDF original + aceptaciónz1No se pudo combinar, creando certificado simple: z-Creando certificado completo con ReportLab...)r_   	topMarginbottomMarginTituloCustomHeading1         )parentfontSize
spaceAfter	alignment	textColorSubtituloCustomHeading2      )ry   rz   r{   r}   NormalCustomNormal      u"   CERTIFICADO DE ACEPTACIÓN DIGITALu*   TÉRMINOS Y CONDICIONES - MIG SISTEMAS SAS   uX   
        <b>DATOS DE LA EMPRESA QUE ACEPTA:</b><br/><br/>
        <b>Razón Social:</b> z'<br/>
        <b>Nombre Comercial:</b> z<br/>
        <b>NIT:</b> u2   <br/>
        <b>Fecha y Hora de Aceptación:</b> u$   <br/>
        <b>Dirección IP:</b> z	
        u  
        <b>DECLARACIÓN DE ACEPTACIÓN:</b><br/><br/>
        El representante legal de la empresa mencionada declara bajo la gravedad de juramento que:<br/><br/>
        ✓ Ha leído completamente los términos y condiciones de uso del software SISTEMAS MIG<br/>
        ✓ Comprende y acepta todas las cláusulas, obligaciones y condiciones establecidas<br/>
        ✓ Tiene plena autoridad para representar y obligar legalmente a la empresa<br/>
        ✓ Acepta que este acto de aceptación electrónica tiene plena validez legal<br/>
        ✓ Se compromete a cumplir con todas las obligaciones contractuales establecidas
        u  
        <b>RESUMEN DE TÉRMINOS PRINCIPALES:</b><br/><br/>
        <b>1. OBJETO:</b> Licencia de uso no exclusiva del software SISTEMAS MIG<br/>
        <b>2. ALCANCE:</b> Facturación POS, administrativo, inventarios, informes fiscales<br/>
        <b>3. OBLIGACIONES USUARIO:</b> Pagos al día, copias de seguridad, protección con antivirus<br/>
        <b>4. OBLIGACIONES MIG:</b> Instalación, actualizaciones, soporte técnico<br/>
        <b>5. HORARIOS SOPORTE:</b> Lun-Vie 8:00-16:00, facturación 7x24<br/>
        <b>6. PAGOS:</b> Cuenta Bancolombia 00449206584 SISTEMAS MIG S.A.S<br/>
        <b>7. GARANTÍA:</b> Corrección de errores con pagos al día<br/>
        <b>8. DOMICILIO:</b> Medellín, Antioquia, Colombia
        u  
        <b>VALIDEZ LEGAL:</b><br/>
        Este documento certifica la aceptación electrónica de los términos y condiciones de MIG SISTEMAS SAS.
        Conforme a la Ley 527 de 1999 sobre comercio electrónico y firmas digitales, y el Decreto 2364 de 2012,
        esta aceptación tiene plena validez legal y constituye un acuerdo vinculante entre las partes.<br/><br/>
        El documento completo de términos y condiciones está disponible en: https://www.migsistemas.net/
        (   u   
        <b>SISTEMAS MIG S.A.S</b><br/>
        NIT: 900.275.400-8<br/>
        Centro de Negocios Alcalá, Carrera 43B N° 14-51 Local 1<br/>
        Medellín - Antioquia, Colombia<br/>
        Tel: 300 762 1171 | info@migsistemas.com
        u'   ✓ Certificado de aceptación creado: zError creando certificado: zTraceback: )NN)/rS   infor,   r   r2   r3   rG   rL   rM   rI   existsTERMINOS_ORIGINALpypdfreportlab.pdfgenr   reportlab.lib.pagesizesr   ior	   CanvassetFontdrawCentredString
drawStringr   remote_addrsaveseek	PdfWriterr4   	PdfReaderpagesadd_pager6   rR   warningr   r   r   r   r   rP   r   buildrT   rU   	traceback
format_exc)'rV   razon_socialrW   rX   razon_limpianombre_limpior8   nombre_archivoruta_destinor   r   r   r   buffercwidthheighty_poswriteroriginal_filereaderpageaceptacion_readeroutput_filer]   docstorystylestitulo_stylesubtitulo_stylenormal_styletitulo	subtituloinfo_empresadeclaracionresumen
nota_legalpier   r*   r*   r+   crear_certificado_aceptacionZ   s   

""





	
	


	

r   /c                   C   s   t dS )Nz
index.html)r   r*   r*   r*   r+   index  s   r   z/api/verificar-firma/<nit>GET)methodsc              
   C   s  z\t | }g }ttD ]*}|| dr6|dr6tjt|}t	tj
|}|||dd q|rV|jdd dd |d	 }td|d
 |d t|dW S tddiW S  ty } z td|  dt|  tddt| idfW  Y d }~S d }~ww )Nr   r;   r-   )r<   r=   c                 S   r>   )Nr=   r*   r?   r*   r*   r+   rA   &  rB   z!verificar_firma.<locals>.<lambda>TrC   r   r=   r<   )firmadofecha_firmar<   total_firmasr   Fz!Error verificando firma para NIT rF   rT   zError al verificar firma:   )r,   rG   rH   rI   rK   rJ   rL   rM   r   rN   rO   rP   r3   rQ   r   lenrR   rS   rT   rU   )rV   rX   archivos_firmadosr<   r[   r\   ultimo_archivor]   r*   r*   r+   verificar_firma  s6   
&r   z7/api/verificar-firma-comercial/<nit>/<nombre_comercial>c                 C   s  zRt j| } t j|}td|  d|  t| |}|r?td|  d| d|d   td|d |d | |d	d
W S td|  d|  td| |dW S  ty } z#td|  d| dt	|  tddt	| idfW  Y d }~S d }~ww )NzVerificando firma para NIT: , Nombre Comercial: zFirma encontrada para  - rF   r<   Tr=   rx   )r   r   r<   rV   rW   r   u   No se encontró firma para Fr   rV   rW   z+Error verificando firma comercial para NIT , Comercial rT   z$Error al verificar firma comercial: r   
urllibparseunquoterS   r   r^   r   rR   rT   rU   rV   rW   	resultador]   r*   r*   r+   verificar_firma_comercial7  s4   
 
	
 &r   z2/api/verificar-aceptacion/<nit>/<nombre_comercial>c                 C   s   zLt j| } t j|}td|  d|  t| |}|r9td|  d|  td|d |d | |dW S td	|  d|  td
| |dW S  ty{ } z#td|  d| dt	|  tddt	| idfW  Y d}~S d}~ww )u   
    Endpoint para verificar aceptación de términos
    Usado por la aplicación C# - redirige a la lógica de verificar-firma-comercial
    u$   [ACEPTACIÓN] Verificando para NIT: r   u   [ACEPTACIÓN] Encontrada para r   Tr=   r<   )r   r   r<   rV   rW   u!   [ACEPTACIÓN] No encontrada para Fr   u   [ACEPTACIÓN] Error para NIT r   rF   rT   u    Error al verificar aceptación: r   Nr   r   r*   r*   r+   verificar_aceptacionX  s2   


 &r   z/api/obtener-terminosc               
   C   s   zt jtstddidfW S ttddddW S  tyA }  ztdt	|   tdd	t	|  id
fW  Y d } ~ S d } ~ ww )NrT   u"   Archivo de términos no encontrado  Tz+Terminos_y_Condiciones_Sistemas_MiG_SAS.pdfzapplication/pdf)as_attachmentdownload_namemimetypeu   Error obteniendo términos: u   Error al obtener términos: r   )
rG   rL   r   r   r   r   rR   rS   rT   rU   )r]   r*   r*   r+   obtener_terminos|  s   &r   z/api/aceptar-terminosPOSTc            
   
   C   s  zt d t } | stddidfW S | dd }| dd }| dd }tj}t d	| d
| d|  |rD|rD|sMtddidfW S t|||\}}|set 	d tddidfW S d| d| d| d| d| 
}t
| t d tdd|t d|||dW S  ty } z+t 	dt|  dd l}	t 	d|	   tddt| idfW  Y d }~S d }~ww )Nu(   === INICIANDO PROCESO DE ACEPTACIÓN ===rT   zNo se recibieron datosi  rV   r   r   rW   zDatos recibidos - NIT: u
   , Razón: z, Comercial: u@   Faltan datos obligatorios: NIT, Razón Social y Nombre Comercialu+   Error creando el certificado de aceptaciónr   u   ACEPTACIÓN REGISTRADA - NIT: u    | Razón Social: z | Nombre Comercial: z | IP: z | Archivo: z'=== PROCESO COMPLETADO EXITOSAMENTE ===Tu.   Términos y condiciones aceptados exitosamenter-   )exitor7   r<   r=   rV   r   rW   z$Error en endpoint aceptar-terminos: r   zTraceback completo: u   Error al aceptar términos: )rS   r   r   get_jsonr   getr'   r   r   rT   r:   r   r2   r3   rR   rU   r   r   )
datarV   r   rW   
ip_clienter   ruta_pdfmensaje_logr]   r   r*   r*   r+   aceptar_terminos  sT   




&r   z/api/listar-firmasc                  C   s  zg } t jtrt tD ]}|drt jt|}tt j	|}t j
|}|ddd}t|dkr_|d }|d }|d  d|d  }t|dkr\d|d	d nd
}	nt|dkri|d nd
}d
}d
}d
}	| ||||	|d|t|d d d	| d| d q| jdd dd tt| | dW S  ty }
 ztdt|
  tddt|
 idfW  Y d }
~
S d }
~
ww )Nr;   r   r   r   r   rx   ra   ri   r-      )r<   rV   rW   r   r\   u   tamaño_bytesu
   tamaño_mbidentificador_unicoc                 S   r>   )Nr\   r*   r?   r*   r*   r+   rA     rB   zlistar_firmas.<locals>.<lambda>TrC   )totalfirmaszError listando firmas: rT   zError al listar firmas: r   )rG   rL   r   rI   rH   rJ   rM   r   rN   rO   getsizereplacesplitr   rP   r3   roundrQ   r   rR   rS   rT   rU   )r   r<   r[   r\      tamañopartesrV   rW   fecha_archivor   r]   r*   r*   r+   listar_firmas  sN   
$
&r   z/api/estadisticasc            
   
   C   s@  zvd} d}t  }t  }tjtrWttD ]@}|drVtjt|}| d7 } |tj|7 }|	dd
d}t|dkrV|d }|d }|| || d|  qt| t|t|t|d d dtjtt dd	W S  ty }	 ztd
t|	  tddt|	 idfW  Y d }	~	S d }	~	ww )Nr   r;   rx   r   r   ra   r   r-   )r   total_empresas_unicastotal_establecimientos_unicosu   tamaño_total_mbarchivo_original_existefecha_consultau    Error obteniendo estadísticas: rT   u    Error al obtener estadísticas: r   )setrG   rL   r   rI   rH   rJ   rM   r   r   r   r   addr   r   r   r   r2   r3   rR   rS   rT   rU   )
r      tamaño_totalempresas_unicasestablecimientos_unicosr<   r[   r   rV   rW   r]   r*   r*   r+   estadisticas  s>   



	&r   r   c                 C      t ddidfS )NrT   zEndpoint no encontrador   r   rT   r*   r*   r+   	not_found     r   r   c                 C   r   )NrT   zError interno del servidorr   r   r   r*   r*   r+   internal_error  r   r   __main__u&   Archivo de términos no encontrado en z=== SERVIDOR INICIADO ===zEndpoints disponibles:z- /api/verificar-firma/<nit>z9- /api/verificar-firma-comercial/<nit>/<nombre_comercial>z<- /api/verificar-aceptacion/<nit>/<nombre_comercial> [NUEVO]z- /api/aceptar-terminosz0.0.0.0a   )debughostport)Kflaskr   r   r   r   r   
flask_corsr   rG   shutilr   r%   jsonloggingbase64r   r	   PILr
   r   r   r   r   r   reportlab.lib.unitsr   reportlab.lib.colorsr   r   reportlab.platypusr   r   r   ReportLabImagereportlab.lib.stylesr   r   werkzeug.utilsr   urllib.parser   r!   __name__appUPLOAD_FOLDERrI   FIRMAS_FOLDERr5   r   makedirsbasicConfigINFO	getLoggerrS   r,   r:   r^   r   router   r   r   r   r   r   r   r   errorhandlerr   r   rL   r   r   r   runr*   r*   r*   r+   <module>   s   

  8

 
 
#

3
.
#








