-- Table structure for table `tb_g_mhoras`
--

CREATE TABLE `tb_g_mhoras` (
  `codigo` varchar(5) CHARACTER SET utf8mb4 COLLATE utf8mb4_spanish_ci NOT NULL DEFAULT '',
  `nombre` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_spanish_ci NOT NULL,
  PRIMARY KEY (`codigo`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_spanish_ci;

--
-- Dumping data for table `tb_g_mhoras`
--

INSERT INTO `tb_g_mhoras` VALUES ('00:00','00:00 AM'),('00:15','00:15 AM'),('00:30','00:30 AM'),('00:45','00:45 AM'),('01:00','01:00 AM'),('01:15','01:15 AM'),('01:30','01:30 AM'),('01:45','01:45 AM'),('02:00','02:00 AM'),('02:15','02:15 AM'),('02:30','02:30 AM'),('02:45','02:45 AM'),('03:00','03:00 AM'),('03:15','03:15 AM'),('03:30','03:30 AM'),('03:45','03:45 AM'),('04:00','04:00 AM'),('04:15','04:15 AM'),('04:30','04:30 AM'),('04:45','04:45 AM'),('05:00','05:00 AM'),('05:15','05:15 AM'),('05:30','05:30 AM'),('05:45','05:45 AM'),('06:00','06:00 AM'),('06:15','06:15 AM'),('06:30','06:30 AM'),('06:45','06:45 AM'),('07:00','07:00 AM'),('07:15','07:15 AM'),('07:30','07:30 AM'),('07:45','07:45 AM'),('07:55','07:55 AM'),('08:00','08:00 AM'),('08:15','08:15 AM'),('08:30','08:30 AM'),('08:45','08:45 AM'),('09:00','09:00 AM'),('09:15','09:15 AM'),('09:30','09:30 AM'),('09:45','09:45 AM'),('10:00','10:00 AM'),('10:15','10:15 AM'),('10:30','10:30 AM'),('10:45','10:45 AM'),('11:00','11:00 AM'),('11:15','11:15 AM'),('11:30','11:30 AM'),('11:45','11:45 AM'),('12:00','12:00 PM'),('12:15','12:15 PM'),('12:30','12:30 PM'),('12:45','12:45 PM'),('13:00','01:00 PM'),('13:15','01:15 PM'),('13:30','01:30 PM'),('13:45','01:45 PM'),('14:00','02:00 PM'),('14:15','02:15 PM'),('14:30','02:30 PM'),('14:45','02:45 PM'),('15:00','03:00 PM'),('15:15','03:15 PM'),('15:30','03:30 PM'),('15:45','03:45 PM'),('16:00','04:00 PM'),('16:15','04:15 PM'),('16:30','04:30 PM'),('16:45','04:45 PM'),('17:00','05:00 PM'),('17:15','05:15 PM'),('17:30','05:30 PM'),('17:45','05:45 PM'),('18:00','06:00 PM'),('18:15','06:15 PM'),('18:30','06:30 PM'),('18:45','06:45 PM'),('19:00','07:00 PM'),('19:15','07:15 PM'),('19:30','07:30 PM'),('19:45','07:45 PM'),('20:00','08:00 PM'),('20:15','08:15 PM'),('20:30','08:30 PM'),('20:45','08:45 PM'),('21:00','09:00 PM'),('21:15','09:15 PM'),('21:30','09:30 PM'),('21:45','09:45 PM'),('22:00','10:00 PM'),('22:15','10:15 PM'),('22:30','10:30 PM'),('22:45','10:45 PM'),('23:00','11:00 PM'),('23:15','11:15 PM'),('23:30','11:30 PM'),('23:45','11:45 PM');

--
-- Table structure for table `tb_g_mmoneda`
--

CREATE TABLE `tb_g_mmoneda` (
  `codemp` varchar(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_spanish_ci NOT NULL,
  `codigo` varchar(5) CHARACTER SET utf8mb4 COLLATE utf8mb4_spanish_ci NOT NULL,
  `nombre` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_spanish_ci NOT NULL,
  `simbolo` varchar(4) CHARACTER SET utf8mb4 COLLATE utf8mb4_spanish_ci NOT NULL,
  `tasa` decimal(10,2) NOT NULL DEFAULT '0.00',
  `estado` int NOT NULL DEFAULT '1',
  PRIMARY KEY (`codemp`,`codigo`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_spanish_ci;

--
-- Dumping data for table `tb_g_mmoneda`
--

INSERT INTO `tb_g_mmoneda` VALUES ('01','01000','Dolares','$',0.00,1);

--
-- Table structure for table `tb_g_mnotificacion`
--

CREATE TABLE `tb_g_mnotificacion` (
  `codemp` varchar(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_spanish_ci NOT NULL DEFAULT '',
  `sucursal` varchar(3) CHARACTER SET utf8mb4 COLLATE utf8mb4_spanish_ci NOT NULL DEFAULT '',
  `codigo` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_spanish_ci NOT NULL DEFAULT '',
  `nombre` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_spanish_ci NOT NULL DEFAULT '',
  `plantilla` varchar(15) CHARACTER SET utf8mb4 COLLATE utf8mb4_spanish_ci NOT NULL DEFAULT '',
  `cliente` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_spanish_ci NOT NULL DEFAULT '',
  `nota` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_spanish_ci NOT NULL DEFAULT '',
  `fecha` date NOT NULL DEFAULT '1900-01-01',
  `fecha_d` date NOT NULL DEFAULT '1900-01-01',
  `fecha_h` date NOT NULL DEFAULT '1900-01-01',
  `fecha_u` date NOT NULL DEFAULT '1900-01-01',
  `vence` smallint NOT NULL DEFAULT '0',
  `interno` smallint NOT NULL DEFAULT '0',
  `usuario` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_spanish_ci NOT NULL DEFAULT '',
  `estado` smallint NOT NULL DEFAULT '1',
  PRIMARY KEY (`codemp`,`sucursal`,`codigo`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_spanish_ci;

--
-- Dumping data for table `tb_g_mnotificacion`
--

INSERT INTO `tb_g_mnotificacion` VALUES ('01','001','0100100003','Notifications','010012400001','','Nota de Notifications','2025-07-09','2025-07-01','2025-07-31','2025-07-09',1,1,'00000',1),('01','001','0100100004','Notifications','010012400001','010100001','Nota de Notifications','2025-07-09','2025-07-01','2025-07-31','2025-07-09',0,1,'00000',1);

--
-- Table structure for table `tb_g_mnotificacion_dformulario`
--

CREATE TABLE `tb_g_mnotificacion_dformulario` (
  `codemp` varchar(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_spanish_ci NOT NULL DEFAULT '',
  `sucursal` varchar(3) CHARACTER SET utf8mb4 COLLATE utf8mb4_spanish_ci NOT NULL DEFAULT '',
  `codigo` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_spanish_ci NOT NULL DEFAULT '',
  `formulario` int NOT NULL DEFAULT '0',
  `item` int NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`item`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_spanish_ci;

--
-- Dumping data for table `tb_g_mnotificacion_dformulario`
--

INSERT INTO `tb_g_mnotificacion_dformulario` VALUES ('01','001','0100100003',35,1),('01','001','0100100003',50,2);

--
-- Table structure for table `tb_g_mnotificacion_dusuario`
--

CREATE TABLE `tb_g_mnotificacion_dusuario` (
  `codemp` varchar(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_spanish_ci NOT NULL DEFAULT '',
  `sucursal` varchar(3) CHARACTER SET utf8mb4 COLLATE utf8mb4_spanish_ci NOT NULL DEFAULT '',
  `codigo` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_spanish_ci NOT NULL DEFAULT '',
  `usuario` varchar(15) CHARACTER SET utf8mb4 COLLATE utf8mb4_spanish_ci NOT NULL DEFAULT '',
  `leida` smallint NOT NULL DEFAULT '0',
  `item` int NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`item`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_spanish_ci;

--
-- Dumping data for table `tb_g_mnotificacion_dusuario`
--

INSERT INTO `tb_g_mnotificacion_dusuario` VALUES ('01','001','0100100003','00021',0,1),('01','001','0100100003','00025',0,2),('01','001','0100100003','00018',0,3),('01','001','0100100003','00013',0,4);

--
-- Table structure for table `tb_g_mpais`
--

CREATE TABLE `tb_g_mpais` (
  `codemp` varchar(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_spanish_ci NOT NULL DEFAULT '',
  `codigo` varchar(3) CHARACTER SET utf8mb4 COLLATE utf8mb4_spanish_ci NOT NULL DEFAULT '',
  `nombre` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_spanish_ci NOT NULL DEFAULT '',
  `telefono` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_spanish_ci NOT NULL,
  `estado` smallint DEFAULT '0',
  PRIMARY KEY (`codemp`,`codigo`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_spanish_ci;

--
-- Dumping data for table `tb_g_mpais`
--

INSERT INTO `tb_g_mpais` VALUES ('01','AG','Antigua and Barbuda','+1',0),('01','AI','Anguilla','+1',0),('01','AN','Netherlands Antilles','+599',0),('01','AR','Argentina','+54',0),('01','AW','Aruba','+297',0),('01','BB','Barbados','+1',0),('01','BL','Saint Barthelemy','+590',0),('01','BM','Bermuda','+1',0),('01','BO','Bolivia','+591',0),('01','BR','Brazil','+55',0),('01','BS','Bahamas','+1',0),('01','BZ','Belize','+501',0),('01','CA','Canada','+1',0),('01','CL','Chile','+56',0),('01','CO','Colombia','+57',0),('01','CR','Costa Rica','+506',0),('01','CU','Cuba','+53',0),('01','CW','Curacao','+599',0),('01','DM','Dominica','+1',0),('01','DO','Dominican Republic','+1',0),('01','EC','Ecuador','+593',0),('01','EU','Saint Eustatius','+1',0),('01','FK','Falkland Islands','+500',0),('01','GD','Grenada','+1',0),('01','GF','French Guiana','+594',0),('01','GP','Guadeloupe','+590',0),('01','GS','South Georgia and the South Sandwich Islands','+500',0),('01','GT','Guatemala','+502',0),('01','GY','Guyana','+592',0),('01','HN','Honduras','+504',0),('01','HT','Haiti','+509',0),('01','JM','Jamaica','+1',0),('01','KN','Saint Kitts and Nevis','+1',0),('01','KY','Cayman Islands','+1',0),('01','LC','Saint Lucia','+1',0),('01','MF','Saint Martin','+1 599',0),('01','MQ','Martinique','+596',0),('01','MS','Montserrat','+1',0),('01','MX','Mexico','+52',0),('01','NI','Nicaragua','+505',0),('01','NU','Navassa Island','+1',0),('01','PA','Panama','+507',0),('01','PE','Peru','+51',0),('01','PM','Saint Pierre and Miquelon','+508',0),('01','PR','Puerto Rico','+1',0),('01','PY','Paraguay','+595',0),('01','SR','Suriname','+597',0),('01','SX','Saba','+721',0),('01','TC','Turks and Caicos Islands','+1',0),('01','TT','Trinidad and Tobago','+1',0),('01','US','United States','+1',1),('01','UY','Uruguay','+598',0),('01','VC','Saint Vincent and the Grenadines','+1',0),('01','VE','Venezuela','+58',0),('01','VG','British Virgin Islands','+1',0),('01','VI','United States Virgin Islands','+1',0);

--
-- Table structure for table `tb_musuario`
--

CREATE TABLE `tb_musuario` (
  `u201` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_spanish_ci NOT NULL,
  `u202` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_spanish_ci NOT NULL DEFAULT '',
  `u203` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_spanish_ci NOT NULL DEFAULT '',
  `u204` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_spanish_ci NOT NULL DEFAULT '',
  `u205` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_spanish_ci NOT NULL DEFAULT '',
  `u205_s` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_spanish_ci NOT NULL DEFAULT '',
  `u206` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_spanish_ci DEFAULT NULL,
  `u207` int NOT NULL DEFAULT '0',
  `u209` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_spanish_ci NOT NULL DEFAULT '',
  `u210` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_spanish_ci NOT NULL DEFAULT '',
  `u211` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_spanish_ci NOT NULL DEFAULT '',
  `u212` varchar(5) CHARACTER SET utf8mb4 COLLATE utf8mb4_spanish_ci DEFAULT '' COMMENT 'lenguaje',
  `u213` int DEFAULT '1' COMMENT 'Formato fecha',
  `u214` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_spanish_ci DEFAULT ',' COMMENT 'Signo decimal',
  `u215` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_spanish_ci DEFAULT '.' COMMENT 'Signo miles',
  `u216` int DEFAULT '0' COMMENT 'Empresa y sucursal predeterminada',
  `estado` int NOT NULL DEFAULT '1',
  `u217` varchar(3) CHARACTER SET utf8mb4 COLLATE utf8mb4_spanish_ci DEFAULT '',
  `u218` varchar(15) CHARACTER SET utf8mb4 COLLATE utf8mb4_spanish_ci DEFAULT '',
  `u219` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_spanish_ci DEFAULT '',
  `u220` blob,
  `u221` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_spanish_ci DEFAULT NULL,
  `u222` datetime DEFAULT '1900-01-01 00:00:00',
  `u223` varchar(5) CHARACTER SET utf8mb4 COLLATE utf8mb4_spanish_ci DEFAULT '',
  `u224` smallint DEFAULT '0',
  `u225` smallint DEFAULT '0',
  `u226` smallint DEFAULT '0',
  PRIMARY KEY (`u201`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_spanish_ci;

--
-- Dumping data for table `tb_musuario`
--

INSERT INTO `tb_musuario` VALUES ('00000','Pedrito los Palotes','admin','89d88c6c5eb329ced9e0180dd0ecdf4c6d4e7f23','','','00000',0,'','','','en_us',2,'.',',',1,1,'108','','desarrollo.dba@gmail.com',_binary '�cvc���,K����a��',NULL,'2025-05-08 23:30:39','',0,0,0);

--
-- Table structure for table `tb_musuario_acceso`
--

CREATE TABLE `tb_musuario_acceso` (
  `id_acceso` int NOT NULL AUTO_INCREMENT,
  `id_documento` int DEFAULT '0',
  `id_accion` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_spanish_ci DEFAULT '',
  PRIMARY KEY (`id_acceso`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_spanish_ci;

--
-- Dumping data for table `tb_musuario_acceso`
--

INSERT INTO `tb_musuario_acceso` VALUES (1,1,'1'),(2,1,'2'),(3,1,'3'),(4,1,'4'),(5,1,'5');

--
-- Table structure for table `tb_musuario_accion`
--

CREATE TABLE `tb_musuario_accion` (
  `id_accion` int NOT NULL AUTO_INCREMENT,
  `descripcion` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_spanish_ci DEFAULT '',
  `tipo` int DEFAULT '0',
  PRIMARY KEY (`id_accion`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_spanish_ci;

--
-- Dumping data for table `tb_musuario_accion`
--

INSERT INTO `tb_musuario_accion` VALUES (1,'Nuevo',1),(2,'Editar',1),(3,'Anular',1),(4,'Imprimir',1),(5,'Ver',1),(6,'Aprobar',2),(7,'Permitir acceso',1),(8,'Eliminar',1);

--
-- Table structure for table `tb_musuario_descripcion`
--

CREATE TABLE `tb_musuario_descripcion` (
  `tabla` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_spanish_ci DEFAULT NULL,
  `campo` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_spanish_ci DEFAULT NULL,
  `descripcion` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_spanish_ci DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_spanish_ci;

--
-- Dumping data for table `tb_musuario_descripcion`
--

INSERT INTO `tb_musuario_descripcion` VALUES ('tb_musuario','u201','Id'),('tb_musuario','u202','Nombre de usuario'),('tb_musuario','u203','Usuario'),('tb_musuario','u204','Password'),('tb_musuario','u205','Caja'),('tb_musuario','u206','Grupo'),('tb_musuario','u207','Cambio de password'),('tb_musuario','u208','Estado'),('tb_musuario_dpermiso','u201','Id Usuario'),('tb_musuario_dpermiso','u202','Id Grupo'),('tb_musuario_dpermiso','u203','Id Modulo'),('tb_musuario_dpermiso','u204','Permitir'),('tb_musuario_dpermiso','u205','Nuevo'),('tb_musuario_dpermiso','u206','Editar'),('tb_musuario_dpermiso','u207','Aprobar'),('tb_musuario_dpermiso','u208','Anular'),('tb_musuario_dpermiso','u209','Imprimir'),('tb_musuario_dpermiso','u210','Ver'),('tb_musuario_dpermiso','u211','Item'),('tb_musuario_grupo','u201','Id'),('tb_musuario_grupo','u202','Descripcion'),('tb_musuario_grupo','u203','Estado'),('tb_musuario_grupo_d','u301','Id Grupo'),('tb_musuario_grupo_d','u302','Id Módulo'),('tb_musuario_grupo_d','u303','Id Acción'),('tb_musuario_grupo_d','u304','Item');

--
-- Table structure for table `tb_musuario_dpermiso`
--

CREATE TABLE `tb_musuario_dpermiso` (
  `u201` varchar(5) CHARACTER SET utf8mb4 COLLATE utf8mb4_spanish_ci NOT NULL DEFAULT '' COMMENT 'Grupo',
  `u202` varchar(5) CHARACTER SET utf8mb4 COLLATE utf8mb4_spanish_ci NOT NULL DEFAULT '' COMMENT 'Opción / Formulario',
  `u204` smallint DEFAULT '0' COMMENT 'Entrar',
  `u205` smallint DEFAULT '0' COMMENT 'Ver',
  `u206` smallint DEFAULT '0' COMMENT 'Nuevo',
  `u207` smallint DEFAULT '0' COMMENT 'Editar',
  `u208` smallint DEFAULT '0' COMMENT 'Anular / Eliminar',
  `u209` smallint DEFAULT '0' COMMENT 'Vista previa',
  `u210` smallint DEFAULT '0' COMMENT 'Imprimir',
  `u211` smallint DEFAULT '0' COMMENT 'Especial1',
  `u212` smallint DEFAULT '0' COMMENT 'Especial2',
  `u213` smallint DEFAULT '0' COMMENT 'Especial3',
  `u214` smallint DEFAULT '0' COMMENT 'Especial4',
  `u215` smallint DEFAULT '0' COMMENT 'Galeria-V',
  `u216` smallint DEFAULT '0' COMMENT 'Galeria-I',
  `u217` smallint DEFAULT '0' COMMENT 'Galeria-E',
  `u218` smallint DEFAULT '0' COMMENT 'Galeria-D',
  `u219` smallint DEFAULT '0' COMMENT 'Especial5',
  `u220` int NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`u220`,`u201`,`u202`)
) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_spanish_ci;

--
-- Dumping data for table `tb_musuario_dpermiso`
--

INSERT INTO `tb_musuario_dpermiso` VALUES ('00001','1',1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1),('00001','2',1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,2),('00001','3',1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,3),('00001','4',1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,4),('00001','5',1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,5),('00001','6',1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,6),('00001','7',1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,7),('00001','8',1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,8),('00001','9',1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,9),('00001','10',1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,10),('00001','11',1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,11),('00001','12',1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,12),('00001','13',1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,13);

--
-- Table structure for table `tb_musuario_grupo`
--

CREATE TABLE `tb_musuario_grupo` (
  `u201` varchar(5) CHARACTER SET utf8mb4 COLLATE utf8mb4_spanish_ci NOT NULL DEFAULT '',
  `u202` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_spanish_ci NOT NULL DEFAULT '',
  `u224` smallint NOT NULL DEFAULT '0',
  `estado` smallint NOT NULL DEFAULT '1',
  PRIMARY KEY (`u201`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_spanish_ci;

--
-- Dumping data for table `tb_musuario_grupo`
--

INSERT INTO `tb_musuario_grupo` VALUES ('00000','ADMINISTRADORES DE SISTEMA',0,1);

--
-- Table structure for table `tb_musuario_grupo_d`
--

CREATE TABLE `tb_musuario_grupo_d` (
  `u301` varchar(5) CHARACTER SET utf8mb4 COLLATE utf8mb4_spanish_ci DEFAULT '',
  `u302` int DEFAULT '0',
  `u303` int DEFAULT '0',
  `u304` int NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`u304`)
) ENGINE=InnoDB AUTO_INCREMENT=43 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_spanish_ci;

--
-- Dumping data for table `tb_musuario_grupo_d`
--

INSERT INTO `tb_musuario_grupo_d` VALUES ('00000',1,0,1),('00000',1,1,2),('00000',1,2,3),('00000',1,3,4),('00000',1,4,5),('00000',1,6,6),('00000',2,0,7),('00000',2,1,8),('00000',2,2,9),('00000',2,3,10),('00000',2,4,11),('00000',2,6,12),('00000',3,0,13),('00000',3,1,14),('00000',3,2,15),('00000',3,3,16),('00000',3,4,17),('00000',3,6,18),('00000',4,0,19),('00000',4,1,20),('00000',4,2,21),('00000',4,3,22),('00000',4,4,23),('00000',4,6,24),('00000',5,0,25),('00000',5,1,26),('00000',5,2,27),('00000',5,3,28),('00000',5,4,29),('00000',5,6,30),('00000',6,0,31),('00000',6,1,32),('00000',6,2,33),('00000',6,3,34),('00000',6,4,35),('00000',6,6,36),('00000',7,0,37),('00000',7,1,38),('00000',7,2,39),('00000',7,3,40),('00000',7,4,41),('00000',7,6,42);

--
-- Table structure for table `tb_musuario_horario`
--

CREATE TABLE `tb_musuario_horario` (
  `codigo` varchar(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_spanish_ci NOT NULL,
  `nombre` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_spanish_ci DEFAULT NULL,
  PRIMARY KEY (`codigo`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_spanish_ci;

--
-- Dumping data for table `tb_musuario_horario`
--


--
-- Table structure for table `tb_musuario_horariod`
--

CREATE TABLE `tb_musuario_horariod` (
  `codigo` varchar(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_spanish_ci NOT NULL,
  `hora_inicio` varchar(5) CHARACTER SET utf8mb4 COLLATE utf8mb4_spanish_ci DEFAULT NULL,
  `hora_fin` varchar(5) CHARACTER SET utf8mb4 COLLATE utf8mb4_spanish_ci DEFAULT NULL,
  PRIMARY KEY (`codigo`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_spanish_ci;

--
-- Dumping data for table `tb_musuario_horariod`
--


--
-- Table structure for table `tb_musuario_horas`
--

CREATE TABLE `tb_musuario_horas` (
  `codigo` varchar(5) CHARACTER SET utf8mb4 COLLATE utf8mb4_spanish_ci NOT NULL,
  PRIMARY KEY (`codigo`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_spanish_ci;

--
-- Dumping data for table `tb_musuario_horas`
--


--
-- Table structure for table `tb_musuario_ip`
--

CREATE TABLE `tb_musuario_ip` (
  `codigo` varchar(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_spanish_ci NOT NULL,
  `nombre` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_spanish_ci DEFAULT NULL,
  `acceso_local` int DEFAULT NULL,
  `ip_inicio` varchar(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_spanish_ci DEFAULT NULL,
  `ip_fin` varchar(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_spanish_ci DEFAULT NULL,
  `acceso_remoto` int DEFAULT NULL,
  `horario_acceso_local` varchar(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_spanish_ci DEFAULT NULL,
  `horario_acceso_remoto` varchar(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_spanish_ci DEFAULT NULL,
  PRIMARY KEY (`codigo`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_spanish_ci;

--
-- Dumping data for table `tb_musuario_ip`
--


--
-- Table structure for table `tb_musuariod`
--

CREATE TABLE `tb_musuariod` (
  `u201` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_spanish_ci NOT NULL,
  `empresa` varchar(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_spanish_ci DEFAULT '',
  `sucursal` varchar(3) CHARACTER SET utf8mb4 COLLATE utf8mb4_spanish_ci DEFAULT '',
  `item` int NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`item`,`u201`)
) ENGINE=InnoDB AUTO_INCREMENT=26 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_spanish_ci;

--
-- Dumping data for table `tb_musuariod`
--

INSERT INTO `tb_musuariod` VALUES ('00001','01','001',1),('00003','01','',2),('00005','01','',3),('00006','01','',4),('00007','01','',5),('00008','01','',6),('00009','01','',7),('00010','01','',8),('00011','01','',9),('00012','01','',10),('00013','01','',11),('00014','01','',12),('00015','01','',13),('00016','01','',14),('00017','01','',15),('00018','01','',16),('00019','01','',17),('00020','01','',18),('00021','01','',19),('00022','01','',20),('00023','01','',21),('00024','01','',22),('00025','01','',23),('00026','01','',24),('00027','01','',25);

--
-- Table structure for table `tb_s_log`
--

CREATE TABLE `tb_s_log` (
  `item` int NOT NULL AUTO_INCREMENT,
  `codemp` varchar(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_spanish_ci NOT NULL,
  `sucursal` varchar(3) CHARACTER SET utf8mb4 COLLATE utf8mb4_spanish_ci DEFAULT NULL,
  `formulario` int DEFAULT NULL,
  `usuario` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_spanish_ci DEFAULT NULL,
  `referencia` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_spanish_ci DEFAULT NULL,
  `fecha` datetime DEFAULT NULL,
  `operacion` int DEFAULT NULL COMMENT '0- Acceso, 1- Nuevo, 2- Editado, 3- Eliminado, 4-Anulado, 5-Impreso',
  `descripcion` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_spanish_ci DEFAULT NULL,
  `ip` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_spanish_ci DEFAULT NULL,
  `browser` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_spanish_ci DEFAULT NULL,
  `browser_version` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_spanish_ci DEFAULT NULL,
  `os` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_spanish_ci DEFAULT NULL,
  `ciudad` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_spanish_ci DEFAULT NULL,
  `estado_ciudad` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_spanish_ci DEFAULT NULL,
  `pais` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_spanish_ci DEFAULT NULL,
  `latitud` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_spanish_ci DEFAULT NULL,
  `longitud` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_spanish_ci DEFAULT NULL,
  `vpn` varchar(5) CHARACTER SET utf8mb4 COLLATE utf8mb4_spanish_ci DEFAULT NULL,
  PRIMARY KEY (`item`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_spanish_ci;

--
-- Dumping data for table `tb_s_log`
--


--
-- Table structure for table `tb_tdocumento`
--

CREATE TABLE `tb_tdocumento` (
  `nombre` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_spanish_ci NOT NULL,
  `numero` int NOT NULL DEFAULT '0',
  `item` int NOT NULL AUTO_INCREMENT,
  `nombre_forma` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_spanish_ci NOT NULL,
  PRIMARY KEY (`item`)
) ENGINE=InnoDB AUTO_INCREMENT=23 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_spanish_ci;

--
-- Dumping data for table `tb_tdocumento`
--

INSERT INTO `tb_tdocumento` VALUES ('tb_musuario',27,1,''),('tb_musuario_grupo',9,2,'');

--
-- Dumping events for database 'db_supply'
--

--
-- Dumping routines for database 'db_supply'
--
/*!50003 DROP PROCEDURE IF EXISTS `sp_cbusqueda` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_cbusqueda`(
	in _codemp varchar(2), 
	in _sucursal varchar(3), 
	in _tabla varchar(100), 
	in _campos varchar(500), 
	in _ordenado varchar(50), 
	in _bCampos varchar(500), 
	in _operador varchar(5), 
	in _valor varchar(100), 
	in _pagina int, 
	in _regpp int, 
	in _adicional varchar(5000), 
	in _tipo_estado varchar(3),
	in _estado int
)
begin
	/* ----------------------------------------------------------------------------------------------------
		Busqueda y paginador generico de formularios listas
		Versión 1.0
		Creado: 2024.12.01
		Actualizado: 2024.12.16, 2024.12.27, 2025.01.24, 2025-05-06
		Autor: 
	---------------------------------------------------------------------------------------------------- */
	
	-- Validación de parámetros
    if (_codemp is not null) OR (_sucursal is not null) or (_tabla is not null) or (_bcampos is not null) or (_operador is not null) then
		set @bCampos = trim(_bCampos) ;
		set @tablaBA = coalesce(_tabla) ;
		set @jointb = '';
		set @camposB = '' ;
		set @cSentencia = '' ;
		set @estado = coalesce(_estado, 0) ;
		
		-- ----------------------------------------------------------------------------------------------------
		-- crea el cursor que validará los números que solo aplican para la búsqueda de los presupuestos.
		call str_cadena(_codemp, _sucursal, _tabla, @tablaBA, @jointb, _campos, @camposB, _ordenado, _bCampos, _operador, _valor, _pagina, _regpp, _adicional, _tipo_estado, @estado, '', '', 0, @cSentencia) ;
		
		-- ----------------------------------------------------------------------------------------------------
		select 	sentencia.*, 
				coalesce(cfg_mestado.nombre, '') as nestado,
				coalesce(cfg_mestado.clase_css, '') as nestado_clase_css,
				coalesce(cfg_mestado.img_icon, '') as nestado_img_icon,
				@iPagina as PagAct, 
				@iPaginaUltima as PagUltima, 
				@iNumeroFila as Filas 
			from sentencia
				left join cfg_mestado 
					on sentencia.estado = cfg_mestado.codigo 
						and cfg_mestado.tipo = rtrim(_tipo_estado) 
			order by sentencia.RegFila ;
	else
		select -1 ;
	end if ;
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_cbusqueda_basico` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_cbusqueda_basico`(
	in _codemp varchar(2), 
	in _sucursal varchar(3), 
	in _tabla varchar(100), 
	in _campos varchar(500), 
	in _ordenado varchar(50), 
	in _bCampos varchar(500), 
	in _operador varchar(5), 
	in _valor varchar(100), 
	in _pagina int, 
	in _regpp int, 
	in _adicional varchar(5000), 
	in _tipo_estado varchar(3),
	in _estado int
)
begin
	/* ----------------------------------------------------------------------------------------------------
		Busqueda y paginador generico de formularios listas
		Versión 1.0
		Creado: 2024.12.01
		Actualizado: 2024.12.16, 2024.12.26, 2025.01.24, 2025-05-06
		Autor: 
	---------------------------------------------------------------------------------------------------- */
	
	-- Validación de parámetros
    if (_codemp is not null) OR (_sucursal is not null) or (_tabla is not null) or (_bcampos is not null)  or (_operador is not null) then
		set @bCampos = trim(_bCampos) ;
		set @tablaBA = coalesce(_tabla) ;
		set @jointb = '';
		set @camposB = '' ;
		set @cSentencia = '' ;
		set @estado = coalesce(_estado, 0) ;
		
		-- ----------------------------------------------------------------------------------------------------
		-- crea el cursor que validará los números que solo aplican para la búsqueda de los presupuestos.
		call str_cadena(_codemp, _sucursal, _tabla, @tablaBA, @jointb, _campos, @camposB, _ordenado, _bCampos, _operador, _valor, _pagina, _regpp, _adicional, _tipo_estado, @estado, '', '', 0, @cSentencia) ;
		
		-- ----------------------------------------------------------------------------------------------------
		select 	sentencia.*, 
				coalesce(cfg_mestado.nombre, '') as nestado,
				coalesce(cfg_mestado.clase_css, '') as nestado_clase_css,
				coalesce(cfg_mestado.img_icon, '') as nestado_img_icon,
				@iPagina as PagAct, 
				@iPaginaUltima as PagUltima, 
				@iNumeroFila as Filas 
			from sentencia
				left join cfg_mestado 
					on sentencia.estado = cfg_mestado.codigo 
						and cfg_mestado.tipo = rtrim(_tipo_estado) 
			order by RegFila ;
	else
		select -1 ;
	end if ;
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_cbusqueda_cfg_mempresa` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_cbusqueda_cfg_mempresa`(	
	in _codemp varchar(2), 
	in _sucursal varchar(3), 
	in _tabla varchar(25), 
	in _campos varchar(500), 
	in _ordenado varchar(50), 
	in _bCampos varchar(500), 
	in _operador varchar(5), 
	in _valor varchar(100), 
	in _pagina int, 
	in _regpp int, 
	in _adicional varchar(5000), 
	in _tipo_estado varchar(3),
	in _estado int
)
begin
	/* ----------------------------------------------------------------------------------------------------
		Busqueda y paginador generico de formularios listas
		Versión 1.0
		Creado: 2024.12.01
		Actualizado: 2024.12.16, 2025.01.24, 2025-05-06
		Autor: 
	---------------------------------------------------------------------------------------------------- */
	
	-- Validación de parámetros
    if (_codemp is not null) OR (_sucursal is not null) or (_tabla is not null) or (_bcampos is not null)  or (_operador is not null) then
		set @bCampos = trim(_bCampos) ;
		set @tablaBA = coalesce(_tabla) ;
		set @jointb = '';
		set @camposB = '' ;
		set @cSentencia = '' ;
		set @estado = coalesce(_estado, 0) ;
		
		-- ----------------------------------------------------------------------------------------------------
		-- crea el cursor que validará los números que solo aplican para la búsqueda de los presupuestos.
		call str_cadena_codigo(_codemp, _sucursal, _tabla, @tablaBA, @jointb, _campos, @camposB, _ordenado, _bCampos, _operador, _valor, _pagina, _regpp, _adicional, _tipo_estado, @estado, '', '', 0, @cSentencia) ;
		   
		-- ----------------------------------------------------------------------------------------------------
		select sentencia.*,
				coalesce(tb_g_mdivisa_b.nombre, '') as ndivisa,
				coalesce(tb_g_mdivisa_c.nombre, '') as nmoneda,
				coalesce(cfg_mestado.nombre, '') as nestado,
				coalesce(cfg_mestado.clase_css, '') as nestado_clase_css,
				coalesce(cfg_mestado.img_icon, '') as nestado_img_icon,
				@iPagina as PagAct, 
				@iPaginaUltima as PagUltima, 
				@iNumeroFila as Filas 
			from sentencia 
				left join tb_g_mdivisa as tb_g_mdivisa_b 
					on sentencia.codigo = tb_g_mdivisa_b.codemp
						and sentencia.divisa = tb_g_mdivisa_b.codigo
				left join tb_g_mdivisa as tb_g_mdivisa_c 
					on sentencia.codigo = tb_g_mdivisa_c.codemp
						and sentencia.moneda = tb_g_mdivisa_c.codigo
				left join cfg_mestado 
					on sentencia.estado = cfg_mestado.codigo 
						and cfg_mestado.tipo = trim(_tipo_estado) 
			order by sentencia.Regfila ;
	else
		select -1 ;
	end if ;
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_cbusqueda_f_mcliente` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_cbusqueda_f_mcliente`(
	in _codemp varchar(2), 
	in _sucursal varchar(3), 
	in _tabla varchar(100), 
	in _campos varchar(500), 
	in _ordenado varchar(50), 
	in _bCampos varchar(500), 
	in _operador varchar(5), 
	in _valor varchar(100), 
	in _pagina int, 
	in _regpp int, 
	in _adicional varchar(5000), 
	in _tipo_estado varchar(3),
	in _estado int
)
begin
	/* ----------------------------------------------------------------------------------------------------
		Busqueda y paginador generico de formularios listas
		Versión 1.0
		Creado: 2024-12-01
		Actualizado: 2024-12-16, 2024-12-27, 2025-01-24, 2025-05-06
		Autor: Custom Systems Solutions LLC
	---------------------------------------------------------------------------------------------------- */
    
	-- Validación de parámetros
    if (_codemp is not null) OR (_sucursal is not null) or (_tabla is not null) or (_bcampos is not null)  or (_operador is not null) then
		set @bCampos = trim(_bCampos) ;
		set @tablaBA = coalesce(_tabla) ;
		set @jointb = '';
		set @camposB = '' ;
		set @cSentencia = '' ;
		set @estado = coalesce(_estado, 0) ;
		
		-- ----------------------------------------------------------------------------------------------------
		-- crea el cursor que validará los números que solo aplican para la búsqueda de los presupuestos.
		call str_cadena(_codemp, _sucursal, _tabla, @tablaBA, @jointb, _campos, @camposB, _ordenado, _bCampos, _operador, _valor, _pagina, _regpp, _adicional, _tipo_estado, @estado, '', '', 0, @cSentencia) ;
		   
		-- ----------------------------------------------------------------------------------------------------
		select 	sentencia.*, 
				coalesce(tb_f_mgrupo.nombre, '') as ngrupo,
				coalesce(tb_g_mpais.nombre, '') as npais,
				concat(trim(coalesce(tb_g_mestado_ciudad.nombre, '')), ' [', sentencia.pais, ']') as nestado_ciudad,
                coalesce(tb_g_mciudad.nombre, '') as nciudad,
				coalesce(cfg_mestado.nombre, '') as nestado,
				coalesce(cfg_mestado.clase_css, '') as nestado_clase_css,
				coalesce(cfg_mestado.img_icon, '') as nestado_img_icon,
				@iPagina as PagAct, 
				@iPaginaUltima as PagUltima, 
				@iNumeroFila as Filas 
			from sentencia
				left join tb_f_mgrupo
					on sentencia.codemp = tb_f_mgrupo.codemp
						and sentencia.sucursal = tb_f_mgrupo.sucursal
						and sentencia.grupo = tb_f_mgrupo.codigo
				left join tb_g_mpais
					on sentencia.pais = tb_g_mpais.codigo
				left join tb_g_mestado_ciudad
					on sentencia.pais = tb_g_mestado_ciudad.pais
						and sentencia.estado_ciudad = tb_g_mestado_ciudad.codigo
				left join tb_g_mciudad
					on sentencia.pais = tb_g_mciudad.pais
						and sentencia.estado_ciudad = tb_g_mciudad.estado_ciudad
                        and sentencia.ciudad = tb_g_mciudad.codigo
				left join cfg_mestado 
					on sentencia.estado = cfg_mestado.codigo 
						and cfg_mestado.tipo = trim(_tipo_estado) 
			order by sentencia.RegFila ;
	else
		select -1 ; 
	end if ;
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_cbusqueda_f_oincidencia` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_cbusqueda_f_oincidencia`(
	in _codemp varchar(2), 
	in _sucursal varchar(3), 
	in _tabla varchar(25), 
	in _campos varchar(500), 
	in _ordenado varchar(50), 
	in _bCampos varchar(500), 
	in _operador varchar(5), 
	in _valor varchar(100), 
	in _pagina int, 
	in _regpp int, 
	in _adicional varchar(5000), 
	in _tipo_estado varchar(3),
	in _estado varchar(3),
	in _desde varchar(10),
	in _hasta varchar(10)
)
begin
	/* ----------------------------------------------------------------------------------------------------
		Busqueda y paginador generico de formularios listas
		Versión 1.0
		Creado: 2025.01.22
		Actualizado: 2025.01.22, 2025.01.24, 2025-05-06
		Autor: 
	---------------------------------------------------------------------------------------------------- */
    
	-- Validación de parámetros
    if (_codemp is not null) OR (_sucursal is not null) or (_tabla is not null) or (_bcampos is not null)  or (_operador is not null) then
		set @bCampos = trim(_bCampos) ;
		set @tablaBA = coalesce(_tabla) ;
		set @jointb = '';
		set @camposB = '' ;
		set @cSentencia = '' ;
		set @estado = coalesce(_estado, 0) ;
		
		-- ----------------------------------------------------------------------------------------------------
		-- crea el cursor que validará los números que solo aplican para la búsqueda de los presupuestos.
		call str_cadena(_codemp, _sucursal, _tabla, @tablaBA, @jointb, _campos, @camposB, _ordenado, _bCampos, _operador, _valor, _pagina, _regpp, _adicional, _tipo_estado, @estado, _desde, _hasta, 1, @cSentencia) ;

		-- ----------------------------------------------------------------------------------------------------
		select 	sentencia.*, 
				coalesce(tb_f_mcliente.nombre, '') as ncliente,
				coalesce(tb_f_msupervisor.nombre, '') as nsupervisor,
				coalesce(tb_f_mincidencia.nombre, '') as nincidencia,
                coalesce(tb_f_mindicencia_nivel.nombre, '') as nincidencia_nivel,
				coalesce(cfg_mestado.nombre, '') as nestado,
				coalesce(cfg_mestado.clase_css, '') as nestado_clase_css,
				coalesce(cfg_mestado.img_icon, '') as nestado_img_icon,
				@iPagina as PagAct, 
				@iPaginaUltima as PagUltima, 
				@iNumeroFila as Filas 
			from sentencia
				left join tb_f_mcliente
					on sentencia.codemp = tb_f_mcliente.codemp
						and sentencia.sucursal = tb_f_mcliente.sucursal
						and sentencia.cliente = tb_f_mcliente.codigo
				left join tb_f_msupervisor
					on sentencia.codemp = tb_f_msupervisor.codemp
						and sentencia.sucursal = tb_f_msupervisor.sucursal
						and sentencia.supervisor = tb_f_msupervisor.codigo
				left join tb_f_mincidencia
					on sentencia.codemp = tb_f_mincidencia.codemp
						and sentencia.sucursal = tb_f_mincidencia.sucursal
						and sentencia.incidencia = tb_f_mincidencia.codigo
				left join tb_f_mindicencia_nivel
					on sentencia.codemp = tb_f_mindicencia_nivel.codemp
						and sentencia.sucursal = tb_f_mindicencia_nivel.sucursal
						and sentencia.incidencia_nivel = tb_f_mindicencia_nivel.codigo
				left join tb_musuario 
					on tb_musuario.u201 = coalesce(sentencia.usuario,'')
				left join cfg_mestado 
					on sentencia.estado = cfg_mestado.codigo 
						and cfg_mestado.tipo = rtrim(_tipo_estado)
			order by sentencia.RegFila ;
	else
		select -1 ;
	end if ;
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_cbusqueda_f_oincidencia_dpersonal_b` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_cbusqueda_f_oincidencia_dpersonal_b`(
	in _codemp varchar(2), 
	in _sucursal varchar(3), 
	in _tabla varchar(50), 
	in _campos varchar(500), 
	in _ordenado varchar(50), 
	in _bcampos varchar(500), 
	in _operador varchar(5), 
	in _valor varchar(100), 
	in _pagina int, 
	in _regpp int, 
	in _adicional varchar(5000), 
	in _tipo_estado varchar(3)
)
begin
	/* ----------------------------------------------------------------------------------------------------
		Busqueda y paginador estandar para detalle de formularios 
		Versión 1.0
		Creado: 2025.01.23
		Actualizado: 2025.01.23, 2025.01.24, 2025-05-06
		Autor: 
	---------------------------------------------------------------------------------------------------- */
   
	-- Validación de parámetros
    if (_codemp is not null) OR (_sucursal is not null) or (_tabla is not null) or (_bcampos is not null)  or (_operador is not null) then
		set @bCampos = trim(_bCampos) ;
		set @tablaBA = coalesce(_tabla) ;
		set @jointb = '';
		set @camposB = '' ;
		set @cSentencia = '' ;
		set @estado = 1 ;
        set @adicional = _adicional ;
        set _adicional = '' ;
		
		-- ----------------------------------------------------------------------------------------------------
		-- crea el cursor que validará los números que solo aplican para la búsqueda de los presupuestos.
		call str_cadena(_codemp, _sucursal, _tabla, @tablaBA, @jointb, _campos, @camposB, 'codigo', _bCampos, _operador, _valor, _pagina, _regpp, _adicional, _tipo_estado, @estado, '', '', 0, @cSentencia) ;
		
		-- ----------------------------------------------------------------------------------------------------
        set @espacio = '' ;
        
        drop temporary table if exists f_mplantilla ;
        create temporary table f_mplantilla
			select codemp, sucursal, codigo
				from tb_f_mplantilla
                where codemp = _codemp
					and sucursal = _sucursal
                    and cliente = @adicional ;
                    
		drop temporary table if exists f_mplantilla_dp ;
        create temporary table f_mplantilla_dp
			select 	tb_f_mplantilla_dpersonal_role.codemp, 
					tb_f_mplantilla_dpersonal_role.sucursal, 
                    tb_f_mplantilla_dpersonal_role.personal
				from tb_f_mplantilla_dpersonal_role
					inner join f_mplantilla
						on tb_f_mplantilla_dpersonal_role.codemp = f_mplantilla.codemp 
							and tb_f_mplantilla_dpersonal_role.sucursal = f_mplantilla.sucursal
							and tb_f_mplantilla_dpersonal_role.codigo = f_mplantilla.codigo
				group by tb_f_mplantilla_dpersonal_role.codemp, 
					tb_f_mplantilla_dpersonal_role.sucursal, 
                    tb_f_mplantilla_dpersonal_role.personal ;
                            
		select 	sentencia.codemp, 
				sentencia.sucursal,
				sentencia.codigo,
                sentencia.codigo as personal,
				coalesce(sentencia.apellido, '') as apellido,
                coalesce(sentencia.nombre, '') as nombre,
				coalesce(tb_g_mestado_ciudad.nombre, '')  as nestado_ciudad,
                coalesce(tb_g_mciudad.nombre, '') as nciudad,
                coalesce(sentencia.telefono, '') as telefono,
                coalesce(sentencia.foto, '') as foto,
				coalesce(cfg_mestado.nombre, '') as nestado,
				coalesce(cfg_mestado.clase_css, '') as nestado_clase_css,
				coalesce(cfg_mestado.img_icon, '') as nestado_img_icon,
                0 as marca,
				@iPagina as PagAct, 
				@iPaginaUltima as PagUltima, 
				@iNumeroFila as Filas
			from sentencia
				inner join f_mplantilla_dp
					on sentencia.codemp = f_mplantilla_dp.codemp 
						and sentencia.sucursal = f_mplantilla_dp.sucursal
						and sentencia.codigo = f_mplantilla_dp.personal
				left join tb_g_mpais
					on sentencia.pais = tb_g_mpais.codigo
				left join tb_g_mestado_ciudad
					on sentencia.pais = tb_g_mestado_ciudad.pais
						and sentencia.estado_ciudad = tb_g_mestado_ciudad.codigo
				left join tb_g_mciudad
					on sentencia.pais = tb_g_mciudad.pais
                        and sentencia.estado_ciudad = tb_g_mciudad.estado_ciudad
                        and sentencia.ciudad = tb_g_mciudad.codigo
				left join cfg_mestado 
					on sentencia.estado = cfg_mestado.codigo 
						and cfg_mestado.tipo = trim(_tipo_estado) 
			order by case  
						when _ordenado = 'apellido' then coalesce(sentencia.apellido, '')
                        when _ordenado = 'nombre' then coalesce(sentencia.nombre, '')
                        when _ordenado = 'nestado_ciudad' then concat(coalesce(tb_g_mestado_ciudad.nombre, ''), coalesce(sentencia.apellido, ''))
                        when _ordenado = 'nciudad' then concat(coalesce(tb_g_mciudad.nombre, ''), coalesce(sentencia.apellido, ''))
						else sentencia.RegFila
					end ;
	else
		select -1 ;
	end if ;
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_cbusqueda_f_oincidencia_dpersonal_role_b` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_cbusqueda_f_oincidencia_dpersonal_role_b`(
	in _codemp varchar(2), 
	in _sucursal varchar(3), 
	in _tabla varchar(50), 
	in _campos varchar(500), 
	in _ordenado varchar(50), 
	in _bcampos varchar(500), 
	in _operador varchar(5), 
	in _valor varchar(100), 
	in _pagina int, 
	in _regpp int, 
	in _adicional varchar(5000), 
	in _tipo_estado varchar(3)
)
begin
	-- -----------------------------------------------------------
	-- Busqueda y paginador estandar para detalle de formularios 
	-- Versión 1.0
	-- Creado: 2025.01.23
	-- Actualizado: 2025.01.23, 2025-05-06
	-- Autor: 
	-- ------------------------------------------------------------
   
	-- Validación de parámetros
    if (_codemp is not null) OR (_sucursal is not null) or (_tabla is not null) or (_bcampos is not null)  or (_operador is not null) then
		set @bCampos = trim(_bCampos) ;
		set @tablaBA = coalesce(_tabla) ;
		set @jointb = '';
		set @camposB = '' ;
		set @cSentencia = '' ;
		set @estado = 1 ;
		
		-- ----------------------------------------------------------------------------------------------
		-- crea el cursor que validará los números que solo aplican para la búsqueda de los presupuestos.
		call str_cadena(_codemp, _sucursal, _tabla, @tablaBA, @jointb, _campos, @camposB, 'codigo', _bCampos, _operador, _valor, _pagina, _regpp, _adicional, _tipo_estado, @estado, '', '', 0, @cSentencia) ;
		
		-- ----------------------------------------------------------------------------------------------
        set @espacio = '' ;
		select 	sentencia.codemp, 
				sentencia.sucursal,
				sentencia.codigo,
                sentencia.codigo as personal,
				coalesce(sentencia.apellido, '') as apellido,
                coalesce(sentencia.nombre, '') as nombre,
				coalesce(tb_g_mestado_ciudad.nombre, '')  as nestado_ciudad,
                coalesce(tb_g_mciudad.nombre, '') as nciudad,
                coalesce(sentencia.telefono, '') as telefono,
                coalesce(sentencia.foto, '') as foto,
                @espacio as role,
                @espacio as nrole,
                0 as marca,
				@iPagina as PagAct, 
				@iPaginaUltima as PagUltima, 
				@iNumeroFila as Filas
			from sentencia
				left join tb_g_mpais
					on sentencia.pais = tb_g_mpais.codigo
				left join tb_g_mestado_ciudad
					on sentencia.pais = tb_g_mestado_ciudad.pais
						and sentencia.estado_ciudad = tb_g_mestado_ciudad.codigo
				left join tb_g_mciudad
					on sentencia.pais = tb_g_mciudad.pais
                        and sentencia.estado_ciudad = tb_g_mciudad.estado_ciudad
                        and sentencia.ciudad = tb_g_mciudad.codigo
				left join cfg_mestado 
					on sentencia.estado = cfg_mestado.codigo 
						and cfg_mestado.tipo = trim(_tipo_estado) 
			order by case  
						when _ordenado = 'apellido' then coalesce(sentencia.apellido, '')
                        when _ordenado = 'nombre' then coalesce(sentencia.nombre, '')
                        when _ordenado = 'nestado_ciudad' then concat(coalesce(tb_g_mestado_ciudad.nombre, ''), coalesce(sentencia.apellido, ''))
                        when _ordenado = 'nciudad' then concat(coalesce(tb_g_mciudad.nombre, ''), coalesce(sentencia.apellido, ''))
						else sentencia.RegFila
					end ;
			-- order by sentencia.RegFila ;
	else
		select -1 ;
	end if ;
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_cbusqueda_musuario` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_cbusqueda_musuario`(
	in _codemp varchar(2), 
	in _sucursal varchar(3), 
	in _tabla varchar(25), 
	in _campos varchar(500), 
	in _ordenado varchar(50), 
	in _bCampos varchar(500), 
	in _operador varchar(5), 
	in _valor varchar(100), 
	in _pagina int, 
	in _regpp int, 
	in _adicional varchar(5000), 
	in _tipo_estado varchar(3),
	in _estado int
)
begin
	/* ----------------------------------------------------------------------------------------------------
		Busqueda y paginador generico de formularios listas
		Versión 1.0
		Creado: 2024.12.01
		Actualizado: 2025.01.22, 2025.01.24, 2025-05-06
		Autor: Iluminado
	---------------------------------------------------------------------------------------------------- */
    
	-- Validación de parámetros
    if (_codemp is not null) OR (_sucursal is not null) or (_tabla is not null) or (_bcampos is not null)  or (_operador is not null) then
		set @iLimite = _regpp ;
		set @iPagina = _pagina ;
		set @cCampos = _campos ;
		set @iLimiteInicio = ((@iPagina - 1) * @iLimite) ;
		set @Fila = 0 ;
		set @cadena = '' ;
		
		if trim(coalesce(_valor, '')) <> '' then
			if _operador='LIKE' then
				set @cadena = concat(' where ', trim(_bCampos), ' LIKE ', '''','%',trim(_valor), '%','''');
			else
				set @cadena = concat(' where ', trim(_bCampos), trim(_operador), '''',trim(_valor), '''');
			end if ;
		end if ;
		
		if coalesce(_adicional, '') <> '' then
			if trim(coalesce(@cadena, '')) = '' then
				set @cadena = concat(' where ', trim(_adicional)) ;
			else
				set @cadena = concat(@cadena, ' and ', _adicional) ;
			end if;
		end if;
		
		drop temporary table if exists sentencia ;
		set @cSentencia = concat('CREATE TEMPORARY TABLE sentencia SELECT SQL_CALC_FOUND_ROWS ',@cCampos,', (@fila:= @fila + 1) as RegFila', ' FROM ', trim(_tabla), @cadena, ' ORDER BY ', rtrim(_ordenado), ' LIMIT ', @iLimiteInicio, ', ',  @iLimite);
		PREPARE sentencia from @cSentencia ;
		EXECUTE sentencia ;
		DEALLOCATE PREPARE sentencia ;
		
		set @iNumeroFila = FOUND_ROWS() ;
		set @iPaginaUltima =  round((@iNumeroFila/@iLimite), 0) ;
		if coalesce(@iPaginaUltima, 0) = 0 then
			set @iPaginaUltima = 1 ;
		end if ;
		
        -- ----------------------------------------------------------------------------------------------------
		select sentencia.*,
				coalesce(tb_musuario_grupo.u202, '') as ngrupo, 
				coalesce(tb_f_msupervisor.nombre, '') as nsupervisor, 
                coalesce(tb_f_mplantilla.nombre, '') as nplantilla,
                coalesce(cfg_mlenguaje.nombre, '') nlenguaje,
                coalesce(cfg_timezones.nombre, '') as ntimezones,
				coalesce(cfg_mestado.nombre, '') as nestado,
				coalesce(cfg_mestado.clase_css, '') as nestado_clase_css,
				coalesce(cfg_mestado.img_icon, '') as nestado_img_icon,
				@iPagina as PagAct, 
				@iPaginaUltima as PagUltima, 
				@iNumeroFila as Filas 
			from sentencia 
				left join tb_musuario_grupo 
					on sentencia.u206 = tb_musuario_grupo.u201 
				left join tb_f_msupervisor
					on tb_f_msupervisor.codemp = _codemp
						and tb_f_msupervisor.sucursal = _sucursal
						and sentencia.u205_s = tb_f_msupervisor.codigo
				left join tb_f_mplantilla
					on tb_f_mplantilla.codemp = _codemp
						and tb_f_mplantilla.sucursal = _sucursal
						and sentencia.u218 = tb_f_mplantilla.codigo
				left join cfg_mlenguaje
					on sentencia.u212 = cfg_mlenguaje.codigo
				left join cfg_timezones
					on cfg_timezones.codemp = _codemp
						and sentencia.u217 = cfg_timezones.codigo
				left join cfg_mestado 
					on sentencia.estado = cfg_mestado.codigo 
						and cfg_mestado.tipo = rtrim(_tipo_estado) 
			order by sentencia.RegFila ;
	else
		select -1 ;
	end if ;
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_cbusqueda_musuario_grupo` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_cbusqueda_musuario_grupo`(
	in _codemp varchar(2), 
	in _sucursal varchar(3), 
	in _tabla varchar(25), 
	in _campos varchar(500), 
	in _ordenado varchar(50), 
	in _bcampos varchar(500), 
	in _operador varchar(5), 
	in _valor varchar(100), 
	in _pagina int, 
	in _regpp int, 
	in _adicional varchar(5000), 
	in _tipo_estado varchar(3),
	in _estado int
)
begin
	/* ----------------------------------------------------------------------------------------------------
		Busqueda y paginador generico de formularios listas
		Versión 1.0
		Creado: 05/05/2014
		Actualizado: 2024.04.13, 07/08/2014, 2024.12.27, 2025-05-06
		Autor: 
	---------------------------------------------------------------------------------------------------- */
    
	if (_codemp is not null) OR (_sucursal is not null) or (_bcampos is not null)  or (_operador is not null) then
		set @iLimite = _regpp ;
		set @iPagina = _pagina ;
		set @cCampos = _campos ;
		set @iLimiteInicio = ((@iPagina - 1) * @iLimite) ;
		set @Fila = 0 ;
		set @cadena = '' ;
		
		if trim(coalesce(_valor, '')) <> '' then
			if _operador='LIKE' then
				set @cadena = concat(' where ', trim(_bCampos), ' LIKE ', '''','%',trim(_valor), '%','''');
			else
				set @cadena = concat(' where ', trim(_bCampos), trim(_operador), '''',trim(_valor), '''');
			end if;
		end if ;
		
		if coalesce(_adicional, '') <> '' then
			if trim(coalesce(@cadena, '')) = '' then
				set @cadena = concat(@cadena, ' where ', trim(_adicional)) ;
			else
				set @cadena = concat(@cadena, ' and ', _adicional) ;
			end if;
		end if;
		
		drop temporary table if exists sentencia ;
		set @cSentencia = concat('CREATE TEMPORARY TABLE sentencia SELECT SQL_CALC_FOUND_ROWS ',@cCampos,', (@fila:= @fila + 1) as RegFila',' FROM ', trim(_tabla), @cadena, ' ORDER BY ', rtrim(_ordenado), ' LIMIT ', @iLimiteInicio, ', ',  @iLimite);
		prepare sentencia from @cSentencia ;
		execute sentencia ;
		deallocate prepare sentencia ;
		
		set @iNumeroFila = FOUND_ROWS();
		set @iPaginaUltima =  round((@iNumeroFila/@iLimite), 0) ;
		if coalesce(@iPaginaUltima, 0) = 0 then
			set @iPaginaUltima = 1 ;
		end if ;
		
        -- ----------------------------------------------------------------------------------------------------
		select 	sentencia.*, 
				coalesce(cfg_mestado.nombre, '') as nestado,
				coalesce(cfg_mestado.clase_css, '') as nestado_clase_css,
				coalesce(cfg_mestado.img_icon, '') as nestado_img_icon,
				@iPagina as PagAct, 
				@iPaginaUltima as PagUltima, 
				@iNumeroFila as Filas 
			from sentencia
				left join cfg_mestado on sentencia.estado = cfg_mestado.codigo and cfg_mestado.tipo = rtrim(_tipo_estado) 
			order by sentencia.RegFila ;
	else
		select -1 ;
	end if ;
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_cbusqueda_nocode` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_cbusqueda_nocode`(
	in _codemp varchar(2), 
	in _sucursal varchar(3), 
	in _tabla varchar(100), 
	in _campos varchar(500), 
	in _ordenado varchar(50), 
	in _bCampos varchar(500), 
	in _operador varchar(5), 
	in _valor varchar(100), 
	in _pagina int, 
	in _regpp int, 
	in _adicional varchar(5000), 
	in _tipo_estado varchar(3),
	in _estado int
)
begin
	/* ----------------------------------------------------------------------------------------------------
		Busqueda y paginador generico de formularios listas
		Versión 1.0
		Creado: 2024.12.01
		Actualizado: 2024.12.16, 2024.12.27
		Autor: 
	---------------------------------------------------------------------------------------------------- */
	
	-- Validación de parámetros
    if (_codemp is not null) OR (_sucursal is not null) or (_tabla is not null) or (_bcampos is not null) or (_operador is not null) then
		set @codemp = '..' ;
		set @bCampos = trim(_bCampos) ;
		set @tablaBA = coalesce(_tabla) ;
		set @jointb = '';
		set @camposB = '' ;
		set @cSentencia = '' ;
		set @estado = coalesce(_estado, 0) ;
		
		-- ----------------------------------------------------------------------------------------------------
		-- crea el cursor que validará los números que solo aplican para la búsqueda de los presupuestos.
		call str_cadena_nocode(@codemp, @codemp, _tabla, @tablaBA, @jointb, _campos, @camposB, _ordenado, _bCampos, _operador, _valor, _pagina, _regpp, _adicional, _tipo_estado, @estado, '', '', 0, @cSentencia) ;
		
		-- ----------------------------------------------------------------------------------------------------
		select 	sentencia.*,
				@iPagina as PagAct, 
				@iPaginaUltima as PagUltima, 
				@iNumeroFila as Filas 
			from sentencia
			order by sentencia.RegFila ;
	else
		select -1 ;
	end if ;
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_cbusqueda_std_b` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_cbusqueda_std_b`(
	in _codemp varchar(2), 
	in _sucursal varchar(3), 
	in _tabla varchar(50), 
	in _campos varchar(500), 
	in _ordenado varchar(50), 
	in _bcampos varchar(500), 
	in _operador varchar(5), 
	in _valor varchar(100), 
	in _pagina int, 
	in _regpp int, 
	in _adicional varchar(5000), 
	in _tipo_estado varchar(3)
)
begin
	/* ----------------------------------------------------------------------------------------------------
		Busqueda y paginador estandar para detalle de formularios 
		Versión 1.0
		Creado: 2024.12.01
		Actualizado: 2025.01.03, 2025.01.24
		Autor: 
	---------------------------------------------------------------------------------------------------- */
	if (_codemp is null) OR (_sucursal is null) or (_tabla is null) or (_bcampos is null)  or (_operador is null) then
		set @ilimite = _regpp ;
		set @iPagina = _pagina ;
		set @cCampos = _campos ;
		set @ilimiteInicio = ((@iPagina - 1) * @ilimite) ;
		set @Fila = 0 ;
		
		-- Se filtra por empresa y sucursal
		set @sql_where = concat(' where codemp = ', _codemp);
		if trim(_sucursal) <> '' then
			set @sql_where = concat(@sql_where, ' and sucursal = ', _sucursal);
		end if;
		-- ----------------------------------------------------------------------------------------------------
		
		if trim(coalesce(_valor, '')) <> '' then
			set @sql_where = if(_operador = 'LIKE', concat(' where ', trim(_bCampos), ' like ', '''','%',trim(_valor), '%',''''), concat(' where ', trim(_bCampos), trim(_operador), '''',trim(_valor), '''') );
		end if ;
		if coalesce(_adicional, '') <> '' then
			set @sql_where = if(trim(coalesce(@sql_where, '')) = '', concat(' where ', trim(_adicional)), concat(@sql_where, ' and ', _adicional) );
		end if;
		
		set @sql_where = concat('create temporary table sql_tabla select SQL_CALC_found_ROWS ',@cCampos,', (@fila:= @fila + 1) as RegFila',' from ', trim(_tabla), @sql_where, ' order by ', rtrim(_ordenado), ' limit ', @ilimiteInicio, ', ',  @ilimite);
		drop temporary table sql_tabla ;
        prepare sql_tabla from @sql_where;
		execute sql_tabla ;
		deallocate prepare sql_tabla ;
		
		set @iNumerofila = found_ROWS();
		set @ipaginaultima =  round((@iNumeroFila/@ilimite), 0) ;
		set @iPaginaultima = if(round(@inumerofila/@ilimite, 0) = 0, 1, coalesce(round((@inumerofila/@ilimite), 0), 0)) ;
		set @sql_where = null;
		
        -- ----------------------------------------------------------------------------------------------------
		select 	sql_tabla.*, 
				1 as marca,
				@ipagina as pagAct, 
				@ipaginaUltima as PagUltima, 
				@iNumeroFila as Filas 
			from sql_tabla
				where sql_tabla.estado = 1
			order by RegFila ;
	else
		select -1 ;
	end if ;
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_cbusqueda_s_log` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_cbusqueda_s_log`(
	in _codemp varchar(2), 
	in _sucursal varchar(3), 
	in _tabla varchar(25), 
	in _campos varchar(500), 
	in _ordenado varchar(50), 
	in _bcampos varchar(500), 
	in _operador varchar(5), 
	in _valor varchar(100), 
	in _pagina int, 
	in _regpp int, 
	in _adicional varchar(5000), 
	in _tipo_estado varchar(3),
	in _estado int,
	in _desde varchar(10),
	in _hasta varchar(10)
)
begin
	/* ----------------------------------------------------------------------------------------------------
		Busqueda y paginador generico de formularios listas
		Versión 1.0
		Creado: 2024-12-01
		Actualizado: 2024-12-16, 2025-01-24, 2025-04-13, 2025-04-15, 2025-04-16
		Autor: Custom Systems Solutions LLC
	---------------------------------------------------------------------------------------------------- */
		set @bCampos = trim(_bCampos) ;
		set @tablaBA = coalesce(_tabla) ;
		set @jointb = '';
		set @camposB = '' ;
		set @cSentencia = '' ;
        set @supervisor = '' ;
        set @plantillas = '' ;
		set @estado = coalesce(_estado, 0) ;
        set @adicional = _adicional ;
		set @adicional = concat(@adicional, @supervisor, @plantillas) ;
       
		-- ----------------------------------------------------------------------------------------------------
		-- crea el cursor que validará los números que solo aplican para la búsqueda de los presupuestos.
		call str_cadena_log(_codemp, _sucursal, _tabla, @tablaBA, @jointb, _campos, @camposB, _ordenado, _bCampos, _operador, _valor, _pagina, _regpp, @adicional, _tipo_estado, @estado, _desde, _hasta, 1, @cSentencia) ;
        
		
  		-- ----------------------------------------------------------------------------------------------------
		/*
        drop temporary table if exists op0 ;
		create temporary table op0
			select 0 as codigo, 'acceso' as nombre
				union select 1 as codigo, 'new' as nombre
				union select 2 as codigo, 'edit' as nombre
				union select 3 as codigo, 'delete' as nombre
				union select 4 as codigo, 'void' as nombre
				union select 5 as codigo, 'print' as nombre 
				union select 6 as codigo, 'send' as nombre        
				union select 7 as codigo, 'Approved' as nombre
				union select 8 as codigo, 'Processed' as nombre;
			*/
		select 	sentencia.*, 
				coalesce(tb_musuario.u202, '') as nusuario, 
				coalesce(cfg_lista_formularios.titulo, 'Acceso') as nformulario, 
				coalesce(cfg_mestado_log.nombre, '') as noperacion,
				coalesce(cfg_mestado_log.clase_css, '') as nestado_clase_css,
				coalesce(cfg_mestado_log.img_icon, '') as nestado_img_icon,
                
				@iPagina as PagAct, 
				@iPaginaUltima as PagUltima, 
				@iNumeroFila as Filas 
			from sentencia
				left join tb_musuario 
					on sentencia.usuario = tb_musuario.u201
				left join cfg_lista_formularios 
					on sentencia.formulario = cfg_lista_formularios.formulario
				left join cfg_mestado_log 
					on sentencia.operacion = cfg_mestado_log.codigo ;
			-- order by sentencia.item ;
		
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_cfg_formulario_aesed_c` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_cfg_formulario_aesed_c`(
	in _e01 int,
    in _e02 varchar(15),
    in _e03 varchar(50),
    out _e04 varchar(150)
)
begin
	select coalesce(e04, '') into @e04
		from cfg_formulario_pasod
        where e01 = _e01
			and e02 = _e02
            and e03 = _e03 ;
	
    if coalesce(@e04, '') = '' then
		select substring(RAND(), 3, 10) into @e04 ;
        insert into cfg_formulario_pasod (e01, e02, e03, e04)
			select _e01, _e02, _e03, @e04 ;
    end if ;
    set _e04 = @e04 ;
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_cfg_formulario_detalle_campos` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_cfg_formulario_detalle_campos`(
	_formulario int
)
begin
	/* ----------------------------------------------------------------------------------------------------
		Consulta los campos del formulario para el detalle de campo
		Versión 1.0
		Creado: 08/06/2016
		Actualizado: 2025-01-30
		Autor: 
	---------------------------------------------------------------------------------------------------- */
	
	select 	cfg_formulario_detalle_campos.*, 
			coalesce(cfg_opciones_campos.readonly, cfg_formulario_detalle_campos.readonly, 1) as readonly      
		from cfg_formulario_detalle_campos 
			left join cfg_opciones_campos 
				on cfg_formulario_detalle_campos.formulario = cfg_opciones_campos.formulario
					and cfg_formulario_detalle_campos.id_detalle = cfg_opciones_campos.id_detalle
					and cfg_formulario_detalle_campos.campo = cfg_opciones_campos.campo
		where cfg_formulario_detalle_campos.formulario = _formulario
		order by cfg_formulario_detalle_campos.id_detalle, cfg_formulario_detalle_campos.orden ;
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_cfg_mempresa_c` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_cfg_mempresa_c`(
	in _codemp varchar(2)
)
begin
	-- ----------------------------------------------------
	-- Consulta datos de la empresa
	-- Versión 1.0
	-- Creado: 14/05/2015
	-- Actualizado: 2024.04.13, 18/07/2018
	-- Autor: 
	-- ----------------------------------------------------

	select	cfg_mempresa.codigo, 
			cfg_mempresa.nombre, 
            cfg_mempresa.pais, 
            cfg_mempresa.estado_ciudad, 
            cfg_mempresa.ciudad, 
            cfg_mempresa.zcode, 
            cfg_mempresa.web, 
            cfg_mempresa.email, 
            cfg_mempresa.telefono, 
            cfg_mempresa.direccion, 
            cfg_mempresa.divisa, 
            coalesce(tb_g_mdivisa_b.nombre, '') as ndivisa,
            cfg_mempresa.moneda, 
            coalesce(tb_g_mdivisa_c.nombre, '') as nmoneda,
            cfg_mempresa.logo, 
            cfg_mempresa.logo_qr, 
            cfg_mempresa.plataforma_a, 
            cfg_mempresa.plataforma_b, 
            cfg_mempresa.plataforma_c,
            cfg_mempresa.plataforma_d,
            cfg_mempresa.estado,
            coalesce(cfg_mestado.nombre, '') as nestado
		from cfg_mempresa
			left join tb_g_mdivisa as tb_g_mdivisa_b 
				on cfg_mempresa.codigo = tb_g_mdivisa_b.codemp
					and cfg_mempresa.divisa = tb_g_mdivisa_b.codigo
			left join tb_g_mdivisa as tb_g_mdivisa_c 
				on cfg_mempresa.codigo = tb_g_mdivisa_c.codemp
					and cfg_mempresa.moneda = tb_g_mdivisa_c.codigo
			left join cfg_mestado 
				on cfg_mempresa.estado = cfg_mestado.codigo 
					and cfg_mestado.tipo = trim('MAE')
		where cfg_mempresa.codigo = _codemp;
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_cfg_menu_nivel1` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_cfg_menu_nivel1`(
	in _Parametro varchar(5),
    in _tipo_menu varchar(1)
)
begin
	drop temporary table if exists a0 ;
	create temporary table a0
		select modulo
			from cfg_lista_formularios
			where cfg_lista_formularios.estado = 1 
				and cfg_lista_formularios.menu = _tipo_menu
				and formulario in (select u202 from tb_musuario_dpermiso where u201 = _parametro and u204 = 1) 
			group by modulo ;

	select *
		from cfg_menu_modulo
		where codigo in (select modulo from a0)
		order by orden ;		
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_cfg_menu_nivel2` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_cfg_menu_nivel2`(
	in _Parametro varchar(5),
    in _tipo_menu varchar(1)
)
begin
	drop temporary table if exists a0 ;
	create temporary table a0
		select 	grupo
			from cfg_lista_formularios
			where cfg_lista_formularios.estado = 1 
				and cfg_lista_formularios.menu = _tipo_menu
				and formulario in (select u202 from tb_musuario_dpermiso where u201 = _parametro and u204 = 1) 
			group by grupo ;

	select 	cfg_lista_formularios.modulo,
			cfg_menu_grupo.codigo,
			cfg_menu_grupo.nombre,
            cfg_menu_grupo.img_icons,
            cfg_menu_grupo.etiqueta
		from cfg_lista_formularios
			inner join a0 
				on cfg_lista_formularios.grupo = a0.grupo
			inner join cfg_menu_grupo 
				on cfg_lista_formularios.grupo = cfg_menu_grupo.codigo 
					and cfg_lista_formularios.menu = _tipo_menu
		group by cfg_lista_formularios.modulo,
			cfg_menu_grupo.codigo,
			cfg_menu_grupo.nombre
		order by cfg_lista_formularios.modulo, 
					cfg_menu_grupo.orden ;
                    -- cfg_lista_formularios.orden ;
	
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_cfg_menu_nivel3` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_cfg_menu_nivel3`(
	in _Parametro varchar(5),
    in _tipo_menu varchar(1)
)
begin
	select 	formulario, formulario_archivo, img_icons, titulo, etiqueta, modulo, grupo, orden
		from cfg_lista_formularios
		where cfg_lista_formularios.estado = 1 
			and cfg_lista_formularios.menu = _tipo_menu
			and formulario in (select u202 from tb_musuario_dpermiso where u201 = _parametro and u204 = 1)
		order by orden, titulo ;	
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_cfg_msucursal_c` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_cfg_msucursal_c`(
	in _codemp varchar(2),
    in _sucursal varchar(3)
)
begin
	-- ----------------------------------------------------
	-- Consulta datos de la empresa
	-- Versión 1.0
	-- Creado: 2020.03.17
	-- Actualizado: 2024.04.13, 2020.03.17
	-- Autor: 
	-- ----------------------------------------------------
    
	select 	cfg_msucursal.codemp, 
			cfg_mempresa.nombre as nempresa,
			cfg_msucursal.codigo, 
            cfg_msucursal.nombre, 
            cfg_msucursal.pais, 
            cfg_msucursal.estado_provincia, 
            cfg_msucursal.ciudad, 
            cfg_msucursal.codigo_postal, 
            cfg_msucursal.rif, 
            cfg_msucursal.email, 
            cfg_msucursal.telefonos, 
            cfg_msucursal.direccion, 
            cfg_msucursal.almacen_e, 
            coalesce(tb_a_malmacen_e.nombre, '') as nalmacen_e,
            cfg_msucursal.almacen_s, 
            coalesce(tb_a_malmacen_s.nombre, '') as nalmacen_s,
            cfg_msucursal.almacen_actualiza, 
            cfg_msucursal.estado
		from cfg_msucursal
			inner join cfg_mempresa 
				on cfg_msucursal.codemp = cfg_mempresa.codigo
            left join tb_a_malmacen as tb_a_malmacen_e 
				on cfg_msucursal.codemp = tb_a_malmacen_e.codemp 
					and cfg_msucursal.codigo = tb_a_malmacen_e.sucursal
					and cfg_msucursal.almacen_e = tb_a_malmacen_e.codigo
			left join tb_a_malmacen as tb_a_malmacen_s 
				on cfg_msucursal.codemp = tb_a_malmacen_s.codemp 
					and cfg_msucursal.codigo = tb_a_malmacen_s.sucursal
					and cfg_msucursal.almacen_s = tb_a_malmacen_e.codigo
		where cfg_msucursal.codemp = _codemp
			and cfg_msucursal.codigo = _sucursal ;
            
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_cfg_ocollate_u` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_cfg_ocollate_u`(
	in _database varchar(50)
)
begin
	/* ----------------------------------------------------------------------------------------------------
		SP para actualizar la COLLATE de las tablas de una base de datos
		Versión 1.0
		Creado: 2025-03-20
		Actualizado: 2025-03-20
		Autor: Custom Systems Solutions LLC
	---------------------------------------------------------------------------------------------------- */
	set @database = trim(_database) ;
	set @SQL = concat('
		select
			CONCAT("alter table ", table_schema, ".", table_name, " convert to character set utf8mb4 collate utf8mb4_spanish_ci;") as query
		from
			information_schema.tables
		where
			table_schema = @database
		;
	');
    
	prepare stmt from @SQL;
	execute stmt;
	deallocate prepare stmt;
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_cfg_opciones_c` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_cfg_opciones_c`(
	in _codemp varchar(2), 
	in _sucursal varchar(3), 
	in _codigo varchar(50),
    out _valor varchar(100)
)
begin	
	/* ----------------------------------------------------------------------------------------------------
		Consulta el valor de una opcion
		Versión 1.0
		Creado: 2025-03-15
		Actualizado: 2025-03-15
		Autor: 
	---------------------------------------------------------------------------------------------------- */
    set @valor = '' ;
    select 	coalesce(valor, '') into @valor
		from cfg_opciones
        where codemp = _codemp
			and sucursal = _sucursal
            and trim(opcion) = trim(coalesce(_codigo, '')) ;
	
    -- ----------------------------------------------------------------------------------------------------
	set _valor = @valor ;
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_cfg_timezone_c` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_cfg_timezone_c`(
	in _codemp Varchar(2), 
	in _sucursal Varchar(3), 
	in _status int, 
	in _clave Varchar(255), 
	in _parametro Varchar(255)
)
begin
	/* -- ------------------------------------------
		Consulta de la lista de timezone
		Creado 2025-02-02
		Actualizado 2025-02-02
		Autor: Custom Systems Solutions LLC
	-- ------------------------------------------- */
                
	drop temporary table if exists a1;
	create temporary table a1
		select	codigo,
				descripcion as nombre
			from cfg_timezones
			where codemp = _codemp
				and codigo <> trim(coalesce(_clave, ''))
				and trim(coalesce(descripcion, '')) <> ''
                 and _status = 1
		union
		select	codigo,
				descripcion as nombre
			from cfg_timezones
			where codemp = _codemp
				and codigo = trim(coalesce(_clave, '')) ;
		
	select	a1.codigo,
			a1.nombre
		from a1
		order by a1.nombre ;
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_clista_operadores` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_clista_operadores`(in _codigo varchar(2))
begin
	/* ----------------------------------------------------------------------------------------------------
		Busqueda de los operadores del formularios listas
		Versión 1.0
		Creado: 2024.12.01
		Actualizado: 2025.01.24
		Autor: 
    ---------------------------------------------------------------------------------------------------- */
	drop temporary table if exists a0;
	create temporary table a0
		select 	operador,
				etiqueta
			from cfg_lista_operador
			where formulario = _codigo ;
	
	drop temporary table if exists a1;
	create temporary table a1
		select 	operador,
				etiqueta
			from cfg_moperadores
			where operador not in (select operador from a0) ;
	
	drop temporary table if exists a2 ;
	create temporary table a2
		select operador, etiqueta from a0
		union select operador, etiqueta from a1 ;
	
    -- ----------------------------------------------------------------------------------------------------
	select * 
		from a2 
		order by etiqueta ;
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_con_cbusqueda` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_con_cbusqueda`(
	in _codemp varchar(2), 
	in _sucursal varchar(3), 
	in _tabla varchar(25), 
	in _campos varchar(500), 
	in _ordenado varchar(50), 
	in _bcampos varchar(500), 
	in _operador varchar(5), 
	in _valor varchar(100), 
	in _pagina int, 
	in _regpp int, 
	in _adicional varchar(5000), 
	in _tipo_estado varchar(3),
	in _estado int
)
begin
	/* ---------------------------------------------------
		Busqueda y paginador generico de formularios listas
		Versión 1.0
		Creado: 2024.12.01
		Actualizado: 2024.12.16
		Autor: 
	--------------------------------------------------- */
    
	-- Validación de parámetros
    if (_codemp is null) OR (_sucursal is null) or (_tabla is null) or (_bcampos is null)  or (_operador is null) then
        signal sqlstate '45000'
            set message_text = 'Parámetros incompletos. Todos los campos deben estar especificados.';
    end if ;
    
	set @ilimite = _regpp ;
	set @ipagina = _pagina ;
	set @cCampos = _campos ;
	set @ilimiteinicio = ((@ipagina - 1) * @ilimite) ;
	set @fila = 0 ;

	set @sql_where = ' where formulario <> 1';
	-- --------------------
	
	if trim(coalesce(_valor, '')) <> '' then
		set @sql_where = if(_operador = 'LIKE', concat(@sql_where, ' and ', trim(_bCampos), ' like ', '''','%',trim(_valor), '%',''''), concat(@sql_where, ' and ', trim(_bCampos), trim(_operador), '''',trim(_valor), '''') );
	end if ;
	if coalesce(_adicional, '') <> '' then
		set @sql_where = if(trim(coalesce(@sql_where, '')) = '', concat(@sql_where, ' and ', trim(_adicional)), concat(@sql_where, ' and ', _adicional) ) ;
	end if;

	set @sql_where = concat('create temporary table sql_tabla select SQL_CALC_found_ROWS *, (@fila:= @fila + 1) as RegFila',' from ', trim(_tabla), @sql_where, ' order by ', rtrim(_ordenado), ' limit ', @ilimiteInicio, ', ',  @ilimite);
	
    begin
		declare exit handler for sqlexception
        begin
            -- Manejo de errores de consulta
            rollback;
            select 'Error al ejecutar la consulta: ' || SQLERRM;
        end;
        
		prepare sql_tabla from @sql_where;
		execute sql_tabla ;
		deallocate prepare sql_tabla ;
	end ;

	set @iNumerofila = found_rOWS();
	set @iPaginaUltima =  round((@inumerofila/@ilimite), 0) ;
	set @iPaginaultima = if(round(@inumerofila/@ilimite, 0) = 0, 1, coalesce(round((@inumerofila/@ilimite), 0), 0)) ;
	set @sql_where = null;
    
	select 	sql_tabla.*, 
			coalesce(cfg_mestado.nombre, '') as nestado,
			coalesce(cfg_menu_modulo.nombre, '') as nmodulo,
			coalesce(cfg_menu_grupo.nombre, '') as ngrupo,
			@iPagina as PagAct, 
			@iPaginaUltima as PagUltima, 
			@inumerofila as Filas 
		from sql_tabla
			left join cfg_menu_modulo 
				on sql_tabla.modulo = cfg_menu_modulo.codigo
			left join cfg_menu_grupo 
				on sql_tabla.grupo = cfg_menu_grupo.codigo
			left join cfg_mestado 
				on sql_tabla.estado = cfg_mestado.codigo 
					and cfg_mestado.tipo = rtrim(_tipo_estado) 
		order by RegFila ;

end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_con_cBusqueda_campos_listas` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_con_cBusqueda_campos_listas`(
	in _codemp varchar(2), 
	in _sucursal varchar(3), 
	in _tabla varchar(25), 
	in _campos varchar(500), 
	in _ordenado varchar(50), 
	in _bcampos varchar(500), 
	in _operador varchar(5), 
	in _valor varchar(100), 
	in _pagina int, 
	in _regpp int, 
	in _adicional varchar(5000), 
	in _tipo_estado varchar(3),
	in _estado int
)
begin
	/* ---------------------------------------------------
		Busqueda y paginador generico de formularios listas
		Versión 1.0
		Creado: 2024.12.01
		Actualizado: 2024.12.16
		Autor: 
	--------------------------------------------------- */
    
	-- Validación de parámetros
    if (_codemp is null) OR (_sucursal is null) or (_tabla is null) or (_bcampos is null)  or (_operador is null) then
        signal sqlstate '45000'
            set message_text = 'Parámetros incompletos. Todos los campos deben estar especificados.';
    end if ;
	
	set @ilimite = _regpp ;
	set @iPagina = _pagina ;
	set @cCampos = _campos ;
	set @ilimiteinicio = ((@iPagina - 1) * @ilimite) ;
	set @Fila = 0 ;

	set @sql_where = ' where formulario <> 1';
	-- -------------------
	
	if trim(coalesce(_valor, '')) <> '' then
		set @sql_where = if(_operador = 'lIKE', concat(@sql_where, ' and ', trim(_bCampos), ' like ', '''','%',trim(_valor), '%',''''), concat(@sql_where, ' and ', trim(_bCampos), trim(_operador), '''',trim(_valor), '''') );
	end if ;
	if coalesce(_adicional, '') <> '' then
		set @sql_where = if(trim(coalesce(@sql_where, '')) = '', concat(@sql_where, ' and ', trim(_adicional)), concat(@sql_where, ' and ', _adicional) );
	end if;

	set @sql_where = concat('create temporary table sql_tabla select SQL_CALC_found_ROWS *, (@fila:= @fila + 1) as RegFila',' from ', trim(_tabla), @sql_where, ' order by ', rtrim(_ordenado), ' limit ', @ilimiteInicio, ', ',  @ilimite);
	
    begin
		declare exit handler for sqlexception
        begin
            -- Manejo de errores de consulta
            rollback;
            select 'Error al ejecutar la consulta: ' || SQLERRM;
        end;
        
		prepare sql_tabla from @sql_where;
		execute sql_tabla ;
		deallocate prepare sql_tabla ;
	end ;

	set @iNumerofila = found_rows();
	set @ipaginaultima =  round((@inumerofila/@ilimite), 0) ;
	set @iPaginaultima = if(round(@inumerofila/@ilimite, 0) = 0, 1, coalesce(round((@inumerofila/@ilimite), 0), 0)) ;
	set @sql_where = null;
    
	select 	sql_tabla.*, 
			coalesce(cfg_lista_formularios.titulo, '') as nformulario,
			@iPagina as pagAct, 
			@ipaginaUltima as PagUltima, 
			@iNumeroFila as Filas 
		from sql_tabla
			left join cfg_lista_formularios 
				on sql_tabla.formulario = cfg_lista_formularios.formulario 
		order by RegFila ;
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_con_form_campos_u` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_con_form_campos_u`(in _codemp varchar(2), in _sucursal varchar(3),
	in _item int(11),
	in _formulario int(11),
	in _orden int(11),
	in _campo varchar(200), 
	in _etiqueta varchar(200), 
	in _ancho smallint(4), 
	in _tipo_campo varchar(15), 
	in _maximo int(11), 
	in _readonly varchar(8), 
	in _requerido varchar(10), 
	in _autofocus varchar(10), 
	in _procedimiento varchar(100), 
	in _parametro varchar(100), 
	in _campo_cbusca varchar(50), 
	in _columna smallint(1), 
	in _valor varchar(255), 
	in _tab smallint(6), 
	in _id_datepicker varchar(15), 
	in _decimales int(1), 
	in _orden_lista int(11), 
	in _campo_lista varchar(200), 
	in _ancho_lista smallint(4), 
	in _link varchar(250), 
	in _image varchar(250), 
	in _parametro_lista varchar(50), 
	in _titulo varchar(50), 
	in _onchange varchar(255), 
	in _l varchar(1), 
	in _B varchar(1), 
	in _O varchar(1), 
	in _F varchar(1),
	in _r varchar(1),
	out _valor_retorno varchar(11)
)
begin
	-- ----------------------------------------------------
	-- Actualiza los datos de campos del constructor
	-- Versión 1.0
	-- Creado: 12/11/2014
	-- Actualizado: 2024.04.13, 12/11/2014
	-- Autor: 
	-- ----------------------------------------------------
	
	-- Esta guarandinga es para darle formato a las cantidades
	set @actualiza_L = convert(trim(replace(_L,',','')), decimal(1,0));
	set @actualiza_o = convert(trim(replace(_o,',','')), decimal(1,0));
	set @actualiza_b = convert(trim(replace(_b,',','')), decimal(1,0));
	set @actualiza_f = convert(trim(replace(_f,',','')), decimal(1,0));
	set @actualiza_r = convert(trim(replace(_r,',','')), decimal(1,0));

    if _formulario = 0 then
	    insert into cfg_formulario_campos (formulario, orden, campo, etiqueta, ancho, tipo_campo, maximo, readonly, requerido, autofocus, procedimiento, parametro, campo_cbusca, columna, valor, tab, id_datepicker, decimales, orden_lista, campo_lista, ancho_lista, link, image, parametro_lista, titulo, conchange, l, B, O, F, R)
			values (_formulario, _orden, _campo, _etiqueta, _ancho, _tipo_campo, _maximo, _readonly, _requerido, _autofocus, _procedimiento, _parametro, _campo_cbusca, _columna, _valor, _tab, _id_datepicker, _decimales, _orden_lista, _campo_lista, _ancho_lista, _link, _image, _parametro_lista, _titulo, _onchange, _actualiza_L, _actualiza_B, _actualiza_O, _actualiza_F, _actualiza_R) ;

		select max(item) into _item
			from cfg_formulario_campos;

	else
		update 	cfg_formulario_campos 
			set
				formulario = _formulario, 
				orden = _orden, 
				campo = _campo, 
				etiqueta = _etiqueta, 
				ancho = _ancho, 
				tipo_campo = _tipo_campo, 
				maximo = _maximo, 
				readonly = _readonly, 
				requerido = _requerido, 
				autofocus = _autofocus, 
				procedimiento = _procedimiento, 
				parametro = _parametro, 
				campo_cbusca = _campo_cbusca, 
				columna = _columna, 
				valor = _valor, 
				tab = _tab, 
				id_datepicker = _id_datepicker, 
				decimales = _decimales, 
				orden_lista = _orden_lista, 
				campo_lista = _campo_lista, 
				ancho_lista = _ancho_lista, 
				link = _link, 
				image = _image, 
				parametro_lista = _parametro_lista, 
				titulo = _titulo, 
				onchange = _onchange,
				L = @actualiza_L, 
				B = @actualiza_B, 
				O = @actualiza_O, 
				F = @actualiza_F,
				R = @actualiza_R
			where item = _item ;
	end if;

	set _valor_retorno = _item;
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_con_form_codigo_c` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_con_form_codigo_c`(
	in _codemp varchar(2), 
	in _sucursal varchar(3), 
	in _status varchar(1), 
	in _parametro varchar(255), 
	in _tabla varchar(255), 
	in _tipo varchar(3)
)
begin
	-- -----------------------------------------------------
	-- Consulta generica de los datos para los formularios
	-- Versión 1.0
	-- Creado: 04/08/2014
	-- Actualizado: 2024.04.13, 05/08/2014
	-- Autor: 
	-- -----------------------------------------------------
   if (_codemp is null) OR (_sucursal is null) or (_tabla is null) or (_parametro is null) then
        signal sqlstate '45000'
            set message_text = 'Parámetros incompletos. Todos los campos deben estar especificados.';
    end if ;
	set @sql_where = concat('create temporary table a1 select * from cfg_lista_formularios', ' where formulario = ', _parametro);
    begin
		declare exit handler for sqlexception
        begin
            -- Manejo de errores de consulta
            rollback;
            select 'Error al ejecutar la consulta: ' || SQLERRM;
        end;
        
		prepare sql_tabla from @sql_where;
		execute sql_tabla ;
		deallocate prepare sql_tabla ;
	end ;
	set @sql_where = null ;
    
	select	sql_tabla.*,
			coalesce(cfg_menu_modulo.nombre, '') as nmodulo,
			coalesce(cfg_menu_grupo.nombre, '') as ngrupo
		from sql_tabla
			inner join cfg_menu_modulo 
				on semtencia.modulo = cfg_menu_modulo.codigo
			inner join cfg_menu_grupo 
				on sql_tabla.grupo = cfg_menu_grupo.codigo 
		order by sql_tabla.modulo, sql_tabla.grupo, sql_tabla.orden ;
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_con_form_u` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_con_form_u`(
	in _codemp varchar(2), 
	in _sucursal varchar(3), 
	in _formulario int(11),
	in _modulo varchar(3),
	in _grupo varchar(3), 
	in _orden smallint(6), 
	in _titulo varchar(200), 
	in _tabla varchar(200), 
	in _estado int(1), 
	in _filtra_sucursal int(1), 
	in _formulario_archivo varchar(100), 
	in _ini_orden varchar(50), 
	in _ini_bcampo varchar(50), 
	in _ini_operador varchar(50), 
	in _ini_valor varchar(200), 
	in _link_nuevo varchar(200), 
	in _link_previa varchar(200), 
	in _link_imprimir varchar(200), 
	in _link_buscar varchar(200), 
	in _procedimiento varchar(100), 
	in _campos varchar(200), 
	in _ordenado varchar(50), 
	in _bcampo varchar(50), 
	in _operador varchar(10), 
	in _valor varchar(200), 
	in _adicional varchar(200),
	in _boton_nuevo varchar(200), 
	in _boton_nuevo_etiqueta varchar(50), 
	in _boton_vistap varchar(200), 
	in _boton_vistap_etiqueta varchar(50), 
	in _boton_imprimir varchar(200), 
	in _boton_imprimir_etiqueta varchar(50), 
	in _tipo_estado varchar(3), 
	in _procedimiento_c varchar(100), 
	in _procedimiento_u varchar(100), 
	in _procedimiento_ea varchar(100), 
	in _procedimiento_v_elimina varchar(100), 
	in _formulario_validar varchar(100), 
	in _tabs smallint(6), 
	in _columnas smallint(1), 
	in _puede_eliminar int(1), 
	in _crear int(1), 
	in _editar int(1), 
	in _eliminar_anular int(1), 
	in _imprimir int(1), 
	in _edita_anulado int(1), 
	in _formulario_post varchar(255), 
	in _formulario_detalle varchar(255), 
	in _formulario_detalle_post varchar(255), 
	in _formulario_encabezado varchar(255), 
	in _formulario_carga varchar(255), 
	in _formulario_actualiza_array varchar(255), 
	in _detalle smallint(6), 
	in _detalle_u smallint(6), 
	in _detalle_e smallint(6), 
	in _procedimiento_detalle_c varchar(100), 
	in _procedimiento_detalle_param varchar(100), 
	in _procedimiento_detalle_u varchar(255), 
	in _detalle_alto smallint(6), 
	in _guarda_detalle varchar(255),
	out _valor_retorno varchar(11)
)
begin
	-- ----------------------------------------------------
	-- Actualiza los datos del constructor
	-- Versión 1.0
	-- Creado: 27/10/2014
	-- Actualizado: 2024.04.13, 27/10/2014, 30/10/2014
	-- Autor: 
	-- ----------------------------------------------------
	
    if _formulario = 0 then
	    insert into cfg_lista_formularios (modulo, grupo, orden, titulo, tabla, filtra_sucursal, formulario_archivo, ini_orden, ini_bcampo, ini_operador, ini_valor, link_nuevo, link_previa, link_imprimir, link_buscar, procedimiento, campos, ordenado, bcampo, operador, valor, adicional, boton_nuevo, boton_nuevo_etiqueta, boton_vistap, boton_vistap_etiqueta, boton_imprimir, boton_imprimir_etiqueta, tipo_estado, procedimiento_c, procedimiento_u, procedimiento_ea, procedimiento_v_elimina, formulario_validar, tabs, columnas, puede_eliminar, crear, editar, eliminar_anular, imprimir, edita_anulado, formulario_post, formulario_detalle, formulario_detalle_post, formulario_encabezado, formulario_carga, formulario_actualiza_array, detalle, detalle_u, detalle_e, procedimiento_detalle_c, procedimiento_detalle_param, procedimiento_detalle_u, detalle_alto, guarda_detalle)
			values (_modulo, _grupo, _orden, _titulo, _tabla, _filtra_sucursal, _formulario_archivo, _ini_orden, _ini_bcampo, _ini_operador, _ini_valor, _link_nuevo, _link_previa, _link_imprimir, _link_buscar, _procedimiento, _campos, _ordenado, _bcampo, _operador, _valor, _adicional, _boton_nuevo, _boton_nuevo_etiqueta, _boton_vistap, _boton_vistap_etiqueta, _boton_imprimir, _boton_imprimir_etiqueta, _tipo_estado, _procedimiento_c, _procedimiento_u, _procedimiento_ea, _procedimiento_v_elimina, _formulario_validar, _tabs, _columnas, _puede_eliminar, _crear, _editar, _eliminar_anular, _imprimir, _edita_anulado, _formulario_post, _formulario_detalle, _formulario_detalle_post, _formulario_encabezado, _formulario_carga, _formulario_actualiza_array, _detalle, _detalle_u, _detalle_e, _procedimiento_detalle_c, _procedimiento_detalle_param, _procedimiento_detalle_u, _detalle_alto, _guarda_detalle) ;

		select max(formulario) into _formulario
			from cfg_lista_formularios;
	else
		update 	cfg_lista_formularios 
			set
				modulo = _modulo, 
				grupo = _grupo, 
				orden = _orden, 
				titulo = _titulo, 
				tabla = _tabla, 
				estado = _estado, 
				filtra_sucursal = _filtra_sucursal, 
				formulario_archivo = _formulario_archivo, 
				ini_orden = _ini_orden, 
				ini_bcampo = _ini_bcampo, 
				ini_operador = _ini_operador, 
				ini_valor = _ini_valor, 
				link_nuevo = _link_nuevo, 
				link_previa = _link_previa, 
				link_imprimir = _link_imprimir, 
				link_buscar = _link_buscar, 
				procedimiento = _procedimiento, 
				campos = _campos, 
				ordenado = _ordenado, 
				bcampo = _bcampo, 
				operador = _operador, 
				valor = _valor, 
				adicional = _adicional, 
				boton_nuevo = _boton_nuevo, 
				boton_nuevo_etiqueta = _boton_nuevo_etiqueta, 
				boton_vistap = _boton_vistap, 
				boton_vistap_etiqueta = _boton_vistap_etiqueta, 
				boton_imprimir = _boton_imprimir, 
				boton_imprimir_etiqueta = _boton_imprimir_etiqueta, 
				tipo_estado = _tipo_estado, 
				procedimiento_c = _procedimiento_c, 
				procedimiento_u = _procedimiento_u, 
				procedimiento_ea = _procedimiento_ea, 
				procedimiento_v_elimina = _procedimiento_v_elimina, 
				formulario_validar = _formulario_validar, 
				tabs = _tabs, 
				columnas = _columnas, 
				puede_eliminar = _puede_eliminar, 
				crear = _crear, 
				editar = _editar, 
				eliminar_anular =_eliminar_anular, 
				imprimir = _imprimir, 
				edita_anulado = _edita_anulado, 
				formulario_post = _formulario_post, 
				formulario_detalle = _formulario_detalle, 
				formulario_detalle_post = _formulario_detalle_post, 
				formulario_encabezado = _formulario_encabezado, 
				formulario_carga = _formulario_carga, 
				formulario_actualiza_array = _formulario_actualiza_array, 
				detalle = _detalle, 
				detalle_u = _detalle_u, 
				detalle_e = _detalle_e, 
				procedimiento_detalle_c = _procedimiento_detalle_c, 
				procedimiento_detalle_param = _procedimiento_detalle_param, 
				procedimiento_detalle_u = _procedimiento_detalle_u, 
				detalle_alto = _detalle_alto, 
				guarda_detalle = _guarda_detalle
			where formulario = _formulario ;
	end if;

	if (select coalesce(count(formulario), 0) from cfg_formulario_campos where formulario = _formulario) = 0 then
		call sp_con_lista_tablas_campos_u(_formulario) ;
	end if ;
	
	set _valor_retorno = _formulario;
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_con_general_c` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_con_general_c`(
	in _codemp varchar(2), 
    in _sucursal varchar(3), 
    in _status varchar(1), 
    in _parametro varchar(255), 
    in _tabla varchar(255), 
    in _tipo varchar(3)
)
begin
	-- ----------------------------------------------------
	-- Consulta generica de los datos para los formularios
	-- Versión 1.0
	-- Creado: 06/11/2014
	-- Actualizado: 2024.04.13, 06/11/2014
	-- Autor: 
	-- ----------------------------------------------------
    -- Validación de parámetros
    if (_codemp is null) OR (_sucursal is null) or (_parametro is null) or (_tabla is null) then
        signal sqlstate '45000'
            set message_text = 'Parámetros incompletos. Todos los campos deben estar especificados.';
    end if ;
    
	set @sql_where = concat(' where formulario = ', trim(_parametro));
	set @sql_where = concat('create temporary table a1 select * from ', trim(_tabla), @sql_where);
    
    begin
		declare exit handler for sqlexception
        begin
            -- Manejo de errores de consulta
            rollback;
            select 'Error al ejecutar la consulta: ' || SQLERRM;
        end;
        
		prepare sql_tabla from @sql_where;
		execute sql_tabla ;
		deallocate prepare sql_tabla ;
	end ;
    set @sql_where = null ;
    
	select	sql_tabla.*
		from sql_tabla ;

end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_con_general_item_c` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_con_general_item_c`(
	in _codemp varchar(2), 
    in _sucursal varchar(3), 
    in _status varchar(1), 
    in _parametro varchar(255), 
    in _tabla varchar(255), 
    in _tipo varchar(3)
)
begin
	-- ----------------------------------------------------
	-- Consulta generica de los datos para los formularios
	-- Versión 1.0
	-- Creado: 06/11/2014
	-- Actualizado: 2024.04.13, 06/11/2014
	-- Autor: 
	-- ----------------------------------------------------
   if (_codemp is null) OR (_sucursal is null) or (_tabla is null) or (_parametro is null) then
        signal sqlstate '45000'
            set message_text = 'Parámetros incompletos. Todos los campos deben estar especificados.';
    end if ;
	set @sql_where = concat('create temporary table a1 select * from ', trim(_tabla), ' where item = ', trim(_parametro));
    begin
		declare exit handler for sqlexception
        begin
            -- Manejo de errores de consulta
            rollback;
            select 'Error al ejecutar la consulta: ' || SQLERRM;
        end;
        
		prepare sql_tabla from @sql_where;
		execute sql_tabla ;
		deallocate prepare sql_tabla ;
	end ;
    set @sql_where = null ;
		
	select	sql_tabla.*
		from sql_tabla ;
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_con_lista_campos_c` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_con_lista_campos_c`(
	in _codemp varchar(2), 
    in _sucursal varchar(3), 
    in _parametro int(11)
)
begin
	set @tabla = '';
	set @formulario = 0 ;
	
	select formulario into @formulario
		from cfg_formulario_campos
		where item = _parametro ;
	
	select trim(tabla) into @tabla
		from cfg_lista_formularios
		where formulario = @formulario ;
	
 	select 	table_schema, 
 			table_name, 
 			column_name, 
 			ordinal_position, 
 			is_nullable, 
 			data_type, 
 			coalesce(CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISion,  '') longitud, 
 			column_type
 		from information_schema.columns 
 		where table_schema = schema()
 			and table_name = trim(@tabla) 
 		order by ordinal_position ;
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_con_lista_procedimiento` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_con_lista_procedimiento`(
	in _codemp varchar(2), 
	in _sucursal varchar(3), 
	in _estado int(1), 
	in _parametro varchar(255), 
	in _tipo varchar(3)
)
begin
	-- -------------------------------------------
	-- Consulta los SP que exisnten en la DB
	-- V 1.0
	-- Creado: 28/10/2014
	-- Actualizado 28/10/2014
	-- Autor: 
	-- -------------------------------------------
	
	drop temporary table if exists a0 ;
	create temporary table a0
		select 	routinE_NAmE as codigo,
				rOutine_NAME as nombre
			from information_schema.ROUTINES 
			where ROUTINe_scHEMA = schema()
				and ROUTINE_Type = 'procedure'
				and routiNE_NAme = _parametro 
		union
		select 	ROUTINE_NAME as codigo,
				ROUTIne_naME as nombre
			from information_schema.ROUTINES 
			where ROUTINe_scHEMA = schema()
				and ROUTINE_Type = 'procedure'
				and routiNE_NAme <> _parametro 
				and _parametro = '' ;
	
	select *
		from a0
		order by codigo ;

end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_con_lista_tablas` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_con_lista_tablas`(
	in _codemp varchar(2), 
    in _sucursal varchar(3), 
    in _estado int(1), 
    in _parametro varchar(255), 
    in _tipo varchar(3)
)
begin
	-- ------------------------------------------
	-- Consulta las tablas que exisnten en la DB
	-- V 1.0
	-- Creado: 28/10/2014
	-- Actualizado 28/10/2014
	-- Autor: 
	-- -------------------------------------------
	
	drop temporary table if exists a0 ;
	create temporary table a0
		select 	table_NAME as codigo,
				table_namE as nombre
			from information_schema.tables 
			where table_schema = schema()
				and table_TYPE = 'base table'
				and table_NAME = _parametro 
		union
		select 	table_NAME as codigo,
				table_Name as nombre
			from information_schema.tables 
			where table_SChema = schema() 
				and table_TYPE = 'base table'
				and table_NAME <> _parametro 
				and _parametro = '' ;
	
	select *
		from a0
		order by codigo ;

end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_con_lista_tablas_campos` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_con_lista_tablas_campos`(
	in _codemp varchar(2), 
    in _sucursal varchar(3), 
    in _estado int(1), 
    in _parametro int(11), 
    in _tipo varchar(3)
)
begin
	set @tabla = '';
	
	select trim(tabla) into @tabla
		from cfg_lista_formularios
		where formulario = _parametro ;
	
 	select 	table_schema, 
 			table_name, 
 			column_name, 
 			ordinal_position, 
 			is_nullable, 
 			data_type, 
 			coalesce(CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISion,  '') longitud, 
 			column_type
 		from information_schema.columns 
 		where table_schema = schema()
 			and table_name = trim(@tabla) 
 		order by ordinal_position ;

end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_con_lista_tablas_campos_d_c` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_con_lista_tablas_campos_d_c`(
	in _codemp varchar(2), 
	in _sucursal varchar(3), 
	in _formulario int(11)
)
begin
	set @tabla = '';
	set @formulario = _formulario ;
	
	select trim(tabla) into @tabla
		from cfg_lista_formularios
		where formulario = @formulario ;
	
	drop temporary table if exists a0 ;
	create temporary table a0
		select 	table_schema collate utf8mb4_spanish_ci, 
 				table_name collate utf8mb4_spanish_ci,
 				column_name as campo,
 				concat('LBl_', trim(upper(column_name collate utf8mb4_spanish_ci))) as etiqueta,
 				ordinal_position as orden, 
 				is_nullable collate utf8mb4_spanish_ci, 
 				data_type as tipo_dato, 
 				coalesce(chaRACTER_MAXIMUM_LEngTH, NUMERIc_PRECISion,  null) as ancho, 
 				NUMERiC_SCALE as decimales,
 				column_type as tipo_columna
			from information_schema.columns 
			where table_schema = schema()
				and table_name = trim(@tabla)
			order by ordinal_position ;
	
	drop temporary table if exists a1 ;
	create temporary table a1
		select 	item, 
				formulario, 
				orden, 
				campo, 
				etiqueta, 
				ancho, 
				tipo_campo, 
				maximo, 
				readonly, 
				requerido, 
				autofocus, 
				procedimiento, 
				parametro, 
				campo_cbusca, 
				columna, 
				valor, 
				tab, 
				id_datepicker, 
				decimales,
				1 as basico
			from cfg_formulario_campos
			where formulario = _formulario 
		union
		select 	0 as item, 
				_formulario,
				orden,
				campo,
				etiqueta,
				ancho,
				tipo_dato as tipo_campo,
				ancho as maximo,
				'' as readonly, 
				'' as requerido, 
				'' as autofocus, 
				'' as procedimiento, 
				'' as parametro, 
				'' as campo_cbusca,
				0 as columna,
				'' as valor,
				0 as tab,
				0 as id_datepicker, 
				decimales,
				0 as basico
			from a0
			where campo not in (select campo from cfg_formulario_campos where formulario = @formulario);
		
	select 	a1.*,
			a0.tipo_columna
		from a1
			left join a0 on a0.campo  = a1.campo
		order by a1.basico desc, orden ;
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_con_lista_tablas_campos_d_u` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_con_lista_tablas_campos_d_u`(
	in _item int(11),
	in _formulario int(11),
	in _orden int(11),
	in _campo varchar(200), 
	in _etiqueta varchar(200), 
	in _ancho smallint(4), 
	in _tipo_campo varchar(15), 
	in _maximo int(11), 
	in _readonly varchar(8), 
	in _requerido varchar(10), 
	in _autofocus varchar(10), 
	in _procedimiento varchar(100), 
	in _parametro varchar(100), 
	in _campo_cbusca varchar(50), 
	in _columna smallint(1), 
	in _valor varchar(255), 
	in _tab smallint(6), 
	in _id_datepicker varchar(15), 
	in _decimales int(1)
)
begin
	if _item = 0 then
		insert into cfg_formulario_campos (formulario, orden, campo, etiqueta, ancho, tipo_campo, maximo, readonly, requerido, autofocus, procedimiento, parametro, campo_cbusca, columna, valor, tab, id_datepicker, decimales)
			select _formulario, _orden, _campo, _etiqueta, _ancho, _tipo_campo, _maximo, _readonly, _requerido, _autofocus, _procedimiento, _parametro, _campo_cbusca, _columna, _valor, _tab, _id_datepicker, _decimales ;
	else
		update cfg_formulario_campos set 
				formulario = _formulario, 
				orden = _orden, 
				campo = _campo, 
				etiqueta = _etiqueta, 
				ancho = _ancho, 
				tipo_campo = _tipo_campo, 
				maximo = _maximo, 
				readonly = _readonly, 
				requerido = _requerido, 
				autofocus = _autofocus, 
				procedimiento = _procedimiento, 
				parametro = _parametro, 
				campo_cbusca = _campo_cbusca, 
				columna = _columna, 
				valor = _valor, 
				tab = _tab, 
				id_datepicker = _id_datepicker, 
				decimales = _decimales
			where item = _item ;
	end if ;
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_con_lista_tablas_campos_u` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_con_lista_tablas_campos_u`(
	in _formulario int(11)
)
begin
	-- ----------------------------------------------------
	-- Actualiza los datos del maestro de almacén
	-- Versión 1.0
	-- Creado: 07/11/2014
	-- Actualizado: 2024.04.13, 07/11/2014
	-- Autor: 
	-- ----------------------------------------------------
	
	set @tabla = '' ;
	set @formulario = _formulario ;
	
	select trim(tabla) into @tabla
		from cfg_lista_formularios
		where formulario = @formulario ;
	
	drop temporary table if exists a0 ;
	create temporary table a0
		select 	table_schema, 
				table_name, 
				column_name, 
				ordinal_position, 
				is_nullable, 
				data_type, 
				coalesce(ChARACTER_MAXIMUM_LeNGTH, NUMERIC_PrECISIon,  '') longitud, 
				numeric_scale,
				column_type,
				case  when is_nullable = 'NO' then 'required' else null end requerido
			from information_schema.columns 
			where table_schema = schema()
				and table_name = trim(@tabla) 
				and column_name not in (select campo from cfg_formulario_campos where formulario = @formulario) ;
	
	/* inserta los nuevos campos de la tabla */
    insert into cfg_formulario_campos (formulario, orden, campo, etiqueta, ancho, tipo_campo, maximo, requerido, columna, decimales, F)
	select @formulario, 
			ordinal_position, 
			column_name, 
			concat('LBL_', trim(upper(column_name))), 
			longitud, 
			column_type,
			longitud,
			requerido, 
			1, 
			numeric_scale,
            1
		from a0
		order by ordinal_position ;
        /*substring(column_type, 1, 1),*/
        
	/*inserta los botones ver y editar de la lista*/
    insert into cfg_formulario_campos (formulario, tipo_campo, orden_lista, campo_lista, ancho_lista, link, image, parametro_lista, titulo)
		values (_formulario, 'i', 100, 'codigo', 24, '../modulos/ad_sis_formulario_u_std.php?modo=0&tipo=1&_parametro=', '../imagenes/find.png', 'codigo', 'Ver registro');
        
    insert into cfg_formulario_campos (formulario, tipo_campo, orden_lista, campo_lista, ancho_lista, link, image, parametro_lista, titulo)
		values (_formulario, 'i', 101, 'codigo', 24, '../modulos/ad_sis_formulario_u_std.php?modo=2&tipo=1&_parametro=', '../imagenes/edit.png', 'codigo', 'Editar registro');
    
    
    /*Actualiza los tipos de campo*/
	update cfg_formulario_campos
		set tipo_campo='C'
		where formulario=_formulario
			and substring(tipo_campo,1,7)='varchar';
        
	update cfg_formulario_campos
		set tipo_campo='N'
		where formulario=_formulario
			and (substring(tipo_campo,1,3)='int' 
				or substring(tipo_campo,1,8)='smallint'
				or substring(tipo_campo,1,7)='decimal'
				or substring(tipo_campo,1,6)='double');

	update cfg_formulario_campos
		set tipo_campo='d'
		where formulario=_formulario
			and (substring(tipo_campo,1,4)='date'
				or substring(tipo_campo,1,8)='datetime');

	update cfg_formulario_campos
		set tipo_campo='list'
		where formulario=_formulario
			and campo='estado';        
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_dashboard_neto_c` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_dashboard_neto_c`(
	in _codemp varchar(2), 
	in _sucursal varchar(3)
)
begin
	/* ----------------------------------------------------------------------------------------------------
		Reporte de Timesheet de clientes, role y tarifa
		Versión 1.0
		Creado: 2025-08-12
		Actualizado: 2025-08-12
		Autor: Custom Systems Solutions LLC
	---------------------------------------------------------------------------------------------------- */
    
	set @codemp = _codemp ;
    set @sucursal = _sucursal ;
	set @personal_a = 0 ;
    set @personal_p = 0 ;
    
     select curdate() - interval 37 day, curdate() - interval 7 day, curdate() - interval 38 day, curdate() - interval 68 day into @fecha_da, @fecha_ha, @fecha_hp, @fecha_dp ;
	
    -- ----------------------------------------------------------------------------------------------------
    drop temporary table if exists c_timesheet ;
    create temporary table c_timesheet
		select	codemp, sucursal, numero, fecha_d, fecha_h
			from tb_f_otimesheet
            where codemp = @codemp
				and sucursal = @sucursal
                and fecha_d between @fecha_da and @fecha_ha
                and estado between 4 and 5
		union
        select	codemp, sucursal, numero, fecha_d, fecha_h
			from tb_f_otimesheet
            where codemp = @codemp
				and sucursal = @sucursal
                and fecha_d between @fecha_dp and @fecha_hp
                and estado between 4 and 5; 
    
    -- ----------------------------------------------------------------------------------------------------
	drop temporary table if exists c_timesheet_dpersonal_role ;
    create temporary table c_timesheet_dpersonal_role
		select	c_timesheet.codemp, 
				c_timesheet.sucursal,
                tb_f_otimesheet_dpersonal_role.personal
			from tb_f_otimesheet_dpersonal_role
				inner join c_timesheet
					on c_timesheet.codemp = tb_f_otimesheet_dpersonal_role.codemp
						and c_timesheet.sucursal = tb_f_otimesheet_dpersonal_role.sucursal
                        and c_timesheet.numero = tb_f_otimesheet_dpersonal_role.numero
			where c_timesheet.fecha_d between @fecha_da and @fecha_ha 
				and tb_f_otimesheet_dpersonal_role.horas > 0 
            group by c_timesheet.codemp, c_timesheet.sucursal, tb_f_otimesheet_dpersonal_role.personal ;
	
    select count(personal) into @personal_a
		from c_timesheet_dpersonal_role ;
        
	-- ----------------------------------------------------------------------------------------------------
	drop temporary table if exists c_timesheet_dpersonal_role ;
    create temporary table c_timesheet_dpersonal_role
		select	c_timesheet.codemp, 
				c_timesheet.sucursal,
                tb_f_otimesheet_dpersonal_role.personal
			from tb_f_otimesheet_dpersonal_role
				inner join c_timesheet
					on c_timesheet.codemp = tb_f_otimesheet_dpersonal_role.codemp
						and c_timesheet.sucursal = tb_f_otimesheet_dpersonal_role.sucursal
                        and c_timesheet.numero = tb_f_otimesheet_dpersonal_role.numero
			where c_timesheet.fecha_d between @fecha_dp and @fecha_hp
				and tb_f_otimesheet_dpersonal_role.horas > 0 
            group by c_timesheet.codemp, c_timesheet.sucursal, tb_f_otimesheet_dpersonal_role.personal ;
	
    select count(personal) into @personal_p
		from c_timesheet_dpersonal_role ;
        
    -- ----------------------------------------------------------------------------------------------------
	drop temporary table if exists c_timesheet_drole ;
    create temporary table c_timesheet_drole
		select	c_timesheet.codemp, 
				c_timesheet.sucursal,
                (case when fecha_d between @fecha_da and @fecha_ha then tb_f_otimesheet_dpersonal_role.horas else 0 end) as horas_a, /*
                (case when fecha_d between @fecha_da and @fecha_ha then tb_f_otimesheet_dpersonal_role.horas_rg else 0 end) as horas_rg_a, 
                (case when fecha_d between @fecha_da and @fecha_ha then tb_f_otimesheet_dpersonal_role.horas_ot else 0 end) as horas_ot_a, 
                (case when fecha_d between @fecha_da and @fecha_ha then tb_f_otimesheet_dpersonal_role.horas_fd else 0 end) as horas_fd_a, 
                (case when fecha_d between @fecha_da and @fecha_ha then tb_f_otimesheet_dpersonal_role.monto_staff_rg else 0 end) as monto_staff_rg_a, 
                (case when fecha_d between @fecha_da and @fecha_ha then tb_f_otimesheet_dpersonal_role.monto_staff_ot else 0 end) as monto_staff_ot_a, 
                (case when fecha_d between @fecha_da and @fecha_ha then tb_f_otimesheet_dpersonal_role.monto_staff_fd else 0 end) as monto_staff_fd_a, */
                (case when fecha_d between @fecha_da and @fecha_ha then tb_f_otimesheet_dpersonal_role.total_staff else 0 end) as total_staff_a, /*
                (case when fecha_d between @fecha_da and @fecha_ha then tb_f_otimesheet_dpersonal_role.monto_margin_rg else 0 end) as monto_margin_rg_a, 
                (case when fecha_d between @fecha_da and @fecha_ha then tb_f_otimesheet_dpersonal_role.monto_margin_ot else 0 end) as monto_margin_ot_a, 
                (case when fecha_d between @fecha_da and @fecha_ha then tb_f_otimesheet_dpersonal_role.monto_margin_fd else 0 end) as monto_margin_fd_a,*/
                (case when fecha_d between @fecha_da and @fecha_ha then tb_f_otimesheet_dpersonal_role.total_cliente else 0 end) as total_customer_a,
                
                (case when fecha_d between @fecha_dp and @fecha_hp then tb_f_otimesheet_dpersonal_role.horas else 0 end) as horas_p, /*
                (case when fecha_d between @fecha_dp and @fecha_hp then tb_f_otimesheet_dpersonal_role.horas_rg else 0 end) as horas_rg_p, 
                (case when fecha_d between @fecha_dp and @fecha_hp then tb_f_otimesheet_dpersonal_role.horas_ot else 0 end) as horas_ot_p, 
                (case when fecha_d between @fecha_dp and @fecha_hp then tb_f_otimesheet_dpersonal_role.horas_fd else 0 end) as horas_fd_p, 
                (case when fecha_d between @fecha_dp and @fecha_hp then tb_f_otimesheet_dpersonal_role.monto_staff_rg else 0 end) as monto_staff_rg_p, 
                (case when fecha_d between @fecha_dp and @fecha_hp then tb_f_otimesheet_dpersonal_role.monto_staff_ot else 0 end) as monto_staff_ot_p, 
                (case when fecha_d between @fecha_dp and @fecha_hp then tb_f_otimesheet_dpersonal_role.monto_staff_fd else 0 end) as monto_staff_fd_p, */
                (case when fecha_d between @fecha_dp and @fecha_hp then tb_f_otimesheet_dpersonal_role.total_staff else 0 end) as total_staff_p, /*
                (case when fecha_d between @fecha_dp and @fecha_hp then tb_f_otimesheet_dpersonal_role.monto_margin_rg else 0 end) as monto_margin_rg_p, 
                (case when fecha_d between @fecha_dp and @fecha_hp then tb_f_otimesheet_dpersonal_role.monto_margin_ot else 0 end) as monto_margin_ot_p, 
                (case when fecha_d between @fecha_dp and @fecha_hp then tb_f_otimesheet_dpersonal_role.monto_margin_fd else 0 end) as monto_margin_fd_p,*/
                (case when fecha_d between @fecha_dp and @fecha_hp then tb_f_otimesheet_dpersonal_role.total_cliente else 0 end) as total_customer_p
			from tb_f_otimesheet_dpersonal_role
				inner join c_timesheet
					on c_timesheet.codemp = tb_f_otimesheet_dpersonal_role.codemp
						and c_timesheet.sucursal = tb_f_otimesheet_dpersonal_role.sucursal
                        and c_timesheet.numero = tb_f_otimesheet_dpersonal_role.numero
			where tb_f_otimesheet_dpersonal_role.horas > 0 ;
	
    -- ----------------------------------------------------------------------------------------------------
	drop temporary table if exists t_timesheet_drole ;
	create temporary table t_timesheet_drole
		select	codemp, 
				sucursal,
                sum(horas_a) as horas_a, /*
                sum(horas_rg_a) as horas_rg_a, 
                sum(horas_ot_a) as horas_ot_a, 
                sum(horas_fd_a) as horas_fd_a, 
                sum(monto_staff_rg_a) as monto_staff_rg_a, 
                sum(monto_staff_ot_a) as monto_staff_ot_a, 
                sum(monto_staff_fd_a) as monto_staff_fd_a, */
                sum(total_staff_a) as total_staff_a, /*
                sum(monto_margin_rg_a) as monto_margin_rg_a, 
                sum(monto_margin_ot_a) as monto_margin_ot_a, 
                sum(monto_margin_fd_a) as monto_margin_fd_a,*/
                sum(total_customer_a) as total_customer_a,
                
                sum(horas_p) as horas_p, /*
                sum(horas_rg_p) as horas_rg_p, 
                sum(horas_ot_p) as horas_ot_p, 
                sum(horas_fd_p) as horas_fd_p, 
                sum(monto_staff_rg_p) as monto_staff_rg_p, 
                sum(monto_staff_ot_p) as monto_staff_ot_p, 
                sum(monto_staff_fd_p) as monto_staff_fd_p, */
                sum(total_staff_p) as total_staff_p, /*
                sum(monto_margin_rg_p) as monto_margin_rg_p, 
                sum(monto_margin_ot_p) as monto_margin_ot_p, 
                sum(monto_margin_fd_p) as monto_margin_fd_p,*/
                sum(total_customer_p) as total_customer_p
			from c_timesheet_drole
            group by codemp, sucursal ;
            
	-- ----------------------------------------------------------------------------------------------------
    select	concat(@fecha_da, ' - ',  @fecha_ha) as fecha_a,
			@personal_a as personal_a,
			-- t_timesheet_drole.horas_rg_a, t_timesheet_drole.horas_ot_a, t_timesheet_drole.horas_fd_a, 
            t_timesheet_drole.horas_a, 
			-- t_timesheet_drole.monto_staff_rg_a, t_timesheet_drole.monto_staff_ot_a, t_timesheet_drole.monto_staff_fd_a, 
            t_timesheet_drole.total_staff_a, 
			-- t_timesheet_drole.monto_margin_rg_a, t_timesheet_drole.monto_margin_ot_a, t_timesheet_drole.monto_margin_fd_a, 
            t_timesheet_drole.total_customer_a,
            
            concat(@fecha_dp, ' - ', @fecha_hp) as fecha_p,
            @personal_p as personal_p,
			-- t_timesheet_drole.horas_rg_p, t_timesheet_drole.horas_ot_p, t_timesheet_drole.horas_fd_p, 
            t_timesheet_drole.horas_p, 
			-- t_timesheet_drole.monto_staff_rg_p, t_timesheet_drole.monto_staff_ot_p, t_timesheet_drole.monto_staff_fd_p, 
            t_timesheet_drole.total_staff_p, 
			-- t_timesheet_drole.monto_margin_rg_p, t_timesheet_drole.monto_margin_ot_p, t_timesheet_drole.monto_margin_fd_p, 
            t_timesheet_drole.total_customer_p,
            
            round(t_timesheet_drole.total_customer_a - t_timesheet_drole.total_staff_a, 2) as total_neto_a,
            round(t_timesheet_drole.total_customer_p - t_timesheet_drole.total_staff_p, 2) as total_neto_p,
            
            round(@personal_a - @personal_p, 0) as diferencia_staff,
            round(t_timesheet_drole.horas_a - t_timesheet_drole.horas_p, 2) as diferencia_horas,
            round((t_timesheet_drole.total_staff_a - t_timesheet_drole.total_staff_p) * 100, 2) as diferencia_staff_total,
            round((t_timesheet_drole.total_customer_a - t_timesheet_drole.total_customer_p) * 100, 2) as diferencia_customer_total
		from t_timesheet_drole  ;
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_form_cfg_acceso_c` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_form_cfg_acceso_c`(
	in _cadena_prim varchar(50), 
	in _cadena_seg varchar(50)
)
begin
	/* ---------------------------------------------------------------------------------------------------------------------------------------------
		Comprueba si el usuario existe, si está activo y si la contraseña coincice
		V 1.0
		Creado 2025-02-03
		Actualizado 2025-02-03, 2025-02-08, 2025-03-23
		Autor: Custom Systems Solutions LLC
	---------------------------------------------------------------------------------------------------- */
	set @_codemp = '01';

	if (( Trim(_cadena_prim )<> '' ) and ( Trim(_cadena_seg )<> '' )) then
		select 	tb_musuario.*,
				coalesce(cfg_mlenguaje.archivo,'') as lenguaje,
				coalesce(cfg_mlenguaje.archivo_rp,'') as lenguaje_rp,
				coalesce(cfg_mformato.formato_fecha,'') as formato_fecha,
				coalesce(cfg_mformato.formato_hora,'') as formato_hora,
                coalesce(cfg_timezones.nombre,'') as timezone,
                coalesce(cfg_mempresa.nombre,'') as nempresa
			from tb_musuario
				left join tb_musuario_grupo on tb_musuario_grupo.u201 = tb_musuario.u206
				left join cfg_mlenguaje on tb_musuario.u212 = trim(cfg_mlenguaje.codigo)
				left join cfg_mformato on tb_musuario.u213 = cfg_mformato.codigo
				left join cfg_timezones on tb_musuario.u217 = cfg_timezones.codigo
                left join cfg_mempresa on cfg_mempresa.codigo = @_codemp
			where tb_musuario.u203 = _cadena_prim 
				and tb_musuario.u204 = sha1(_cadena_seg) 
				and tb_musuario.estado = 1 ;
	else
		select -1 ;
	end if;
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_form_cfg_acceso_pin_c` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_form_cfg_acceso_pin_c`(
	in _cadena_prim varchar(50), 
	in _cadena_seg varchar(50)
)
begin
	/* ---------------------------------------------------------------------------------------------------------------------------------------------
		Comprueba si el usuario existe, si está activo y si la contraseña coincice
		V 1.0
		Creado 2025-02-03
		Actualizado 2025-02-03, 2025-02-08, 2025-03-09
		Autor: Custom Systems Solutions LLC
	---------------------------------------------------------------------------------------------------- */

	if (( Trim(_cadena_prim )<> '' ) and ( Trim(_cadena_seg )<> '' )) then
		select 	u201 into @codigo
			from tb_musuario
			where tb_musuario.u203 = _cadena_prim 
				and tb_musuario.estado = 1 ;
			
		set @KeyU220 = '' ;  
        call sp_cfg_formulario_aesed_c(5, @codigo, 'u220', @KeyU220) ;
    
		select 	tb_musuario.u219
			from tb_musuario
			where tb_musuario.u203 = _cadena_prim 
				and tb_musuario.u220 = aes_encrypt(_cadena_seg,  @KeyU220)
				and tb_musuario.estado = 1 ;
	else
		select -1 ;
	end if;
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_form_cfg_mdepartamento_u` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_form_cfg_mdepartamento_u`(
	in _codemp varchar(2), 
	in _sucursal varchar(3), 
	in _usuario varchar(10),
	in _caja varchar(10),
	in _codigo varchar(5), 
	in _nombre varchar(120), 
	in _estado varchar(1), 
	out _valor varchar(11)
)
begin
	/* ----------------------------------------------------------------------------------------------------
		Actualiza los datos del maestro de departamentos
		Versión 1.0
		Creado: 02/07/2014
		Actualizado: 2024.04.13, 01/09/2014
		Autor: 
	---------------------------------------------------------------------------------------------------- */
	
   if trim(_codigo) = '' then
		call sp_tdocumento_u('cfg_mdepartamento', 5, 1, @_codigo);
		set _codigo = @_codigo;
	    insert into cfg_mdepartamento (codemp, codigo, nombre, estado) values (_codemp, _codigo, ltrim(_nombre), _estado);
	else
		update cfg_mdepartamento 
			set 
				nombre = _nombre, 
				estado = _estado 
			where codigo = _codigo 
				and codemp = _codemp;
	end if;
	set _valor = _codigo;
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_form_cfg_mempresa_c` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_form_cfg_mempresa_c`(
	in _codemp varchar(2), 
	in _sucursal varchar(3), 
	in _status varchar(1), 
	in _parametro varchar(3),
	in _tabla varchar(20),
	in _tipo varchar(3)
)
begin
	-- ----------------------------------------------------
	-- Consulta datos de la empresa
	-- Versión 1.0
	-- Creado: 2024.12.01
	-- Actualizado: 2024.12.29
	-- Autor: 
	-- ----------------------------------------------------
	if (_codemp is not null) OR (_sucursal is not null) or (_tabla is not null) or (_parametro is not null) then
		set @sql_where = concat(' where codigo = ', _codemp);
		
		-- ----------------------------------------------------
		call sql_prepare(trim(_tabla), @sql_where) ;
		set @sql_where = null ;
		
		-- ----------------------------------------------------
		select	sql_tabla.*,
				coalesce(tb_g_mdivisa_b.nombre, '') as ndivisa,
                coalesce(tb_g_mdivisa_c.nombre, '') as nmoneda,
				coalesce(cfg_mestado.nombre, '') as nestado,
				coalesce(cfg_mestado.clase_css, '') as nestado_clase_css,
				coalesce(cfg_mestado.img_icon, '') as nestado_img_icon
			from sql_tabla
				left join tb_g_mdivisa as tb_g_mdivisa_b 
					on sql_tabla.codigo = tb_g_mdivisa_b.codemp
						and sql_tabla.divisa = tb_g_mdivisa_b.codigo
				left join tb_g_mdivisa as tb_g_mdivisa_c 
					on sql_tabla.codigo = tb_g_mdivisa_c.codemp
						and sql_tabla.moneda = tb_g_mdivisa_c.codigo
				left join cfg_mestado 
					on sql_tabla.estado = cfg_mestado.codigo 
						and cfg_mestado.tipo = trim(_tipo);
		
	else
		select -1 ;
	end if ;
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_form_cfg_mempresa_u` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_form_cfg_mempresa_u`(
	in _codemp varchar(2), 
	in _sucursal varchar(3),
	in _usuario varchar(10),
    in _formulario int,
	in _codigo varchar(2), 
    in _estado_ciudad varchar(5), 
    in _ciudad varchar(100), 
    in _zcode varchar(10),
    in _estado varchar(3),
    in _web varchar(100), 
    in _email varchar(100), 
    in _direccion varchar(1000), 
    in _divisa varchar(5),
    in _moneda varchar(5), 
    in _logo_qr varchar(50),
	in _plataforma_a varchar(50),
	in _plataforma_b varchar(50),
	in _plataforma_c varchar(50),
	in _plataforma_d varchar(50),
	out _valor varchar(15)    
)
begin
	-- -----------------------------------------------------
	-- Actualiza los datos de la organización
	-- Versión 1.0
	-- Creado: 2024.12.01
	-- Actualizado: 2024.12.30
	-- Autor: 
	-- ---------------------------------------------------
    select pais into @pais
		from tb_g_mestado_ciudad
        where codigo = _estado_ciudad ;
        
    if coalesce(_codigo, '') != '' then 
		update cfg_mempresa 
			set
				pais = @pais, 
				estado_ciudad = _estado_ciudad, 
				ciudad = _ciudad, 
				zcode = _zcode, 
                web = _web,
				email = _email, 
				direccion = _direccion, 
				divisa = _divisa, 
				moneda = _moneda,
				logo_qr = _logo_qr,
				plataforma_a = _plataforma_a,
				plataforma_b = _plataforma_b,
				plataforma_c = _plataforma_c,
				plataforma_d = _plataforma_d
			where codigo = _codigo ;
	end if ;
    set _valor = _codigo;
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_form_cfg_msucursal_u` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_form_cfg_msucursal_u`(
	in _codemp varchar(2), 
	in _sucursal varchar(3),
	in _usuario varchar(10),
    in _formulario int,
	in _codigo varchar(3), 
    in _nombre varchar(100), 
    in _pais varchar(100), 
    in _estado_provincia varchar(100), 
    in _ciudad varchar(100), 
    in _codigo_postal varchar(10), 
    in _email varchar(100), 
    in _telefonos varchar(100), 
    in _direccion varchar(8000), 
    in _almacen_e varchar(10),
    in _almacen_s varchar(10), 
    in _almacen_a int(1), 
    in _estado char(3), 
	out _valor varchar(15)
)
begin
	-- -----------------------------------------------------
	-- Actualiza los datos de la sucursal
	-- Versión 1.0
	-- Creado: 2020.03.17
	-- Actualizado: 2024.04.13, 2020.03.17
	-- Autor: 
	-- ---------------------------------------------------
    
    if coalesce(_codigo, '') != '' then 
		update cfg_msucursal 
			set
				pais = _pais, 
				estado_provincia = _estado_provincia, 
				ciudad = _ciudad, 
				codigo_postal = _codigo_postal, 
				email = _email, 
				telefonos = _telefonos, 
				direccion = _direccion, 
				almacen_e = _almacen_e, 
				almacen_s = _almacen_s, 
				almacen_actualiza = _almacen_a
			where codemp = _codemp
				and codigo = _codigo ;
	end if ;
    set _valor = _codigo;
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_form_cfg_musuaiod_c` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_form_cfg_musuaiod_c`(
	in _codemp varchar(2), 
    in _sucursal varchar(3), 
    in _parametro varchar(15))
begin
	-- ---------------------------------------------------
	-- Consulta datos del detalle de usuarios
	-- Empresas y sucursales
	-- Versión 1.0
	-- Creado: 18/08/2014
	-- Actualizado: 2024.04.13, 27/10/2014
	-- Autor: 
	-- ---------------------------------------------------
	
	drop temporary table if exists a1;
	create temporary table a1
		select 	empresa as codemp, 
				sucursal,
				1 as marca,
				item
			from tb_musuariod
			where u201 = trim(_parametro) ;

	drop temporary table if exists a2 ;
	create temporary table a2
		select 	codemp, 
				codigo as sucursal, 
				0 as marca,
				0 as item
			from cfg_msucursal 
			where concat(codemp, codigo) not in (select concat(codemp, sucursal) from a1) ;

	drop temporary table if exists a3 ;
	create temporary table a3
		select codemp, sucursal, marca, item 
			from a1
		union 
		select codemp, sucursal, marca, item 
			from a2 ;
	
	
	select	a3.codemp,
			coalesce(cfg_mempresa.nombre,'') as nempresa,
			a3.sucursal,
			coalesce(cfg_msucursal.nombre,'') as nsucursal,
			a3.marca,
			a3.item
		from a3
			left join cfg_mempresa 
				on cfg_mempresa.codigo = a3.codemp
			left join cfg_msucursal 
				on cfg_msucursal.codemp = a3.codemp 
					and cfg_msucursal.codigo = a3.sucursal
	order by a3.codemp, cfg_msucursal.nombre;
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_form_cfg_musuariod_u` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_form_cfg_musuariod_u`(
	in _nousar1 varchar(1),
	in _nousar2 varchar(1),
	in _parametro varchar(5),
	in _nousar3 varchar(1),
	in _nousar4 varchar(1),
	in _marca int(1),
	in _codemp varchar(2), 
	in _sucursal varchar(3), 
	in _item int(11)
)
begin
	-- --------------------------------------------------
	-- inserta o actualiza registros del detalle de 
	-- usuarios (empresas y sucursales )
	-- Versión 1.0
	-- Creado: 14/08/2014
	-- Actualizado: 2024.04.13, 15/09/2015
	-- Autor: 
	-- --------------------------------------------------

	if _item = 0 and _marca = 1 then
		-- Si no está guardado y está marcado se inserta
		insert into tb_musuariod(u201, empresa, sucursal)
			Values (_parametro, _codemp, _sucursal);
	elseif _item <>0 then
		-- actualiza los registros del detalle
		if _marca = 0 then
		   delete 
			from tb_musuariod 
			where u201 = _parametro
				and item = _item ;
		else
			update tb_musuariod 
				set
					empresa = _codemp,
					sucursal = _sucursal
				where u201 = _parametro
					and item = _item ;
		end if;
	end if;
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_form_cfg_musuario_acceso_c` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_form_cfg_musuario_acceso_c`(
	in _codemp varchar(2), 
	in _sucursal varchar(3),
	in _u201 varchar(5),
	in _formulario int(11)
)
begin
	-- ---------------------------------------------------
	-- consulta los accesos de usuario 
	-- Versión 1.0
	-- Creado: 07/10/2015
	-- Actualizado: 2024.04.13, 07/02/2018
	-- Autor: 
	-- ---------------------------------------------------
	set @grupo = '' collate utf8mb4_spanish_ci;
	select u206 into @grupo
		from tb_musuario
		where u201 = _u201;

	select * 
		from tb_musuario_dpermiso
		where u201 = @grupo
			and u202 = _formulario;

end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_form_cfg_musuario_c` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_form_cfg_musuario_c`(
	in _codemp varchar(2), 
	in _sucursal varchar(3), 
	in _status varchar(1), 
	in _parametro varchar(255), 
	in _tabla varchar(255), 
	in _tipo varchar(3))
begin
	-- ----------------------------------------------------
	-- consulta generica de los datos para los formularios
	-- Versión 1.0
	-- Creado: 2024.12.0
	-- Actualizado: 2024.12.29
	-- Autor: 
	-- ----------------------------------------------------
    if (_codemp is not null) OR (_sucursal is not null) or (_tabla is not null) or (_parametro is not null) then
		set @sql_where = concat(' where estado <> 0');
		if trim(coalesce(_parametro, '')) <> '' then
			set @sql_where = concat(@sql_where, ' and u201 = "', trim(_parametro), '"');
		end if;
		
		-- ----------------------------------------------------
		call sql_prepare(trim(_tabla), @sql_where) ;
		set @sql_where = null ;
		
		-- ----------------------------------------------------
        set @KeyU220 = '' ;  
        call sp_cfg_formulario_aesed_c(5, _parametro, 'u220', @KeyU220) ;
		select	sql_tabla.u201, sql_tabla.u202, sql_tabla.u203, sql_tabla.u204, sql_tabla.u205, sql_tabla.u205_s, 
				sql_tabla.u206, sql_tabla.u207, sql_tabla.u209, sql_tabla.u210, sql_tabla.u211, sql_tabla.u212, 
				sql_tabla.u213, sql_tabla.u214, sql_tabla.u215, sql_tabla.u216, sql_tabla.estado, sql_tabla.u217, 
				sql_tabla.u218, sql_tabla.u219, sql_tabla.u221,
				sql_tabla.u224, sql_tabla.u225, sql_tabla.u226,
				convert(aes_decrypt(sql_tabla.u220, @KeyU220) using utf8) as u220,
				coalesce(cfg_mestado.nombre, '') as nestado,
				coalesce(cfg_mdepartamento.nombre,'') as ndepartamento,
				coalesce(tb_musuario_grupo.u202,'') as ngrupo
			from sql_tabla
				left join cfg_mdepartamento 
					on sql_tabla.u210 = cfg_mdepartamento.codigo 
						and cfg_mdepartamento.codemp = _codemp
				left join tb_musuario_grupo 
					on sql_tabla.u206 = tb_musuario_grupo.u201
				inner join cfg_mestado 
					on sql_tabla.estado = cfg_mestado.codigo 
						and cfg_mestado.codemp = _codemp 
						and cfg_mestado.tipo = trim(_tipo)  ;
		
	else
		select -1 ;
	end if ;
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_form_cfg_musuario_cambiopwd_u` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_form_cfg_musuario_cambiopwd_u`(
	in _usuario varchar(10),
	in _pass varchar(50)
)
begin
	-- -------------------------------------------
	-- actualiza el passord de usuarios, 
	-- V 1.0
	-- Creado 07/01/2016
	-- Actualizado 03-16-2025
	-- Autor:  Custom Systems Solutions LLC
	-- -------------------------------------------
    
	update tb_musuario 
		set
			u221 = null,
			u204 = sha1(md5(_pass))
		where u203 = _usuario;
        
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_form_cfg_musuario_dgrupo_c` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_form_cfg_musuario_dgrupo_c`(
	in _codemp varchar(2), 
	in _sucursal varchar(3), 
    in _modo varchar(1),
	in _parametro varchar(15)
)
begin
	-- ------------------------------------------------------------------------------------------------------------------------
	-- Consulta datos del detalle de grupos de usuarios
	-- Versión 1.0
	-- Creado: 2025-03-02
	-- Actualizado: 2025-07-10
	-- Autor: Custom Systems Solutions LLC
	-- ------------------------------------------------------------------------------------------------------------------------
    
	drop temporary table if exists a1;
	create temporary table a1
		select *
			from tb_musuario_dpermiso
			where u201 = coalesce(_parametro, '') ;
	
	drop temporary table if exists a2;
	create temporary table a2
		select 	coalesce(_parametro, '') u201,
				formulario as  u202,
				0 u204, 0 u205, 
                0 u206, 0 u207, 0 u208, 0 u209, 0 u210,
				0 u211, 0 u212, 0 u213, 0 u214, 0 u215, 
                0 u216, 0 u217, 0 u218, 0 u219, 0 u220
			from cfg_lista_formularios
			where formulario not in (select u202 from a1) ;
		
	drop temporary table if exists a3 ;
	create temporary table a3
		select 	u201, u202, u204, u205, u206, u207, u208, u209, u210, 
				u211, u212, u213, u214, u215, u216, u217, u218, u219, u220 
			from a1
		union 
		select 	u201, u202, u204, u205, u206, u207, u208, u209, u210, 
				u211, u212, u213, u214, u215, u216, u217, u218, u219, u220 
			from a2 ;

	select	a3.*,
			coalesce(cfg_lista_formularios.titulo,'') as nopcion,
			coalesce(cfg_menu_modulo.nombre,'') as nmodulo,
			coalesce(cfg_menu_grupo.nombre,'') as ngrupo
		from a3
			left join cfg_lista_formularios 
				on cfg_lista_formularios.formulario = a3.u202
			left join cfg_menu_modulo 
				on cfg_menu_modulo.codigo = cfg_lista_formularios.modulo
			left join cfg_menu_grupo 
				on cfg_menu_grupo.codigo = cfg_lista_formularios.grupo
	order by cfg_menu_modulo.codigo, cfg_menu_grupo.codigo, cfg_lista_formularios.titulo;
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_form_cfg_musuario_dgrupo_u` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_form_cfg_musuario_dgrupo_u`(
	in _codemp varchar(2), 
    in _sucursal varchar(3),
	in _u201 varchar(5),
	in _u202 smallint,
	in _u204 smallint, 
	in _u205 smallint, 
	in _u206 smallint, 
	in _u207 smallint, 
	in _u208 smallint, 
	in _u209 smallint, 
	in _u210 smallint, 
	in _u211 smallint, 
	in _u212 smallint, 
	in _u213 smallint, 
	in _u214 smallint, 
    in _u215 smallint, 
    in _u216 smallint, 
    in _u217 smallint, 
    in _u218 smallint, 
    in _u219 smallint, 
	in _item int(11)
)
begin
	-- ------------------------------------------------------------------------------------------------------------------------
	-- inserta o actualiza registros del detalle de grupos de usuarios (accesos)
	-- Versión 1.0
	-- Creado: 2024-12-01
	-- Actualizado: 2025-07-15
	-- Autor: Custom Systems Solutions LLC
	-- ------------------------------------------------------------------------------------------------------------------------
    
	if coalesce(_item, 0) = 0 then
		-- Si no está guardado y está marcado se inserta
		insert into tb_musuario_dpermiso(u201, u202, u204, u205, u206, u207, u208, u209, u210, u211, u212, u213, u214, u215, u216, u217, u218, u219)
			values (_u201, _u202, _u204, _u205, _u206, _u207, _u208, _u209, _u210, _u211, _u212, _u213, _u214, _u215, _u216, _u217, _u218, u219);
	else
		-- Actualiza los registros del detalle
		update tb_musuario_dpermiso 
			set
				u204 = _u204,
				u205 = _u205,
				u206 = _u206,
				u207 = _u207,
				u208 = _u208,
				u209 = _u209,
				u210 = _u210,
				u211 = _u211,
				u212 = _u212,
				u213 = _u213,
				u214 = _u214,
                u215 = _u215,
                u216 = _u216,
                u217 = _u217,
                u218 = _u218,
                u219 = _u219
			where u201 = _u201
				and u202 = _u202
				and u220 = _item ;
	end if;
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_form_cfg_musuario_grupo_c` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_form_cfg_musuario_grupo_c`(
	in _codemp varchar(2), 
	in _sucursal varchar(3), 
	in _status varchar(1), 
	in _parametro varchar(255), 
	in _tabla varchar(255), 
	in _tipo varchar(3)
)
begin
	-- ------------------------------------------------------------------------------------------------------------------------
	-- consulta generica de los datos para los formularios
	-- Versión 1.0
	-- Creado: 2024.12.01
	-- Actualizado: 2024.12.29
	-- Autor: Custom Systems Solutions LLC
	-- ------------------------------------------------------------------------------------------------------------------------
    if (_codemp is not null) OR (_sucursal is not null) or (_tabla is not null) or (_parametro is not null) then
		set @sql_where = concat(' where estado <> 0');
		if trim(coalesce(_parametro, '')) <> '' then
			set @sql_where = concat(@sql_where, ' and u201 = "', trim(_parametro), '"');
		end if;
		
		-- ----------------------------------------------------
		call sql_prepare(trim(_tabla), @sql_where) ;
		set @sql_where = null ;
		
		-- ----------------------------------------------------
		select	sql_tabla.*,
				coalesce(cfg_mestado.nombre, '') as nestado
			from sql_tabla
				inner join cfg_mestado 
					on sql_tabla.estado = cfg_mestado.codigo 
						and cfg_mestado.codemp = _codemp 
						and cfg_mestado.tipo = trim(_tipo)  ;
		
	else
		select -1 ;
	end if ;
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_form_cfg_musuario_grupo_u` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_form_cfg_musuario_grupo_u`(
	in _codemp varchar(2), 
	in _sucursal varchar(3), 
	in _usuario varchar(10),
	in _formulario varchar(5),
	in _codigo varchar(5), 
	in _nombre varchar(120), 
    in _notificacion char(1),     
	in _estado char(3), 
	out _valor varchar(11)
)
begin
	-- -------------------------------------------------------
	-- actualiza los datos del maestro de grupos de usuarios
	-- Versión 1.0
    -- Creado 2024-12-01
	-- Actualizado 2025-07-09
	-- Autor: Custom Systems Solutions LLC
	-- -------------------------------------------------------
	set @notificacion = coalesce(NULLIF(_notificacion, 0), 0) ;
	if (Trim(_codigo) = '') then
		call sp_tdocumento_u('tb_musuario_grupo', 5, 1, @_codigo);
		set _codigo = @_codigo;
        insert into tb_musuario_grupo (u201, u202, u224, estado) 
				Values (_codigo, _nombre, @notificacion, 1);
	else
		update tb_musuario_grupo 
			set
				u202 = _nombre,
                u224 = @notificacion,
				estado = _estado
			where u201 = _codigo;
    end if;
	set _valor = _codigo;
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_form_cfg_musuario_req_cambio_c` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_form_cfg_musuario_req_cambio_c`(
	in _hash varchar(100)
)
begin
	-- -------------------------------------------
	-- actualiza los datos de usuarios, 
	-- V 1.0
	-- Creado 03/14/2025
	-- Actualizado 03/16/2025
	-- Autor: Custom Systems Solutions LLC
	-- -------------------------------------------
    set @variable = _hash collate utf8mb4_spanish_ci;
    -- collate utf8mb4_spanish_ci
    
	SELECT coalesce(TIMESTAMPDIFF(MINUTE, u222, NOW()), 31)  into @date_time_actual_reg
		FROM tb_musuario
		WHERE u221 = @variable ;
	
	if @date_time_actual_reg > 30  then
		update tb_musuario
			set
				u221 = null
			where u221 = @variable ;
	end if ;	

	select case when @date_time_actual_reg between 0 and 30 then 1 else 0 end ;
    
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_form_cfg_musuario_req_cambio_u` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_form_cfg_musuario_req_cambio_u`(
	in _usuario varchar(10),
	out _valor varchar(100)
)
begin
	-- -------------------------------------------
	-- actualiza los datos de usuarios, 
	-- V 1.0
	-- Creado 03/14/2025
	-- Actualizado 
	-- Autor: Custom Systems Solutions LLC
	-- -------------------------------------------
	set @KeyU221 = sha(substring(rand(), 3, 5));
	set @date_time = CURRENT_TIMESTAMP();
    
    -- select TIMESTAMPDIFF(MINUTE, @time, NOW()) as now;
    
	update tb_musuario 
		set
			u221 = @KeyU221,
			u222 = @date_time
		where u203 = _usuario;

	set _valor = @KeyU221;
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_form_cfg_musuario_u` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_form_cfg_musuario_u`(
	in _codemp varchar(2), 
	in _sucursal varchar(3), 
	in _usuario varchar(10),
	in _formulario varchar(10),
	in _codigo varchar(5),
	in _nombre varchar(120), 
	in _login varchar(50),
	in _cambio_pass char(1), 
	in _grupo varchar(10),
	in _personal_s varchar(10),
    in _plantilla varchar(15),
    in _estado varchar(1),
    in _timezone varchar(10),    
	in _lenguaje varchar(5),
	in _formato_fecha_hora varchar(1),
	in _signo_decimal varchar(1),
	in _signo_miles varchar(1), 
	in _pin varchar(5),
	in _email varchar(50), 
    in _notificacion char(1), 
    in _externo char(1), 
    in _requiere_localizacion char(1), 
	out _valor varchar(11)
)
begin
	-- -------------------------------------------
	-- actualiza los datos de usuarios, 
	-- V 1.0
	-- Creado 2024-12-01
	-- Actualizado 2025-07-10
	-- Autor: Custom Systems Solutions LLC
	-- -------------------------------------------
    
    select case when coalesce(_timezone, '') = '' then '108' else coalesce(_timezone, '') end into @timezone ;
    select case when coalesce(_formato_fecha_hora, '') = ''  then '2' else coalesce(_formato_fecha_hora, '2') end into @formato_fecha_hora ;
	select case when coalesce(_signo_decimal, '') = '' then '.' else coalesce(_signo_decimal, '.') end into @signo_decimal;
    select case when coalesce( _signo_miles, '') = '' then ',' else coalesce( _signo_miles, ',') end into @signo_miles;
    select case when coalesce( _lenguaje, '') = '' then 'en_us' else coalesce( _lenguaje, 'en_us') end into @lenguaje;
    select case when coalesce( _pin, '') = '' then substring(rand(), 3, 5) else coalesce( _pin, substring(rand(), 3, 5)) end into _pin;
    select case when coalesce( _estado, '') = '' then '1' else coalesce( _estado, '1') end into @estado;
    select case when coalesce( _externo, '') = '' then '0' else coalesce( _externo, '1') end into @externo;
    select case when coalesce( _requiere_localizacion, '') = '' then '0' else coalesce( _requiere_localizacion, '1') end into @localizacion;
    
	set @cambio_pass = coalesce(NULLIF(_cambio_pass, 0), 0) ;
    set @notificacion = coalesce(NULLIF(_notificacion, 0), 0) ;
    -- set @externo = coalesce(NULLIF(_externo, 0), 0) ;
    set @login = '' collate utf8mb4_spanish_ci ;
    
    -- set @KeyU205 = '' ;
    set @KeyU220 = '' ;  
    
	if (trim(_codigo) = '') then
		call sp_tdocumento_u('tb_musuario', 5, 1, @_codigo);
		set _codigo = @_codigo;
		-- call sp_cfg_formulario_aesed_c(5, @_codigo, 'u205', @KeyU205) ;
		call sp_cfg_formulario_aesed_c(5, @_codigo, 'u220', @KeyU220) ;
        set @pin = aes_encrypt(coalesce(_pin, ''), @KeyU220);
        
        select coalesce(u203) into @login
			from tb_musuario
            where u203 = _login ;

		select case when trim(_login) = trim(@login) then concat(trim(_login), substring(rand(), 3, 5)) else _login end into @login ;
        
        insert into tb_musuario(u201, u202, u203, u204, u205, u205_s, u206, u207, estado, u209, u210, u211, u212, u213, u214, u215, u216, u217, u218, u219, u220, u224, u225, u226) 
			Values (_codigo, _nombre, @login, sha1(md5('Temporal1$')), '', _personal_s, _grupo, @cambio_pass, 1, '', '', '', @lenguaje, @formato_fecha_hora, @signo_decimal, @signo_miles, '01', @timezone, _plantilla, _email, @pin, @notificacion, @externo, @localizacion);
        
        -- Asigna sucursal 00001 al usuario nuevo            
		insert into tb_musuariod (u201, empresa, sucursal) Values (_codigo, '01', '');
        
	else
		call sp_cfg_formulario_aesed_c(5, _codigo, 'u220', @KeyU220) ;
        set @pin = aes_encrypt(coalesce(_pin, ''), @KeyU220);

        select coalesce(u203) into @login 
			from tb_musuario
            where u203 = _login
				and u201 <> _codigo ;

		select case when trim(_login) = trim(@login) then concat(trim(_login), substring(rand(), 3, 5)) else _login end into @login ;
        
	   	update tb_musuario 
			set
				u202 = _nombre,
				u203 = @login COLLATE utf8mb4_spanish_ci,
				u205 = '',
                u205_s = _personal_s,
				u206 = _grupo,
				u207 = @cambio_pass,
				u209 = '',
				u210 = '',
				u211 = '',
				u212 = @lenguaje,
				u213 = @formato_fecha_hora,
				u214 = @signo_decimal,
				u215 = @signo_miles,
				u217 = @timezone,
                u218 = _plantilla,
				u219 = _email,
                u220 = @pin,
                u224 = @notificacion,
                u225 = @externo,
                u226 = @localizacion,
                estado = @estado
			where u201 = _codigo;
	end if;
	set _valor = _codigo;
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_form_elimina_codigo` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_form_elimina_codigo`(
	in _codemp varchar(2), 
	in _sucursal varchar(3), 
	in _parametro varchar(255), 
	in _tabla varchar(255)
)
begin
	-- --------------------------------------------------
	-- procedimiento genérico que elimina registros
	-- Versión 1.0
	-- Creado: 21/07/2014
	-- Actualizado: 2024.04.13, 27/10/2014
	-- Autor: 
	-- --------------------------------------------------
   if (_codemp is null) OR (_sucursal is null) or (_tabla is null) or (_parametro is null) then
        signal sqlstate '45000'
            set message_text = 'Parámetros incompletos. Todos los campos deben estar especificados.';
    end if ;
	set @sql_where = concat('delete from ', trim(_tabla),' where codemp = ', _codemp) ;
    set @sql_where = if(trim(coalesce(_sucursal, '')) <> '', concat(@sql_where, ' and sucursal = ', _sucursal), @sql_where) ;
    set @sql_where = concat(@sql_where, ' and codigo = ', _parametro, ' and estado = 1 ');
	
    begin
		declare exit handler for sqlexception
        begin
            -- Manejo de errores de consulta
            rollback;
            select 'Error al ejecutar la consulta: ' || SQLERRM;
        end;
        
		prepare sql_tabla from @sql_where;
		execute sql_tabla ;
		deallocate prepare sql_tabla ;
	end ;
    set @sql_where = null ;
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_form_elimina_musuario_grupo` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_form_elimina_musuario_grupo`(
	in _codemp varchar(2), 
    in _sucursal varchar(3), 
    in _parametro varchar(255), 
    in _tabla varchar(255)
)
begin
	-- ---------------------------------------------------
	-- procedimiento genérico que elimina registros
	-- Versión 1.0
	-- Actualizado: 2024.04.13, 21/07/2014
	-- Autor: 
	-- ---------------------------------------------------
   if (_codemp is null) OR (_sucursal is null) or (_tabla is null) or (_parametro is null) then
        signal sqlstate '45000'
            set message_text = 'Parámetros incompletos. Todos los campos deben estar especificados.';
    end if ;
	set @sql_where = concat('delete from ', trim(_tabla),' where u201 = ', _parametro, ' and estado = 1 ');
    begin
		declare exit handler for sqlexception
        begin
            -- Manejo de errores de consulta
            rollback;
            select 'Error al ejecutar la consulta: ' || SQLERRM;
        end;
        
		prepare sql_tabla from @sql_where;
		execute sql_tabla ;
		deallocate prepare sql_tabla ;
	end ;
    set @sql_where = null ;
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_form_elimina_numero` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_form_elimina_numero`(
	in _codemp varchar(2), 
    in _sucursal varchar(3), 
    in _parametro varchar(255), 
    in _tabla varchar(255)
)
begin
	-- ---------------------------------------------------
	-- procedimiento genérico que elimina registros
	-- Versión 1.0
	-- Creado: 21/07/2014
	-- Actualizado: 2024.04.13, 27/10/2014
	-- Autor: 
	-- ---------------------------------------------------
   if (_codemp is null) OR (_sucursal is null) or (_tabla is null) or (_parametro is null) then
        signal sqlstate '45000'
            set message_text = 'Parámetros incompletos. Todos los campos deben estar especificados.';
    end if ;
	set @sql_where = concat('delete from ', trim(_tabla),' where codemp = ', _codemp) ;
    set @sql_where = if(trim(coalesce(_sucursal, '')) <> '', concact(@sql_where, ' and sucursal = ', _sucursal), @sql_where);
    set @sql_where = concat(@sql_where, ' and numero = ', _parametro, ' and estado = 1 ');

    begin
		declare exit handler for sqlexception
        begin
            -- Manejo de errores de consulta
            rollback;
            select 'Error al ejecutar la consulta: ' || SQLERRM;
        end;
        
		prepare sql_tabla from @sql_where;
		execute sql_tabla ;
		deallocate prepare sql_tabla ;
	end ;
    set @sql_where = null ;
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_form_estado_l` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_form_estado_l`(
	in _tipo varchar(3), 
    in _codigo int(3)
)
begin
	-- ------------------------------------------
	-- consulta del maestro de estados, 
	-- de acuerdo al tipo, para crear la lista
	-- desplegable.
	-- V 1.0
	-- Actualizado 06/05/2014
	-- Autor: 
	-- -------------------------------------------
	
	drop temporary table if exists a0 ;
	create temporary table a0
		select codigo, nombre
			from cfg_mestado
			where tipo = _tipo
				and codigo = _codigo 
				and _codigo > 0
		union
		select codigo, nombre
			from cfg_mestado
			where tipo = _tipo
				and codigo <> _codigo 
				and _codigo = 0 ;

	select *
		from a0
		order by codigo ;
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_form_f_mcliente_c` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_form_f_mcliente_c`(
	in _codemp varchar(2), 
	in _sucursal varchar(3), 
	in _codigo varchar(10)
)
begin	
	/* ----------------------------------------------------------------------------------------------------
		Busqueda y paginador generico de formularios listas
		Versión 1.0
		Creado: 2024-12-01
		Actualizado: 2025-01-24
		Autor: Custom Systems Solutions LLC
	---------------------------------------------------------------------------------------------------- */
    
	set @tipo_estado = 'MAE' ;
	drop temporary table if exists sentencia ;
    create temporary table sentencia
		select 	tb_f_mcliente.*
			from tb_f_mcliente
			where codemp = _codemp
				and sucursal = _sucursal
				and codigo = _codigo ;
	
    -- ----------------------------------------------------------------------------------------------------
	select 	sentencia.*, 
			coalesce(tb_f_mgrupo.nombre, '') as ngrupo,
            coalesce(tb_g_mpais.nombre, '') as npais,
            concat(trim(coalesce(tb_g_mestado_ciudad.nombre, '')), ' [', sentencia.pais, ']') as ndestado,
				coalesce(cfg_mestado.nombre, '') as nestado,
				coalesce(cfg_mestado.clase_css, '') as nestado_clase_css,
				coalesce(cfg_mestado.img_icon, '') as nestado_img_icon
		from sentencia
			left join tb_f_mgrupo
				on sentencia.codemp = tb_f_mgrupo.codemp
					and sentencia.sucursal = tb_f_mgrupo.sucursal
                    and sentencia.grupo = tb_f_mgrupo.codigo
			left join tb_g_mpais
				on sentencia.pais = tb_g_mpais.codigo
            left join tb_g_mestado_ciudad
				on sentencia.pais = tb_g_mestado_ciudad.pais
                    and sentencia.estado_ciudad = tb_g_mestado_ciudad.codigo
			left join cfg_mestado 
				on sentencia.estado = cfg_mestado.codigo 
					and cfg_mestado.tipo = trim(@tipo_estado)  ;
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_form_f_mcliente_u` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_form_f_mcliente_u`(
	in _codemp varchar(2), 
	in _sucursal varchar(3),
	in _usuario varchar(10),
	in _formulario int,
	in _codigo varchar(10),
    in _nombre varchar(120),
    in _grupo varchar(10),
    in _referencia varchar(20),
    in _contacto varchar(70),
    in _web varchar(50), 
    in _email varchar(50), 
    in _telefono varchar(30), 
    in _estado_ciudad varchar(5), 
    in _ciudad varchar(10), 
    in _zcode varchar(10), 
    in _direccion varchar(500),
    in _nota varchar(500),
    in _estado varchar(3),
    in _horas_diarias decimal(6,2),
    in _horas_semanal decimal(6,2), 
    in _adjust_fd decimal(6,2), 
	out _valor varchar(15)
)
begin
	/* ----------------------------------------------------------------------------------------------------
		Actualiza los datos del maestro de cliente
		Versión 1.0
		Creado: 2024-12-01
		Actualizado: 2024-12-21, 2025-01-11, 2025-01-24, 2025-02-06, 2025-02-08, 2025-02-26, 2025-06-12
		Autor: Custom Systems Solutions LLC
	---------------------------------------------------------------------------------------------------- */
    set @tipo = 1 ;
    set @horas_d = case coalesce(_horas_diarias, '') when '' then '0' else _horas_diarias end;
    set @horas_s = case coalesce(_horas_semanal, '') when '' then '0' else _horas_semanal end;
    set @adjust_fd = coalesce(_adjust_fd, 0);
    set @ciudad = coalesce(_ciudad, '');
    select coalesce(pais, ''), coalesce(estado_ciudad, '') into @pais, @estado_ciudad
		from tb_g_mciudad
        where codigo = @ciudad ;
	
	if trim(_codigo)='' then
        call sp_tdocumento_u(concat(_codemp, _sucursal, mod(year(curdate()), 100), 'tb_f_mcliente'), 3, 1, @codigo);
		set _codigo = concat(_codemp, _sucursal, mod(year(curdate()), 100), @codigo);
		insert into tb_f_mcliente (codemp, sucursal, codigo, nombre, grupo, referencia, contacto, pais, estado_ciudad, ciudad, zcode, web, email, telefono, direccion, nota, horas_diarias, horas_semanal, adjust_fd, fecha_r, fecha_u, usuario, estado)
			values (_codemp, _sucursal, _codigo, _nombre, _grupo, _referencia, _contacto, coalesce(@pais, ''), coalesce(@estado_ciudad, ''), @ciudad, _zcode, _web, _email, _telefono, _direccion, _nota, @horas_d, @horas_s, @adjust_fd, curdate(), curdate(), _usuario, 1 );
	else
		set @tipo = 2 ;
		update tb_f_mcliente 
			set
				nombre = _nombre,
                grupo = _grupo,
                referencia = _referencia,
                contacto = _contacto,
                pais = coalesce(@pais, ''),
				estado_ciudad = coalesce(@estado_ciudad, ''),
				ciudad = @ciudad, 
				zcode = _zcode, 
                web = _web,
				email = _email, 
                telefono = _telefono,
                direccion = _direccion,
                nota = _nota,
                horas_diarias = @horas_d, 
                horas_semanal = @horas_s, 
                adjust_fd = @adjust_fd,
                fecha_u = curdate(),
                usuario = case when coalesce(usuario, '') = '' then _usuario else usuario end,
                estado = _estado
			where codemp = _codemp 
				and sucursal = _sucursal
				and codigo = _codigo;
	end if;
    call sp_s_log_u(_codemp, _sucursal, _formulario, _usuario, _codigo, @tipo, '','','','','','','','','','','') ;
    
	set _valor = _codigo;
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_form_f_mincidencia_nivel_u` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_form_f_mincidencia_nivel_u`(
	in _codemp varchar(2), 
	in _sucursal varchar(3),
	in _usuario varchar(10),
	in _formulario int,
	in _codigo varchar(10),
    in _nombre varchar(120),
    in _referencia varchar(20),
    in _estado varchar(1),
	out _valor varchar(10)
)
begin
	/* ----------------------------------------------------------------------------------------------------
		Actualiza los datos del maestro de cliente
		Versión 1.0
		Creado: 2025.01.22
		Actualizado: 2025.01.22, 2025.01.25
		Autor: 
	---------------------------------------------------------------------------------------------------- */
    
    set @tipo = 1 ;
	if trim(_codigo) = '' then
		call sp_tdocumento_u(concat(_codemp, _sucursal, 'tb_f_mindicencia_nivel'), 3, 1, @codigo);
		set _codigo = concat(_codemp, _sucursal, @codigo);
		insert into tb_f_mindicencia_nivel (codemp, sucursal, codigo, nombre, referencia, fecha_r, usuario, estado)
			values (_codemp, _sucursal, _codigo, _nombre, _referencia, curdate(), _usuario, 1 );
	else
		set @tipo = 2 ;
		update tb_f_mindicencia_nivel 
			set
				nombre = _nombre,
                referencia = _referencia,
                usuario = case when coalesce(usuario, '') = '' then _usuario else usuario end,
                estado = _estado
			where codemp = _codemp 
				and sucursal = _sucursal
				and codigo = _codigo;
	end if;
    call sp_s_log_u(_codemp, _sucursal, _formulario, _usuario, _codigo, @tipo, '','','','','','','','','','','') ;
	set _valor = _codigo;
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_form_f_mincidencia_u` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_form_f_mincidencia_u`(
	in _codemp varchar(2), 
	in _sucursal varchar(3),
	in _usuario varchar(10),
	in _formulario int,
	in _codigo varchar(10),
    in _nombre varchar(120),
    in _referencia varchar(20),
    in _estado varchar(1),
	out _valor varchar(10)
)
begin
	/* ----------------------------------------------------------------------------------------------------
		Actualiza los datos del maestro de cliente
		Versión 1.0
		Creado: 2025.01.22
		Actualizado: 2025.01.22
		Autor: 
	---------------------------------------------------------------------------------------------------- */
    
    set @tipo = 1 ;
	if trim(_codigo) = '' then
		call sp_tdocumento_u(concat(_codemp, _sucursal, 'tb_f_mincidencia'), 3, 1, @codigo);
		set _codigo = concat(_codemp, _sucursal, @codigo);
		insert into tb_f_mincidencia (codemp, sucursal, codigo, nombre, referencia, fecha_r, fecha_u, usuario, estado)
			values (_codemp, _sucursal, _codigo, _nombre, _referencia, curdate(), curdate(), _usuario, 1 );
	else
		set @tipo = 2 ;
		update tb_f_mincidencia 
			set
				nombre = _nombre,
                referencia = _referencia,
                fecha_u = curdate(),
                usuario = case when coalesce(usuario, '') = '' then _usuario else usuario end,
                estado = _estado
			where codemp = _codemp 
				and sucursal = _sucursal
				and codigo = _codigo;
	end if;
    call sp_s_log_u(_codemp, _sucursal, _formulario, _usuario, _codigo, @tipo, '','','','','','','','','','','') ;
	set _valor = _codigo;
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_form_f_oincidencia_dpersonal_c` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_form_f_oincidencia_dpersonal_c`(
	in _codemp varchar(2), 
	in _sucursal varchar(3), 
    in _modo smallint(1),
	in _numero varchar(15)
)
begin
	/* ----------------------------------------------------------------------------------------------------
		Consulta las personas y los tipo de rol o tareas que realiza
		Versión 1.0
		Creado: 2025.01.22
		Actualizado: 2025.01.22
		Autor: 
	---------------------------------------------------------------------------------------------------- */
	
   	drop temporary table if exists c_dpersonal ;
	create temporary table c_dpersonal
		select 	*, 
				concat(personal) as codigo,
                1 as marca
			from tb_f_oincidencia_dpersonal
			where codemp = _codemp
				and sucursal = _sucursal
				and numero = _numero ;
	
    -- ----------------------------------------------------------------------------------------------------
	select	c_dpersonal.*,
			coalesce(tb_f_mpersonal.foto, '') as foto,
            coalesce(tb_f_mpersonal.apellido, '') as apellido,
            coalesce(tb_f_mpersonal.nombre, '') as nombre,
			coalesce(tb_f_mpersonal.telefono, '') as telefono			
		from c_dpersonal
			left join tb_f_mpersonal
				on c_dpersonal.codemp = tb_f_mpersonal.codemp
					and c_dpersonal.sucursal = tb_f_mpersonal.sucursal
                    and c_dpersonal.personal = tb_f_mpersonal.codigo
		order by concat(coalesce(tb_f_mpersonal.apellido, ''), ' ', coalesce(tb_f_mpersonal.nombre, '')) ;
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_form_f_oincidencia_dpersonal_u` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_form_f_oincidencia_dpersonal_u`(
	in _codemp varchar(2),
    in _sucursal varchar(3),
    in _numero varchar(15),
    in _personal varchar(15), 
    in _marca smallint,
    in _item int
)
begin
	/* ----------------------------------------------------------------------------------------------------
		Actualiza las roles y personal de la incidencia en el cliente
		Versión 1.0
		Creado: 2024.12.22
		Actualizado: 2025.01.22, 2025.01.24
		Autor: 
	---------------------------------------------------------------------------------------------------- */
	
    if coalesce(_item, 0) = 0 and _marca = 1 then
        insert into tb_f_oincidencia_dpersonal (codemp, sucursal, numero, personal)
			values (_codemp, _sucursal, _numero, _personal) ;
    elseif coalesce(_item) != 0 and _marca = 0 then
		delete
			from tb_f_oincidencia_dpersonal
            where codemp = _codemp
				and sucursal = _sucursal
                and item = coalesce(_item, 0);
    end if ;
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_form_f_oincidencia_numero_c` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_form_f_oincidencia_numero_c`(
	in _codemp varchar(2),
    in _sucursal varchar(3),
    in _numero varchar(15),
    in _tipo_estado varchar(3)
)
begin
	/* ----------------------------------------------------------------------------------------------------
		Consulta el registro seleccionado en formularios listas
		Versión 1.0
		Creado: 2025.01.22
		Actualizado: 2025.01.22
		Autor: 
	---------------------------------------------------------------------------------------------------- */
    
	drop temporary table if exists f_oincidencia ;
    create temporary table f_oincidencia
		select	codemp, sucursal, numero, 
                cliente, supervisor, 
                incidencia, incidencia_nivel, 
                fecha, fecha_u, 
                nota, usuario, estado
			from tb_f_oincidencia
            where codemp = _codemp
				and sucursal = _sucursal
                and numero = _numero ;
	
    -- ----------------------------------------------------------------------------------------------------
    select 	f_oincidencia.*, 
			case when f_oincidencia.plantilla != '' 
					then concat(coalesce(tb_f_mplantilla.nombre, ''), ' ', coalesce(tb_f_mplantilla.referencia, '')) 
                    else '' 
				end as nplantilla,
			coalesce(tb_f_mcliente.nombre, '') as ncliente,
			coalesce(tb_f_msupervisor.nombre, '') as nsupervisor,
			coalesce(tb_f_mincidencia.nombre, '') as nincidencia,
			coalesce(tb_f_mindicencia_nivel.nombre, '') as nincidencia_nivel,
			coalesce(cfg_mestado.nombre, '') as nestado 
		from f_oincidencia
			left join tb_f_mplantilla
				on f_oincidencia.codemp = tb_f_mplantilla.codemp
					and f_oincidencia.sucursal = tb_f_mplantilla.sucursal
					and f_oincidencia.plantilla = tb_f_mplantilla.codigo
			left join tb_f_mcliente
				on f_oincidencia.codemp = tb_f_mcliente.codemp
					and f_oincidencia.sucursal = tb_f_mcliente.sucursal
					and f_oincidencia.cliente = tb_f_mcliente.codigo
			left join tb_f_msupervisor
				on f_oincidencia.codemp = tb_f_msupervisor.codemp
					and f_oincidencia.sucursal = tb_f_msupervisor.sucursal
					and f_oincidencia.supervisor = tb_f_msupervisor.codigo
			left join tb_f_mincidencia
					on f_oincidencia.codemp = tb_f_mincidencia.codemp
						and f_oincidencia.sucursal = tb_f_mincidencia.sucursal
						and f_oincidencia.incidencia = tb_f_mincidencia.codigo
			left join tb_f_mindicencia_nivel
				on f_oincidencia.codemp = tb_f_mindicencia_nivel.codemp
					and f_oincidencia.sucursal = tb_f_mindicencia_nivel.sucursal
					and f_oincidencia.incidencia_nivel = tb_f_mindicencia_nivel.codigo
			left join tb_musuario 
				on tb_musuario.u201 = coalesce(f_oincidencia.usuario,'')
			left join cfg_mestado 
				on f_oincidencia.estado = cfg_mestado.codigo 
					and cfg_mestado.tipo = rtrim(_tipo_estado) ;
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_form_f_oincidencia_u` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_form_f_oincidencia_u`(
	in _codemp varchar(2), 
	in _sucursal varchar(3),
	in _usuario varchar(10),
	in _formulario int,
	in _numero varchar(15),
    in _plantilla varchar(15),
    in _cliente varchar(15),
    in _supervisor varchar(10),
    in _incidencia varchar(10),
    in _incidencia_nivel varchar(10),
    in _nota varchar(500),
	in _estado varchar(3),
	out _valor varchar(15)
)
begin
	/* ----------------------------------------------------------------------------------------------------
		Actualiza (I/U/D) los datos de de la plantilla
		Versión 1.0
		Creado: 2025.01.23
		Actualizado: 2025.01.23
		Autor: 
	---------------------------------------------------------------------------------------------------- */
    
	set @tipo = 1 ;
    set @estado = case when coalesce(_estado, '') = '' then 1 else _estado end ;
	if trim(_numero)='' then
		call sp_tdocumento_u(concat(_codemp, _sucursal, mod(year(curdate()), 100), 'tb_f_oincidencia'), 5, 1, @codigo);
		set _numero = concat(_codemp, _sucursal, mod(year(curdate()), 100), @codigo);
		insert into tb_f_oincidencia (codemp, sucursal, numero, plantilla, cliente, supervisor, incidencia, incidencia_nivel, nota, fecha, fecha_u, usuario, estado)
			values (_codemp, _sucursal, _numero, _plantilla, _cliente, _supervisor, _incidencia, _incidencia_nivel, _nota, curdate(), curdate(), _usuario, @estado );
    else
		set @tipo = 2 ;
		update tb_f_oincidencia
			set
				supervisor = _supervisor, 
				incidencia = _incidencia, 
                incidencia_nivel = _incidencia_nivel,
                nota = _nota,
                estado = @estado
			where codemp = _codemp
				and sucursal = _sucursal
                and numero = _numero ;
	end if ;
    call sp_s_log_u(_codemp, _sucursal, _formulario, _usuario, _numero, @tipo, '','','','','','','','','','','');
    set _valor = _numero;
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_form_general_codigo_c` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_form_general_codigo_c`(
	in _codemp varchar(2), 
	in _sucursal varchar(3), 
	in _status varchar(1), 
    in _parametro varchar(255), 
    in _tabla varchar(255), 
    in _tipo varchar(3)
)
begin
	/* ----------------------------------------------------------------------------------------------------
		Consulta generica de los datos para los formularios
		Versión 1.0
		Creado: 2024.12.01
		Actualizado: 2024.12.29
		Autor: 
	---------------------------------------------------------------------------------------------------- */
	if (_codemp is not null) OR (_sucursal is not null) or (_tabla is not null) or (_parametro is not null) then
		set @sql_where = concat(' where codemp = ', _codemp, ' and estado <> 0');
		if trim(_sucursal) <> '' then
			set @sql_where = concat(@sql_where, ' and sucursal = ', _sucursal);
		end if;
		if trim(coalesce(_parametro, '')) <> '' then
			set @sql_where = concat(@sql_where, ' and codigo = "', trim(_parametro), '"');
		end if;
		
		-- ----------------------------------------------------
		call sql_prepare(trim(_tabla), @sql_where) ;
		set @sql_where = null ;
		
		-- ----------------------------------------------------
		select	sql_tabla.*,
				coalesce(cfg_mestado.nombre, '') as nestado,
				coalesce(cfg_mestado.clase_css, '') as nestado_clase_css,
				coalesce(cfg_mestado.img_icon, '') as nestado_img_icon
			from sql_tabla
				inner join cfg_mestado 
					on sql_tabla.codemp = cfg_mestado.codemp
						and sql_tabla.estado = cfg_mestado.codigo 
						and cfg_mestado.tipo = trim(_tipo) ;
	else
		select -1 ;
	end if ;
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_form_general_mdetalle_c` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_form_general_mdetalle_c`(
	in _codemp varchar(2), 
	in _sucursal varchar(3), 
	in _status varchar(1), 
	in _parametro varchar(255), 
	in _tabla varchar(255), 
	in _tipo varchar(3)
)
begin
	/* ----------------------------------------------------------------------------------------------------
		Consulta generica de los datos para los formularios
		Creado: 2024.05.10
		Actualizado: 2024.05.10
		Autor: 
	---------------------------------------------------------------------------------------------------- */
   if (_codemp is null) OR (_sucursal is null) or (_tabla is null) or (_parametro is null) then
        signal sqlstate '45000'
            set message_text = 'Parámetros incompletos. Todos los campos deben estar especificados.';
    end if ;
	
	set @cadena = concat(' where estado <> 0');
	if trim(coalesce(_parametro, '')) <> '' then
		set @cadena = concat(@cadena, ' and u201 = ', trim(_parametro));
	end if ;
	
	drop temporary table if exists a1 ;
	set @cSentencia = concat('create temporary table a1 select * from ', trim(_tabla), @cadena);
	prepare sentencia from @cSentencia ;
	execute sentencia ;
	deallocate prepare sentencia ;
	
	select	a1.*
		from a1
        order by nombre ;
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_form_general_numero_c` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_form_general_numero_c`(
	in _codemp varchar(2), 
	in _sucursal varchar(3), 
	in _status varchar(1), 
	in _parametro varchar(255), 
	in _tabla varchar(255), 
	in _tipo varchar(3)
)
begin
	/* ----------------------------------------------------------------------------------------------------
		Consulta generica de los datos para los formularios
		Versión 1.0
		Creado: 2024.12.01
		Actualizado: 2025.01.24
		Autor: 
	---------------------------------------------------------------------------------------------------- */
    
   if (_codemp is null) OR (_sucursal is null) or (_tabla is null) or (_parametro is null) then
        signal sqlstate '45000'
            set message_text = 'Parámetros incompletos. Todos los campos deben estar especificados.';
    end if ;
	set @sql_where = concat(' where codemp = ', _codemp, ' and estado <> 0');
	if trim(_sucursal) <> '' then
		set @sql_where = concat(@sql_where, ' and sucursal = ', _sucursal);
	end if;
	if trim(coalesce(_parametro, '')) <> '' then
		set @sql_where = concat(@sql_where, ' and numero = "', trim(_parametro), '"');
	end if;

	set @sql_where = concat('create temporary table sql_tabla select * from ', trim(_tabla), @sql_where);
    begin
		declare exit handler for sqlexception
        begin
            -- Manejo de errores de consulta
            rollback;
            select 'Error al ejecutar la consulta: ' || SQLERRM;
        end;
        
		prepare sql_tabla from @sql_where;
		execute sql_tabla ;
		deallocate prepare sql_tabla ;
	end ;
    set @sql_where = null ;
    
    -- ----------------------------------------------------------------------------------------------------
	select	sql_tabla.*,
			coalesce(tb_musuario.u202, '') as nusuario,
			coalesce(cfg_mestado.nombre, '') as nestado,
			coalesce(cfg_mestado.clase_css, '') as nestado_clase_css,
			coalesce(cfg_mestado.img_icon, '') as nestado_img_icon
		from sql_tabla
			left join tb_musuario 
					on tb_musuario.u201 = coalesce(sql_tabla.usuario,'')
            left join cfg_mestado 
				on sql_tabla.codemp = cfg_mestado.codemp
					and sql_tabla.estado = cfg_mestado.codigo 
					and cfg_mestado.tipo = trim(_tipo) ;
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_form_gen_eliminar_codigo` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_form_gen_eliminar_codigo`(
	in _codemp varchar(2), 
	in _sucursal varchar(3), 
	in _parametro varchar(255),
	in _tabla varchar(100)
)
begin
	/* ----------------------------------------------------------------------------------------------------
		Procedimiento genérico que elimina o anula registros
		Versión 1.0
		Creado: 2024.12.01
		Actualizado: 2024.12.27, 2025.01.24
		Autor: 
	---------------------------------------------------------------------------------------------------- */
    
	if (_codemp is not null) and (_sucursal is not null) and (_tabla is not null) and (_parametro is not null) then
		set @sql_where = concat('delete from ', trim(_tabla), ' where codemp = ', _codemp);
        set @sucursal = case when coalesce(_sucursal, '') <> '' then concat(' and sucursal = ', _sucursal) else '' end ;
		set @sql_where = concat(@sql_where, @sucursal, ' and codigo = ', _parametro, ' ;');	
		
		prepare sql_tabla from @sql_where;
		execute sql_tabla ;
		deallocate prepare sql_tabla ;
        set @sql_where = null ;
    else
		select -1 ;
	end if ;
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_form_gen_eliminar_numero` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_form_gen_eliminar_numero`(
	in _codemp varchar(2), 
	in _sucursal varchar(3), 
	in _parametro varchar(255),
	in _tabla varchar(100))
begin
	/* ----------------------------------------------------------------------------------------------------
		Procedimiento genérico que elimina o anula registros
		Versión 1.0
		Creado: 2024.12.01
		Actualizado: 2024.12.27, 2025.01.24
		Autor: 
	---------------------------------------------------------------------------------------------------- */
	if (_codemp is not null) OR (_sucursal is not null) or (_tabla is not null) or (_parametro is not null) then
		set @sql_where = concat('delete from ', trim(_tabla), ' where codemp = ', _codemp);
		set @sql_where = if(trim(coalesce(_sucursal, '')) <> '', concat(@sql_where, ' and sucursal = ', _sucursal), @sql_where);
		set @sql_where = concat(@sql_where, ' and numero = ', _parametro, ' and estado = 1 ');	
		
		prepare sql_tabla from @sql_where;
		execute sql_tabla ;
		deallocate prepare sql_tabla ;
        set @sql_where = null ;
    else
		select -1 ;
	end if ;
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_form_g_mdivisa_u` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_form_g_mdivisa_u`(
	in _codemp varchar(2), 
	in _sucursal varchar(3),
	in _usuario varchar(10),
	in _formulario int,
	in _codigo varchar(5),
    in _nombre varchar(120),
    in _coletilla varchar(120),
	in _simbolo varchar(5), 
	out _valor varchar(15)
)
begin
	/* ----------------------------------------------------------------------------------------------------
		Actualiza los datos del maestro de monedas
		Versión 1.0
		Creado: 17/07/2018
		Actualizado: 2024.04.13, 26/08/2019, 2025.01.24
		Autor: 
	---------------------------------------------------------------------------------------------------- */
    
	if trim(_codigo)='' then
		call sp_tdocumento_u(concat(_codemp,_sucursal,'tb_g_mdivisa'), 3, 1, @_codigo);
		set _codigo = concat(_codemp, @_codigo);
		insert into tb_g_mdivisa (codemp, codigo, nombre, coletilla, simbolo, estado)
			values (_codemp, _codigo, _nombre, _coletilla, _simbolo, 1 );
	else
		update tb_g_mdivisa 
			set
				nombre = _nombre,
                coletilla = _coletilla,
				simbolo = _simbolo
			where codemp = _codemp 
				and codigo = _codigo;
	end if;
    call sp_s_log_u(_codemp, _sucursal, _formulario, _usuario, _codigo, @tipo, '','','','','','','','','','','') ;
	set _valor = _codigo;
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_form_g_mmoneda_u` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_form_g_mmoneda_u`(
	in _codemp varchar(2), 
	in _sucursal varchar(3),
	in _usuario varchar(10),
	in _caja varchar(10),
	in _codigo varchar(5),
	in _nombre varchar(120), 
	in _estado int(1), 
	in _simbolo varchar(4), 
	in _tasa decimal(10,2), 
	out _valor varchar(15)
)
begin
	/* ----------------------------------------------------------------------------------------------------
		Actualiza los datos del maestro de monedas
		Versión 1.0
		Creado: 2024.05.10
		Actualizado: 2024.05.10
		Autor: 
	---------------------------------------------------------------------------------------------------- */

	if Trim(_codigo) = '' then
		call sp_tdocumento_u(concat(_codemp,_sucursal,'tb_g_mmoneda'), 5, 1, @_codigo);
		set _codigo = Concat(_codemp, @_codigo);

		insert into tb_g_mmoneda (codemp, codigo, nombre, simbolo, tasa, estado)
			select _codemp, _codigo, _nombre, _simbolo, _tasa, 1 ;
	else
		update tb_g_mmoneda 
			set
				nombre = _nombre,
				simbolo = _simbolo,
				tasa = _tasa
			where codemp = _codemp 
				and codigo = _codigo;
	end if;
    call sp_s_log_u(_codemp, _sucursal, _formulario, _usuario, _codigo, @tipo, '','','','','','','','','','','') ;
	set _valor = _codigo;
End ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_form_g_mnotificacion_dformulario_c` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_form_g_mnotificacion_dformulario_c`(
	in _codemp varchar(2), 
	in _sucursal varchar(3),     
    in _modo smallint(1),
	in _codigo varchar(15)
)
begin
	/* ----------------------------------------------------------------------------------------------------
		Consulta los tipo de rol o tareas que realiza una persona
		Versión 1.0
		Creado: 2025-07-08
		Actualizado: 2025-07-08
		Autor: Custom Systems Solutions LLC
	---------------------------------------------------------------------------------------------------- */
	
   	drop temporary table if exists a1 ;
	create temporary table a1
		select 	codemp, sucursal, codigo, formulario, 1 as marca, item
			from tb_g_mnotificacion_dformulario 
			where codemp = _codemp
				and sucursal = _sucursal
				and codigo = _codigo ;
	
    drop temporary table if exists a2 ;
    create temporary table a2
		select	_codemp as codemp, 
				_sucursal as sucursal, 
                _codigo as codigo, 
                formulario, 
                0 as marca,
                0 as item
			from cfg_lista_formularios
            where coalesce(notificaciones, 0) = 1
                and _modo <> 0
				and formulario not in (select formulario from a1) ;
	
    drop temporary table if exists a3 ;
    create temporary table a3
		select codemp, sucursal, codigo, formulario, marca, item from a1 
			union select codemp, sucursal, codigo, formulario, marca, item from a2 ;
    
    -- ----------------------------------------------------------------------------------------------------
	select	a3.*,
			coalesce(cfg_lista_formularios.titulo, '') as nformulario,
            coalesce(cfg_lista_formularios.etiqueta, '') as etiqueta
		from a3
			left join cfg_lista_formularios
				on a3.formulario = cfg_lista_formularios.formulario
		order by a3.marca desc, cfg_lista_formularios.modulo, cfg_lista_formularios.menu, cfg_lista_formularios.grupo, cfg_lista_formularios.orden  ;
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_form_g_mnotificacion_dformulario_u` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_form_g_mnotificacion_dformulario_u`(
	in _codemp varchar(2),
    in _sucursal varchar(3),
    in _codigo varchar(15),
    in _formulario int,
    in _marca int(1), 
	in _item int(11)
)
begin
	/* ----------------------------------------------------------------------------------------------------
		Actualiza los formularios a los que se aplicará la notificación
		Versión 1.0
		Creado: 2025-07-09
		Actualizado: 2025-07-09
		Autor: Custom Systems Solutions LLC
	---------------------------------------------------------------------------------------------------- */
    
    if _item = 0 and _marca = 1 then
		insert into tb_g_mnotificacion_dformulario (codemp, sucursal, codigo, formulario)
			select _codemp, _sucursal, _codigo, _formulario ;
                
    elseif _item != 0 and _marca = 0 then
		delete 
			from tb_g_mnotificacion_dformulario
            where codemp = _codemp 
				and sucursal = _sucursal 
				and item = _item ;
    end if ;
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_form_g_mnotificacion_dusuario_c` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_form_g_mnotificacion_dusuario_c`(
	in _codemp varchar(2), 
	in _sucursal varchar(3),     
    in _modo smallint(1),
	in _codigo varchar(15)
)
begin
	/* ----------------------------------------------------------------------------------------------------
		Consulta los tipo de rol o tareas que realiza una persona
		Versión 1.0
		Creado: 2025-07-08
		Actualizado: 2025-07-08
		Autor: Custom Systems Solutions LLC
	---------------------------------------------------------------------------------------------------- */
	
   	drop temporary table if exists a1 ;
	create temporary table a1
		select 	codemp, sucursal, codigo, usuario, leida, 1 as marca, item
			from tb_g_mnotificacion_dusuario
			where codemp = _codemp
				and sucursal = _sucursal
				and codigo = _codigo ;
	
    drop temporary table if exists a2 ;
    create temporary table a2
		select	_codemp as codemp, 
				_sucursal as sucursal, 
                _codigo as codigo, 
                tb_musuario.u201 as usuario, 
                0 as leida, 
                0 as marca,
                0 as item
			from tb_musuario
				inner join tb_musuario_grupo
					on tb_musuario.u206 = tb_musuario_grupo.u201
						and tb_musuario_grupo.u224 = 1
            where coalesce(tb_musuario.u224, 0) = 0
                and _modo <> 0
				and tb_musuario.u201 not in (select usuario from a1) 
                and tb_musuario.estado = 1 ;
	
    drop temporary table if exists a3 ;
    create temporary table a3
		select codemp, sucursal, codigo, usuario, leida, marca, item from a1 
			union select codemp, sucursal, codigo, usuario, leida, marca, item from a2 ;
    
    -- ----------------------------------------------------------------------------------------------------
	select	a3.*,
			coalesce(tb_musuario.u202, '') as nusuario,
            coalesce(tb_f_mplantilla.nombre) as nplantilla
		from a3
			left join tb_musuario
				on a3.usuario = tb_musuario.u201
			left join tb_f_mplantilla
				on tb_f_mplantilla.codemp = _codemp
					and tb_f_mplantilla.sucursal = _sucursal
                    and tb_musuario.u218 = tb_f_mplantilla.codigo
		order by a3.marca desc, coalesce(tb_f_mplantilla.nombre), coalesce(tb_musuario.u202, '') ;
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_form_g_mnotificacion_dusuario_u` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_form_g_mnotificacion_dusuario_u`(
	in _codemp varchar(2),
    in _sucursal varchar(3),
    in _codigo varchar(15),
    in _usuario varchar(10),
    in _marca int(1), 
	in _item int(11)
)
begin
	/* ----------------------------------------------------------------------------------------------------
		Actualiza los usuario a los que se aplicará la notificación
		Versión 1.0
		Creado: 2025-07-09
		Actualizado: 2025-07-09
		Autor: Custom Systems Solutions LLC
	---------------------------------------------------------------------------------------------------- */
    
    if _item = 0 and _marca = 1 then
		insert into tb_g_mnotificacion_dusuario (codemp, sucursal, codigo, usuario, leida)
			value( _codemp, _sucursal, _codigo, _usuario, 0 );
                
    elseif _item != 0 and _marca = 0 then
		delete 
			from tb_g_mnotificacion_dusuario
            where codemp = _codemp 
				and sucursal = _sucursal 
				and item = _item ;
    end if ;
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_form_g_mnotificacion_u` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_form_g_mnotificacion_u`(
	in _codemp varchar(2), 
	in _sucursal varchar(3),
	in _usuario varchar(10),
	in _formulario int,
	in _codigo varchar(10),
    in _nombre varchar(100),
    in _plantilla varchar(15),
    in _cliente varchar(10),
    in _nota varchar(500),
    in _fecha varchar(10),
    in _fecha_u varchar(10),
    in _fecha_d varchar(10),
    in _fecha_h varchar(10),
    in _vence varchar(1),
    in _interno varchar(1),
	out _valor varchar(10)
)
begin
	/* ----------------------------------------------------------------------------------------------------
		Actualiza los datos del maestro de cliente
		Versión 1.0
		Creado: 2025-07-09
		Actualizado: 2025-07-09
		Autor: Custom Systems Solutions LLC
	---------------------------------------------------------------------------------------------------- */
	set @tipo = 1 ;
    set @fecha = coalesce(STR_TO_DATE(Trim(_fecha), '%m/%d/%Y'), curdate());
    set @fecha_u = coalesce(STR_TO_DATE(Trim(_fecha_u), '%m/%d/%Y'), curdate());
    set @fecha_d = coalesce(STR_TO_DATE(Trim(_fecha_d), '%m/%d/%Y'), curdate());
    set @fecha_h = coalesce(STR_TO_DATE(Trim(_fecha_h), '%m/%d/%Y'), curdate());
    set @vence = case when coalesce(_vence, '') = '' then 0 else _vence end ;
    set @interno = case when coalesce(_interno, '') = '' then 0 else _interno end ;
    set @estado = 1 ;
    
	if trim(_codigo) = '' then
		call sp_tdocumento_u(concat(_codemp, _sucursal, 'tb_g_mnotificacion'), 5, 1, @codigo);
		set _codigo = concat(_codemp, _sucursal, @codigo); 
		insert into tb_g_mnotificacion (codemp, sucursal, codigo, nombre, plantilla, cliente, nota, fecha, fecha_d, fecha_h, fecha_u, vence, interno, usuario, estado)
			select _codemp, _sucursal, _codigo, _nombre, _plantilla, _cliente, _nota, @fecha, @fecha_d, @fecha_h, @fecha_u, @vence, @interno, _usuario, @estado ;
	else
		set @tipo = 2 ;
		update tb_g_mnotificacion 
			set
				nombre = _nombre,
                plantilla = _plantilla, 
                cliente = _cliente, 
                nota = _nota, 
                fecha_d = @fecha_d, 
                fecha_h = @fecha_h, 
                fecha_u = @fecha_u, 
                vence = @vence, 
                interno = @interno, 
                usuario = case when coalesce(usuario, '') = '' then _usuario else usuario end
			where codemp = _codemp 
				and sucursal = _sucursal
				and codigo = _codigo;
	end if;
    call sp_s_log_u(_codemp, _sucursal, _formulario, _usuario, _codigo, @tipo, '','','','','','','','','','','') ;
	set _valor = _codigo; 
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_form_g_mtipo_documento_u` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_form_g_mtipo_documento_u`(
	in _codemp varchar(2), 
	in _sucursal varchar(3),
	in _usuario varchar(10),
	in _formulario varchar(10),
	in _codigo varchar(5), 
	in _nombre varchar(120), 
	in _estado varchar(1), 
	in _simbolo varchar(5),
	out _valor varchar(11)
)
begin
	/* ----------------------------------------------------------------------------------------------------
		Actualiza los datos del maestro de procedimientos
		Versión 1.0
        Creado: 2024.12.01
		Actualizado: 2025.01.24
		Autor: 
	---------------------------------------------------------------------------------------------------- */
	   
	 if Trim(_codigo) = '' then
			call sp_tdocumento_u(concat(_codemp, 'tb_g_mtipo_documento'), 3, 1, @_codigo);
			set _codigo = concat(_codemp, @_codigo);
			insert into tb_g_mtipo_documento (codemp, codigo, nombre, simbolo, estado) 
				select _codemp, _codigo, trim(_nombre), _simbolo, 1;
	else
		update tb_g_mtipo_documento 
			set 
				nombre = _nombre, 
				simbolo = _simbolo,
				estado = _estado 
			where codemp = _codemp
				and codigo = _codigo ;
		end if;
		set _valor = _codigo;
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_form_g_otasa_c` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_form_g_otasa_c`(
	in _codemp Varchar(2), 
	in _sucursal Varchar(3), 
	in _status Varchar(1), 
	in _parametro Varchar(255), 
	in _tabla Varchar(255), 
	in _tipo Varchar(3)
)
Begin
	/* ----------------------------------------------------------------------------------------------------
		Consulta el detalle de los recaudos para facturas
		Versión 1.0
		Creado: 2024.12.01
		Actualizado: 2025.01.24
		Autor: 
	---------------------------------------------------------------------------------------------------- */
    
	set @clave = rtrim(ltrim(coalesce(_parametro, ''))) ;
	drop temporary table if exists a1;
	create temporary table a1
		select 	*, 
				1 as marca
			from tb_g_otasa
			where codemp = coalesce(_codemp, '') 
				and numero = @clave ;
	
    -- ----------------------------------------------------------------------------------------------------
	 select a1.*, 
            coalesce(tb_g_mmoneda.nombre, '') as nmoneda, 
            coalesce(tb_g_mmoneda.simbolo, '') as simbolo,
			coalesce(tb_musuario.u202, '') as nusuario,
            coalesce(cfg_mestado.nombre, '') as nestado,
			coalesce(cfg_mestado.clase_css, '') as nestado_clase_css,
			coalesce(cfg_mestado.img_icon, '') as nestado_img_icon
		from a1
			left join tb_g_mmoneda
				on a1.codemp = tb_g_mmoneda.codemp
					and a1.moneda = tb_g_mmoneda.codigo 
			left join tb_musuario 
				on coalesce(a1.usuario,'') = tb_musuario.u201
			inner join cfg_mestado 
				on cfg_mestado.codemp = a1.codemp 
					and a1.estado = cfg_mestado.codigo 
					and cfg_mestado.tipo = trim(_tipo) 
		order by coalesce(tb_g_mmoneda.nombre,'') ;
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_form_g_otasa_dhistorial_c` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_form_g_otasa_dhistorial_c`(
	in _codemp varchar(2), 
	in _sucursal varchar(3), 
	in _clave varchar(15)
)
begin
	 /* ----------------------------------------------------------------------------------------------------
		Consulta los datos del historial de cambio de una moneda 
		Versión 1.0
		Creado: 2024.05.10
		Actualizado: 2024.05.10
		Autor: 
	---------------------------------------------------------------------------------------------------- */
	
    select coalesce(moneda, '') into @moneda
		from tb_g_otasa
		where codemp = _codemp
			and numero = trim(_clave) ;
    
	drop temporary table if exists a1;
	create temporary table a1
		select 	*, 
				1 as marca
		from tb_g_otasa_dhistorial
		where codemp = _codemp
			and moneda = @moneda ;
	
    -- ----------------------------------------------------------------------------------------------------
	select	a1.*,
			coalesce(tb_musuario.u202, '') as nusuario
		from a1
			left join tb_musuario 
				on coalesce(a1.usuario,'') = tb_musuario.u201 
		order by a1.item desc ;
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_form_g_otasa_hoy_c` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_form_g_otasa_hoy_c`(
	in _codemp varchar(2),
	in _sucursal varchar(3),
	in _moneda varchar(10)
)
begin
	/*	--------------------------------------------------------------------
		Consulta los datos de la moneda
		Versión 1.0
		Creado: 2024.05.10
		Actualizado: 2024.05.10
		Autor: 
	-------------------------------------------------------------------- */
    
	select	codemp, 
			sucursal, 
            numero, 
            fecha, 
            fecha_act, 
            moneda, 
            usuario, 
            round(coalesce(tasa, 0), 2) as tasa, 
            round(coalesce(tasacambio_fp, 0), 2) as tasacambio_fp, 
            round(coalesce(igtf_p, 0), 2) as igtf_p, 
            estado
		from tb_g_otasa
        where codemp = coalesce(_codemp, '00')
			and moneda = coalesce(_moneda, '')
            and coalesce(estado, 0) = 1 ;
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_form_g_otasa_u` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_form_g_otasa_u`(
	in _codemp varchar(2), 
	in _sucursal varchar(3),
	in _usuario Varchar(10),
	in _formulario int,
	in _numero varchar(15),
	in _moneda varchar(5),
	in _fecha date,
	in _fecha_act date,
	in _tasa decimal(15,2),
    out _valor varchar(15)
)
begin
	/* ----------------------------------------------------------------------------------------------------
		Actualiza los datos de las tasas de cambio 
		Versión 1.0
		Creado: 17/07/2018
		Actualizado: 15/10/2018
		Autor: Venesisco, c.a.
	---------------------------------------------------------------------------------------------------- */
	
    set @tasa = convert(trim(replace(_tasa,',','')), decimal(15,2));
    set @tasacambio_fp = 0 ;
    set @igtf_p = 0 ;
    
    if trim(_numero) = '' then
		call sp_tdocumento_u(concat(_codemp, 'tb_g_otasa'), 6, 2, @_numero);
		set _numero = concat(_codemp, @_numero);
		set @accion = 1 ;
        
        -- Agrega al historial el cambio de la tasa anterior y que usuario lo realizo
        insert into tb_g_otasa_dhistorial (codemp, sucursal, numero, fecha, fecha_act, moneda, usuario, tasa, tasacambio_fp, igtf_p, aplicar_dc, estado)
			select  codemp, sucursal, numero, fecha, fecha_act, moneda, usuario, tasa, 0, 0, 0, estado
				from tb_g_otasa 
                where codemp = _codemp
					and moneda = _moneda
					and estado = 1 ;
        
        update tb_g_otasa
			set 
				estado = 3
			where codemp = _codemp
				and moneda = _moneda
                and estado = 1 ;
        
        -- Inserta el nuevo registro de la tasa
		insert into tb_g_otasa (codemp, sucursal, numero, fecha, fecha_act, moneda, usuario, tasa, tasacambio_fp, igtf_p, aplicar_dc, estado) 
						select 	_codemp, '', _numero, curdate(), curdate(), _moneda, _usuario, @tasa, @tasacambio_fp, @igtf_p, 0, 1 ;
	else
		set @accion = 2 ;
		-- Agrega al historial el cambio de la tasa anterior y que usuario lo realizo
        insert into tb_g_otasa_dhistorial (codemp, sucursal, numero, fecha, fecha_act, moneda, usuario, tasa, tasacambio_fp, igtf_p, aplicar_dc, estado)
			select codemp, sucursal, numero, fecha, fecha_act, moneda, _usuario, tasa, tasacambio_fp, igtf_p, aplicar_dc, estado
				from tb_g_otasa
                where codemp = _codemp
					and numero = _numero ;
        -- Actualiza el nuevo valor de la tasa aplicar
		update tb_g_otasa 
			set  
				fecha_act = curdate(),
                tasa = @tasa,
                tasacambio_fp = 0,
                igtf_p = 0,
                aplicar_dc = 0
			where codemp = _codemp
				and numero = _numero ;
	end if ;
	call sp_s_log_u(_codemp, _sucursal, _formulario, _usuario, _numero, @accion, '','','','','');
	set _valor = _numero;
End ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_form_mempresa_c` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_form_mempresa_c`(
	in _codemp varchar(2), 
	in _sucursal varchar(3), 
	in _status varchar(1), 
	in _parametro varchar(1),
	in _tabla varchar(20),
	in _tipo varchar(3)
)
begin
	/* ----------------------------------------------------------------------------------------------------
		Consulta datos de la empresa
		Versión 1.0
		Creado: 14/05/2015
		Actualizado: 2024.04.13, 18/07/2018
		Autor: 
	---------------------------------------------------------------------------------------------------- */
	
	select	cfg_mempresa.codigo, 
			cfg_mempresa.nombre, 
            cfg_mempresa.nombre_comercial, 
            cfg_mempresa.siglas, 
            cfg_mempresa.pais, 
            cfg_mempresa.estado_provincia, 
            cfg_mempresa.ciudad, 
            cfg_mempresa.codigo_postal, 
            cfg_mempresa.web, 
            cfg_mempresa.email, 
            cfg_mempresa.telefonos, 
            cfg_mempresa.direccion, 
            cfg_mempresa.divisa, 
            coalesce(tb_g_mdivisa_b.nombre, '') as ndivisa,
            cfg_mempresa.moneda, 
            coalesce(tb_g_mdivisa_c.nombre, '') as nmoneda,
            cfg_mempresa.logo, 
            cfg_mempresa.id_fiscal, 
            cfg_mempresa.id_isae, 
            cfg_mempresa.fax, 
            cfg_mempresa.estado,
            coalesce(cfg_mestado.nombre, '') as nestado,
			coalesce(cfg_mestado.clase_css, '') as nestado_clase_css,
			coalesce(cfg_mestado.img_icon, '') as nestado_img_icon
		from cfg_mempresa
			left join tb_g_mdivisa as tb_g_mdivisa_b 
				on cfg_mempresa.codigo = tb_g_mdivisa_b.codemp
					and cfg_mempresa.divisa = tb_g_mdivisa_b.codigo
			left join tb_g_mdivisa as tb_g_mdivisa_c 
				on cfg_mempresa.codigo = tb_g_mdivisa_c.codemp
					and cfg_mempresa.moneda = tb_g_mdivisa_c.codigo
			left join cfg_mestado 
				on cfg_mempresa.estado = cfg_mestado.codigo 
					and cfg_mestado.tipo = trim(_tipo)
		where cfg_mempresa.codigo = _codemp;
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_form_mempresa_u` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_form_mempresa_u`(
	in _codemp varchar(2), 
	in _sucursal varchar(3),
	in _usuario varchar(10),
    in _formulario int,
	in _codigo varchar(2), 
    in _nombre_comercial varchar(100), 
    in _siglas varchar(45), 
    in _pais varchar(100), 
    in _estado_provincia varchar(100), 
    in _ciudad varchar(100), 
    in _codigo_postal varchar(10), 
    in _web varchar(100), 
    in _email varchar(100), 
    in _telefonos varchar(100), 
    in _fax varchar(50),
    in _direccion varchar(8000), 
    in _divisa varchar(5),
    in _moneda varchar(5), 
    in _id_fiscal varchar(45), 
    in _id_isae varchar(15), 
	out _valor varchar(15)
)
begin
	/* ----------------------------------------------------------------------------------------------------
		Actualiza los datos de la organización
		Versión 1.0
		Creado: 2024.12.01
		Actualizado: 2025.01.24
		Autor: 
	---------------------------------------------------------------------------------------------------- */
    
    if coalesce(_codigo, '') != '' then 
		update cfg_mempresa 
			set
				nombre_comercial = _nombre_comercial, 
				siglas = _siglas, 
				pais = _pais, 
				estado_provincia = _estado_provincia, 
				ciudad = _ciudad, 
				codigo_postal = _codigo_postal, 
                web = _web,
				email = _email, 
				telefonos = _telefonos, 
				direccion = _direccion, 
				divisa = _divisa, 
				moneda = _moneda, 
				id_fiscal = _id_fiscal, 
				id_isae = _id_isae, 
				fax = _fax
			where codigo = _codigo ;
	end if ;
    set _valor = _codigo;
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_form_vinculadas_c` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_form_vinculadas_c`(
	in _codemp varchar(2), 
	in _sucursal varchar(3), 
	in _filtra_sucursal smallint, 
	in _tabla varchar(255), 
	in _valor varchar(255), 
	out _resultado int
)
begin
	/* ----------------------------------------------------------------------------------------------------
		Verifica que un registro vinculado no esté en alguna de sus tablas vinculadas antes de ser eliminado
		si existe el valor devuelto es 1
		Versión 2.0
		Creado: 2024.12.01
		Actualizado: 2024.12.27, 2025.01.24
		Autor: 
	---------------------------------------------------------------------------------------------------- */
	declare done int default 0 ;
	declare _RegFila int default 0 ;
	declare _tabla_vinculada varchar(100) default '' ;
	declare _campo_tabla_vinculada varchar(100) default '' ;
	declare sqlcursor cursor for 
		select tabla_vinculada, campo_tabla_vinculada
			from cfg_tablas_vinculadas 
			where trim(tabla) = trim(_tabla) ;

	declare continue handler for sqlstate '02000' set done = 1 ;
	
	set @cadena = '' ;
	set @linea = 1 ;
    set @resultado = 0 ;

	select count(tabla) into @registros 
		from cfg_tablas_vinculadas 
		where trim(tabla) = trim(_tabla) ;

	open sqlcursor;

	repeat
		fetch sqlcursor into _tabla_vinculada, _campo_tabla_vinculada ;

		if (@linea <= @registros) then
			if @linea = 1 then 
				set @cadena = concat('select ', trim(_campo_tabla_vinculada), ' as campo from ', trim(_tabla_vinculada), ' where codemp = ',trim(_codemp), ' and ', trim(_campo_tabla_vinculada), ' = ', trim(_valor));
			else
				set @cadena = concat(@cadena, ' union select ', trim(_campo_tabla_vinculada), ' as campo from ', trim(_tabla_vinculada), ' where codemp = ',trim(_codemp), ' and ', trim(_campo_tabla_vinculada), ' = ', trim(_valor));
			end if ;

			if (_filtra_sucursal = 1) then
				set @cadena = concat(@cadena, ' and sucursal = ', trim(_sucursal) ) ;
			end if ;
		end if;
		set @linea  = (@linea + 1) ;
	until done = 1 end repeat ;
	close sqlcursor ;
    
    if trim(@cadena) <> '' then
		drop temporary table if exists sentencia ;
		set @cSentencia = concat('CREATE TEMPORARY TABLE sentencia ', @cadena );
		PREPARE sentencia from @cSentencia ;
		EXECUTE sentencia ;
		DEALLOCATE PREPARE sentencia ;
		select count(campo) into @resultado from sentencia ;
	end if ;
    set _resultado = coalesce(@resultado, 0)  ;
    
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_form_vinculadas_nocodemp_c` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_form_vinculadas_nocodemp_c`(
	in _codemp varchar(2), 
    in _sucursal varchar(3), 
    in _filtra_sucursal smallint, 
    in _tabla varchar(255), 
    in _valor varchar(255), 
    out _resultado int
)
begin
	/* ----------------------------------------------------------------------------------------------------
		Verifica que un registro vinculado no esté en alguna de sus tablas vinculadas antes de ser eliminado
		si existe el valor devuelto es 1
		Versión 2.0
		Creado: 2024.12.01
		Actualizado: 2024.12.27, 2025.01.24
		Autor: 
	---------------------------------------------------------------------------------------------------- */
	set @sql_where = '';
    set @resultado = 5000 ;
    
	-- Validación de parámetros
    if (_codemp is not null) OR (_sucursal is not null) or (_tabla is not null) or (_valor is not null) then
 		select 	group_concat(
					concat('select ', trim(campo_tabla_vinculada), ' as cantidad from ', trim(tabla_vinculada), 
					' where ', trim(campo_tabla_vinculada), ' = ''', trim(_valor), ''''
				) separator ' union all ') 
				into @sql_where
			from cfg_tablas_vinculadas
			where trim(tabla) = trim(_tabla);
		
        if @sql_where is not null and @sql_where <> '' then
			prepare sql_tabla from @sql_where;
			execute sql_tabla ;
			deallocate prepare sql_tabla ;
            select cantidad into @resultado from sql_tabla ;
		end if;
		set @sql_where = null ;
	end if ;
    set _resultado = if(coalesce(@resultado, 0) = 0 , -1, @resultado) ;
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_lista_cfg_mformato` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_lista_cfg_mformato`(
	in _codemp Varchar(2), 
	in _sucursal Varchar(3), 
	in _status int, 
	in _clave Varchar(255), 
	in _parametro Varchar(255)
)
begin
	-- ------------------------------------------
	-- Consulta del maestro de formatos fecha y hora, 
	-- para crear la lista desplegable.
	-- V 1.0
	-- Creado: 2024.05.06
	-- Actualizado: 2024.05.06
	-- Autor: 
	-- -------------------------------------------
	drop temporary table if exists a1;
	create temporary table a1
		select	cfg_mformato.codigo,
				cfg_mformato.nombre
			From cfg_mformato
			where trim(coalesce(cfg_mformato.nombre, '')) <> ''
				and cfg_mformato.codigo <> trim(coalesce(_clave, ''))
				and trim(coalesce(_clave, '')) = ''
		union
		select	cfg_mformato.codigo,
				cfg_mformato.nombre
			From cfg_mformato
			where cfg_mformato.codigo = trim(coalesce(_clave, '')) 
				and trim(coalesce(_clave, '')) <> '';
		
		select	a1.codigo,
				nombre
			from a1
			order by a1.nombre ;
		
End ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_lista_cfg_mlenguaje` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_lista_cfg_mlenguaje`(
	in _codemp Varchar(2), 
	in _sucursal Varchar(3), 
	in _status int, 
	in _clave Varchar(255), 
	in _parametro Varchar(255)
)
begin
	-- ------------------------------------------
	-- Consulta del maestro de lenguajes, 
	-- para crear la lista desplegable.
	-- V 1.0
	-- Creado: 2024.05.06
	-- Actualizado: 2024.05.06
	-- Autor: 
	-- -------------------------------------------
	drop temporary table if exists a1;
	create temporary table a1
		select	codigo,
				nombre
			from cfg_mlenguaje
			where codigo <> trim(coalesce(_clave, ''))
				and trim(coalesce(nombre, '')) <> ''
                and _status = 1
		union
		select	codigo,
				nombre
			from cfg_mlenguaje
			where codigo = trim(coalesce(_clave, '')) ; 
				-- and _status = 0 ;
		
	select	a1.codigo,
			concat(a1.codigo,' ',trim(a1.nombre)) as nombre
		from a1
		order by a1.nombre ;
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_lista_cfg_musuario_grupo` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_lista_cfg_musuario_grupo`(
	in _codemp varchar(2), 
	in _sucursal varchar(3), 
	in _status varchar(1), 
	in _parametro varchar(255), 
	in _tipo varchar(3)
)
begin
	-- ------------------------------------------
	-- consulta del maestro de grupos de usuarios, 
	-- para crear la lista desplegable.
	-- V 1.0
	-- Creado: 2024.05.06
	-- Actualizado: 2024.05.06
	-- Autor: 
	-- -------------------------------------------
	
	drop temporary table if exists a1;
	create temporary table a1
		select	tb_musuario_grupo.u201,
				tb_musuario_grupo.u202
			from tb_musuario_grupo
			where tb_musuario_grupo.estado = _status
				and trim(coalesce(tb_musuario_grupo.u202, '')) <> ''
				and tb_musuario_grupo.u201 <> trim(coalesce(_parametro, ''))
		union
		select	tb_musuario_grupo.u201,
				tb_musuario_grupo.u202
			from tb_musuario_grupo
			where tb_musuario_grupo.u201 = trim(coalesce(_parametro, ''));

	select	a1.u201,
			a1.u201 as codigo,
			a1.u202,
			a1.u202 as nombre
		from a1
		order by a1.u202 ;
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_lista_f_mciudad_carga_c` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_lista_f_mciudad_carga_c`(
	in _clave varchar(3)
)
begin
	select	codigo,
			nombre
		from tb_g_mciudad
        where estado_ciudad = _clave
			and estado = 1
		order by nombre ;
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_lista_f_mcliente` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_lista_f_mcliente`(
	in _codemp Varchar(2), 
	in _sucursal Varchar(3), 
	in _status int, 
	in _clave Varchar(255), 
	in _parametro Varchar(255)
)
begin
	/* -- ------------------------------------------
		Consulta del maestro de grupo, para clasificar a los clientes
		Creado 2024.07.21
		Actualizado 2024.07.21
		Autor: 
	-- ------------------------------------------- */
	
	drop temporary table if exists a1;
	create temporary table a1
		select	codigo,
				nombre
			from tb_f_mcliente
			where codemp = _codemp
				and codigo <> trim(coalesce(_clave, ''))
				and trim(coalesce(nombre, '')) <> ''
				and estado = _status
		union
		select	codigo,
				nombre
			from tb_f_mcliente
			where codemp = _codemp
				and codigo = trim(coalesce(_clave, '')) ;
		
	select	a1.codigo,
			a1.nombre
		from a1
		order by a1.nombre ;
		
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_lista_f_mgrupo` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_lista_f_mgrupo`(
	in _codemp Varchar(2), 
	in _sucursal Varchar(3), 
	in _status int, 
	in _clave Varchar(255), 
	in _parametro Varchar(255)
)
begin
	/* -- ------------------------------------------
		Consulta del maestro de grupo, para clasificar a los clientes
		Creado 2024.06.25
		Actualizado 2024.06.25
		Autor: 
	-- ------------------------------------------- */

	drop temporary table if exists a1;
	create temporary table a1
		select	codigo,
				nombre
			from tb_f_mgrupo
			where codemp = _codemp
				and codigo <> trim(coalesce(_clave, ''))
				and trim(coalesce(nombre, '')) <> ''
				and estado = _status
		union
		select	codigo,
				nombre
			from tb_f_mgrupo
			where codemp = _codemp
				and codigo = trim(coalesce(_clave, '')) ;
		
	select	a1.codigo,
			a1.nombre
		from a1
		order by a1.nombre ;
		
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_lista_f_mincidencia` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_lista_f_mincidencia`(
	in _codemp Varchar(2), 
	in _sucursal Varchar(3), 
	in _status int, 
	in _clave Varchar(255), 
	in _parametro Varchar(255)
)
begin
	/* ----------------------------------------------------------------------------------------------------
		Lista el maestro de incidencia
		Creado 2025.01.22
		Actualizado 2025.01.22
		Autor: 
	---------------------------------------------------------------------------------------------------- */

	drop temporary table if exists a1;
	create temporary table a1
		select	codigo,
				nombre
			from tb_f_mincidencia
			where codemp = _codemp
				and codigo <> trim(coalesce(_clave, ''))
				and trim(coalesce(nombre, '')) <> ''
				and estado = _status
		union
		select	codigo,
				nombre
			from tb_f_mincidencia
			where codemp = _codemp
				and codigo = trim(coalesce(_clave, '')) ;
		
	select	a1.codigo,
			a1.nombre
		from a1
		order by a1.nombre ;
		
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_lista_f_mincidencia_nivel` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_lista_f_mincidencia_nivel`(
	in _codemp Varchar(2), 
	in _sucursal Varchar(3), 
	in _status int, 
	in _clave Varchar(255), 
	in _parametro Varchar(255)
)
begin
	/* ----------------------------------------------------------------------------------------------------
		Lista el maestro de niveles de incidencia
		Creado 2025.01.22
		Actualizado 2025.01.22
		Autor: 
	---------------------------------------------------------------------------------------------------- */

	drop temporary table if exists a1;
	create temporary table a1
		select	codigo,
				nombre
			from tb_f_mindicencia_nivel
			where codemp = _codemp
				and codigo <> trim(coalesce(_clave, ''))
				and trim(coalesce(nombre, '')) <> ''
				and estado = _status
		union
		select	codigo,
				nombre
			from tb_f_mindicencia_nivel
			where codemp = _codemp
				and codigo = trim(coalesce(_clave, '')) ;
		
	select	a1.codigo,
			a1.nombre
		from a1
		order by a1.nombre ;
		
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_lista_g_mciudad` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_lista_g_mciudad`(
	in _codemp varchar(2), 
	in _sucursal varchar(3), 
	in _status int, 
	in _clave varchar(255), 
	in _parametro int(3)
)
BEGIN
	/* ------------------------------------------
		Crea una consulta del maestro indicado la lista desplegable.
		Creado 2025.01.03
		Actualizado 2025.01.03
		Autor: 
	------------------------------------------- */
    
	set @tabla = '' ;
	set @espacio = '''' ;
	set @clave = trim(coalesce(_clave, '')) ;
    
    if @clave <> '' then
		select 	tabla into @tabla
			from cfg_lista_formularios
			where formulario = _parametro ;
        
		set @estado_ciudad ='';
        set @sql_estados = concat('select estado_ciudad into @estado_ciudad from ',@tabla,' where codigo =  @clave');
			prepare sentencia from @sql_estados ;
			execute sentencia ;
            
		drop temporary table if exists sentencia;
		
		if coalesce(@tabla, '') <> '' then
			set @sql_select = concat('select codigo, nombre from ', @tabla, ' where estado_ciudad = ', @espacio, @estado_ciudad, @espacio) ;
			set @sql_sentencia = concat('create temporary table sentencia ', @sql_select, ' and codigo <> ', @espacio, @clave, @espacio, ' and estado = ', _status) ;
			set @sql_sentencia = concat(@sql_sentencia, ' and trim(coalesce(nombre,', @espacio,  @espacio, ')) <> ', @espacio, @espacio) ;
			set @sql_sentencia = concat(@sql_sentencia, ' union ') ;
			set @sql_sentencia = concat(@sql_sentencia, @sql_select, ' and codigo = ', @espacio, @clave, @espacio, ' ;' ) ;
		
			prepare sentencia from @sql_sentencia ;
			execute sentencia ;
			deallocate prepare sentencia ;
			
			select	sentencia.codigo,
					trim(sentencia.nombre) as nombre
				from sentencia
				order by sentencia.nombre ;
		else
			select 	'' collate utf8mb4_spanish_ci as codigo,
					'' collate utf8mb4_spanish_ci as nombre ;
		end if ;
    end if ;
END ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_lista_g_mestado_ciudad` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_lista_g_mestado_ciudad`(
	in _codemp varchar(2),
    in _sucursal varchar(3),
    in _status int, 
    in _clave varchar(5), 
    in _tipo varchar(3)
)
begin
	-- ------------------------------------------
	-- Consulta del maestro de paises
    -- Creado: 2024.12.01
	-- Actualizado 2024.12.01
	-- Autor: 
	-- -------------------------------------------

	drop temporary table if exists sql_tabla ;
	create temporary table sql_tabla
		select	codigo, nombre, siglas
			from tb_g_mestado_ciudad
			where codigo <> trim(coalesce(_clave, ''))
				and _status <> 0
		union
		select	codigo, nombre, siglas
			from tb_g_mestado_ciudad
			where codigo = trim(coalesce(_clave, ''))
				and _status <> 0 
		union
		select	codigo, nombre, siglas
			from tb_g_mestado_ciudad
			where codigo = trim(coalesce(_clave, ''))
				and _status = 0 ;
	
    select *
		from sql_tabla
		order by nombre ;
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_lista_g_mpais` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_lista_g_mpais`(
	in _codemp varchar(2), 
    in _sucursal varchar(3), 
    in _status int, 
    in _codigo varchar(5), 
    in _tipo varchar(3)
)
begin
	-- ------------------------------------------
	-- Consulta del maestro de paises
    -- Creado: 2024.12.01
	-- Actualizado 2024.12.29
	-- Autor: 
	-- -------------------------------------------

	drop temporary table if exists sql_tabla ;
	create temporary table sql_tabla
		select codigo, nombre
			from tb_g_mpais
			where codigo = coalesce(_codigo, '')
				and coalesce(_codigo, '') != '' 
                and estado = 1
		union
		select codigo, nombre
			from tb_g_mpais
			where codigo <> coalesce(_codigo, '')
				and coalesce(_codigo, '') = '' 
                and estado = 1 ;
	
    select *
		from sql_tabla
		order by nombre ;
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_lista_mestado` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_lista_mestado`(
	in _codemp varchar(2), 
    in _sucursal varchar(3), 
    in _status int, 
    in _codigo varchar(3), 
    in _tipo varchar(3)
)
begin
	/* -- ------------------------------------------
		Consulta del maestro de estados, de acuerdo al tipo, para crear la lista esplegable.
		Actualizado 01/21/2025
		Autor: Iluminado
	-- ------------------------------------------- */

	drop temporary table if exists a0;
	create temporary table a0
		select	codigo,
				nombre
			from cfg_mestado
			where tipo = _tipo
				and codigo <> trim(coalesce(_codigo, ''))
				and trim(coalesce(nombre, '')) <> ''
                and _status = 1
		union
		select	codigo,
				nombre
			from cfg_mestado
			where tipo = _tipo
				and codigo = trim(coalesce(_codigo, '')) ;
                
    select *
		from a0
		order by codigo ;
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_lista_mformulario_grupo` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_lista_mformulario_grupo`(
	in _codemp varchar(2), 
    in _sucursal varchar(3), 
    in _estado int(1), 
    in _parametro varchar(255), 
    in _tipo varchar(3)
)
begin
	-- ------------------------------------------
	-- consulta los diversos grupos del menú
	-- V 1.0
	-- Creado: 27/10/2014
	-- Actualizado 27/10/2014
	-- Autor: 
	-- -------------------------------------------
	if (_codemp is null) OR (_sucursal is null) or (_tabla is null) or (_parametro is null) then
        signal sqlstate '45000'
            set message_text = 'Parámetros incompletos. Todos los campos deben estar especificados.';
    end if ;
	drop temporary table if exists a0 ;
	create temporary table a0
		select codigo, nombre
			from cfg_menu_grupo
			where codigo = _parametro 
		union
		select codigo, nombre
			from cfg_menu_grupo
			where codigo <> _parametro 
				and _parametro = '' ;
	
	select *
		from a0
		order by codigo ;
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_lista_mformulario_modulo` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_lista_mformulario_modulo`(
	in _codemp varchar(2), 
    in _sucursal varchar(3), 
    in _estado int(1), 
    in _parametro varchar(255), 
    in _tipo varchar(3)
)
begin
	-- ------------------------------------------
	-- Consulta los diversos módulos del menú
	-- V 1.0
	-- Creado: 27/10/2014
	-- Actualizado 27/10/2014
	-- Autor: 
	-- -------------------------------------------
	
	drop temporary table if exists a0 ;
	create temporary table a0
		select codigo, nombre
			from cfg_menu_modulo
			where codigo = _parametro 
		union
		select codigo, nombre
			from cfg_menu_modulo
			where codigo <> _parametro
				and _parametro = '';
	
	select *
		from a0
		order by codigo ;

end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_lista_mmaestro_c` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_lista_mmaestro_c`(
	in _codemp varchar(2), 
	in _sucursal varchar(3), 
	in _status int, 
	in _clave varchar(255), 
	in _parametro int(3)
)
Begin
	/* ------------------------------------------
		Crea una consulta del maestro indicado la lista desplegable.
		Creado 2024.05.10
		Actualizado 2024.05.10
		Autor: 
	------------------------------------------- */
    
	set @tabla = '' ;
	set @espacio = '''' ;
	set @clave = trim(coalesce(_clave, '')) ;

	select 	tabla into @tabla
		from cfg_lista_formularios
		where formulario = _parametro ;
	
	select 	filtra_sucursal into @filtra_sucursal
		from cfg_lista_formularios
		where formulario = _parametro ;
	
	set @sucursal = '' ;
	if @filtra_sucursal = 1 then 
		set @sucursal = concat(' and sucursal = ', @espacio, _sucursal, @espacio) ;
	end if ;
	drop temporary table if exists sentencia;
	
	if coalesce(@tabla, '') <> '' then
		set @sql_select = concat('select codigo, nombre from ', @tabla, ' where codemp = ', @espacio, _codemp, @espacio, @sucursal) ;
		set @sql_sentencia = concat('create temporary table sentencia ', @sql_select, ' and codigo <> ', @espacio, @clave, @espacio, ' and estado = ', _status) ;
		set @sql_sentencia = concat(@sql_sentencia, ' and trim(coalesce(nombre,', @espacio,  @espacio, ')) <> ', @espacio, @espacio) ;
		set @sql_sentencia = concat(@sql_sentencia, ' union ') ;
		set @sql_sentencia = concat(@sql_sentencia, @sql_select, ' and codigo = ', @espacio, @clave, @espacio, ' ;' ) ;
	
		prepare sentencia from @sql_sentencia ;
		execute sentencia ;
		deallocate prepare sentencia ;
		
		select	sentencia.codigo,
				trim(sentencia.nombre) as nombre
			from sentencia
			order by sentencia.nombre ;
	else
		select 	'' collate utf8mb4_spanish_ci as codigo,
				'' collate utf8mb4_spanish_ci as nombre ;
	end if ;
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_lista_mmaestro_c_nocodemp` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_lista_mmaestro_c_nocodemp`(
	in _codemp varchar(2), 
	in _sucursal varchar(3), 
	in _status int, 
	in _clave varchar(255), 
	in _parametro int(3)
)
BEGIN
	/* ------------------------------------------
		Crea una consulta del maestro indicado la lista desplegable.
		Creado 2024.05.10
		Actualizado 2024.05.10
		Autor: 
	------------------------------------------- */
    
	set @tabla = '' ;
	set @espacio = '''' ;
	set @clave = trim(coalesce(_clave, '')) ;
    
    -- Si la clave esta en blanco solo se carga la lista al seleccionar el estado
    -- Si pasa un valor en la clave, entonces filtra todas las ciudades que tengan el mismo estado
    if @clave <> '' then

		select 	tabla into @tabla
			from cfg_lista_formularios
			where formulario = _parametro ;
		/*
		select 	filtra_sucursal into @filtra_sucursal
			from cfg_lista_formularios
			where formulario = _parametro ;
        
		set @sucursal = '' ;
		if @filtra_sucursal = 1 then 
			set @sucursal = concat(' and sucursal = ', @espacio, _sucursal, @espacio) ;
		end if ;
        */
        
		set @estado_ciudad ='';
        set @sql_estados = concat('select estado_ciudad into @estado_ciudad from ',@tabla,' where codigo =  @clave');
			prepare sentencia from @sql_estados ;
			execute sentencia ;
            
		drop temporary table if exists sentencia;
		
		if coalesce(@tabla, '') <> '' then
			set @sql_select = concat('select codigo, nombre from ', @tabla, ' where estado_ciudad = ', @espacio, @estado_ciudad, @espacio) ;
			set @sql_sentencia = concat('create temporary table sentencia ', @sql_select, ' and codigo <> ', @espacio, @clave, @espacio, ' and estado = ', _status) ;
			set @sql_sentencia = concat(@sql_sentencia, ' and trim(coalesce(nombre,', @espacio,  @espacio, ')) <> ', @espacio, @espacio) ;
			set @sql_sentencia = concat(@sql_sentencia, ' union ') ;
			set @sql_sentencia = concat(@sql_sentencia, @sql_select, ' and codigo = ', @espacio, @clave, @espacio, ' ;' ) ;
		
        -- select @sql_sentencia;
        
			prepare sentencia from @sql_sentencia ;
			execute sentencia ;
			deallocate prepare sentencia ;
			
			select	sentencia.codigo,
					trim(sentencia.nombre) as nombre
				from sentencia
				order by sentencia.nombre ;
                
		else
			select 	'' collate utf8mb4_spanish_ci as codigo,
					'' collate utf8mb4_spanish_ci as nombre ;
		end if ;
	
    end if ;
END ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_musuario_acceso_c` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_musuario_acceso_c`(
	in _id_documento int(5), 
    in _id_grupo varchar(5)
)
begin
	if(trim(_id_documento)<>'')then
		select
			tb_musuario_acceso.id_acceso,
			tb_musuario_acceso.id_documento,
			tb_musuario_accion.id_accion,
			tb_musuario_accion.descripcion
		from tb_musuario_acceso
			left join tb_musuario_accion 
				on tb_musuario_accion.id_accion = tb_musuario_acceso.id_accion
		where
			tb_musuario_acceso.id_accion not in (select  u303 from tb_musuario_grupo_d where u301 = _id_grupo and u302 = _id_documento ) and tb_musuario_acceso.id_documento = _id_documento
		order by tb_musuario_accion.id_accion Asc;
	end if;
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_musuario_dpermiso_c` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_musuario_dpermiso_c`(
	in _grupo varchar(5)
)
begin
	select
		tb_musuario_dpermiso.u201,
		tb_musuario_dpermiso.u202,
		tb_musuario_dpermiso.u203,
		tb_musuario_dpermiso.u204,
		tb_musuario_dpermiso.u205,
		tb_musuario_dpermiso.u206,
		tb_musuario_dpermiso.u207,
		tb_musuario_dpermiso.u208,
		tb_musuario_dpermiso.u209,
		tb_musuario_dpermiso.u210,
		tb_musuario_dpermiso.u211,
		coalesce(tb_mmaestros.Modulo, '') As nmodulo
	from tb_musuario_dpermiso
		inner join tb_mmaestros 
			on tb_mmaestros.id_documento = tb_musuario_dpermiso.u203
	where tb_musuario_dpermiso.u202 = _grupo
	order by tb_mmaestros.item asc;

end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_musuario_dpermiso_comprobacion_c` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_musuario_dpermiso_comprobacion_c`(
	in _codigo_usuario varchar(5), 
    in _modulo varchar(3)
)
begin
	if(trim(_modulo)='')then
		select 	tb_musuario.u201,
				tb_musuario_grupo.u201 as codigo_grupo,
				tb_musuario_dpermiso.u201 as usuario,
				tb_musuario_dpermiso.u203,
				tb_musuario_dpermiso.u204,
				tb_musuario_dpermiso.u205,
				tb_musuario_dpermiso.u206,
				tb_musuario_dpermiso.u207,
				tb_musuario_dpermiso.u208,
				tb_musuario_dpermiso.u209,
				tb_musuario_dpermiso.u210
		from tb_musuario
			left join tb_musuario_grupo 
				on tb_musuario_grupo.u201 = tb_musuario.u206
			left join tb_musuario_dpermiso 
				on tb_musuario_dpermiso.u202 = tb_musuario_grupo.u201
		where tb_musuario.u201 = _codigo_usuario;

	else
		select 	tb_musuario.u201,
				tb_musuario_grupo.u201 as codigo_grupo,
				tb_musuario_dpermiso.u201 as usuario,
				tb_musuario_dpermiso.u203,
				tb_musuario_dpermiso.u204,
				tb_musuario_dpermiso.u205,
				tb_musuario_dpermiso.u206,
				tb_musuario_dpermiso.u207,
				tb_musuario_dpermiso.u208,
				tb_musuario_dpermiso.u209,
				tb_musuario_dpermiso.u210
		from tb_musuario
			left join tb_musuario_grupo 
				on tb_musuario_grupo.u201 = tb_musuario.u206
			left join tb_musuario_dpermiso 
				on tb_musuario_dpermiso.u202 = tb_musuario_grupo.u201
		where tb_musuario.u201 = _codigo_usuario 
			and tb_musuario_dpermiso.u203 = _modulo;
	end if;

end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_musuario_dpermiso_edicion_c` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_musuario_dpermiso_edicion_c`(
	in _grupo varchar(5)
)
begin
	select *
		from tb_mmaestros
		where tb_mmaestros.id_documento not in(select u302 from tb_musuario_grupo_d where tb_musuario_grupo_d.u301 = _grupo )
		order by nivel,modulo;

end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_musuario_dpermiso_u` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_musuario_dpermiso_u`(
	in _usuario varchar(5), 
	in _grupo varchar(5), 
	in _modulo varchar(5), 
	in _permitir int(1), 
	in _nuevo int(1), 
	in _editar int(1), 
	in _aprobar int(1), 
	in _anular int(1), 
	in _imprimir int(1), 
	in _ver int(1), 
	in _item int(11), 
	in _accion varchar(1)
)
begin
	if (_accion = 'D') then
		delete 
			from tb_musuario_dpermiso 
            where u211 = _item ;
	else
		if _item = 0 then
			insert into tb_musuario_dpermiso (u201, u202, u203, u204, u205, u206, u207, u208, u209, u210 ) 
				values (_usuario, _grupo, _modulo, _permitir, _nuevo, _editar, _aprobar, _anular, _imprimir, _ver  );
		else
			update tb_musuario_dpermiso 
				set
					u201 = _usuario,
					u202 = _grupo,
					u203 = _modulo,
					u204 = _permitir,
					u205 = _nuevo,
					u206 = _editar,
					u207 = _aprobar,
					u208 = _anular,
					u209 = _imprimir,
					u210 = _ver
				where u211 = _item;
		end if;
	end if;
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_musuario_grupos_c` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_musuario_grupos_c`(
	in _status varchar(1), 
    in _parametro varchar(255)
)
begin
	if trim(_status)='' then
		if Trim(_parametro)='' then
			select	tb_musuario.u201,
					tb_musuario.u202,
					tb_musuario.u203,
					tb_musuario.u204,
					tb_musuario.u205,
					tb_musuario.u206,
					tb_musuario.u207,
					tb_musuario.u208 As estado,
					tb_mestado.nombre AS nestado,
					tb_musuario.u209,
					tb_mprofesional.nombre AS nprofesional
			 from tb_musuario
				left join tb_mestado 
					on tb_musuario.u208 = tb_mestado.codigo
				left join tb_mprofesional 
					on tb_musuario.u209 = tb_mprofesional.codigo
 			order by tb_musuario.u202;

		else
			select	tb_musuario.u201,
					tb_musuario.u202,
					tb_musuario.u203,
					tb_musuario.u204,
					tb_musuario.u205,
					tb_musuario.u206,
					tb_musuario.u207,
					tb_musuario.u208 As estado,
					tb_mestado.nombre AS nestado,
					tb_musuario.u209,
					tb_mprofesional.nombre AS nprofesional
			 from tb_musuario
				left join tb_mestado 
					on tb_musuario.u208 = tb_mestado.codigo
				left join tb_mprofesional 
					on tb_musuario.u209 = tb_mprofesional.codigo
			where tb_musuario.u206 = _parametro
 			order by tb_musuario.u202;
		end if;
	else
		if Trim(_parametro)='' then
			select
				tb_musuario.u201,
				tb_musuario.u202,
				tb_musuario.u203,
				tb_musuario.u204,
				tb_musuario.u205,
				tb_musuario.u206,
				tb_musuario.u207,
				tb_musuario.u208 As estado,
				tb_mestado.nombre AS nestado,
				tb_musuario.u209,
				tb_mprofesional.nombre AS nprofesional
			 from tb_musuario
				left join tb_mestado 
					on tb_musuario.u208 = tb_mestado.codigo
				left join tb_mprofesional 
					on tb_musuario.u209 = tb_mprofesional.codigo
			where tb_musuario.u208 = _status
 			order by tb_musuario.u202;

		else
			select	tb_musuario.u201,
					tb_musuario.u202,
					tb_musuario.u203,
					tb_musuario.u204,
					tb_musuario.u205,
					tb_musuario.u206,
					tb_musuario.u207,
					tb_musuario.u208 As estado,
					tb_mestado.nombre AS nestado,
					tb_musuario.u209,
					tb_mprofesional.nombre AS nprofesional
			 from tb_musuario
				left join tb_mestado on tb_musuario.u208 = tb_mestado.codigo
				left join tb_mprofesional on tb_musuario.u209 = tb_mprofesional.codigo
			where tb_musuario.u208 = _status and
			            tb_musuario.u206 = _parametro
 			order by tb_musuario.u202;
		end if;
	end if;

end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_musuario_grupo_d` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_musuario_grupo_d`(
	in _grupo varchar(5), 
    in _modulo varchar(5), 
    in _accion_botones varchar(5), 
    in _item int(11), 
    in _accion varchar(1)
)
begin
	if(_accion = 'D')then
		delete 
			from tb_musuario_grupo_d 
            where u304 = _item;
	else
		if _item = 0 then
			insert into tb_musuario_grupo_d (u301, u302, u303 ) values (_grupo, _modulo, _accion_botones );
		else
			update tb_musuario_grupo_d 
				set
					u301 = _grupo,
					u302 = _modulo,
					u303 = _accion_botones
				where u304 = _item;
		end if;
	end if;

end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_musuario_grupo_d_accion_c` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_musuario_grupo_d_accion_c`(
	in _id_grupo varchar(5), 
    in _id_modulo varchar(5), 
    in _id_accion varchar(1)
)
begin
	select	tb_musuario_grupo_d.u301,
			tb_musuario_grupo_d.u302,
			tb_musuario_grupo_d.u303,
			tb_musuario_grupo_d.u304
		from tb_musuario_grupo_d
		where tb_musuario_grupo_d.u301 = _id_grupo 
			and tb_musuario_grupo_d.u302 = _id_modulo 
			and tb_musuario_grupo_d.u303 = _id_accion;

end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_musuario_grupo_d_c` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_musuario_grupo_d_c`(
	in _id_grupo varchar(5), 
	in _id_documento varchar(5), 
	in _accion varchar(1))
begin
	if(trim(_accion)='')then
		if((trim(_id_grupo)<> '' ) and (trim(_id_documento)<> '' ))then
			select	tb_musuario_grupo_d.u301,
					tb_musuario_grupo_d.u302,
					tb_musuario_grupo_d.u303,
					tb_musuario_grupo_d.u304,
					tb_musuario_accion.descripcion
			from tb_musuario_grupo_d
				left join tb_musuario_accion 
					on tb_musuario_accion.id_accion = tb_musuario_grupo_d.u303
			where tb_musuario_grupo_d.u301 = _id_grupo 
				and tb_musuario_grupo_d.u302 = _id_documento;
		end if;
	else
		select	tb_musuario_grupo_d.u301,
				tb_musuario_grupo_d.u302 as id_documento,
				tb_musuario_grupo_d.u303,
				tb_musuario_grupo_d.u304,
				tb_musuario_accion.descripcion,
				tb_mmaestros.Modulo,
				tb_mmaestros.nivel
		from tb_musuario_grupo_d
			left join tb_musuario_accion 
				on tb_musuario_accion.id_accion = tb_musuario_grupo_d.u303
			left join tb_mmaestros 
				on tb_mmaestros.id_documento = tb_musuario_grupo_d.u302
		where tb_musuario_grupo_d.u301 = _id_grupo 
			and tb_musuario_grupo_d.u303 = 0
		order by nivel,modulo;
	end if;
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_musuario_grupo_d_comprobacion_c` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_musuario_grupo_d_comprobacion_c`(
	in _codigo_usuario varchar(5), 
	in _modulo varchar(5)
)
begin
	if(trim(_modulo)='' )then
		select 	tb_musuario.u201,
				tb_mmaestros.Modulo,
				tb_musuario_grupo.u201 as codigo_grupo,
				tb_musuario_grupo_d.u302,
				tb_musuario_grupo_d.u303,
				tb_musuario_grupo_d.u304
			from tb_musuario
				left join tb_musuario_grupo 
					on tb_musuario_grupo.u201 = tb_musuario.u206
				left join tb_musuario_grupo_d 
					on tb_musuario_grupo_d.u301 = tb_musuario_grupo.u201
				left join tb_mmaestros 
					on tb_mmaestros.id_documento = tb_musuario_grupo_d.u302
			where tb_musuario.u201 = _codigo_usuario 
				and tb_musuario_grupo_d.u303 = 0;
	else
		select 	tb_musuario.u201,
				tb_mmaestros.Modulo,
				tb_musuario_grupo.u201 as codigo_grupo,
				tb_musuario_grupo_d.u302,
				tb_musuario_grupo_d.u303,
				tb_musuario_grupo_d.u304
			from tb_musuario
				left join tb_musuario_grupo 
					on tb_musuario_grupo.u201 = tb_musuario.u206
				left join tb_musuario_grupo_d 
					on tb_musuario_grupo_d.u301 = tb_musuario_grupo.u201
				left join tb_mmaestros 
					on tb_mmaestros.id_documento = tb_musuario_grupo_d.u302
			where tb_musuario.u201 = _codigo_usuario 
				and tb_musuario_grupo_d.u302 = _modulo;
	end if;

end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_musuario_grupo_d_edicion_c` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_musuario_grupo_d_edicion_c`(
	in _id_grupo varchar(5)
)
begin
	if(trim(_id_grupo)<> '' )then
		select	tb_musuario_grupo_d.u301, 
				tb_musuario_grupo_d.u302, 
				tb_musuario_grupo_d.u303, 
				tb_musuario_grupo_d.u304, 
				tb_musuario_accion.descripcion,
				tb_mmaestros.Modulo
		from tb_musuario_grupo_d
			left join tb_musuario_accion 
				on tb_musuario_accion.id_accion = tb_musuario_grupo_d.u303
			left join tb_mmaestros 
				on tb_mmaestros.id_documento = tb_musuario_grupo_d.u302
		where
			tb_musuario_grupo_d.u301 = _id_grupo 
				and tb_musuario_grupo_d.u303 = 0;
	end if;
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_musuario_grupo_d_u` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_musuario_grupo_d_u`(
	in _grupo varchar(5), 
	in _modulo varchar(5), 
	in _accion_botones varchar(5), 
	in _item int(11), 
	in _accion varchar(1)
)
begin
	if (_accion = 'D') then
		delete 
			from tb_musuario_grupo_d 
            where u304 = _item;
	else
		if _item = 0 then
			insert into tb_musuario_grupo_d (u301, u302, u303 ) 
				values (_grupo, _modulo, _accion_botones );
		else
			update tb_musuario_grupo_d 
				set
					u301 = _grupo,
					u302 = _modulo,
					u303 = _accion_botones
				where u304 = _item;
		end if;
	end if;
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_rep_g_dfecha_c` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_rep_g_dfecha_c`(
	in _codemp varchar(2), 
	in _sucursal varchar(3),
	in _fecha_desde varchar(10), 
	in _fecha_hasta varchar(10), 
	in _nulo varchar(1),
	in _nulo1 varchar(1)
)
begin
	-- ----------------------------------------------------
	-- consulta reporte de presupuestos
	-- Versión 1.0
	-- Creado: 11/07/2017
	-- Actualizado: 2024.04.13, 11/07/2017
	-- Autor: 
	-- ----------------------------------------------------
	    
	select 	_codemp as codemp,
			_sucursal as sucursal,
            @nusuario as nsuaurio,
            _fecha_desde as desde,
            _fecha_hasta as hasta ;
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_s_log_u` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_s_log_u`(
	in _codemp varchar(2), 
	in _sucursal varchar(3),
	in _formulario varchar(10),
	in _usuario varchar(10),
	in _referencia varchar(50), 
	in _operacion varchar(1),
	in _descripcion varchar(255),
	in _ip varchar(50), 
	in _browser varchar(50), 
	in _browser_version varchar(50), 
	in _os varchar(100),
	in _ciudad varchar(100),
	in _estado_ciudad varchar(100),
	in _pais varchar(100),
	in _latitud varchar(45),
	in _longitud varchar(45),
	in _vpn varchar(5)    
)
begin
	-- ----------------------------------------------------
	-- actualiza los datos del log
	-- versión 1.0
	-- Creado: 13/08/2015
	-- Actualizado: 2024.04.13, 20/02/2017, 2024.12.21, 2025-05-16
	-- Autor: 
	-- ----------------------------------------------------
	
	insert into tb_s_log (codemp, sucursal, formulario, usuario, referencia, fecha, operacion, descripcion, ip, browser, browser_version, os, ciudad, estado_ciudad, pais, latitud, longitud, vpn) 
		select _codemp, _sucursal, _formulario, _usuario, _referencia, now(), _operacion, _descripcion, _ip, _browser, _browser_version, _os, _ciudad, _estado_ciudad, _pais, _latitud, _longitud, _vpn;
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sp_tdocumento_u` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sp_tdocumento_u`(
	in _tabla varchar(50), 
    in _repetir int(10), 
    in _tipo int(1), 
    out _valor varchar(11)
)
begin
	/* ---------------------------------------------------
		Busqueda y paginador generico de formularios listas
		Versión 1.0
		Creado: 2024.12.01
		Actualizado: 2024.12.16
		Autor: 
	--------------------------------------------------- */
    
	declare _largo int(10);
	declare _ultimo int(10);
	declare _codigo varchar(10);
	declare _year varchar(4) ;
	set _year = '' ;
    
	if coalesce(_tipo, 0) = 2 then
		set _year = concat(substring(curdate(), 1, 4), '/') ;
		set _tabla = concat(_tabla, '-', substring(_year, 1, 4)) ;
	end if;
	if (select coAlesCE(CoUnT(*), 0) from tb_tdocumento where nombre = _tabla) = 0 then
		insert into tb_tdocumento (nombre, numero) ValueS (_tabla, 0);
	end if;

    update tb_tdocumento 
		set 
			numero = numero + 1 
		where nombre = _tabla;
        
    select coaLEsce(numero, 0) into _ultimo 
		from tb_tdocumento 
        where nombre = _tabla;
        
	set _valor = concat(_year, repEAT('0',  _repetir - LENgth(Trim(_ultimo))), trim(_ultimo));
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `sql_prepare` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `sql_prepare`(
	in _tabla varchar(50),
	in _sql_query varchar(8000)
)
begin
	/* ---------------------------------------------------
		Busqueda y paginador generico de formularios listas
		Versión 1.0
		Creado: 2024.12.01
		Actualizado: 2024.12.16, 2024.12.26, 2024.12.29
		Autor: 
	--------------------------------------------------- */
    
	-- Validación de parámetros
    if (_tabla is not null) or (_sql_query is not null) then
		-- Preparar y ejecutar la consulta dinámica
		set @tabla = coalesce(_tabla, '') ; 
		set @sql_where = coalesce(_sql_query, '') ; 
		set @sql_query = concat('create temporary table sql_tabla select * from ', trim(@tabla), @sql_where);
		
		-- ---------------------------------------------------
		drop temporary table if exists sql_tabla ;
		prepare sql_tabla from @sql_query;
		execute sql_tabla;
		deallocate prepare sql_tabla;
        set @sql_query = null ;
	else
		select -1 ;
	end if ;
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `str_cadena` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `str_cadena`(
	in _codemp varchar(2), 
	in _sucursal varchar(3), 
	in _tabla varchar(100), 
	in _tablaBA varchar(25), 
	in _jointb varchar(2000),
	in _camposA varchar(1000), 
	in _camposB varchar(1000),
	in _ordenado varchar(50), 
	in _bCampos varchar(1000), 
	in _operador varchar(6), 
	in _valor varchar(100), 
	in _pagina int, 
	in _regpp int, 
	in _adicional varchar(5000), 
	in _tipo_estado varchar(3),
	in _estado int,
	in _desde varchar(10),
	in _hasta varchar(10),
	in _tipoBusq int(1),
	out _cResultado Varchar(5000)
)
begin
	/* ------------------------------------------------------------------------------------------------------
		Busqueda y paginador generico de formularios listas
		Versión 1.0
		Creado: 2024.12.01
		Actualizado: 2024.12.16, 2024.12.29, 2025.01.21, 2025-05-06
		Autor: 
	------------------------------------------------------------------------------------------------------ */
    
	-- Validación de parámetros
	set @iLimite = coalesce(_regpp, 25) ;
	set @iPagina = coalesce(_pagina, 1) ;
	set @iLimiteInicio = ((@iPagina - 1) * @iLimite) ;
	set @nRowTotal = 0 ;
	set @Fila = 0 ;
	
	set @cResultadoA = '' ;
	set @cResultadoB = '' ;
	set @cResultadoC = '' ;
	set @cResultadoI = '' ;
	set @cResultadoT = '' ;
	set @parent = ')' ;
	
	set @sucursal = '' ;
	set @tabla = concat(trim(_tabla), '.') ;
	set @tablaBA = concat(trim(_tablaBA), '.') ;
	set @valor = coalesce(trim(_valor), '') ;
	set @bCampos = coalesce(trim(_bCampos), '') ;
	set @operador = coalesce(_operador, '') ;
	set @tipoBusq = coalesce(_tipoBusq, 0) ;
    set @jointb = coalesce(trim(_jointb), '') ;
    set @adicional = coalesce(trim(_adicional), '') ;
	set @cJoinOrdenB = '' ;
	set @cJoinCampoO = '' ;
	
	-- ----------------------------------------------------------------------------------------------
	-- Proceso para Ordenar la consulta de la tabla
	
	if coalesce(_ordenado, '') = 'ncliente' then
		set @cJoinOrdenB = concat(' left join tb_f_mcliente on ', @tabla, 'codemp = tb_f_mcliente.codemp and ', @tabla, 'sucursal = tb_f_mcliente.sucursal and ', @tabla, 'cliente = tb_f_mcliente.codigo ') ; 
		set @cJoinCampoO = concat(', tb_f_mcliente.nombre') ; 
		set @cOrdenado = concat(' order by tb_f_mcliente.nombre') ;
	elseif coalesce(_ordenado, '') = 'nplantilla' then
		set @cJoinOrdenB = concat(' left join tb_f_mplantilla on ', @tabla, 'codemp = tb_f_mplantilla.codemp and ', @tabla, 'sucursal = tb_f_mplantilla.sucursal and ', @tabla, 'plantilla = tb_f_mplantilla.codigo ') ; 
		set @cJoinCampoO = concat(', tb_f_mplantilla.codigo') ; 
		set @cOrdenado = concat(' order by tb_f_mplantilla.nombre') ;
	elseif coalesce(_ordenado, '') = 'ngrupo' then
		set @cJoinOrdenB = concat(' left join tb_f_mgrupo on ', @tabla, 'codemp = tb_f_mgrupo.codemp and ', @tabla, 'sucursal = tb_f_mgrupo.sucursal and ', @tabla, 'grupo = tb_f_mgrupo.codigo ') ; 
		set @cJoinCampoO = concat(', tb_f_mgrupo.nombre') ; 
		set @cOrdenado = concat(' order by tb_f_mgrupo.nombre') ;
	elseif coalesce(_ordenado, '') = 'npersonal' then
		set @cJoinOrdenB = concat(' left join tb_f_mpersonal on ', @tabla, 'codemp = tb_f_mpersonal.codemp and ', @tabla, 'sucursal = tb_f_mpersonal.sucursal and ', @tabla, 'personal = tb_f_mpersonal.codigo ') ; 
		set @cJoinCampoO = concat(', tb_f_mpersonal.nombre') ; 
		set @cOrdenado = concat(' order by tb_f_mpersonal.nombre') ;
	elseif coalesce(_ordenado, '') = 'nrole' then
		set @cJoinOrdenB = concat(' left join tb_f_mrole on ', @tabla, 'codemp = tb_f_mrole.codemp and ', @tabla, 'sucursal = tb_f_mrole.sucursal and ', @tabla, 'role = tb_f_mrole.codigo ') ; 
		set @cJoinCampoO = concat(', tb_f_mrole.nombre') ; 
		set @cOrdenado = concat(' order by tb_f_mrole.nombre') ;
	elseif coalesce(_ordenado, '') = 'nproyecto' then
		set @cJoinOrdenB = concat(' left join tb_f_mproyecto on ', @tabla, 'codemp = tb_f_mproyecto.codemp and ', @tabla, 'sucursal = tb_f_mproyecto.sucursal and ', @tabla, 'proyecto = tb_f_mproyecto.codigo ') ; 
		set @cJoinCampoO = concat(', tb_f_mproyecto.nombre') ; 
		set @cOrdenado = concat(' order by tb_f_mproyecto.nombre') ;
	elseif coalesce(_ordenado, '') = 'nsupervisor' then
		set @cJoinOrdenB = concat(' left join tb_f_msupervisor on ', @tabla, 'codemp = tb_f_msupervisor.codemp and ', @tabla, 'sucursal = tb_f_msupervisor.sucursal and ', @tabla, 'supervisor = tb_f_msupervisor.codigo ') ; 
		set @cJoinCampoO = concat(', tb_f_msupervisor.nombre') ; 
		set @cOrdenado = concat(' order by tb_f_msupervisor.nombre') ;
	else 
		set @cOrdenado = concat(' order by ',  @tabla, _ordenado) ;
		set @cJoinCampoO = concat(', ', @tabla, _ordenado) ; 
	end if ;
	set @cJoinCampoO = concat(@cJoinCampoO, '  as xOrdenado') ; 
	-- ----------------------------------------------------------------------------------------------
	-- Se crea una cadena para filtral por empresa y sucursal
	set @empresa = concat(' where ', @tabla, 'codemp = ', _codemp);
	if trim(_sucursal) <> '' then
		set @sucursal = concat(' and ', @tabla, 'sucursal = ', _sucursal);
	end if;
	
	-- ----------------------------------------------------------------------------------------------
	-- Crea dos cadena: 
	-- 		cResultadoIniciar: 	realizar la búsqueda de los registros que se mostraran como resultado final segun los parametros indicados
	-- 		cResultadoTotales: 	realiza una consulta para obtener el total de registro en la consulta por medio de un COUNT(*)
	-- 		COUNT(*):			sustituye la funcion SQL_CALC_FOUND_ROWS, dado que el FOUND_ROWS() no funciona ahora con el prepare y deallocate prepare
	--
	
	set @cResultadoIniciar = concat('create temporary table sentencia select ', @tabla, '*, (@fila:= @fila + 1) as RegFila',  @cJoinCampoO) ;
	set @cResultadoTotales = concat('create temporary table sentencia select COUNT(*) total_filas ');
	if coalesce(_camposB, '') <> '' then
		set @cResultadoA = concat(@cResultadoA, _camposB) ;
	end if ;
	
	-- ----------------------------------------------------------------------------------------------
	set @cResultadoA = concat(@cResultadoA, '  from ', _tabla) ;
	if coalesce(@jointb, '') <> '' then
		set @cResultadoA = concat(@cResultadoA, ' ', coalesce(@jointb, ''), ' ');
	end if ;
	
	-- ----------------------------------------------------------------------------------------------
	-- Agrega el LEFT JOIN de la Tabla por la que ordenara la busqueda.
	set @cResultadoA = concat(@cResultadoA, ' ', coalesce(@cJoinOrdenB, '') ) ;
	
	-- ----------------------------------------------------------------------------------------------
	set @cResultadoA = concat(@cResultadoA, @empresa, @sucursal) ;
	if trim(coalesce(@adicional, '')) <> '' then
		set @cResultadoA = concat(@cResultadoA, ' and ', @tablaBA, trim(@adicional));
	end if;
	
	if coalesce(_estado, 0) > 0 then
		set @cResultadoA = concat(@cResultadoA, ' and ', @tabla, 'estado = ', coalesce(_estado, 0));
	else 
		set @cResultadoA = concat(@cResultadoA, ' and ', @tabla, 'estado > 0 ');
	end if ;
	
	-- ----------------------------------------------------------------------------------------------
	-- De pasar la fecha como parametro, se incluye la opción para el rango de fecha
	--
	if trim(coalesce(_desde, '')) <> '' and _tipoBusq = 1 then
		set @desde = STR_TO_DATE(Trim(_desde), '%m/%d/%Y');
		set @hasta = STR_TO_DATE(Trim(_hasta), '%m/%d/%Y');
        if (@tabla = 'tb_f_otimesheet.') then
			set @cResultadoA = CONCAT(@cResultadoA, ' and ', @tabla, 'fecha_d between ', QUOTE(@desde), ' and ', QUOTE(@hasta));
        else
			set @cResultadoA = CONCAT(@cResultadoA, ' and ', @tabla, 'fecha between ', QUOTE(@desde), ' and ', QUOTE(@hasta));
		end if ;
	end if ;
	
	if trim(@valor) <> '' then
		if @tipoBusq = 1 then
			-- ----------------------------------------------------------------------------------------------
			-- Según el campo por el que se realizará la búsqueda, se anexará a la cadena validado por la tabla del maestro que lo rige
			-- es importante que el campo a validar en la búsqueda se encuentre dentro de las siguientes opciones, de lo contrario se deberá anexar
			-- para que se incorpore a la cadena.
			--
			if @bCampos = 'numero' then
				set @cResultadoB = concat(@cResultadoB, ' and ', @tablaBA, 'numero ') ;
				set @parent = '' ;
			elseif @bCampos = 'referencia' then
				set @cResultadoB = concat(@cResultadoB, ' and ', @tablaBA, 'referencia ') ;
				set @parent = '' ;
			elseif @bCampos = 'seguimiento' then
				set @cResultadoB = concat(@cResultadoB, ' and ', @tablaBA, 'seguimiento ') ;
				set @parent = '' ;
			elseif @bCampos = 'contacto' then
				set @cResultadoB = concat(@cResultadoB, ' and ', @tablaBA, 'contacto ') ;
				set @parent = '' ;
			elseif @bCampos = 'zcode' then
				set @cResultadoB = concat(@cResultadoB, ' and ', @tablaBA, 'zcode ') ;
				set @parent = '' ;
			elseif @bCampos = 'email' then
				set @cResultadoB = concat(@cResultadoB, ' and ', @tablaBA, 'email ') ;
				set @parent = '' ;
			elseif @bCampos = 'telefono' then
				set @cResultadoB = concat(@cResultadoB, ' and ', @tablaBA, 'telefono ') ;
				set @parent = '' ;
			elseif @bCampos = 'usuario' then
				set @cResultadoB = concat(@cResultadoB, ' and ', @tablaBA, 'usuario in (select u201 from tb_musuario where u202 ') ;
			elseif @bCampos = 'nusuario' then
				set @cResultadoB = concat(@cResultadoB, ' and ', @tablaBA, 'usuario in (select u201 from tb_musuario where u202 ') ;
			elseif @bCampos = 'cliente' then
				set @cResultadoB = concat(@cResultadoB, ' and ', @tablaBA,' cliente in (select codigo from tb_f_mcliente ', @empresa, @sucursal,' and nombre ') ;
			elseif @bCampos = 'ncliente' then
				set @cResultadoB = concat(@cResultadoB, ' and ', @tablaBA,' cliente in (select codigo from tb_f_mcliente ', @empresa, @sucursal,' and nombre ') ;
			elseif @bCampos = 'plantilla' then
				set @cResultadoB = concat(@cResultadoB, ' and ', @tablaBA,' plantilla in (select codigo from tb_f_mplantilla ', @empresa, @sucursal,' and nombre ') ;
			elseif @bCampos = 'nplantilla' then
				set @cResultadoB = concat(@cResultadoB, ' and ', @tablaBA,' plantilla in (select codigo from tb_f_mplantilla ', @empresa, @sucursal,' and nombre ') ;
			elseif @bCampos = 'grupo' then
				set @cResultadoB = concat(@cResultadoB, ' and ', @tablaBA,' grupo in (select codigo from tb_f_mgrupo ', @empresa, @sucursal,' and nombre ') ;
			elseif @bCampos = 'ngrupo' then
				set @cResultadoB = concat(@cResultadoB, ' and ', @tablaBA,' grupo in (select codigo from tb_f_mgrupo ', @empresa, @sucursal,' and nombre ') ;
			elseif @bCampos = 'personal' then
				set @cResultadoB = concat(@cResultadoB, ' and ', @tablaBA,' personal in (select codigo from tb_f_mpersonal ', @empresa, @sucursal,' and nombre ') ;
			elseif @bCampos = 'npersonal' then
				set @cResultadoB = concat(@cResultadoB, ' and ', @tablaBA,' personal in (select codigo from tb_f_mpersonal ', @empresa, @sucursal,' and nombre ') ;
			elseif @bCampos = 'proyecto' then
				set @cResultadoB = concat(@cResultadoB, ' and ', @tablaBA,' proyecto in (select codigo from tb_f_mproyecto ', @empresa, @sucursal,' and nombre ') ;
			elseif @bCampos = 'nproyecto' then
				set @cResultadoB = concat(@cResultadoB, ' and ', @tablaBA,' proyecto in (select codigo from tb_f_mproyecto ', @empresa, @sucursal,' and nombre ') ;
			elseif @bCampos = 'role' then
				set @cResultadoB = concat(@cResultadoB, ' and ', @tablaBA,' role in (select codigo from tb_f_mrole ', @empresa, @sucursal,' and nombre ') ;
			elseif @bCampos = 'nrole' then
				set @cResultadoB = concat(@cResultadoB, ' and ', @tablaBA,' role in (select codigo from tb_f_mrole ', @empresa, @sucursal,' and nombre ') ;
			elseif @bCampos = 'supervisor' then
				set @cResultadoB = concat(@cResultadoB, ' and ', @tablaBA,' supervisor in (select codigo from tb_f_msupervisor ', @empresa, @sucursal,' and nombre ') ;
			elseif @bCampos = 'nsupervisor' then
				set @cResultadoB = concat(@cResultadoB, ' and ', @tablaBA,' supervisor in (select codigo from tb_f_msupervisor ', @empresa, @sucursal,' and nombre ') ;
			else
				set @cResultadoB = @cResultadoB ;
			end if ;
		else	
			set @cResultadoB = concat(@cResultadoB, ' and ', @tablaBA, @bCampos) ;
			set @parent = '' ;
		end if ;
		
		-- ----------------------------------------------------------------------------------------------
		-- Valida el operador a utilizar para comparar el campo vs el valor
		if @operador = 'LIKE' then
			set @cResultadoB = concat(@cResultadoB, ' LIKE ', '''', '%', trim(@valor), '%', '''') ;
		elseif @operador = 'REGEXP' then
			set @cResultadoB = concat(@cResultadoB, ' REGEXP ', '''', trim(@valor), '''') ;
		else
			set @cResultadoB = concat(@cResultadoB, trim(@operador), '''', trim(@valor), '''') ;
		end if;
	else
		-- ----------------------------------------------------------------------------------------------
		-- En caso que no se requiera validar con un maestro, la variable pasa a ser en blanco y un ')' como valor predeterminado
		set @parent = '' ;
	end if ;
	
	-- ----------------------------------------------------------------------------------------------
	-- Integra todas las cadenas armadas para construir el cursor.
	--
	set @cResultadoB = concat(@cResultadoB, @parent) ;
	if coalesce(_regpp, 0) <> 0 then
		set @cResultadoC = concat(' LIMIT ', @iLimiteInicio, ', ',  @iLimite) ;
	else
		set @cResultadoC = '' ;
	end if ;
	-- set @cResultado = concat(@cResultadoA, @cResultadoB, @cOrdenado, @cResultadoC) ;
	set @cResultado = concat(@cResultadoA, @cResultadoB, @cOrdenado, @cResultadoC) ;
	
	-- ----------------------------------------------------------------------------------------------
	-- Se construye la cadena para obtener el Total de Registros.
	set @cResultadoT = concat(@cResultadoTotales, @cResultadoA, @cResultadoB, @cOrdenado);
	drop temporary table if exists sentencia ;
	prepare sentencia from @cResultadoT ;
	execute sentencia ;
	deallocate prepare sentencia;
	
	-- ----------------------------------------------------------------------------------------------
	-- Se construye la cadena para obtener los registros, y se anexa la variable con el total de registros de
	-- @cResultadoT
	select total_filas into @iNumeroFila from sentencia;
	set @iPaginaUltima =  round((@iNumeroFila/@iLimite), 0) ;
	if coalesce(@iPaginaUltima, 0) = 0 then
		set @iPaginaUltima = 1 ;
	end if ;
	
	-- ----------------------------------------------------------------------------------------------
	-- Se construye la cadena para realizar la consulta de los registros a mostrar en la Lista Formulario
	-- segun los parametros indicados.
	-- Se agrega la variable @iPaginaUltima a la cadena antes de realizar la consulta a través del Prepare.
	set @cResultadoI = concat(@cResultadoIniciar, ', @iPagina as PagAct, @iNumeroFila as Filas, round(@iPaginaUltima,0) as PagUltima ', @cResultado);
    
	drop temporary table if exists sentencia ;
	prepare sentencia from @cResultadoI ;
	execute sentencia ;
	deallocate prepare sentencia;
	
    -- ----------------------------------------------------------------------------------------------
    -- La Cadena de consulta que se devolvera estara vacia, dado que ya no se requiere.
    -- ----------------------------------------------------------------------------------------------
    -- set _cResultado = '';
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `str_cadena_ba` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `str_cadena_ba`(
	in _codemp varchar(2),
	in _sucursal varchar(3),
	in _tabla varchar(25),
	in _bcampos varchar(25),
	in _operador varchar(25),
	in _valor varchar(100),
	in _tipoBusq int(1),
	out _cresultado varchar(1500)
)
begin
	/* ---------------------------------------------------
		Busqueda y paginador generico de formularios listas
		Versión 1.0
		Creado: 2024.12.01
		Actualizado: 2024.12.16
		Autor: 
	--------------------------------------------------- */
    
	-- Validación de parámetros
    if (_codemp is null) OR (_sucursal is null) or (_tabla is null) or (_bcampos is null)  or (_operador is null) then
        signal sqlstate '45000'
            set message_text = 'Parámetros incompletos. Todos los campos deben estar especificados.';
    end if ;
    
	set @cResultado = '' ;
	set @parent = ')' ;
	set @tabla = concat(trim(_tabla), '.') ;
	set @valor = coalesce(_valor, '') ;
	set @bCampos = coalesce(_bCampos, '') ;
	set @operador = coalesce(_operador, '') ;
	set @tipoBusq = coalesce(_tipoBusq, 0) ;
	set @sucursal = '' ;
	
	set @empresa = concat(' where codemp = ', coalesce(_codemp, '')) ;
	if trim(coalesce(_sucursal, '')) <> '' then
		set @sucursal = concat(' and sucursal = ', coalesce(_sucursal, '')) ;
	end if ;
	
	if trim(@valor) <> '' then
		if @tipoBusq = 1 then
			-- ----------------------------------------------------------------------------------------------
			-- según el campo que pasamos como parámetro, se anexará a la cadena la búsqueda según el maestro o campo indicado.
			if @bCampos = 'apellido' then
				set @cResultado = concat(@cResultado, ' and ', @tabla, 'historia in (select historia from tb_m_mpaciente ', @empresa, @sucursal, ' and apellido ' ) ;
			end if ;
			if @bCampos = 'nombre' then
				set @cResultado = concat(@cResultado, ' and ', @tabla, 'historia in (select historia from tb_m_mpaciente ', @empresa, @sucursal,' and nombre ' ) ;
			end if ;
			if @bCampos = 'cedula' then
				set @cResultado = concat(@cResultado, ' and ', @tabla, 'historia in (select historia from tb_m_mpaciente ', @empresa, @sucursal,' and cedula ' ) ;
			end if ;
			if @bCampos = 'medico' then
				set @cResultado = concat(@cResultado, ' and ', @tabla,' medico in (select codigo from tb_m_mprofesional ', @empresa, @sucursal,' and nombre ') ;
			end if ;
			if @bCampos = 'nmedico' then
				set @cResultado = concat(@cResultado, ' and ', @tabla,' medico in (select codigo from tb_m_mprofesional ', @empresa, @sucursal,' and nombre ') ;
			end if ;
			if @bCampos = 'procedimiento' then
				set @cResultado = concat(@cResultado, ' and ', @tabla, 'procedimiento in (select codigo from tb_m_mprocedimiento ', @empresa, @sucursal,' and nombre ') ;
			end if ;
			if @bCampos = 'nprocedimiento' then
				set @cResultado = concat(@cResultado, ' and ', @tabla, 'procedimiento in (select codigo from tb_m_mprocedimiento ', @empresa, @sucursal,' and nombre ') ;
			end if ;
			if @bCampos = 'servicio_ntipo' then
				set @cResultado = concat(@cResultado, ' and ', @tabla, 'tipo in (select codigo from tb_m_mservicio_tipo ', @empresa, @sucursal,' and nombre ') ;
			end if ;
			if @bCampos = 'numero' then
				set @cResultado = concat(@cResultado, ' and ', @tabla, 'numero ') ;
				set @parent = '' ;
			end if ;
			if @bCampos = 'presupuesto' then
				set @cResultado = concat(@cResultado, ' and ', @tabla, 'presupuesto ') ;
				set @parent = '' ;
			end if ;
			if @bCampos = 'historia' then
				set @cResultado = concat(@cResultado, ' and ', @tabla, 'historia ') ;
				set @parent = '' ;
			end if ;
		else
			set @cResultado = concat(@cResultado, ' and ', @tabla, @bCampos) ;
			set @parent = '' ;
		end if ;
		-- ----------------------------------------------------------------------------------------------
		-- Valida el operador a utilizar para comparar el campo vs el valor
		if @operador = 'LIKE' then
			set @cResultado = concat(@cResultado, ' LIKE ', '''', '%', trim(@valor), '%', '''') ;
		elseif @operador = 'REGEXP' then
			set @cResultado = concat(@cResultado, ' REGEXP ', '''', trim(@valor), '''') ;
		else
			set @cResultado = concat(@cResultado, trim(@operador), '''', trim(@valor), '''') ;
		end if;
	else
		set @parent = '' ;
	end if ;
	
	set @cResultado = concat(@cResultado, @parent) ;
	set _cResultado = @cResultado ;
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `str_cadena_campo_extra` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `str_cadena_campo_extra`(
	in _codemp varchar(2), 
	in _sucursal varchar(3), 
	in _tabla varchar(100), 
	in _tablaBA varchar(25), 
	in _jointb varchar(2000),
	in _camposA varchar(1000), 
	in _camposB varchar(1000),
	in _ordenado varchar(50), 
	in _bCampos varchar(1000), 
	in _operador varchar(6), 
	in _valor varchar(100), 
	in _pagina int, 
	in _regpp int, 
	in _adicional varchar(5000), 
    in _campoextra varchar(5000), 
	in _tipo_estado varchar(3),
	in _estado int,
	in _desde varchar(10),
	in _hasta varchar(10),
	in _tipoBusq int(1),
	out _cResultado Varchar(5000)
)
begin
	/* ------------------------------------------------------------------------------------------------------
		Busqueda y paginador generico de formularios listas
		Versión 1.0
		Creado: 2024.12.01
		Actualizado: 2024.12.16, 2024.12.29, 2025.01.21, 2025-05-06
		Autor: 
	------------------------------------------------------------------------------------------------------ */
    
	-- Validación de parámetros
	set @iLimite = coalesce(_regpp, 25) ;
	set @iPagina = coalesce(_pagina, 1) ;
	set @iLimiteInicio = ((@iPagina - 1) * @iLimite) ;
	set @nRowTotal = 0 ;
	set @Fila = 0 ;
	
	set @cResultadoA = '' ;
	set @cResultadoB = '' ;
	set @cResultadoC = '' ;
	set @cResultadoI = '' ;
	set @cResultadoT = '' ;
	set @parent = ')' ;
	
	set @sucursal = '' ;
	set @tabla = concat(trim(_tabla), '.') ;
	set @tablaBA = concat(trim(_tablaBA), '.') ;
	set @valor = coalesce(trim(_valor), '') ;
	set @bCampos = coalesce(trim(_bCampos), '') ;
	set @operador = coalesce(_operador, '') ;
	set @tipoBusq = coalesce(_tipoBusq, 0) ;
    set @jointb = coalesce(trim(_jointb), '') ;
    set @adicional = coalesce(trim(_adicional), '') ;
    set @campoextra = coalesce(trim(_campoextra), '') ;
	set @cJoinOrdenB = '' ;
	set @cJoinCampoO = '' ;
	
	-- ----------------------------------------------------------------------------------------------
	-- Proceso para Ordenar la consulta de la tabla
	
	if coalesce(_ordenado, '') = 'ncliente' then
		set @cJoinOrdenB = concat(' left join tb_f_mcliente on ', @tabla, 'codemp = tb_f_mcliente.codemp and ', @tabla, 'sucursal = tb_f_mcliente.sucursal and ', @tabla, 'cliente = tb_f_mcliente.codigo ') ; 
		set @cJoinCampoO = concat(', tb_f_mcliente.nombre') ; 
		set @cOrdenado = concat(' order by tb_f_mcliente.nombre') ;
	elseif coalesce(_ordenado, '') = 'nplantilla' then
		set @cJoinOrdenB = concat(' left join tb_f_mplantilla on ', @tabla, 'codemp = tb_f_mplantilla.codemp and ', @tabla, 'sucursal = tb_f_mplantilla.sucursal and ', @tabla, 'plantilla = tb_f_mplantilla.codigo ') ; 
		set @cJoinCampoO = concat(', tb_f_mplantilla.codigo') ; 
		set @cOrdenado = concat(' order by tb_f_mplantilla.nombre') ;
	elseif coalesce(_ordenado, '') = 'ngrupo' then
		set @cJoinOrdenB = concat(' left join tb_f_mgrupo on ', @tabla, 'codemp = tb_f_mgrupo.codemp and ', @tabla, 'sucursal = tb_f_mgrupo.sucursal and ', @tabla, 'grupo = tb_f_mgrupo.codigo ') ; 
		set @cJoinCampoO = concat(', tb_f_mgrupo.nombre') ; 
		set @cOrdenado = concat(' order by tb_f_mgrupo.nombre') ;
	elseif coalesce(_ordenado, '') = 'npersonal' then
		set @cJoinOrdenB = concat(' left join tb_f_mpersonal on ', @tabla, 'codemp = tb_f_mpersonal.codemp and ', @tabla, 'sucursal = tb_f_mpersonal.sucursal and ', @tabla, 'personal = tb_f_mpersonal.codigo ') ; 
		set @cJoinCampoO = concat(', tb_f_mpersonal.nombre') ; 
		set @cOrdenado = concat(' order by tb_f_mpersonal.nombre') ;
	elseif coalesce(_ordenado, '') = 'nrole' then
		set @cJoinOrdenB = concat(' left join tb_f_mrole on ', @tabla, 'codemp = tb_f_mrole.codemp and ', @tabla, 'sucursal = tb_f_mrole.sucursal and ', @tabla, 'role = tb_f_mrole.codigo ') ; 
		set @cJoinCampoO = concat(', tb_f_mrole.nombre') ; 
		set @cOrdenado = concat(' order by tb_f_mrole.nombre') ;
	elseif coalesce(_ordenado, '') = 'nproyecto' then
		set @cJoinOrdenB = concat(' left join tb_f_mproyecto on ', @tabla, 'codemp = tb_f_mproyecto.codemp and ', @tabla, 'sucursal = tb_f_mproyecto.sucursal and ', @tabla, 'proyecto = tb_f_mproyecto.codigo ') ; 
		set @cJoinCampoO = concat(', tb_f_mproyecto.nombre') ; 
		set @cOrdenado = concat(' order by tb_f_mproyecto.nombre') ;
	elseif coalesce(_ordenado, '') = 'nsupervisor' then
		set @cJoinOrdenB = concat(' left join tb_f_msupervisor on ', @tabla, 'codemp = tb_f_msupervisor.codemp and ', @tabla, 'sucursal = tb_f_msupervisor.sucursal and ', @tabla, 'supervisor = tb_f_msupervisor.codigo ') ; 
		set @cJoinCampoO = concat(', tb_f_msupervisor.nombre') ; 
		set @cOrdenado = concat(' order by tb_f_msupervisor.nombre') ;
	else 
		set @cOrdenado = concat(' order by ',  @tabla, _ordenado) ;
		set @cJoinCampoO = concat(', ', @tabla, _ordenado) ; 
	end if ;
	set @cJoinCampoO = concat(@cJoinCampoO, '  as xOrdenado') ; 
	-- ----------------------------------------------------------------------------------------------
	-- Se crea una cadena para filtral por empresa y sucursal
	set @empresa = concat(' where ', @tabla, 'codemp = ', _codemp);
	if trim(_sucursal) <> '' then
		set @sucursal = concat(' and ', @tabla, 'sucursal = ', _sucursal);
	end if;
	
	-- ----------------------------------------------------------------------------------------------
	-- Crea dos cadena: 
	-- 		cResultadoIniciar: 	realizar la búsqueda de los registros que se mostraran como resultado final segun los parametros indicados
	-- 		cResultadoTotales: 	realiza una consulta para obtener el total de registro en la consulta por medio de un COUNT(*)
	-- 		COUNT(*):			sustituye la funcion SQL_CALC_FOUND_ROWS, dado que el FOUND_ROWS() no funciona ahora con el prepare y deallocate prepare
	--
	
	set @cResultadoIniciar = concat('create temporary table sentencia select ', @tabla, '*, ', @campoextra, '(@fila:= @fila + 1) as RegFila',  @cJoinCampoO) ;
	set @cResultadoTotales = concat('create temporary table sentencia select COUNT(*) total_filas ');
	if coalesce(_camposB, '') <> '' then
		set @cResultadoA = concat(@cResultadoA, _camposB) ;
	end if ;
	
	-- ----------------------------------------------------------------------------------------------
	set @cResultadoA = concat(@cResultadoA, '  from ', _tabla) ;
	if coalesce(@jointb, '') <> '' then
		set @cResultadoA = concat(@cResultadoA, ' ', coalesce(@jointb, ''), ' ');
	end if ;
	
	-- ----------------------------------------------------------------------------------------------
	-- Agrega el LEFT JOIN de la Tabla por la que ordenara la busqueda.
	set @cResultadoA = concat(@cResultadoA, ' ', coalesce(@cJoinOrdenB, '') ) ;
	
	-- ----------------------------------------------------------------------------------------------
	set @cResultadoA = concat(@cResultadoA, @empresa, @sucursal) ;
	if trim(coalesce(@adicional, '')) <> '' then
		set @cResultadoA = concat(@cResultadoA, ' and ', @tablaBA, trim(@adicional));
	end if;
	
	if coalesce(_estado, 0) > 0 then
		set @cResultadoA = concat(@cResultadoA, ' and ', @tabla, 'estado = ', coalesce(_estado, 0));
	else 
		set @cResultadoA = concat(@cResultadoA, ' and ', @tabla, 'estado > 0 ');
	end if ;
	
	-- ----------------------------------------------------------------------------------------------
	-- De pasar la fecha como parametro, se incluye la opción para el rango de fecha
	--
	if trim(coalesce(_desde, '')) <> '' and _tipoBusq = 1 then
		set @desde = STR_TO_DATE(Trim(_desde), '%m/%d/%Y');
		set @hasta = STR_TO_DATE(Trim(_hasta), '%m/%d/%Y');
        if (@tabla = 'tb_f_otimesheet.') then
			set @cResultadoA = CONCAT(@cResultadoA, ' and ', @tabla, 'fecha_d between ', QUOTE(@desde), ' and ', QUOTE(@hasta));
        else
			set @cResultadoA = CONCAT(@cResultadoA, ' and ', @tabla, 'fecha between ', QUOTE(@desde), ' and ', QUOTE(@hasta));
		end if ;
	end if ;
	
	if trim(@valor) <> '' then
		if @tipoBusq = 1 then
			-- ----------------------------------------------------------------------------------------------
			-- Según el campo por el que se realizará la búsqueda, se anexará a la cadena validado por la tabla del maestro que lo rige
			-- es importante que el campo a validar en la búsqueda se encuentre dentro de las siguientes opciones, de lo contrario se deberá anexar
			-- para que se incorpore a la cadena.
			--
			if @bCampos = 'numero' then
				set @cResultadoB = concat(@cResultadoB, ' and ', @tablaBA, 'numero ') ;
				set @parent = '' ;
			elseif @bCampos = 'referencia' then
				set @cResultadoB = concat(@cResultadoB, ' and ', @tablaBA, 'referencia ') ;
				set @parent = '' ;
			elseif @bCampos = 'seguimiento' then
				set @cResultadoB = concat(@cResultadoB, ' and ', @tablaBA, 'seguimiento ') ;
				set @parent = '' ;
			elseif @bCampos = 'contacto' then
				set @cResultadoB = concat(@cResultadoB, ' and ', @tablaBA, 'contacto ') ;
				set @parent = '' ;
			elseif @bCampos = 'zcode' then
				set @cResultadoB = concat(@cResultadoB, ' and ', @tablaBA, 'zcode ') ;
				set @parent = '' ;
			elseif @bCampos = 'email' then
				set @cResultadoB = concat(@cResultadoB, ' and ', @tablaBA, 'email ') ;
				set @parent = '' ;
			elseif @bCampos = 'telefono' then
				set @cResultadoB = concat(@cResultadoB, ' and ', @tablaBA, 'telefono ') ;
				set @parent = '' ;
			elseif @bCampos = 'usuario' then
				set @cResultadoB = concat(@cResultadoB, ' and ', @tablaBA, 'usuario in (select u201 from tb_musuario where u202 ') ;
			elseif @bCampos = 'nusuario' then
				set @cResultadoB = concat(@cResultadoB, ' and ', @tablaBA, 'usuario in (select u201 from tb_musuario where u202 ') ;
			elseif @bCampos = 'cliente' then
				set @cResultadoB = concat(@cResultadoB, ' and ', @tablaBA,' cliente in (select codigo from tb_f_mcliente ', @empresa, @sucursal,' and nombre ') ;
			elseif @bCampos = 'ncliente' then
				set @cResultadoB = concat(@cResultadoB, ' and ', @tablaBA,' cliente in (select codigo from tb_f_mcliente ', @empresa, @sucursal,' and nombre ') ;
			elseif @bCampos = 'plantilla' then
				set @cResultadoB = concat(@cResultadoB, ' and ', @tablaBA,' plantilla in (select codigo from tb_f_mplantilla ', @empresa, @sucursal,' and nombre ') ;
			elseif @bCampos = 'nplantilla' then
				set @cResultadoB = concat(@cResultadoB, ' and ', @tablaBA,' plantilla in (select codigo from tb_f_mplantilla ', @empresa, @sucursal,' and nombre ') ;
			elseif @bCampos = 'grupo' then
				set @cResultadoB = concat(@cResultadoB, ' and ', @tablaBA,' grupo in (select codigo from tb_f_mgrupo ', @empresa, @sucursal,' and nombre ') ;
			elseif @bCampos = 'ngrupo' then
				set @cResultadoB = concat(@cResultadoB, ' and ', @tablaBA,' grupo in (select codigo from tb_f_mgrupo ', @empresa, @sucursal,' and nombre ') ;
			elseif @bCampos = 'personal' then
				set @cResultadoB = concat(@cResultadoB, ' and ', @tablaBA,' personal in (select codigo from tb_f_mpersonal ', @empresa, @sucursal,' and nombre ') ;
			elseif @bCampos = 'npersonal' then
				set @cResultadoB = concat(@cResultadoB, ' and ', @tablaBA,' personal in (select codigo from tb_f_mpersonal ', @empresa, @sucursal,' and nombre ') ;
			elseif @bCampos = 'proyecto' then
				set @cResultadoB = concat(@cResultadoB, ' and ', @tablaBA,' proyecto in (select codigo from tb_f_mproyecto ', @empresa, @sucursal,' and nombre ') ;
			elseif @bCampos = 'nproyecto' then
				set @cResultadoB = concat(@cResultadoB, ' and ', @tablaBA,' proyecto in (select codigo from tb_f_mproyecto ', @empresa, @sucursal,' and nombre ') ;
			elseif @bCampos = 'role' then
				set @cResultadoB = concat(@cResultadoB, ' and ', @tablaBA,' role in (select codigo from tb_f_mrole ', @empresa, @sucursal,' and nombre ') ;
			elseif @bCampos = 'nrole' then
				set @cResultadoB = concat(@cResultadoB, ' and ', @tablaBA,' role in (select codigo from tb_f_mrole ', @empresa, @sucursal,' and nombre ') ;
			elseif @bCampos = 'supervisor' then
				set @cResultadoB = concat(@cResultadoB, ' and ', @tablaBA,' supervisor in (select codigo from tb_f_msupervisor ', @empresa, @sucursal,' and nombre ') ;
			elseif @bCampos = 'nsupervisor' then
				set @cResultadoB = concat(@cResultadoB, ' and ', @tablaBA,' supervisor in (select codigo from tb_f_msupervisor ', @empresa, @sucursal,' and nombre ') ;
			else
				set @cResultadoB = @cResultadoB ;
			end if ;
		else	
			set @cResultadoB = concat(@cResultadoB, ' and ', @tablaBA, @bCampos) ;
			set @parent = '' ;
		end if ;
		
		-- ----------------------------------------------------------------------------------------------
		-- Valida el operador a utilizar para comparar el campo vs el valor
		if @operador = 'LIKE' then
			set @cResultadoB = concat(@cResultadoB, ' LIKE ', '''', '%', trim(@valor), '%', '''') ;
		elseif @operador = 'REGEXP' then
			set @cResultadoB = concat(@cResultadoB, ' REGEXP ', '''', trim(@valor), '''') ;
		else
			set @cResultadoB = concat(@cResultadoB, trim(@operador), '''', trim(@valor), '''') ;
		end if;
	else
		-- ----------------------------------------------------------------------------------------------
		-- En caso que no se requiera validar con un maestro, la variable pasa a ser en blanco y un ')' como valor predeterminado
		set @parent = '' ;
	end if ;
	
	-- ----------------------------------------------------------------------------------------------
	-- Integra todas las cadenas armadas para construir el cursor.
	--
	set @cResultadoB = concat(@cResultadoB, @parent) ;
	if coalesce(_regpp, 0) <> 0 then
		set @cResultadoC = concat(' LIMIT ', @iLimiteInicio, ', ',  @iLimite) ;
	else
		set @cResultadoC = '' ;
	end if ;
	-- set @cResultado = concat(@cResultadoA, @cResultadoB, @cOrdenado, @cResultadoC) ;
	set @cResultado = concat(@cResultadoA, @cResultadoB, @cOrdenado, @cResultadoC) ;
	
	-- ----------------------------------------------------------------------------------------------
	-- Se construye la cadena para obtener el Total de Registros.
	set @cResultadoT = concat(@cResultadoTotales, @cResultadoA, @cResultadoB, @cOrdenado);
	drop temporary table if exists sentencia ;
	prepare sentencia from @cResultadoT ;
	execute sentencia ;
	deallocate prepare sentencia;
	
	-- ----------------------------------------------------------------------------------------------
	-- Se construye la cadena para obtener los registros, y se anexa la variable con el total de registros de
	-- @cResultadoT
	select total_filas into @iNumeroFila from sentencia;
	set @iPaginaUltima =  round((@iNumeroFila/@iLimite), 0) ;
	if coalesce(@iPaginaUltima, 0) = 0 then
		set @iPaginaUltima = 1 ;
	end if ;
	
	-- ----------------------------------------------------------------------------------------------
	-- Se construye la cadena para realizar la consulta de los registros a mostrar en la Lista Formulario
	-- segun los parametros indicados.
	-- Se agrega la variable @iPaginaUltima a la cadena antes de realizar la consulta a través del Prepare.
	set @cResultadoI = concat(@cResultadoIniciar, ', @iPagina as PagAct, @iNumeroFila as Filas, round(@iPaginaUltima,0) as PagUltima ', @cResultado);
    
	drop temporary table if exists sentencia ;
	prepare sentencia from @cResultadoI ;
	execute sentencia ;
	deallocate prepare sentencia;
	
    -- ----------------------------------------------------------------------------------------------
    -- La Cadena de consulta que se devolvera estara vacia, dado que ya no se requiere.
    -- ----------------------------------------------------------------------------------------------
    -- set _cResultado = '';
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `str_cadena_codigo` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `str_cadena_codigo`(
	in _codemp varchar(2), 
	in _sucursal varchar(3), 
	in _tabla varchar(100), 
	in _tablaBA varchar(25), 
	in _jointb varchar(1000),
	in _camposA varchar(1000), 
	in _camposB varchar(1000),
	in _ordenado varchar(50), 
	in _bCampos varchar(1000), 
	in _operador varchar(6), 
	in _valor varchar(100), 
	in _pagina int, 
	in _regpp int, 
	in _adicional varchar(5000), 
	in _tipo_estado varchar(3),
	in _estado int,
	in _desde varchar(10),
	in _hasta varchar(10),
	in _tipoBusq int(1),
	out _cResultado Varchar(5000)
)
begin
	/* ---------------------------------------------------
		Busqueda y paginador generico de formularios listas
		Versión 1.0
		Creado: 2024.12.01
		Actualizado: 2024.12.16, 2024.12.29
		Autor: 
	--------------------------------------------------- */
    
	-- Validación de parámetros
	set @iLimite = coalesce(_regpp, 25) ;
	set @iPagina = coalesce(_pagina, 1) ;
	set @iLimiteInicio = ((@iPagina - 1) * @iLimite) ;
	set @nRowTotal = 0 ;
	set @Fila = 0 ;
	
	set @cResultadoA = '' ;
	set @cResultadoB = '' ;
	set @cResultadoC = '' ;
	set @cResultadoI = '' ;
	set @cResultadoT = '' ;
	set @parent = ')' ;
	
	set @sucursal = '' ;
	set @tabla = concat(trim(_tabla), '.') ;
	set @tablaBA = concat(trim(_tablaBA), '.') ;
	set @valor = coalesce(trim(_valor), '') ;
	set @bCampos = coalesce(trim(_bCampos), '') ;
	set @operador = coalesce(_operador, '') ;
	set @tipoBusq = coalesce(_tipoBusq, 0) ;
	set @cJoinOrdenB = '' ;
	set @cJoinCampoO = '' ;
	
	set @cOrdenado = concat(' order by ', _ordenado) ;
	set @cJoinCampoO = concat(', ', @tabla, _ordenado) ; 
	set @cJoinCampoO = concat(@cJoinCampoO, '  as xOrdenado') ; 
	-- ----------------------------------------------------------------------------------------------
	-- Se crea una cadena para filtral por empresa y sucursal
	set @empresa = concat(' where ', @tabla, 'codigo = ', _codemp);
	
	
	-- ----------------------------------------------------------------------------------------------
	-- Crea dos cadena: 
	-- 		cResultadoIniciar: 	realizar la búsqueda de los registros que se mostraran como resultado final segun los parametros indicados
	-- 		cResultadoTotales: 	realiza una consulta para obtener el total de registro en la consulta por medio de un COUNT(*)
	-- 		COUNT(*):			sustituye la funcion SQL_CALC_FOUND_ROWS, dado que el FOUND_ROWS() no funciona ahora con el prepare y deallocate prepare
	--
	
	set @cResultadoIniciar = concat('create temporary table sentencia select ', @tabla, '*, (@fila:= @fila + 1) as RegFila',  @cJoinCampoO) ;
	set @cResultadoTotales = concat('create temporary table sentencia select COUNT(*) total_filas ');
	if coalesce(_camposB, '') <> '' then
		set @cResultadoA = concat(@cResultadoA, _camposB) ;
	end if ;
	
	-- ----------------------------------------------------------------------------------------------
	set @cResultadoA = concat(@cResultadoA, '  from ', _tabla) ;
	if coalesce(_jointb, '') <> '' then
		set @cResultadoA = concat(@cResultadoA, ' ', coalesce(_jointb, ''));
	end if ;
	
	-- ----------------------------------------------------------------------------------------------
	-- Agrega el LEFT JOIN de la Tabla por la que ordenara la busqueda.
	set @cResultadoA = concat(@cResultadoA, ' ', coalesce(@cJoinOrdenB, '') ) ;
	
	-- ----------------------------------------------------------------------------------------------
	set @cResultadoA = concat(@cResultadoA, @empresa, @sucursal) ;
	if trim(coalesce(_adicional, '')) <> '' then
		set @cResultadoA = concat(@cResultadoA, ' and ', @tabla, trim(_adicional));
	end if;
	
	if coalesce(_estado, 0) > 0 then
		set @cResultadoA = concat(@cResultadoA, ' and ', @tabla, 'estado = ', coalesce(_estado, 0));
	else 
		set @cResultadoA = concat(@cResultadoA, ' and ', @tabla, 'estado > 0 ');
	end if ;
	
	-- ----------------------------------------------------------------------------------------------
	-- De pasar la fecha como parametro, se incluye la opción para el rango de fecha
	--
	if trim(coalesce(_desde, '')) <> '' and _tipoBusq = 1 then
		set @desde = STR_TO_DATE(Trim(_desde), '%m/%d/%Y');
		set @hasta = STR_TO_DATE(Trim(_hasta), '%m/%d/%Y');
		set  @cResultadoA = CONCAT(@cResultadoA, ' and ', @tabla, 'fecha between ', QUOTE(@desde), ' and ', QUOTE(@hasta));
	end if ;
	
	if trim(@valor) <> '' then
		set @cResultadoB = concat(@cResultadoB, ' and ', @tablaBA, @bCampos) ;
		set @parent = '' ;
		
		-- ----------------------------------------------------------------------------------------------
		-- Valida el operador a utilizar para comparar el campo vs el valor
		if @operador = 'LIKE' then
			set @cResultadoB = concat(@cResultadoB, ' LIKE ', '''', '%', trim(@valor), '%', '''') ;
		elseif @operador = 'REGEXP' then
			set @cResultadoB = concat(@cResultadoB, ' REGEXP ', '''', trim(@valor), '''') ;
		else
			set @cResultadoB = concat(@cResultadoB, trim(@operador), '''', trim(@valor), '''') ;
		end if;
	else
		-- ----------------------------------------------------------------------------------------------
		-- En caso que no se requiera validar con un maestro, la variable pasa a ser en blanco y un ')' como valor predeterminado
		set @parent = '' ;
	end if ;
	
	-- ----------------------------------------------------------------------------------------------
	-- Integra todas las cadenas armadas para construir el cursor.
	--
	set @cResultadoB = concat(@cResultadoB, @parent) ;
	if coalesce(_regpp, 0) <> 0 then
		set @cResultadoC = concat(' LIMIT ', @iLimiteInicio, ', ',  @iLimite) ;
	else
		set @cResultadoC = '' ;
	end if ;
	-- set @cResultado = concat(@cResultadoA, @cResultadoB, @cOrdenado, @cResultadoC) ;
	set @cResultado = concat(@cResultadoA, @cResultadoB, @cOrdenado, @cResultadoC) ;
	
	-- ----------------------------------------------------------------------------------------------
	-- Se construye la cadena para obtener el Total de Registros.
	set @cResultadoT = concat(@cResultadoTotales, @cResultadoA, @cResultadoB, @cOrdenado);
	drop temporary table if exists sentencia ;
	prepare sentencia from @cResultadoT ;
	execute sentencia ;
	deallocate prepare sentencia;
	
	-- ----------------------------------------------------------------------------------------------
	-- Se construye la cadena para obtener los registros, y se anexa la variable con el total de registros de
	-- @cResultadoT
	select total_filas into @iNumeroFila from sentencia;
	set @iPaginaUltima =  round((@iNumeroFila/@iLimite), 0) ;
	if coalesce(@iPaginaUltima, 0) = 0 then
		set @iPaginaUltima = 1 ;
	end if ;
	
	-- ----------------------------------------------------------------------------------------------
	-- Se construye la cadena para realizar la consulta de los registros a mostrar en la Lista Formulario
	-- segun los parametros indicados.
	-- Se agrega la variable @iPaginaUltima a la cadena antes de realizar la consulta a través del Prepare.
	set @cResultadoI = concat(@cResultadoIniciar, ', @iPagina as PagAct, @iNumeroFila as Filas, round(@iPaginaUltima,0) as PagUltima ', @cResultado);
	drop temporary table if exists sentencia ;
	prepare sentencia from @cResultadoI ;
	execute sentencia ;
	deallocate prepare sentencia;
	
    -- ----------------------------------------------------------------------------------------------
    -- La Cadena de consulta que se devolvera estara vacia, dado que ya no se requiere.
    -- ----------------------------------------------------------------------------------------------
    -- set _cResultado = '';
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `str_cadena_dbexternal_c` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `str_cadena_dbexternal_c`(
	in _tablaT varchar(25), 
	in _tablaP varchar(25), 
	in _campo varchar(500), 
	in _jointb varchar(500),
	in _condicion varchar(500),
	in _groupby varchar(500), 
	in _orderby varchar(500)
)
begin
	/* ------------------------------------------------------------------------------------------------------
		Crea una tabla temporal, basada en una DB y tabla pasada como parametro
		Versión 1.0
		Creado: 2025-08-04
		Actualizado: 2025-08-04
		Autor: Custom Systems Solutions LLC
	------------------------------------------------------------------------------------------------------ */
    
	set @tablaT = coalesce(trim(_tablaT), 'tablaTMP') ;
    set @tablaP = coalesce(trim(_tablaP), '') ;
    set @campo = coalesce(trim(_campo), concat(@tablaT, '.*')) ;
    set @jointb = coalesce(_jointb, '') ;
    set @condicion = coalesce(_condicion, '') ;
    set @groupby = coalesce(_groupby, '') ;
    set @orderby = coalesce(_orderby, 'nombre') ;
    
    -- ------------------------------------------------------------------------------------------------------
    set @dropT = concat('drop temporary table if exists ', @tablaT) ;
  	drop temporary table if exists sentencia ;
	prepare sentencia from @dropT ;
	execute sentencia ;  
    
    -- ------------------------------------------------------------------------------------------------------
    set @sentencia = case when (@tablaP != '') 
							then concat('create temporary table ', @tablaT, ' select ', @campo, ' from ', @tablaP, @jointb, @condicion, @groupby, @orderby)
                            else 'select null as nombre, -1 as codigo, 0 as estado'
						end ;
	
	prepare sentencia from @sentencia ;
	execute sentencia ;
	deallocate prepare sentencia;
    
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `str_cadena_group_by` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `str_cadena_group_by`(
	in _codemp varchar(2), 
	in _sucursal varchar(3), 
    in _tabla varchar(20),
	in _campos varchar(1000),
    in _jointb varchar(1000),
    in _condicion varchar(1000),
    in _group_by varchar(1000),
    in _ordenado varchar(500),
	in _bCampos varchar(500), 
	in _operador varchar(5), 
	in _valor varchar(100), 
	in _pagina int, 
	in _regpp int, 
	in _tipoBusq int(1),
	out _cResultado Varchar(5000)
)
begin
	/* ------------------------------------------------------------------------------------------------------
		Busqueda y paginador generico de formularios listas
		Versión 1.0
		Creado: 2025-07-23
		Actualizado: 2025-07-23
		Autor: 
	------------------------------------------------------------------------------------------------------ */
    
	-- Validación de parámetros
	set @iLimite = coalesce(_regpp, 25) ;
	set @iPagina = coalesce(_pagina, 1) ;
	set @iLimiteInicio = ((@iPagina - 1) * @iLimite) ;
	set @nRowTotal = 0 ;
	set @Fila = 0 ;
	
	set @cResultadoA = '' ;
	set @cResultadoB = '' ;
	set @cResultadoC = '' ;
	set @cResultadoI = '' ;
	set @cResultadoT = '' ;
    set @parent = '' ;
	-- set @parent = ')' ;
	
 	set @campos = _campos ;
    set @tabla = trim(_tabla) ;
	set @tablaBA = '_tablaTMP.' ;
    set @jointb = case when coalesce(_jointb, '') = '' then '' else concat(' ',  trim(_jointb)) end ;
    set @condicion = case when coalesce(_condicion, '') = '' then '' else concat(' where ', trim(_condicion)) end ;
    set @group_by = case when coalesce(_group_by, '') = '' then '' else concat(' group by ', trim(_group_by)) end ; 
    
	set @bCampos = coalesce(trim(_bCampos), '') ;
	set @operador = coalesce(_operador, '') ;
	set @valor = coalesce(trim(_valor), '') ;
	set @tipoBusq = coalesce(_tipoBusq, 0) ;
    
	set @cResultado = concat('create temporary table _tablaTMP select ', @campos, ', 4 as estado from ', @tabla, ' ', @jointb, @condicion, @group_by) ;
    
	-- ----------------------------------------------------------------------------------------------
	-- Se construye la cadena para obtener el Total de Registros.
	drop temporary table if exists _tablaTMP ;
	prepare _tablaTMP from @cResultado ;
	execute _tablaTMP ;
	deallocate prepare _tablaTMP;
    
	-- ----------------------------------------------------------------------------------------------
    -- ----------------------------------------------------------------------------------------------
	-- Proceso que realiza una subconsulta según la condición a filtrar
    -- 
	set @cResultado = '' ;
	set @cResultadoIniciar = concat('create temporary table sentencia select _tablaTMP.*, (@fila:= @fila + 1) as RegFila') ;
	set @cResultadoTotales = concat('create temporary table sentencia select COUNT(*) total_filas from _tablaTMP');
    
	-- ----------------------------------------------------------------------------------------------
	-- Integra todas las cadenas armadas para construir el cursor.
	--
	set @cResultadoB = concat(@cResultadoB, @parent) ;
	set @cResultadoC = case when coalesce(_regpp, 0) <> 0 then concat(' LIMIT ', @iLimiteInicio, ', ',  @iLimite) else '' end ;
	set @cResultado = concat(@cResultadoA, @cJoinCampoO, ' from _tablaTMP ', @cResultadoB, @cJoinOrdenB, @cOrdenado, @cResultadoC) ;
	
	-- ----------------------------------------------------------------------------------------------
	-- Se construye la cadena para obtener el Total de Registros.
	set @cResultadoT = concat(@cResultadoTotales, ' ',  @cResultadoB);
	drop temporary table if exists sentencia ;
	prepare sentencia from @cResultadoT ;
	execute sentencia ;
	deallocate prepare sentencia;
	
	-- ----------------------------------------------------------------------------------------------
	-- Se construye la cadena para obtener los registros, y se anexa la variable con el total de registros de
	-- @cResultadoT
	select total_filas into @iNumeroFila from sentencia;
	set @iPaginaUltima =  round((@iNumeroFila/@iLimite), 0) ;
	if coalesce(@iPaginaUltima, 0) = 0 then
		set @iPaginaUltima = 1 ;
	end if ;
	-- ----------------------------------------------------------------------------------------------
	-- Se construye la cadena para realizar la consulta de los registros a mostrar en la Lista Formulario
	-- segun los parametros indicados.
	-- Se agrega la variable @iPaginaUltima a la cadena antes de realizar la consulta a través del Prepare.
	set @cResultadoI = concat(@cResultadoIniciar, ', @iPagina as PagAct, @iNumeroFila as Filas, round(@iPaginaUltima,0) as PagUltima ', @cResultado, '; ');
    
	drop temporary table if exists sentencia ;
	prepare sentencia from @cResultadoI ;
	execute sentencia ;
	deallocate prepare sentencia;
	
    -- ----------------------------------------------------------------------------------------------
    -- La Cadena de consulta que se devolvera estara vacia, dado que ya no se requiere.
    -- ----------------------------------------------------------------------------------------------
    -- set _cResultado = '';
    
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `str_cadena_log` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `str_cadena_log`(
	in _codemp varchar(2), 
	in _sucursal varchar(3), 
	in _tabla varchar(100), 
	in _tablaBA varchar(25), 
	in _jointb varchar(2000),
	in _camposA varchar(1000), 
	in _camposB varchar(1000),
	in _ordenado varchar(50), 
	in _bCampos varchar(1000), 
	in _operador varchar(6), 
	in _valor varchar(100), 
	in _pagina int, 
	in _regpp int, 
	in _adicional varchar(5000), 
	in _tipo_estado varchar(3),
	in _estado int,
	in _desde varchar(10),
	in _hasta varchar(10),
	in _tipoBusq int(1),
	out _cResultado Varchar(5000)
)
begin
	/* ------------------------------------------------------------------------------------------------------
		Busqueda y paginador generico de formularios listas
		Versión 1.0
		Creado: 2024.12.01
		Actualizado: 2024.12.16, 2024.12.29, 2025.01.21
		Autor: 
	------------------------------------------------------------------------------------------------------ */
    
	-- Validación de parámetros
	set @iLimite = coalesce(_regpp, 25) ;
	set @iPagina = coalesce(_pagina, 1) ;
	set @iLimiteInicio = ((@iPagina - 1) * @iLimite) ;
	set @nRowTotal = 0 ;
	set @Fila = 0 ;
	
	set @cResultadoA = '' ;
	set @cResultadoB = '' ;
	set @cResultadoC = '' ;
	set @cResultadoI = '' ;
	set @cResultadoT = '' ;
	set @parent = ')' ;
	
	set @sucursal = '' ;
	set @tabla = concat(trim(_tabla), '.') ;
	set @tablaBA = concat(trim(_tablaBA), '.') ;
	set @valor = coalesce(trim(_valor), '') ;
	set @bCampos = coalesce(trim(_bCampos), '') ;
	set @operador = coalesce(_operador, '') ;
	set @tipoBusq = coalesce(_tipoBusq, 0) ;
    set @jointb = coalesce(trim(_jointb), '') ;
    set @adicional = coalesce(trim(_adicional), '') ;
	set @cJoinOrdenB = '' ;
	set @cJoinCampoO = '' ;
	
	-- ----------------------------------------------------------------------------------------------
	-- Proceso para Ordenar la consulta de la tabla
	
	if coalesce(_ordenado, '') = 'usuario' then
		set @cJoinOrdenB = concat(' left join tb_musuario on ', @tabla, 'usuario = tb_musuario.u201 ') ; 
		set @cJoinCampoO = concat(', tb_musuario.u202') ; 
		set @cOrdenado = concat(' order by tb_musuario.u202') ;
	elseif coalesce(_ordenado, '') = 'nusuario' then
		set @cJoinOrdenB = concat(' left join tb_musuario on ', @tabla, 'usuario = tb_musuario.u201 ') ; 
		set @cJoinCampoO = concat(', tb_musuario.u202') ; 
		set @cOrdenado = concat(' order by tb_musuario.u202') ;
	elseif coalesce(_ordenado, '') = 'nformulario' then
		set @cJoinOrdenB = concat(' left join cfg_lista_formularios on ', @tabla, 'formulario = cfg_lista_formularios.formulario ') ; 
		set @cJoinCampoO = concat(', cfg_lista_formularios.titulo') ; 
		set @cOrdenado = concat(' order by cfg_lista_formularios.titulo') ;
	elseif coalesce(_ordenado, '') = 'noperacion' then
		set @cOrdenado = concat(' order by ',  @tabla, 'operacion') ;
		set @cJoinCampoO = concat(', ', @tabla, 'operacion') ; 
	else 
		set @cOrdenado = concat(' order by ',  @tabla, _ordenado, ' desc') ;
		set @cJoinCampoO = concat(', ', @tabla, _ordenado) ; 
	end if ;
	set @cJoinCampoO = concat(@cJoinCampoO, '  as xOrdenado') ; 
	-- ----------------------------------------------------------------------------------------------
	-- Se crea una cadena para filtral por empresa y sucursal
	set @empresa = concat(' where ', @tabla, 'codemp = ', _codemp);
	if trim(_sucursal) <> '' then
		set @sucursal = concat(' and ', @tabla, 'sucursal = ', _sucursal);
	end if;
	
	-- ----------------------------------------------------------------------------------------------
	-- Crea dos cadena: 
	-- 		cResultadoIniciar: 	realizar la búsqueda de los registros que se mostraran como resultado final segun los parametros indicados
	-- 		cResultadoTotales: 	realiza una consulta para obtener el total de registro en la consulta por medio de un COUNT(*)
	-- 		COUNT(*):			sustituye la funcion SQL_CALC_FOUND_ROWS, dado que el FOUND_ROWS() no funciona ahora con el prepare y deallocate prepare
	--
	
	set @cResultadoIniciar = concat('create temporary table sentencia select ', @tabla, '*, (@fila:= @fila + 1) as RegFila',  @cJoinCampoO) ;
	set @cResultadoTotales = concat('create temporary table sentencia select COUNT(*) total_filas ');
    /*
	if coalesce(_camposB, '') <> '' then
		set @cResultadoA = concat(@cResultadoA, @tabla, _camposB) ;
	end if ;
	*/
	-- ----------------------------------------------------------------------------------------------
	set @cResultadoA = concat(@cResultadoA, '  from ', _tabla) ;
	if coalesce(@jointb, '') <> '' then
		set @cResultadoA = concat(@cResultadoA, ' ', coalesce(@jointb, ''), ' ');
	end if ;
	
	-- ----------------------------------------------------------------------------------------------
	-- Agrega el LEFT JOIN de la Tabla por la que ordenara la busqueda.
	set @cResultadoA = concat(@cResultadoA, ' ', coalesce(@cJoinOrdenB, '') ) ;
	
	-- ----------------------------------------------------------------------------------------------
	set @cResultadoA = concat(@cResultadoA, @empresa, @sucursal) ;
	if trim(coalesce(@adicional, '')) <> '' then
		set @cResultadoA = concat(@cResultadoA, ' and ', @tablaBA, trim(@adicional));
	end if;
    
	/*
	if coalesce(_estado, 0) > 0 then
		set @cResultadoA = concat(@cResultadoA, ' and ', @tabla, 'estado = ', coalesce(_estado, 0));
	else 
		set @cResultadoA = concat(@cResultadoA, ' and ', @tabla, 'estado > 0 ');
	end if ;
	*/
    
	-- ----------------------------------------------------------------------------------------------
	-- De pasar la fecha como parametro, se incluye la opción para el rango de fecha
	--
	if trim(coalesce(_desde, '')) <> '' and _tipoBusq = 1 then
		set @desde = STR_TO_DATE(Trim(_desde), '%m/%d/%Y');
		set @hasta = STR_TO_DATE(Trim(_hasta), '%m/%d/%Y');
		set @cResultadoA = CONCAT(@cResultadoA, ' and date(', @tabla, 'fecha) between ', QUOTE(@desde), ' and ', QUOTE(@hasta));
	end if ;
	
	if trim(@valor) <> '' then
		if @tipoBusq = 1 then
			-- ----------------------------------------------------------------------------------------------
			-- Según el campo por el que se realizará la búsqueda, se anexará a la cadena validado por la tabla del maestro que lo rige
			-- es importante que el campo a validar en la búsqueda se encuentre dentro de las siguientes opciones, de lo contrario se deberá anexar
			-- para que se incorpore a la cadena.
			--
			if @bCampos = 'numero' then
				set @cResultadoB = concat(@cResultadoB, ' and ', @tablaBA, 'numero ') ;
				set @parent = '' ;
			elseif @bCampos = 'usuario' then
				set @cResultadoB = concat(@cResultadoB, ' and ', @tablaBA, 'usuario in (select u201 from tb_musuario where u202 ') ;
			elseif @bCampos = 'nusuario' then
				set @cResultadoB = concat(@cResultadoB, ' and ', @tablaBA, 'usuario in (select u201 from tb_musuario where u202 ') ;
			else
				set @cResultadoB = @cResultadoB ;
			end if ;
		else	
			set @cResultadoB = concat(@cResultadoB, ' and ', @tablaBA, @bCampos) ;
			set @parent = '' ;
		end if ;
		
		-- ----------------------------------------------------------------------------------------------
		-- Valida el operador a utilizar para comparar el campo vs el valor
		if @operador = 'LIKE' then
			set @cResultadoB = concat(@cResultadoB, ' LIKE ', '''', '%', trim(@valor), '%', '''') ;
		elseif @operador = 'REGEXP' then
			set @cResultadoB = concat(@cResultadoB, ' REGEXP ', '''', trim(@valor), '''') ;
		else
			set @cResultadoB = concat(@cResultadoB, trim(@operador), '''', trim(@valor), '''') ;
		end if;
	else
		-- ----------------------------------------------------------------------------------------------
		-- En caso que no se requiera validar con un maestro, la variable pasa a ser en blanco y un ')' como valor predeterminado
		set @parent = '' ;
	end if ;
	
	-- ----------------------------------------------------------------------------------------------
	-- Integra todas las cadenas armadas para construir el cursor.
	--
	set @cResultadoB = concat(@cResultadoB, @parent) ;
	if coalesce(_regpp, 0) <> 0 then
		set @cResultadoC = concat(' LIMIT ', @iLimiteInicio, ', ',  @iLimite) ;
	else
		set @cResultadoC = '' ;
	end if ;
	-- set @cResultado = concat(@cResultadoA, @cResultadoB, @cOrdenado, @cResultadoC) ;
	set @cResultado = concat(@cResultadoA, @cResultadoB, @cOrdenado, @cResultadoC) ;
	
	-- ----------------------------------------------------------------------------------------------
	-- Se construye la cadena para obtener el Total de Registros.
	set @cResultadoT = concat(@cResultadoTotales, @cResultadoA, @cResultadoB, @cOrdenado);
	drop temporary table if exists sentencia ;
	prepare sentencia from @cResultadoT ;
	execute sentencia ;
	deallocate prepare sentencia;
	
	-- ----------------------------------------------------------------------------------------------
	-- Se construye la cadena para obtener los registros, y se anexa la variable con el total de registros de
	-- @cResultadoT
	select total_filas into @iNumeroFila from sentencia;
	set @iPaginaUltima =  round((@iNumeroFila/@iLimite), 0) ;
	if coalesce(@iPaginaUltima, 0) = 0 then
		set @iPaginaUltima = 1 ;
	end if ;
	
	-- ----------------------------------------------------------------------------------------------
	-- Se construye la cadena para realizar la consulta de los registros a mostrar en la Lista Formulario
	-- segun los parametros indicados.
	-- Se agrega la variable @iPaginaUltima a la cadena antes de realizar la consulta a través del Prepare.
	set @cResultadoI = concat(@cResultadoIniciar, ', @iPagina as PagAct, @iNumeroFila as Filas, round(@iPaginaUltima,0) as PagUltima ', @cResultado);
    
    drop temporary table if exists sentencia ;
	prepare sentencia from @cResultadoI ;
	execute sentencia ;
	deallocate prepare sentencia;
    
    -- ----------------------------------------------------------------------------------------------
    -- La Cadena de consulta que se devolvera estara vacia, dado que ya no se requiere.
    -- ----------------------------------------------------------------------------------------------
    -- set _cResultado = '';
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `str_cadena_nocode` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `str_cadena_nocode`(
	in _codemp varchar(2), 
	in _sucursal varchar(3), 
	in _tabla varchar(100), 
	in _tablaBA varchar(25), 
	in _jointb varchar(1000),
	in _camposA varchar(1000), 
	in _camposB varchar(1000),
	in _ordenado varchar(50), 
	in _bCampos varchar(1000), 
	in _operador varchar(6), 
	in _valor varchar(100), 
	in _pagina int, 
	in _regpp int, 
	in _adicional varchar(5000), 
	in _tipo_estado varchar(3),
	in _estado int,
	in _desde varchar(10),
	in _hasta varchar(10),
	in _tipoBusq int(1),
	out _cResultado Varchar(5000)
)
begin
	/* ---------------------------------------------------
		Busqueda y paginador generico de formularios listas
		Versión 1.0
		Creado: 2024.12.01
		Actualizado: 2024.12.29
		Autor: 
	--------------------------------------------------- */
    
	-- Validación de parámetros
	set @iLimite = coalesce(_regpp, 25) ;
	set @iPagina = coalesce(_pagina, 1) ;
	set @iLimiteInicio = ((@iPagina - 1) * @iLimite) ;
	set @nRowTotal = 0 ;
	set @Fila = 0 ;
	
	set @cResultadoA = '' ;
	set @cResultadoB = '' ;
	set @cResultadoC = '' ;
	set @cResultadoI = '' ;
	set @cResultadoT = '' ;
	set @parent = ')' ;
	
	set @sucursal = '' ;
	set @tabla = concat(trim(_tabla), '.') ;
	set @tablaBA = concat(trim(_tablaBA), '.') ;
	set @valor = coalesce(trim(_valor), '') ;
	set @bCampos = coalesce(trim(_bCampos), '') ;
	set @operador = coalesce(_operador, '') ;
	set @tipoBusq = coalesce(_tipoBusq, 0) ;
	set @cJoinOrdenB = '' ;
	set @cJoinCampoO = '' ;
	
	-- ----------------------------------------------------------------------------------------------
	-- Proceso para Ordenar la consulta de la tabla
	set @cOrdenado = concat(' order by ', @tabla, _ordenado) ;
	set @cJoinCampoO = concat(', ', @tabla, _ordenado) ; 
	set @cJoinCampoO = concat(@cJoinCampoO, '  as xOrdenado') ; 
	-- ----------------------------------------------------------------------------------------------
	-- Se crea una cadena para filtral por empresa y sucursal
	set @empresa = concat(' where ', @tabla, 'codigo <> ''', _codemp, '''');
	
	
	-- ----------------------------------------------------------------------------------------------
	-- Crea dos cadena: 
	-- 		cResultadoIniciar: 	realizar la búsqueda de los registros que se mostraran como resultado final segun los parametros indicados
	-- 		cResultadoTotales: 	realiza una consulta para obtener el total de registro en la consulta por medio de un COUNT(*)
	-- 		COUNT(*):			sustituye la funcion SQL_CALC_FOUND_ROWS, dado que el FOUND_ROWS() no funciona ahora con el prepare y deallocate prepare
	--
	
	set @cResultadoIniciar = concat('create temporary table sentencia select ', @tabla, '*, (@fila:= @fila + 1) as RegFila',  @cJoinCampoO) ;
	set @cResultadoTotales = concat('create temporary table sentencia select COUNT(*) total_filas ');
	if coalesce(_camposB, '') <> '' then
		set @cResultadoA = concat(@cResultadoA, _camposB) ;
	end if ;
	
	-- ----------------------------------------------------------------------------------------------
	set @cResultadoA = concat(@cResultadoA, '  from ', _tabla) ;
	if coalesce(_jointb, '') <> '' then
		set @cResultadoA = concat(@cResultadoA, ' ', coalesce(_jointb, ''));
	end if ;
	
	-- ----------------------------------------------------------------------------------------------
	-- Agrega el LEFT JOIN de la Tabla por la que ordenara la busqueda.
	set @cResultadoA = concat(@cResultadoA, ' ', coalesce(@cJoinOrdenB, '') ) ;
	
	-- ----------------------------------------------------------------------------------------------
	set @cResultadoA = concat(@cResultadoA, @empresa, @sucursal) ;
	
	-- ----------------------------------------------------------------------------------------------
	-- De pasar la fecha como parametro, se incluye la opción para el rango de fecha
	--
	if trim(coalesce(_desde, '')) <> '' and _tipoBusq = 1 then
		set @desde = STR_TO_DATE(Trim(_desde), '%m/%d/%Y');
		set @hasta = STR_TO_DATE(Trim(_hasta), '%m/%d/%Y');
		set  @cResultadoA = CONCAT(@cResultadoA, ' and ', @tabla, 'fecha between ', QUOTE(@desde), ' and ', QUOTE(@hasta));
	end if ;
	
	if trim(@valor) <> '' then
		set @cResultadoB = concat(@cResultadoB, ' and ', @tablaBA, @bCampos) ;
		set @parent = '' ;
		
		-- ----------------------------------------------------------------------------------------------
		-- Valida el operador a utilizar para comparar el campo vs el valor
		if @operador = 'LIKE' then
			set @cResultadoB = concat(@cResultadoB, ' LIKE ', '''', '%', trim(@valor), '%', '''') ;
		elseif @operador = 'REGEXP' then
			set @cResultadoB = concat(@cResultadoB, ' REGEXP ', '''', trim(@valor), '''') ;
		else
			set @cResultadoB = concat(@cResultadoB, trim(@operador), '''', trim(@valor), '''') ;
		end if;
	else
		-- ----------------------------------------------------------------------------------------------
		-- En caso que no se requiera validar con un maestro, la variable pasa a ser en blanco y un ')' como valor predeterminado
		set @parent = '' ;
	end if ;
	
	-- ----------------------------------------------------------------------------------------------
	-- Integra todas las cadenas armadas para construir el cursor.
	--
	set @cResultadoB = concat(@cResultadoB, @parent) ;
	if coalesce(_regpp, 0) <> 0 then
		set @cResultadoC = concat(' LIMIT ', @iLimiteInicio, ', ',  @iLimite) ;
	else
		set @cResultadoC = '' ;
	end if ;
	-- set @cResultado = concat(@cResultadoA, @cResultadoB, @cOrdenado, @cResultadoC) ;
	set @cResultado = concat(@cResultadoA, @cResultadoB, @cOrdenado, @cResultadoC) ;
    
	-- ----------------------------------------------------------------------------------------------
	-- Se construye la cadena para obtener el Total de Registros.
	set @cResultadoT = concat(@cResultadoTotales, @cResultadoA, @cResultadoB, @cOrdenado);
    
	drop temporary table if exists sentencia ;
	prepare sentencia from @cResultadoT ;
	execute sentencia ;
	deallocate prepare sentencia;
	
	-- ----------------------------------------------------------------------------------------------
	-- Se construye la cadena para obtener los registros, y se anexa la variable con el total de registros de
	-- @cResultadoT
	select total_filas into @iNumeroFila from sentencia;
	set @iPaginaUltima =  round((@iNumeroFila/@iLimite), 0) ;
	if coalesce(@iPaginaUltima, 0) = 0 then
		set @iPaginaUltima = 1 ;
	end if ;
	
	-- ----------------------------------------------------------------------------------------------
	-- Se construye la cadena para realizar la consulta de los registros a mostrar en la Lista Formulario
	-- segun los parametros indicados.
	-- Se agrega la variable @iPaginaUltima a la cadena antes de realizar la consulta a través del Prepare.
	set @cResultadoI = concat(@cResultadoIniciar, ', @iPagina as PagAct, @iNumeroFila as Filas, round(@iPaginaUltima,0) as PagUltima ', @cResultado);
    
	drop temporary table if exists sentencia ;
	prepare sentencia from @cResultadoI ;
	execute sentencia ;
	deallocate prepare sentencia;

    -- ----------------------------------------------------------------------------------------------
    -- La Cadena de consulta que se devolvera estara vacia, dado que ya no se requiere.
    -- ----------------------------------------------------------------------------------------------
    -- set _cResultado = '';
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `str_cadena_operacional` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `str_cadena_operacional`(
	in _codemp varchar(2),
	in _sucursal varchar(3),
	in _tabla varchar(25),
	in _adicional varchar(5000), 
	in _estado int,
	in _desde varchar(10),
	in _hasta varchar(10),
	Out _cresultado varchar(1500)
)
begin
	/* ---------------------------------------------------
		Busqueda y paginador generico de formularios listas
		Versión 1.0
		Creado: 2024.12.01
		Actualizado: 2024.12.16
		Autor: 
	--------------------------------------------------- */
    
	-- Validación de parámetros
    if (_codemp is null) OR (_sucursal is null) or (_tabla is null) or (_bcampos is null)  or (_operador is null) then
        signal sqlstate '45000'
            set message_text = 'Parámetros incompletos. Todos los campos deben estar especificados.';
    end if ;
    
	-- ----------------------------------------------------------------------------------------------
	-- se crea una cadena para filtral por empresa y sucursal
	-- ----------------------------------------------------------------------------------------------
	-- Se crea una cadena para filtral por empresa y sucursal
	set @Fila = 0 ;
	set @sucursal = '' ;
	
	set @empresa = concat(' where codemp = ', _codemp);
	if trim(_sucursal) <> '' then
		set @sucursal = concat(' and sucursal = ', _sucursal);
	end if;
	
	-- ----------------------------------------------------------------------------------------------
	-- crea la cadena para realizar la búsqueda de los números de presupuesto que se mostraran como resultado final
	set @cSentencia = concat('create temporary table sentencia select SQL_CALC_FOUND_ROWS *, (@fila:= @fila + 1) as RegFila from ', _tabla, @empresa, @sucursal) ;
	if trim(coalesce(_adicional, '')) <> '' then
		set @cSentencia = concat(@cSentencia, ' and ', _adicional);
	end if; 
	
	-- ----------------------------------------------------------------------------------------------
	-- De pasar la fecha como parametro, se incluye la opción para el rango de fecha
	if trim(coalesce(_desde, '')) <> '' then
		set @desde = STR_TO_DATE(Trim(_desde), '%m/%d/%Y');
		set @hasta = STR_TO_DATE(Trim(_hasta), '%m/%d/%Y');
		set @cSentencia = concat(@cSentencia, ' and fecha between ', '''', @desde, '''', ' and ', '''', @hasta, '''');
	end if ;
	
	if coalesce(_estado, 0) <> 0 then
	 	set @cSentencia = concat(@cSentencia, ' and estado = ', _estado);
	end if;
	set _cResultado = @cSentencia ;
end ;;
DELIMITER ;
/*!50003 DROP PROCEDURE IF EXISTS `str_cfg_alter_autoincremental_u` */;
DELIMITER ;;
CREATE DEFINER=`dbuser`@`%` PROCEDURE `str_cfg_alter_autoincremental_u`(
	in _tabla varchar(50),
    in _orden varchar(50)
)
begin
	set @tabla = coalesce(trim(_tabla), '') ;
    set @orderby = coalesce(trim(_orden), '') ;
    set @item = 0;
	set @valor = 0 ;
    
	-- ----------------------------------------------------------------------------------------------
    set @sql = concat('select max(item)+1 into @item from ', @tabla) ;
    prepare	sentencia from @sql ;
    execute sentencia ;
    deallocate prepare sentencia ;
    
    -- ----------------------------------------------------------------------------------------------
    set @sql = concat('update ', @tabla, ' set item = (@item := @item + 1) ') ;
    prepare	sentencia from @sql ;
    execute sentencia ;
    deallocate prepare sentencia ;
    
    -- ----------------------------------------------------------------------------------------------
    set @sql = concat('update ', @tabla, ' set item = (@valor := @valor + 1) order by ', @orderby) ;
    prepare	sentencia from @sql ;
    execute sentencia ;
    deallocate prepare sentencia ;
    
    -- ----------------------------------------------------------------------------------------------
    set @sql = concat('alter table ', @tabla, ' auto_increment = ', @valor) ;
    prepare	sentencia from @sql ;
    execute sentencia ;
    deallocate prepare sentencia ;
end ;;
DELIMITER ;


