public static void CopyImageToServer(System.Windows.Forms.OpenFileDialog dlg)
        {
            //VERIFICAR SI LA IMÁGEN EXISTE EN LA RUTA DE IMAGENES
            string ruta_origen = dlg.FileName;

            string ruta_destino = Global.DIRECTORIO_IMAGENES + @"\" + dlg.SafeFileName;

            if (!File.Exists(ruta_destino))
            {
                File.Copy(dlg.FileName, ruta_destino);
            }
            else
            {
                if (!SomeHelpers.FileCompare(ruta_origen, ruta_destino))
                {
                    File.Copy(dlg.FileName, ruta_destino);
                }
                else
                {
                    Console.WriteLine("La imagen no fue copiada");
                }
            }
        }
        public void GenerateSmp(int id_smp)
        {
            try
            {
                //BUSCAR SMP EN SU TABLA
                if (id_smp == 0)
                {
                    MessageBox.Show("SMP no cargado aún...");
                }
                else
                {
                    splash.Show();
                    //CREAR SMP A PARTIR DE LA BASE DE DATOS
                    //OBEJTO QUE PERMITE GESTIONAR DOCUMENTO EXCEL
                    Excel.Application xlApp = new Excel.Application();
                    //NO MOSTRAR ARCHIVO MIENTRAS SE UTILIZA
                    xlApp.Visible = false;
                    //DIRECTORIO DONDE SE COPIARÁ EL ARCHIVO TEMPORALMENTE
                    //PARA EDITARLO
                    string sru = System.IO.Path.GetTempPath();
                    //NOMBRE DEL ARCHIVO TEMPORAL
                    path = @"" + sru + "\\SMP_TEMP.xlsx";
                    //COPIAR EL ARCHIVO DE LOS RECURSOS DE LA APLICACIÓN
                    // A LA RUTA ESTABLECIDA
                    File.WriteAllBytes(path, Properties.Resources.SMP_MODIFICADO);

                    //VERIFICAR SI EL ARCHIVO ESTÁ BLOQUEADO O ESTA SIENDO UTILIZADO POR OTRO PROCESO
                    if (IsFileLocked(new FileInfo(path)))
                    {
                        MessageBox.Show("El archivo se está ejecutando, debe cerrarlo para continuar",
                                        "Abrir SMP", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                    else
                    {
                        //CREAR EL OBJETO DEL LIBRO A PARTIR DE LA RUTA
                        Excel.Workbook wb = xlApp.Workbooks.Open(path);

                        //FIJAR EN OBJETOS LAS PESTAÑAS U HOJA DEL LIBRO PARA TRABAJAR
                        Excel.Worksheet ws2 = (Excel.Worksheet)wb.Worksheets[1];

                        //INFORMACIÓN DE BD
                        CustomSMP cs = daoSMP.GetCustomSMP(id_smp);
                        //////////////////////////////////////////////////
                        //**************** INFORMACIÓN BÁSICA ************
                        //////////////////////////////////////////////////
                        //LINEA
                        FillCell(ws2, 3, 5, cs.desc_linea);
                        //EQUIPO
                        FillCell(ws2, 4, 5, cs.desc_equipo);
                        //CLASDIFICACIÓN SMP
                        FillCell(ws2, 5, 5, cs.desc_clasificacion);
                        //NOMBRE SMP
                        FillCell(ws2, 2, 14, cs.nombre);
                        //NÚMERO SMP
                        FillCell(ws2, 3, 18, cs.numero.ToString());
                        //ELABORADO POR
                        FillCell(ws2, 3, 25, cs.desc_elaborador);
                        //APROBADO POR
                        FillCell(ws2, 3, 35, cs.desc_aprobador);
                        //FECHA
                        FillCell(ws2, 4, 40, cs.fecha_smp.ToString());
                        //NÚMERO DE TECNICOS REQUERIDOS
                        FillCell(ws2, 5, 14, cs.tecnicos_eq.ToString());
                        //TIPO MANTENIMIENTO
                        FillCell(ws2, 5, 24, cs.desc_tipo_mtto);
                        //DURACIÓN DE LA ACTIVIDAD
                        FillCell(ws2, 5, 30, cs.duracion_actividad.ToString());
                        //TIEMPO EQUIPO PARADO
                        FillCell(ws2, 5, 35, cs.equipo_parado.ToString());
                        ////FREUENCIA
                        FillCell(ws2, 5, 41, cs.frecuencia + " " + cs.desc_tipo_frecuencia.ToString());
                        ////LOTO
                        FillCell(ws2, 16, 3, cs.loto ? "SI" : "NO");

                        //IMAGEN 1
                        if (!cs.imagen_1.Equals(""))
                        {
                            Microsoft.Office.Interop.Excel.Range rIm = (Microsoft.Office.Interop.Excel.Range)ws2.Cells[7, 9];
                            SomeHelpers.AddImageExcel(ws2, Global.DIRECTORIO_IMAGENES + @"\" + cs.imagen_1, (float)rIm.Left + 1, (float)rIm.Top + 1, 152, 150);
                        }
                        //IMAGEN 2
                        if (!cs.imagen_2.Equals(""))
                        {
                            Microsoft.Office.Interop.Excel.Range rIm = (Microsoft.Office.Interop.Excel.Range)ws2.Cells[7, 21];
                            SomeHelpers.AddImageExcel(ws2, Global.DIRECTORIO_IMAGENES + @"\" + cs.imagen_2, (float)rIm.Left + 1, (float)rIm.Top + 1, 152, 150);
                        }

                        //PERMISOS DE TRABAJO
                        string[] permisos = cs.permisos.Split(',');
                        int      k        = 0;
                        for (int i = 5; i <= 30; i += 2)
                        {
                            if (k < permisos.Length)
                            {
                                //CÓDIGO PODEROSO
                                SomeHelpers.AddImageExcel(ws2, Util.Global.DIRECTORIO_IMAGENES + @"\"
                                                          + GetImageFromRisk(permisos[k]), (float)GetRangeImageRisk(ws2, i).Left + 1,
                                                          (float)GetRangeImageRisk(ws2, i).Top + 1, 55, 58);

                                FillCell(ws2, 19, i, permisos[k]);
                                k++;
                            }
                        }

                        //////////////////////////////////////////////////
                        //**************** EPPS *************************
                        //////////////////////////////////////////////////
                        //EPPS
                        //EPPS IMAGENES RANGO

                        int j = 0;

                        for (int i = 6; i <= 70; i += 2)
                        {
                            if (j < cs.list_epps.Count)
                            {
                                //CÓDIGO PODEROSO
                                SomeHelpers.AddImageExcel(ws2, Util.Global.DIRECTORIO_IMAGENES + @"\"
                                                          + cs.list_epps[j].foto, (float)GetRangeImageEpp(ws2, i).Left + 1,
                                                          (float)GetRangeImageEpp(ws2, i).Top + 1, 56, 59);

                                FillCell(ws2, 12, i, cs.list_epps[j].nombre);

                                j++;
                            }
                        }


                        //////////////////////////////////////////////////
                        //**************** HERRAMIENTAS *****************
                        //////////////////////////////////////////////////
                        int         herramientas_cant = cs.list_herramientas.Count;
                        int         inicio_herr       = 22;
                        Excel.Range linePpal          = (Excel.Range)ws2.Rows[inicio_herr - 1];
                        if (herramientas_cant > 0)
                        {
                            linePpal.RowHeight = 138.6;
                        }

                        //COMBINAR Y CENTRAR CELDAS
                        for (int i = 1; i < herramientas_cant; i++)
                        {
                            Excel.Range line = (Excel.Range)ws2.Rows[inicio_herr];
                            linePpal.RowHeight = 138.6;
                            line.Insert();

                            //COMBINAR CELDA DE FOTO
                            ws2.Range[ws2.Cells[inicio_herr, 26], ws2.Cells[inicio_herr, 42]].Merge();
                            //COMBINAR CELDA DE NOMBRE HERRAMIENTA
                            ws2.Range[ws2.Cells[inicio_herr, 13], ws2.Cells[inicio_herr, 25]].Merge();
                            //COMBINAR CELDA DE NOMBRE CATEGORÍA
                            ws2.Range[ws2.Cells[inicio_herr, 11], ws2.Cells[inicio_herr, 12]].Merge();
                        }
                        //SI HAY MAS DE 1 ELEMENTO, SE COMBINAN LAS COLUMNAS
                        if (herramientas_cant > 1)
                        {
                            ws2.Range[ws2.Cells[inicio_herr - 1, 3], ws2.Cells[inicio_herr + herramientas_cant - 2, 9]].Merge();
                        }

                        //AÑADIR ELEMENTOS A CELDAS
                        int l = inicio_herr - 1;

                        for (int i = 0; i < herramientas_cant; i++)
                        {
                            //OBTENER EL RANGO DEPENDIENDO DE CADA ELEMENTO
                            Microsoft.Office.Interop.Excel.Range picPosition = GetRangeHerramienta(ws2, l, 32);
                            //LA IMAGEN EN EL DATAGRID FUE DESCARGADA, SE OBTIENE LA RUTA PARA PEGAR EN EL EXCEL
                            string image_p = Util.Global.DIRECTORIO_IMAGENES + @"\" + System.IO.Path.GetFileName(cs.list_herramientas[i].image_path);
                            //SE INSERTA LA IMAGEN EN EL EXCEL, CONFIGURANDO ATRIBUTOS
                            SomeHelpers.AddImageExcelFromWeb(ws2, image_p, (float)picPosition.Left, (float)picPosition.Top + 1, 170, 137, cs.list_herramientas[i].image_path);
                            //NOMBRE DE LA HERRAMIENTA
                            FillCell(ws2, l, 13, cs.list_herramientas[i].herramienta);
                            l++;
                        }

                        //////////////////////////////////////////////////
                        //**************** REPUESTOS *****************
                        //////////////////////////////////////////////////
                        if (herramientas_cant == 0)
                        {
                            herramientas_cant++;
                        }

                        int         repuestos_cant = cs.list_repuestos.Count;
                        int         inicio_rep     = inicio_herr + herramientas_cant; //+ 1; //23;
                        Excel.Range linePpalRep    = (Excel.Range)ws2.Rows[inicio_rep - 1];
                        if (repuestos_cant > 0)
                        {
                            linePpalRep.RowHeight = 138.6;
                        }

                        //COMBINAR Y CENTRAR CELDAS
                        for (int i = 1; i < repuestos_cant; i++)
                        {
                            Excel.Range line = (Excel.Range)ws2.Rows[inicio_rep];
                            linePpalRep.RowHeight = 138.6;
                            line.Insert();

                            //COMBINAR CELDA DE FOTO
                            ws2.Range[ws2.Cells[inicio_rep, 26], ws2.Cells[inicio_rep, 42]].Merge();
                            //COMBINAR CELDA DE NOMBRE HERRAMIENTA
                            ws2.Range[ws2.Cells[inicio_rep, 13], ws2.Cells[inicio_rep, 25]].Merge();
                            //COMBINAR CELDA DE NOMBRE CATEGORÍA
                            ws2.Range[ws2.Cells[inicio_rep, 11], ws2.Cells[inicio_rep, 12]].Merge();
                        }
                        //SI HAY MAS DE 1 ELEMENTO, SE COMBINAN LAS COLUMNAS
                        if (repuestos_cant > 1)
                        {
                            ws2.Range[ws2.Cells[inicio_rep - 1, 3], ws2.Cells[inicio_rep + repuestos_cant - 2, 9]].Merge();
                        }

                        //AÑADIR ELEMENTOS A CELDAS
                        int b = inicio_rep - 1;

                        for (int i = 0; i < repuestos_cant; i++)
                        {
                            //OBTENER EL RANGO DEPENDIENDO DE CADA ELEMENTO
                            Microsoft.Office.Interop.Excel.Range picPosition = GetRangeHerramienta(ws2, b, 32);
                            //LA IMAGEN EN EL DATAGRID FUE DESCARGADA, SE OBTIENE LA RUTA PARA PEGAR EN EL EXCEL
                            string image_p = Util.Global.DIRECTORIO_IMAGENES + @"\" + System.IO.Path.GetFileName(cs.list_repuestos[i].image_path);
                            //SE INSERTA LA IMAGEN EN EL EXCEL, CONFIGURANDO ATRIBUTOS
                            SomeHelpers.AddImageExcelFromWeb(ws2, image_p, (float)picPosition.Left, (float)picPosition.Top + 1, 170, 137, cs.list_repuestos[i].image_path);
                            //NOMBRE DE LA HERRAMIENTA
                            FillCell(ws2, b, 13, "(" + cs.list_repuestos[i].cantidad + ") " + cs.list_repuestos[i].descripcion);
                            b++;
                        }

                        //////////////////////////////////////////////////
                        //**************** PASO A PASO *****************
                        //////////////////////////////////////////////////
                        if (repuestos_cant == 0)
                        {
                            repuestos_cant += 1;
                        }

                        int         paso_cant   = cs.list_pasos.Count;
                        int         inicio_paso = inicio_rep + repuestos_cant + 1; //23;
                        Excel.Range linePpalPas = (Excel.Range)ws2.Rows[inicio_paso - 1];
                        if (paso_cant > 0)
                        {
                            linePpalPas.RowHeight = 138.6;
                        }

                        //COMBINAR Y CENTRAR CELDAS
                        for (int i = 1; i < paso_cant; i++)
                        {
                            Excel.Range line = (Excel.Range)ws2.Rows[inicio_paso];
                            linePpalPas.RowHeight = 138.6;
                            line.Insert();

                            //COMBINAR CELDA DE FOTO
                            ws2.Range[ws2.Cells[inicio_paso, 26], ws2.Cells[inicio_paso, 42]].Merge();
                            //COMBINAR CELDA DESCRIPCIÓN DEL PASO
                            ws2.Range[ws2.Cells[inicio_paso, 13], ws2.Cells[inicio_paso, 25]].Merge();
                            //COMBINAR CELDA DE FOTO CATEGORÍA
                            ws2.Range[ws2.Cells[inicio_paso, 11], ws2.Cells[inicio_paso, 12]].Merge();
                            //COMBINAR CELDA DE DURACIÓN
                            ws2.Range[ws2.Cells[inicio_paso, 10], ws2.Cells[inicio_paso, 10]].Merge();
                            //COMBINAR CELDA DE NOMBRE
                            ws2.Range[ws2.Cells[inicio_paso, 3], ws2.Cells[inicio_paso, 9]].Merge();
                        }


                        System.Windows.Forms.Application.DoEvents();


                        //AÑADIR ELEMENTOS A CELDAS
                        int p = inicio_paso - 1;

                        for (int i = 0; i < paso_cant; i++)
                        {
                            //OBTENER EL RANGO DEPENDIENDO DE CADA ELEMENTO
                            Microsoft.Office.Interop.Excel.Range picPosition = GetRangeHerramienta(ws2, p, 32);
                            //LA IMAGEN EN EL DATAGRID FUE DESCARGADA, SE OBTIENE LA RUTA PARA PEGAR EN EL EXCEL
                            string image_p = Util.Global.DIRECTORIO_IMAGENES + @"\" + System.IO.Path.GetFileName(cs.list_pasos[i].imagen_paso_path);
                            //SE INSERTA LA IMAGEN EN EL EXCEL, CONFIGURANDO ATRIBUTOS
                            SomeHelpers.AddImageExcel(ws2, image_p, (float)picPosition.Left, (float)picPosition.Top + 1, 170, 137);

                            //DESCRIPCIÓN
                            FillCell(ws2, p, 13, cs.list_pasos[i].desc);
                            //NOMBRE
                            FillCell(ws2, p, 3, cs.list_pasos[i].paso);
                            //DURACIÓN
                            FillCell(ws2, p, 10, cs.list_pasos[i].duracion + "");
                            //NUMERO PASO
                            int num_pas = i + 1;
                            FillCell(ws2, p, 2, num_pas.ToString() + "");

                            //IMAGEN CATEGORIA
                            //OBTENER EL RANGO DEPENDIENDO DE CADA ELEMENTO
                            Microsoft.Office.Interop.Excel.Range picPositionCat = GetRangeHerramienta(ws2, p, 11);
                            //LA IMAGEN EN EL DATAGRID FUE DESCARGADA, SE OBTIENE LA RUTA PARA PEGAR EN EL EXCEL
                            string image_pCat = Util.Global.DIRECTORIO_IMAGENES + @"\" + System.IO.Path.GetFileName(cs.list_pasos[i].categoria + ".PNG");
                            //SE INSERTA LA IMAGEN EN EL EXCEL, CONFIGURANDO ATRIBUTOS
                            SomeHelpers.AddImageExcel(ws2, image_pCat, (float)picPositionCat.Left + 15, (float)picPositionCat.Top + 57, 20, 20);

                            p++;
                        }

                        int limit = inicio_paso + paso_cant;
                        //CONFIGURANDO AREA DE IMPRESIÓN
                        ws2.PageSetup.PrintArea = "$A$1:$AP$" + limit;

                        wb.Save();
                        wb.Close();

                        System.Diagnostics.Process.Start(path);
                        splash.Hide();
                    }
                }
            }
            catch (Exception ex)
            {
                splash.Hide();
                MessageBox.Show("Item inválido, " + ex.Message.ToLower());
            }
        }