You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
PythonCode/RptSegregadosFacPagadas/ReporteMensualAmazon.py

162 lines
6.0 KiB

import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email.mime.text import MIMEText
from email import encoders
import pyodbc
import pandas as pd
import json
import datetime
import os
# Obtiene la ruta del directorio donde se encuentra el script
directorio_script = os.path.dirname(os.path.abspath(__file__))
# Establece el directorio de trabajo actual
os.chdir(directorio_script)
# Cargar la configuración del correo electrónico desde el archivo JSON
with open('config.json', 'r') as config_file:
config = json.load(config_file)
smtp_server = config['EmailServer']
smtp_port = config['EmailPort']
# Tus credenciales de correo electrónico desde el archivo JSON
sender_email = config['EmailUser']
sender_password = config['EmailPassword']
# Obtener la fecha de inicio y fin del mes anterior
today = datetime.date.today()
first_day_of_month = today.replace(day=1)
last_day_of_previous_month = first_day_of_month - datetime.timedelta(days=1)
first_day_of_previous_month = last_day_of_previous_month.replace(day=1)
# Convertir las fechas a formato de cadena YYYY-MM-DD
start_date = first_day_of_previous_month.strftime("%Y-%m-%d")
end_date = last_day_of_previous_month.strftime("%Y-%m-%d")
# Obtener el nombre del mes que se está reportando en español
mes = last_day_of_previous_month.strftime("%B").capitalize()
# Cargar la configuración de la base de datos desde el archivo JSON
with open('config.json', 'r') as config_file:
config = json.load(config_file)
conn_str = (
f"DRIVER=ODBC Driver 17 for SQL Server;"
f"SERVER={config['server']};"
f"DATABASE={config['database']};"
f"UID={config['username']};"
f"PWD={config['password']};"
)
# Conectar a la base de datos
conn = pyodbc.connect(conn_str)
try:
cursor = conn.cursor()
# Ejecutar la consulta SQL para obtener los correos electrónicos de la tabla
cursor.execute("SELECT CorreoElectronico FROM [dbo].[Clientes.Amazon.Reporte.Notificaciones] Where Activo = 1 ")
rows = cursor.fetchall()
# Obtener una lista de correos electrónicos
recipients = [row.CorreoElectronico for row in rows]
# Ejecutar el primer procedimiento almacenado y guardar los resultados en un DataFrame
cursor.execute("{CALL [Reportes.Web.Clientes.Amazon.Segregacion.Get] (?, ?)}", (start_date, end_date))
rows = cursor.fetchall()
df1 = pd.DataFrame([tuple(row) for row in rows], columns=[desc[0] for desc in cursor.description])
# Guardar el DataFrame en un archivo Excel con el mes en el nombre del archivo
excel_file_1 = f'ReporteMensualSegregacion_{mes}.xlsx'
df1.to_excel(excel_file_1, index=False)
# Ejecutar el segundo procedimiento almacenado y guardar los resultados en otro DataFrame
cursor.execute("{CALL [Clientes.Amazon.Invoice.FacturasPagadas.Get] (?, ?)}", (start_date, end_date))
rows = cursor.fetchall()
df2 = pd.DataFrame([tuple(row) for row in rows], columns=[desc[0] for desc in cursor.description])
# Guardar el segundo DataFrame en otro archivo Excel con el mes en el nombre del archivo
excel_file_2 = f'ReporteMensualFacturasPagadas_{mes}.xlsx'
df2.to_excel(excel_file_2, index=False)
# Configurar el correo electrónico
msg = MIMEMultipart()
msg['From'] = sender_email
msg['To'] = ', '.join(recipients) # Lista de destinatarios separados por comas
msg['Subject'] = f'Reportes Mensuales GEMCO - {mes}'
# Agregar el cuerpo del mensaje
# body = """ Se anexan reportes mensual de segregados y reporte de factura pagadas correspodientes al mes inmediato anterior.
# En caso de dudas o aclaraciones conctactar a Viviana Jara: (vjara@gemcousa.com) o Susana Sánchez: (ssanchez@gemcousa.com)
# Saludos. """
body ="""Se anexan reportes mensual de segregados y reporte de factura pagadas correspodientes al mes inmediato anterior.
En caso de dudas o aclaraciones conctactar a Viviana Jara:(vjara@gemcousa.com) o Susana Sánchez:(ssanchez@gemcousa.com)
Saludos. """
centered_body = body.strip().center(70)
msg.attach(MIMEText(body, 'plain'))
# Adjuntar los archivos Excel al correo electrónico
for excel_file in [excel_file_1, excel_file_2]:
with open(excel_file, 'rb') as attachment:
part = MIMEBase('application', 'octet-stream')
part.set_payload(attachment.read())
encoders.encode_base64(part)
part.add_header('Content-Disposition', f'attachment; filename= {excel_file}')
msg.attach(part)
# Establecer la conexión al servidor SMTP
server = smtplib.SMTP(smtp_server, smtp_port)
server.starttls()
server.login(sender_email, sender_password)
# Enviar el correo
server.sendmail(sender_email, recipients, msg.as_string())
print("Reportes mensuales enviados exitosamente por correo electrónico.")
# Eliminar los archivos Excel después de enviar el correo electrónico
for excel_file in [excel_file_1, excel_file_2]:
os.remove(excel_file)
except Exception as e:
print(f"Error al enviar los reportes mensuales por correo: {e}")
finally:
# Cerrar la conexión SMTP y la conexión con la base de datos
if 'server' in locals():
server.quit()
conn.close()
# Credenciales producion
#{
# "server": "100.10.10.1",
# "database": "GEMCO",
# "username": "admin",
# "password": "DBAdmin1234$.",
# "EmailUser": "noreply@gemcousa.mx",
# "EmailPassword": "Mx77lf%02",
# "EmailServer": "smtp.ionos.com",
# "EmailPort": 587,
# "recipients": ["lrendon@gemcousa.com", "destinatario2@example.com", "destinatario3@example.com"]
# }
# { credenciales maquina local
# "server": ".",
# "database": "GEMCO",
# "username": "sa",
# "password": "Chispa10",
# "EmailUser": "noreply@gemcousa.mx",
# "EmailPassword": "Mx77lf%02",
# "EmailServer": "smtp.ionos.com",
# "EmailPort": 587,
# "recipients": ["lrendon@gemcousa.com", "destinatario2@example.com", "destinatario3@example.com"]
# }