parroquia 1.1.13 → 1.1.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/parroquia/catecismo/actualizar_alumno.rb +181 -0
- data/lib/parroquia/catecismo/alumno.rb +179 -0
- data/lib/parroquia/catecismo/catecismo.rb +119 -0
- data/lib/parroquia/catecismo/consulta.rb +177 -0
- data/lib/parroquia/catecismo/resultado.rb +230 -0
- data/lib/parroquia/main.rb +82 -91
- data/lib/parroquia/sacramentos/actualizar_bautismo.rb +313 -0
- data/lib/parroquia/sacramentos/actualizar_certificado_prebautismal.rb +184 -0
- data/lib/parroquia/sacramentos/actualizar_comunion.rb +239 -0
- data/lib/parroquia/sacramentos/actualizar_confirmacion.rb +239 -0
- data/lib/parroquia/sacramentos/actualizar_matrimonio.rb +298 -0
- data/lib/parroquia/sacramentos/actualizar_misa.rb +170 -0
- data/lib/parroquia/sacramentos/actualizar_permiso_prebautismal.rb +200 -0
- data/lib/parroquia/sacramentos/actualizar_permiso_prematrimonial.rb +205 -0
- data/lib/parroquia/sacramentos/actualizar_supletoria.rb +313 -0
- data/lib/parroquia/sacramentos/bautizo.rb +310 -0
- data/lib/parroquia/sacramentos/certificado_prebautismal.rb +195 -0
- data/lib/parroquia/sacramentos/comunion.rb +234 -0
- data/lib/parroquia/sacramentos/confirmacion.rb +239 -0
- data/lib/parroquia/sacramentos/consultas.rb +162 -0
- data/lib/parroquia/sacramentos/matrimonio.rb +297 -0
- data/lib/parroquia/sacramentos/misa.rb +171 -0
- data/lib/parroquia/sacramentos/permiso_bautismo.rb +207 -0
- data/lib/parroquia/sacramentos/permiso_prematrimonial.rb +219 -0
- data/lib/parroquia/sacramentos/resultados.rb +931 -0
- data/lib/parroquia/sacramentos/sacramentos.rb +182 -0
- data/lib/parroquia/sacramentos/supletoria.rb +309 -0
- metadata +30 -11
- data/lib/parroquia/actualizar_bautismo.rb +0 -245
- data/lib/parroquia/actualizar_confirmacion.rb +0 -194
- data/lib/parroquia/actualizar_matrimonio.rb +0 -235
- data/lib/parroquia/bautizo.rb +0 -239
- data/lib/parroquia/confirmacion.rb +0 -191
- data/lib/parroquia/consultas.rb +0 -144
- data/lib/parroquia/matrimonio.rb +0 -232
- data/lib/parroquia/resultados.rb +0 -414
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 27ba9bf8f3bd27b83aeec98e391337cc91bb586972c66b6c693b520a0108a3d9
         | 
| 4 | 
            +
              data.tar.gz: 4c1c50dfdbaf6ff3a70d21b340902c15661143ce7bc8c1f5905f15ef4b2476a9
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 0f45b4d8942ccb68aa2f842382b57b3723d43d0df393dbd283404414fdce4da6754a21e1bda1337402e5db8afe27750905972ba49f0b7d143eebb8d6104a8311
         | 
| 7 | 
            +
              data.tar.gz: dec141c1d166a09463bc373332b62f580a412b22e6d3e3f7edf9862761d8c4e00238c66dbe964e31f0cc56a8f3c2b96274678f931d6934b5955656622a112e3d
         | 
| @@ -0,0 +1,181 @@ | |
| 1 | 
            +
            require 'pg'
         | 
| 2 | 
            +
            require 'fox16'
         | 
| 3 | 
            +
            include Fox
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            class ActualizarAlumno < FXMainWindow
         | 
| 6 | 
            +
              def initialize(app, registro)
         | 
| 7 | 
            +
                @registro = registro
         | 
| 8 | 
            +
                super(app, 'Parroquia San Judas Tadeo', width: 1050, height: 450)
         | 
| 9 | 
            +
                self.backColor = FXRGB(3, 187, 133)
         | 
| 10 | 
            +
                # Title
         | 
| 11 | 
            +
                @lbltitle = FXLabel.new(self, 'Bienvenido a la Parroquia San Judas Tadeo',
         | 
| 12 | 
            +
                                        opts: LAYOUT_EXPLICIT | JUSTIFY_CENTER_X, width: 1050, height: 20, x: 0, y: 20)
         | 
| 13 | 
            +
                @lbltitle.font = FXFont.new(app, 'Geneva', 16, FONTWEIGHT_BOLD)
         | 
| 14 | 
            +
                @lbltitle.backColor = FXRGB(3, 187, 133)
         | 
| 15 | 
            +
                # Subtitle
         | 
| 16 | 
            +
                @lblsubtitle = FXLabel.new(self, 'ARQUIDIOSESIS DE QUITO - SERVICIO PARROQUIAL DE SAN JUDAS TADEO',
         | 
| 17 | 
            +
                                           opts: LAYOUT_EXPLICIT | JUSTIFY_CENTER_X, width: 1050, height: 20, x: 0, y: 40)
         | 
| 18 | 
            +
                @lblsubtitle.font = FXFont.new(app, 'Geneva', 10, FONTWEIGHT_BOLD)
         | 
| 19 | 
            +
                @lblsubtitle.backColor = FXRGB(3, 187, 133)
         | 
| 20 | 
            +
                # Date
         | 
| 21 | 
            +
                @date = Time.now.strftime('%d/%m/%Y')
         | 
| 22 | 
            +
                @lbldate = FXLabel.new(self, "anio_lectivo: #{cambiar_formato_anio_lectivo(@date)}", opts: LAYOUT_EXPLICIT | JUSTIFY_RIGHT,
         | 
| 23 | 
            +
                                                                                                     width: 1050, height: 20, x: 0, y: 60, padRight: 20)
         | 
| 24 | 
            +
                @lbldate.font = FXFont.new(app, 'Geneva', 12, FONTWEIGHT_BOLD)
         | 
| 25 | 
            +
                @lbldate.backColor = FXRGB(3, 187, 133)
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                # section datos
         | 
| 28 | 
            +
                @lbl_anio_lectivo = FXLabel.new(self, 'Año lectivo', opts: LAYOUT_EXPLICIT, width: 250,
         | 
| 29 | 
            +
                                                                     height: 20, x: 10, y: 150)
         | 
| 30 | 
            +
                @lbl_anio_lectivo.backColor = FXRGB(3, 187, 133)
         | 
| 31 | 
            +
                @input_anio_lectivo = FXTextField.new(self, 10, opts: LAYOUT_EXPLICIT, width: 150, height: 20, x: 340,
         | 
| 32 | 
            +
                                                                y: 150)
         | 
| 33 | 
            +
                @input_anio_lectivo.text = @registro[12]
         | 
| 34 | 
            +
                @lbl_nivel = FXLabel.new(self, 'Nivel: ', opts: LAYOUT_EXPLICIT, width: 150, height: 20,
         | 
| 35 | 
            +
                                                          x: 680, y: 150)
         | 
| 36 | 
            +
                @lbl_nivel.backColor = FXRGB(3, 187, 133)
         | 
| 37 | 
            +
                @input_nivel = FXTextField.new(self, 10, opts: LAYOUT_EXPLICIT, width: 150, height: 20, x: 850,
         | 
| 38 | 
            +
                                                         y: 150)
         | 
| 39 | 
            +
                @input_nivel.text = @registro[10]
         | 
| 40 | 
            +
                @lbl_sector = FXLabel.new(self, 'Sector: ', opts: LAYOUT_EXPLICIT, width: 150, height: 20, x: 340,
         | 
| 41 | 
            +
                                                            y: 180)
         | 
| 42 | 
            +
                @lbl_sector.backColor = FXRGB(3, 187, 133)
         | 
| 43 | 
            +
                @input_sector = FXTextField.new(self, 10, opts: LAYOUT_EXPLICIT, width: 150, height: 20, x: 510,
         | 
| 44 | 
            +
                                                          y: 180)
         | 
| 45 | 
            +
                @input_sector.text = @registro[11]
         | 
| 46 | 
            +
                @lbl_name = FXLabel.new(self, 'Nombres: ', opts: LAYOUT_EXPLICIT, width: 150, height: 20, x: 10,
         | 
| 47 | 
            +
                                                           y: 240)
         | 
| 48 | 
            +
                @lbl_name.backColor = FXRGB(3, 187, 133)
         | 
| 49 | 
            +
                @input_name = FXTextField.new(self, 10, opts: LAYOUT_EXPLICIT, width: 150, height: 20, x: 170,
         | 
| 50 | 
            +
                                                        y: 240)
         | 
| 51 | 
            +
                @input_name.text = @registro[1]
         | 
| 52 | 
            +
                @lbl_apellidos = FXLabel.new(self, 'Apellidos: ', opts: LAYOUT_EXPLICIT, width: 150, height: 20, x: 10,
         | 
| 53 | 
            +
                                                                  y: 270)
         | 
| 54 | 
            +
                @lbl_apellidos.backColor = FXRGB(3, 187, 133)
         | 
| 55 | 
            +
                @input_apellidos = FXTextField.new(self, 10, opts: LAYOUT_EXPLICIT, width: 150, height: 20, x: 170,
         | 
| 56 | 
            +
                                                             y: 270)
         | 
| 57 | 
            +
                @input_apellidos.text = @registro[2]
         | 
| 58 | 
            +
                @lbl_lugar_nacimiento = FXLabel.new(self, 'Lugar de nacimiento: ', opts: LAYOUT_EXPLICIT, width: 150,
         | 
| 59 | 
            +
                                                                                   height: 20, x: 10, y: 300)
         | 
| 60 | 
            +
                @lbl_lugar_nacimiento.backColor = FXRGB(3, 187, 133)
         | 
| 61 | 
            +
                @input_lugar_nacimiento = FXTextField.new(self, 10, opts: LAYOUT_EXPLICIT, width: 150, height: 20,
         | 
| 62 | 
            +
                                                                    x: 170, y: 300)
         | 
| 63 | 
            +
                @input_lugar_nacimiento.text = @registro[3]
         | 
| 64 | 
            +
                @lbl_fecha_nacimiento = FXLabel.new(self, 'Fecha de nacimiento (AAAA/MM/DD): ', opts: LAYOUT_EXPLICIT,
         | 
| 65 | 
            +
                                                                                                width: 250, height: 20, x: 340, y: 300)
         | 
| 66 | 
            +
                @lbl_fecha_nacimiento.backColor = FXRGB(3, 187, 133)
         | 
| 67 | 
            +
                @input_fecha_nacimiento = FXTextField.new(self, 10, opts: LAYOUT_EXPLICIT, width: 150, height: 20,
         | 
| 68 | 
            +
                                                                    x: 590, y: 300)
         | 
| 69 | 
            +
                @input_fecha_nacimiento.text = @registro[4]
         | 
| 70 | 
            +
                @lbl_cedula = FXLabel.new(self, 'Cédula: ', opts: LAYOUT_EXPLICIT, width: 80, height: 20, x: 750,
         | 
| 71 | 
            +
                                                            y: 300)
         | 
| 72 | 
            +
                @lbl_cedula.backColor = FXRGB(3, 187, 133)
         | 
| 73 | 
            +
                @input_cedula = FXTextField.new(self, 10, opts: LAYOUT_EXPLICIT, width: 150, height: 20, x: 850,
         | 
| 74 | 
            +
                                                          y: 300)
         | 
| 75 | 
            +
                @input_cedula.text = @registro[5]
         | 
| 76 | 
            +
                @lbl_nombres_catequista = FXLabel.new(self, 'Nombres Catequista: ', opts: LAYOUT_EXPLICIT, width: 150, height: 20, x: 10,
         | 
| 77 | 
            +
                                                                                    y: 330)
         | 
| 78 | 
            +
                @lbl_nombres_catequista.backColor = FXRGB(3, 187, 133)
         | 
| 79 | 
            +
                @input_nombres_catequista = FXTextField.new(self, 10, opts: LAYOUT_EXPLICIT, width: 150, height: 20, x: 170,
         | 
| 80 | 
            +
                                                                      y: 330)
         | 
| 81 | 
            +
                @input_nombres_catequista.text = @registro[7]
         | 
| 82 | 
            +
                @lbl_apellidos_catequista = FXLabel.new(self, 'Apellidos catequista: ', opts: LAYOUT_EXPLICIT, width: 150, height: 20, x: 10,
         | 
| 83 | 
            +
                                                                                        y: 360)
         | 
| 84 | 
            +
                @lbl_apellidos_catequista.backColor = FXRGB(3, 187, 133)
         | 
| 85 | 
            +
                @input_apellidos_catequista = FXTextField.new(self, 10, opts: LAYOUT_EXPLICIT, width: 150, height: 20, x: 170,
         | 
| 86 | 
            +
                                                                        y: 360)
         | 
| 87 | 
            +
                @input_apellidos_catequista.text = @registro[8]
         | 
| 88 | 
            +
                # create buttons
         | 
| 89 | 
            +
                @btnupdate = FXButton.new(self, 'Actualizar', opts: LAYOUT_EXPLICIT | BUTTON_NORMAL, width: 100, height: 30,
         | 
| 90 | 
            +
                                                              x: 790, y: 400)
         | 
| 91 | 
            +
                @btncancel = FXButton.new(self, 'Cancelar', opts: LAYOUT_EXPLICIT | BUTTON_NORMAL, width: 100, height: 30,
         | 
| 92 | 
            +
                                                            x: 900, y: 400)
         | 
| 93 | 
            +
             | 
| 94 | 
            +
                # connect buttons
         | 
| 95 | 
            +
                @btnupdate.connect(SEL_COMMAND) do
         | 
| 96 | 
            +
                  anio_lectivo = @input_anio_lectivo.text.empty? ? nil : @input_anio_lectivo.text
         | 
| 97 | 
            +
                  nivel = @input_nivel.text.empty? ? nil : @input_nivel.text
         | 
| 98 | 
            +
                  sector = @input_sector.text.empty? ? nil : @input_sector.text
         | 
| 99 | 
            +
                  name = @input_name.text.empty? ? nil : @input_name.text
         | 
| 100 | 
            +
                  apellidos = @input_apellidos.text.empty? ? nil : @input_apellidos.text
         | 
| 101 | 
            +
                  lugar_nacimiento = @input_lugar_nacimiento.text.empty? ? nil : @input_lugar_nacimiento.text
         | 
| 102 | 
            +
                  fecha_nacimiento = @input_fecha_nacimiento.text.empty? ? nil : @input_fecha_nacimiento.text
         | 
| 103 | 
            +
                  cedula = @input_cedula.text.empty? ? nil : @input_cedula.text
         | 
| 104 | 
            +
                  nombres_catequista = @input_nombres_catequista.text.empty? ? nil : @input_nombres_catequista.text
         | 
| 105 | 
            +
                  apellidos_catequista = @input_apellidos_catequista.text.empty? ? nil : @input_apellidos_catequista.text
         | 
| 106 | 
            +
             | 
| 107 | 
            +
                  # tables
         | 
| 108 | 
            +
                  # tabla catequistas (id, nombres, apellidos, fecha de nacimiento, lugar de nacimiento, cedula)
         | 
| 109 | 
            +
                  # tabla alumnos (id, nombres, apellidos, lugar_nacimiento, fecha_nacimiento, cedula, fk_catequistas, fk_niveles)
         | 
| 110 | 
            +
                  # tabla niveles (id, nivel, sector, anio_lectivo)
         | 
| 111 | 
            +
                  # Iniciar una transacción
         | 
| 112 | 
            +
                  $conn.transaction do
         | 
| 113 | 
            +
                    # Actualizar la tabla catequistas
         | 
| 114 | 
            +
                    $conn.exec('UPDATE catequistas SET nombres = $1, apellidos = $2 WHERE id = $3',
         | 
| 115 | 
            +
                               [nombres_catequista, apellidos_catequista, registro[6]])
         | 
| 116 | 
            +
             | 
| 117 | 
            +
                    # Actualizar la tabla niveles
         | 
| 118 | 
            +
                    $conn.exec(
         | 
| 119 | 
            +
                      'UPDATE niveles SET anio_lectivo = $1, nivel = $2, sector = $3 WHERE id = $4', [
         | 
| 120 | 
            +
                        anio_lectivo, nivel, sector, registro[9]
         | 
| 121 | 
            +
                      ]
         | 
| 122 | 
            +
                    )
         | 
| 123 | 
            +
             | 
| 124 | 
            +
                    # Actualizar la tabla alumnos
         | 
| 125 | 
            +
                    $conn.exec('UPDATE alumnos SET nombres = $1, apellidos = $2, lugar_nacimiento = $3, fecha_nacimiento = $4, cedula = $5 WHERE id = $6',
         | 
| 126 | 
            +
                               [name, apellidos, lugar_nacimiento, fecha_nacimiento, cedula, registro[0]])
         | 
| 127 | 
            +
             | 
| 128 | 
            +
                    # ¿Desea guardar los cambios? SI: commit msg: datos actualizados correctamente, NO: rollback, close
         | 
| 129 | 
            +
                    if FXMessageBox.question(self, MBOX_YES_NO, 'Pregunta', '¿Desea guardar los cambios?') == MBOX_CLICKED_YES
         | 
| 130 | 
            +
                      # Confirmar la transacción
         | 
| 131 | 
            +
                      $conn.exec('COMMIT')
         | 
| 132 | 
            +
                      FXMessageBox.information(self, MBOX_OK, 'Información', 'Datos actualizados correctamente')
         | 
| 133 | 
            +
                    else
         | 
| 134 | 
            +
                      $conn.exec('ROLLBACK')
         | 
| 135 | 
            +
                    end
         | 
| 136 | 
            +
                    close
         | 
| 137 | 
            +
                  end
         | 
| 138 | 
            +
                end
         | 
| 139 | 
            +
             | 
| 140 | 
            +
                @btncancel.connect(SEL_COMMAND) do
         | 
| 141 | 
            +
                  FXMessageBox.warning(self, MBOX_OK, 'Advertencia', 'No se guardarán los cambios')
         | 
| 142 | 
            +
                  close
         | 
| 143 | 
            +
                end
         | 
| 144 | 
            +
              end
         | 
| 145 | 
            +
             | 
| 146 | 
            +
              # Nombre del mes
         | 
| 147 | 
            +
              def nombre_mes(mes)
         | 
| 148 | 
            +
                meses = {
         | 
| 149 | 
            +
                  '01' => 'enero',
         | 
| 150 | 
            +
                  '02' => 'febrero',
         | 
| 151 | 
            +
                  '03' => 'marzo',
         | 
| 152 | 
            +
                  '04' => 'abril',
         | 
| 153 | 
            +
                  '05' => 'mayo',
         | 
| 154 | 
            +
                  '06' => 'junio',
         | 
| 155 | 
            +
                  '07' => 'julio',
         | 
| 156 | 
            +
                  '08' => 'agosto',
         | 
| 157 | 
            +
                  '09' => 'septiembre',
         | 
| 158 | 
            +
                  '10' => 'octubre',
         | 
| 159 | 
            +
                  '11' => 'noviembre',
         | 
| 160 | 
            +
                  '12' => 'diciembre'
         | 
| 161 | 
            +
                }
         | 
| 162 | 
            +
                meses[mes]
         | 
| 163 | 
            +
              end
         | 
| 164 | 
            +
             | 
| 165 | 
            +
              # Cambiar el formato de la anio_lectivo de YYYY-MM-DD a DD de nombre_mes de YYYY
         | 
| 166 | 
            +
              def cambiar_formato_anio_lectivo(anio_lectivo)
         | 
| 167 | 
            +
                # split "-" or "/"
         | 
| 168 | 
            +
                anio_lectivo = anio_lectivo.split(%r{-|/})
         | 
| 169 | 
            +
                # si el formato de anio_lectivo es YYYY-MM-DD o YYYY/MM/DD, sino si es DD-MM-YYYY o DD/MM/YYYY
         | 
| 170 | 
            +
                if anio_lectivo[0].length == 4
         | 
| 171 | 
            +
                  "#{anio_lectivo[2]} de #{nombre_mes(anio_lectivo[1])} de #{anio_lectivo[0]}"
         | 
| 172 | 
            +
                else
         | 
| 173 | 
            +
                  "#{anio_lectivo[0]} de #{nombre_mes(anio_lectivo[1])} de #{anio_lectivo[2]}"
         | 
| 174 | 
            +
                end
         | 
| 175 | 
            +
              end
         | 
| 176 | 
            +
             | 
| 177 | 
            +
              def create
         | 
| 178 | 
            +
                super
         | 
| 179 | 
            +
                show(PLACEMENT_SCREEN)
         | 
| 180 | 
            +
              end
         | 
| 181 | 
            +
            end
         | 
| @@ -0,0 +1,179 @@ | |
| 1 | 
            +
            require 'pg'
         | 
| 2 | 
            +
            require 'fox16'
         | 
| 3 | 
            +
            include Fox
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            class Alumno < FXMainWindow
         | 
| 6 | 
            +
              def initialize(app)
         | 
| 7 | 
            +
                @app = app
         | 
| 8 | 
            +
                super(app, 'Parroquia San Judas Tadeo', width: 1050, height: 330)
         | 
| 9 | 
            +
                self.backColor = FXRGB(3, 187, 133)
         | 
| 10 | 
            +
                # Title
         | 
| 11 | 
            +
                @lbltitle = FXLabel.new(self, 'Bienvenido a la Parroquia San Judas Tadeo',
         | 
| 12 | 
            +
                                        opts: LAYOUT_EXPLICIT | JUSTIFY_CENTER_X, width: 1050, height: 20, x: 0, y: 20)
         | 
| 13 | 
            +
                @lbltitle.font = FXFont.new(app, 'Geneva', 16, FONTWEIGHT_BOLD)
         | 
| 14 | 
            +
                @lbltitle.backColor = FXRGB(3, 187, 133)
         | 
| 15 | 
            +
                # Subtitle
         | 
| 16 | 
            +
                @lblsubtitle = FXLabel.new(self, 'ARQUIDIOSESIS DE QUITO - SERVICIO PARROQUIAL DE SAN JUDAS TADEO',
         | 
| 17 | 
            +
                                           opts: LAYOUT_EXPLICIT | JUSTIFY_CENTER_X, width: 1050, height: 20, x: 0, y: 40)
         | 
| 18 | 
            +
                @lblsubtitle.font = FXFont.new(app, 'Geneva', 10, FONTWEIGHT_BOLD)
         | 
| 19 | 
            +
                @lblsubtitle.backColor = FXRGB(3, 187, 133)
         | 
| 20 | 
            +
                # Date
         | 
| 21 | 
            +
                @date = Time.now.strftime('%d/%m/%Y')
         | 
| 22 | 
            +
                @lbldate = FXLabel.new(self, "Fecha: #{cambiar_formato_fecha(@date)}", opts: LAYOUT_EXPLICIT | JUSTIFY_RIGHT,
         | 
| 23 | 
            +
                                                                                       width: 1050, height: 20, x: 0, y: 60, padRight: 20)
         | 
| 24 | 
            +
                @lbldate.font = FXFont.new(app, 'Geneva', 12, FONTWEIGHT_BOLD)
         | 
| 25 | 
            +
                @lbldate.backColor = FXRGB(3, 187, 133)
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                # section datos
         | 
| 28 | 
            +
                @lbl_anio_lectivo = FXLabel.new(self, 'Año lectivo: ', opts: LAYOUT_EXPLICIT, width: 150,
         | 
| 29 | 
            +
                                                                       height: 20, x: 10, y: 150)
         | 
| 30 | 
            +
                @lbl_anio_lectivo.backColor = FXRGB(3, 187, 133)
         | 
| 31 | 
            +
                @input_anio_lectivo = FXTextField.new(self, 10, opts: LAYOUT_EXPLICIT, width: 150, height: 20, x: 170,
         | 
| 32 | 
            +
                                                                y: 150)
         | 
| 33 | 
            +
                @lbl_nivel = FXLabel.new(self, 'Nivel: ', opts: LAYOUT_EXPLICIT, width: 150, height: 20,
         | 
| 34 | 
            +
                                                          x: 330, y: 150)
         | 
| 35 | 
            +
                @lbl_nivel.backColor = FXRGB(3, 187, 133)
         | 
| 36 | 
            +
                @input_nivel = FXTextField.new(self, 10, opts: LAYOUT_EXPLICIT, width: 150, height: 20, x: 490,
         | 
| 37 | 
            +
                                                         y: 150)
         | 
| 38 | 
            +
                @lbl_sector = FXLabel.new(self, 'Sector: ', opts: LAYOUT_EXPLICIT, width: 150, height: 20, x: 650,
         | 
| 39 | 
            +
                                                            y: 150)
         | 
| 40 | 
            +
                @lbl_sector.backColor = FXRGB(3, 187, 133)
         | 
| 41 | 
            +
                @input_sector = FXTextField.new(self, 10, opts: LAYOUT_EXPLICIT, width: 150, height: 20, x: 810,
         | 
| 42 | 
            +
                                                          y: 150)
         | 
| 43 | 
            +
                @lbl_name = FXLabel.new(self, 'Nombres: ', opts: LAYOUT_EXPLICIT, width: 150, height: 20, x: 10,
         | 
| 44 | 
            +
                                                           y: 180)
         | 
| 45 | 
            +
                @lbl_name.backColor = FXRGB(3, 187, 133)
         | 
| 46 | 
            +
                @input_name = FXTextField.new(self, 10, opts: LAYOUT_EXPLICIT, width: 150, height: 20, x: 170,
         | 
| 47 | 
            +
                                                        y: 180)
         | 
| 48 | 
            +
                @lbl_apellidos = FXLabel.new(self, 'Apellidos: ', opts: LAYOUT_EXPLICIT, width: 150, height: 20, x: 330,
         | 
| 49 | 
            +
                                                                  y: 180)
         | 
| 50 | 
            +
                @lbl_apellidos.backColor = FXRGB(3, 187, 133)
         | 
| 51 | 
            +
                @input_apellidos = FXTextField.new(self, 10, opts: LAYOUT_EXPLICIT, width: 150, height: 20, x: 490,
         | 
| 52 | 
            +
                                                             y: 180)
         | 
| 53 | 
            +
                @lbl_lugar_nacimiento = FXLabel.new(self, 'Lugar de nacimiento: ', opts: LAYOUT_EXPLICIT, width: 150,
         | 
| 54 | 
            +
                                                                                   height: 20, x: 10, y: 210)
         | 
| 55 | 
            +
                @lbl_lugar_nacimiento.backColor = FXRGB(3, 187, 133)
         | 
| 56 | 
            +
                @input_lugar_nacimiento = FXTextField.new(self, 10, opts: LAYOUT_EXPLICIT, width: 150, height: 20,
         | 
| 57 | 
            +
                                                                    x: 170, y: 210)
         | 
| 58 | 
            +
                @lbl_fecha_nacimiento = FXLabel.new(self, 'Fecha de nacimiento (AAAA/MM/DD): ', opts: LAYOUT_EXPLICIT,
         | 
| 59 | 
            +
                                                                                                width: 250, height: 20, x: 340, y: 210)
         | 
| 60 | 
            +
                @lbl_fecha_nacimiento.backColor = FXRGB(3, 187, 133)
         | 
| 61 | 
            +
                @input_fecha_nacimiento = FXTextField.new(self, 10, opts: LAYOUT_EXPLICIT, width: 150, height: 20,
         | 
| 62 | 
            +
                                                                    x: 590, y: 210)
         | 
| 63 | 
            +
                @lbl_cedula = FXLabel.new(self, 'Cédula: ', opts: LAYOUT_EXPLICIT, width: 80, height: 20, x: 750,
         | 
| 64 | 
            +
                                                            y: 210)
         | 
| 65 | 
            +
                @lbl_cedula.backColor = FXRGB(3, 187, 133)
         | 
| 66 | 
            +
                @input_cedula = FXTextField.new(self, 10, opts: LAYOUT_EXPLICIT, width: 150, height: 20, x: 850,
         | 
| 67 | 
            +
                                                          y: 210)
         | 
| 68 | 
            +
                @lbl_nombre_catequista = FXLabel.new(self, 'Nombre del catequista: ', opts: LAYOUT_EXPLICIT, width: 150,
         | 
| 69 | 
            +
                                                                                      height: 20, x: 10, y: 240)
         | 
| 70 | 
            +
                @lbl_nombre_catequista.backColor = FXRGB(3, 187, 133)
         | 
| 71 | 
            +
                @input_nombre_catequista = FXTextField.new(self, 10, opts: LAYOUT_EXPLICIT, width: 150, height: 20,
         | 
| 72 | 
            +
                                                                     x: 170, y: 240)
         | 
| 73 | 
            +
                @lbl_apellidos_catequista = FXLabel.new(self, 'Apellidos del catequista: ', opts: LAYOUT_EXPLICIT, width: 150,
         | 
| 74 | 
            +
                                                                                            height: 20, x: 340, y: 240)
         | 
| 75 | 
            +
                @lbl_apellidos_catequista.backColor = FXRGB(3, 187, 133)
         | 
| 76 | 
            +
                @input_apellidos_catequista = FXTextField.new(self, 10, opts: LAYOUT_EXPLICIT, width: 150, height: 20,
         | 
| 77 | 
            +
                                                                        x: 510, y: 240)
         | 
| 78 | 
            +
                # create buttons
         | 
| 79 | 
            +
                @btnsave = FXButton.new(self, 'Guardar', opts: LAYOUT_EXPLICIT | BUTTON_NORMAL, width: 100, height: 30,
         | 
| 80 | 
            +
                                                         x: 790, y: 270)
         | 
| 81 | 
            +
                @btncancel = FXButton.new(self, 'Cancelar', opts: LAYOUT_EXPLICIT | BUTTON_NORMAL, width: 100, height: 30,
         | 
| 82 | 
            +
                                                            x: 900, y: 270)
         | 
| 83 | 
            +
             | 
| 84 | 
            +
                # connect buttons
         | 
| 85 | 
            +
                @btnsave.connect(SEL_COMMAND) do
         | 
| 86 | 
            +
                  anio_lectivo = @input_anio_lectivo.text.empty? ? nil : @input_anio_lectivo.text
         | 
| 87 | 
            +
                  nivel = @input_nivel.text.empty? ? nil : @input_nivel.text
         | 
| 88 | 
            +
                  sector = @input_sector.text.empty? ? nil : @input_sector.text
         | 
| 89 | 
            +
                  name = @input_name.text.empty? ? nil : @input_name.text
         | 
| 90 | 
            +
                  apellidos = @input_apellidos.text.empty? ? nil : @input_apellidos.text
         | 
| 91 | 
            +
                  lugar_nacimiento = @input_lugar_nacimiento.text.empty? ? nil : @input_lugar_nacimiento.text
         | 
| 92 | 
            +
                  fecha_nacimiento = @input_fecha_nacimiento.text.empty? ? nil : @input_fecha_nacimiento.text
         | 
| 93 | 
            +
                  cedula = @input_cedula.text.empty? ? nil : @input_cedula.text
         | 
| 94 | 
            +
                  nombres_catequista = @input_nombre_catequista.text.empty? ? nil : @input_nombre_catequista.text
         | 
| 95 | 
            +
                  apellidos_catequista = @input_apellidos_catequista.text.empty? ? nil : @input_apellidos_catequista.text
         | 
| 96 | 
            +
             | 
| 97 | 
            +
             | 
| 98 | 
            +
                  # tables
         | 
| 99 | 
            +
                  # tabla catequistas (id, nombres, apellidos, fecha de nacimiento, lugar de nacimiento, cedula)
         | 
| 100 | 
            +
                  # tabla alumnos (id, nombres, apellidos, lugar_nacimiento, fecha_nacimiento, cedula, fk_catequistas, fk_niveles)
         | 
| 101 | 
            +
                  # tabla niveles (id, nivel, sector, anio_lectivo)
         | 
| 102 | 
            +
                  $conn.transaction do
         | 
| 103 | 
            +
                    # Insertar en la tabla catequistas
         | 
| 104 | 
            +
                    @registro_catequistas = $conn.exec('INSERT INTO catequistas (nombres, apellidos) VALUES ($1, $2)',
         | 
| 105 | 
            +
                                                       [nombres_catequista, apellidos_catequista])
         | 
| 106 | 
            +
                    # Insertar en la tabla niveles
         | 
| 107 | 
            +
                    @registro_parroquias = $conn.exec('INSERT INTO niveles (anio_lectivo, nivel, sector) VALUES ($1, $2, $3)',
         | 
| 108 | 
            +
                                                      [anio_lectivo, nivel, sector])
         | 
| 109 | 
            +
                    # Insertar en la tabla alumnos
         | 
| 110 | 
            +
                    @registro_creyentes = $conn.exec(
         | 
| 111 | 
            +
                      'INSERT INTO alumnos (nombres, apellidos, lugar_nacimiento, fecha_nacimiento, cedula) VALUES ($1, $2, $3, $4, $5)', [
         | 
| 112 | 
            +
                        name, apellidos, lugar_nacimiento, fecha_nacimiento, cedula
         | 
| 113 | 
            +
                      ]
         | 
| 114 | 
            +
                    )
         | 
| 115 | 
            +
                    puts @registro_creyentes
         | 
| 116 | 
            +
                    puts @registro_parroquias
         | 
| 117 | 
            +
                    puts @registro_catequistas
         | 
| 118 | 
            +
             | 
| 119 | 
            +
                    # Confirmar la transacción
         | 
| 120 | 
            +
                    $conn.exec('COMMIT')
         | 
| 121 | 
            +
                    FXMessageBox.information(self, MBOX_OK, 'Información', 'Datos guardados correctamente')
         | 
| 122 | 
            +
                    clear_input_fields
         | 
| 123 | 
            +
                  end
         | 
| 124 | 
            +
                end
         | 
| 125 | 
            +
             | 
| 126 | 
            +
                @btncancel.connect(SEL_COMMAND) do
         | 
| 127 | 
            +
                  clear_input_fields
         | 
| 128 | 
            +
                end
         | 
| 129 | 
            +
             | 
| 130 | 
            +
                def clear_input_fields
         | 
| 131 | 
            +
                  @input_anio_lectivo.text = ''
         | 
| 132 | 
            +
                  @input_nivel.text = ''
         | 
| 133 | 
            +
                  @input_sector.text = ''
         | 
| 134 | 
            +
                  @input_name.text = ''
         | 
| 135 | 
            +
                  @input_apellidos.text = ''
         | 
| 136 | 
            +
                  @input_lugar_nacimiento.text = ''
         | 
| 137 | 
            +
                  @input_fecha_nacimiento.text = ''
         | 
| 138 | 
            +
                  @input_cedula.text = ''
         | 
| 139 | 
            +
                  @input_nombre_catequista.text = ''
         | 
| 140 | 
            +
                  @input_apellidos_catequista.text = ''
         | 
| 141 | 
            +
                end
         | 
| 142 | 
            +
              end
         | 
| 143 | 
            +
             | 
| 144 | 
            +
              # Nombre del mes
         | 
| 145 | 
            +
              def nombre_mes(mes)
         | 
| 146 | 
            +
                meses = {
         | 
| 147 | 
            +
                  '01' => 'enero',
         | 
| 148 | 
            +
                  '02' => 'febrero',
         | 
| 149 | 
            +
                  '03' => 'marzo',
         | 
| 150 | 
            +
                  '04' => 'abril',
         | 
| 151 | 
            +
                  '05' => 'mayo',
         | 
| 152 | 
            +
                  '06' => 'junio',
         | 
| 153 | 
            +
                  '07' => 'julio',
         | 
| 154 | 
            +
                  '08' => 'agosto',
         | 
| 155 | 
            +
                  '09' => 'septiembre',
         | 
| 156 | 
            +
                  '10' => 'octubre',
         | 
| 157 | 
            +
                  '11' => 'noviembre',
         | 
| 158 | 
            +
                  '12' => 'diciembre'
         | 
| 159 | 
            +
                }
         | 
| 160 | 
            +
                meses[mes]
         | 
| 161 | 
            +
              end
         | 
| 162 | 
            +
             | 
| 163 | 
            +
              # Cambiar el formato de la fecha de YYYY-MM-DD a DD de nombre_mes de YYYY
         | 
| 164 | 
            +
              def cambiar_formato_fecha(fecha)
         | 
| 165 | 
            +
                # split "-" or "/"
         | 
| 166 | 
            +
                fecha = fecha.split(%r{-|/})
         | 
| 167 | 
            +
                # si el formato de fecha es YYYY-MM-DD o YYYY/MM/DD, sino si es DD-MM-YYYY o DD/MM/YYYY
         | 
| 168 | 
            +
                if fecha[0].length == 4
         | 
| 169 | 
            +
                  "#{fecha[2]} de #{nombre_mes(fecha[1])} de #{fecha[0]}"
         | 
| 170 | 
            +
                else
         | 
| 171 | 
            +
                  "#{fecha[0]} de #{nombre_mes(fecha[1])} de #{fecha[2]}"
         | 
| 172 | 
            +
                end
         | 
| 173 | 
            +
              end
         | 
| 174 | 
            +
             | 
| 175 | 
            +
              def create
         | 
| 176 | 
            +
                super
         | 
| 177 | 
            +
                show(PLACEMENT_SCREEN)
         | 
| 178 | 
            +
              end
         | 
| 179 | 
            +
            end
         | 
| @@ -0,0 +1,119 @@ | |
| 1 | 
            +
            require 'pg'
         | 
| 2 | 
            +
            require 'fox16'
         | 
| 3 | 
            +
            include Fox
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            class Catecismo < FXMainWindow
         | 
| 6 | 
            +
              def initialize(app)
         | 
| 7 | 
            +
                super(app, 'Parroquia San Judas Tadeo', width: 700, height: 500)
         | 
| 8 | 
            +
                @app = app
         | 
| 9 | 
            +
                self.backColor = FXRGB(3, 187, 133)
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                # Font
         | 
| 12 | 
            +
                @font = FXFont.new(app, 'Geneva', 12, FONTWEIGHT_BOLD)
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                # Inserar imagen del logo
         | 
| 15 | 
            +
                @image = File.join(File.dirname(__FILE__), '../assets/images/Logo-SJT.png')
         | 
| 16 | 
            +
                @image = File.open(@image, 'rb')
         | 
| 17 | 
            +
                @image = FXPNGIcon.new(app, @image.read)
         | 
| 18 | 
            +
                @logo = FXImageFrame.new(self, @image, opts: LAYOUT_EXPLICIT | LAYOUT_CENTER_X | LAYOUT_CENTER_Y, width: 400,
         | 
| 19 | 
            +
                                                       height: 250, x: 10, y: 100)
         | 
| 20 | 
            +
                # Color de fondo de image frame es el mismo que el de la ventana
         | 
| 21 | 
            +
                @logo.backColor = FXRGB(3, 187, 133)
         | 
| 22 | 
            +
                # Escalar imagen
         | 
| 23 | 
            +
                @image.scale(400, 250)
         | 
| 24 | 
            +
             | 
| 25 | 
            +
                # Title
         | 
| 26 | 
            +
                @lbltitle = FXLabel.new(self, 'Bienvenido a la Parroquia San Judas Tadeo',
         | 
| 27 | 
            +
                                        opts: LAYOUT_EXPLICIT | JUSTIFY_CENTER_X, width: 700, height: 20, x: 0, y: 20)
         | 
| 28 | 
            +
                @lbltitle.font = FXFont.new(app, 'Geneva', 16, FONTWEIGHT_BOLD)
         | 
| 29 | 
            +
                @lbltitle.backColor = FXRGB(3, 187, 133)
         | 
| 30 | 
            +
                # Subtitle
         | 
| 31 | 
            +
                @lblsubtitle = FXLabel.new(self, 'ARQUIDIOSESIS DE QUITO - SERVICIO PARROQUIAL DE SAN JUDAS TADEO',
         | 
| 32 | 
            +
                                           opts: LAYOUT_EXPLICIT | JUSTIFY_CENTER_X, width: 700, height: 20, x: 0, y: 40)
         | 
| 33 | 
            +
                @lblsubtitle.font = FXFont.new(app, 'Geneva', 10, FONTWEIGHT_BOLD)
         | 
| 34 | 
            +
                @lblsubtitle.backColor = FXRGB(3, 187, 133)
         | 
| 35 | 
            +
                # Date
         | 
| 36 | 
            +
                @date = Time.now.strftime('%d/%m/%Y')
         | 
| 37 | 
            +
                @lbldate = FXLabel.new(self, "Fecha: #{cambiar_formato_fecha(@date)}", opts: LAYOUT_EXPLICIT | JUSTIFY_RIGHT,
         | 
| 38 | 
            +
                                                                                       width: 700, height: 20, x: 0, y: 60, padRight: 20)
         | 
| 39 | 
            +
                @lbldate.font = FXFont.new(app, 'Geneva', 12, FONTWEIGHT_BOLD)
         | 
| 40 | 
            +
                @lbldate.backColor = FXRGB(3, 187, 133)
         | 
| 41 | 
            +
             | 
| 42 | 
            +
                # section lista
         | 
| 43 | 
            +
                @btnalumno = FXButton.new(self, 'Ingresar Alumno', opts: LAYOUT_EXPLICIT | BUTTON_NORMAL, width: 150,
         | 
| 44 | 
            +
                                                                   height: 30, x: 460, y: 150)
         | 
| 45 | 
            +
                @btnconsulta = FXButton.new(self, 'Consultar', opts: LAYOUT_EXPLICIT | BUTTON_NORMAL, width: 150,
         | 
| 46 | 
            +
                                                               height: 30, x: 460, y: 190)
         | 
| 47 | 
            +
             | 
| 48 | 
            +
                # Footer
         | 
| 49 | 
            +
                @lblfooter = FXLabel.new(self, 'WebMinds Studio - 2023', opts: LAYOUT_EXPLICIT | JUSTIFY_CENTER_X, width: 700,
         | 
| 50 | 
            +
                                                                         height: 20, x: 0, y: 400)
         | 
| 51 | 
            +
                @lblfooter.font = FXFont.new(app, 'Geneva', 10)
         | 
| 52 | 
            +
                @lblfooter.backColor = FXRGB(3, 187, 133)
         | 
| 53 | 
            +
                @lblauthor = FXLabel.new(self, 'Desarrollado por Ing. Francisco J. Borja L.',
         | 
| 54 | 
            +
                                         opts: LAYOUT_EXPLICIT | JUSTIFY_CENTER_X, width: 700, height: 20, x: 0, y: 420)
         | 
| 55 | 
            +
                @lblauthor.font = FXFont.new(app, 'Geneva', 10)
         | 
| 56 | 
            +
                @lblauthor.backColor = FXRGB(3, 187, 133)
         | 
| 57 | 
            +
                @lblweb = FXLabel.new(self, 'www.webmindsstudio.com', opts: LAYOUT_EXPLICIT | JUSTIFY_CENTER_X, width: 700,
         | 
| 58 | 
            +
                                                                      height: 20, x: 0, y: 440)
         | 
| 59 | 
            +
                @lblweb.font = FXFont.new(app, 'Geneva', 10)
         | 
| 60 | 
            +
                @lblweb.backColor = FXRGB(3, 187, 133)
         | 
| 61 | 
            +
                @lbllicence = FXLabel.new(self, 'MIT License', opts: LAYOUT_EXPLICIT | JUSTIFY_CENTER_X, width: 700,
         | 
| 62 | 
            +
                                                               height: 20, x: 0, y: 460)
         | 
| 63 | 
            +
                @lbllicence.font = FXFont.new(app, 'Geneva', 10)
         | 
| 64 | 
            +
                @lbllicence.backColor = FXRGB(3, 187, 133)
         | 
| 65 | 
            +
                # section buttons executions
         | 
| 66 | 
            +
                @btnalumno.connect(SEL_COMMAND) do
         | 
| 67 | 
            +
                  require_relative 'alumno'
         | 
| 68 | 
            +
                  vtnalumno = Alumno.new(@app)
         | 
| 69 | 
            +
                  vtnalumno.create
         | 
| 70 | 
            +
                  vtnalumno.show(PLACEMENT_SCREEN)
         | 
| 71 | 
            +
                end
         | 
| 72 | 
            +
                @btnconsulta.connect(SEL_COMMAND) do
         | 
| 73 | 
            +
                  require_relative 'consulta'
         | 
| 74 | 
            +
                  vtnconsulta = Consulta.new(@app)
         | 
| 75 | 
            +
                  vtnconsulta.create
         | 
| 76 | 
            +
                  vtnconsulta.show(PLACEMENT_SCREEN)
         | 
| 77 | 
            +
                end
         | 
| 78 | 
            +
              end
         | 
| 79 | 
            +
             | 
| 80 | 
            +
              # Nombre del mes
         | 
| 81 | 
            +
              def nombre_mes(mes)
         | 
| 82 | 
            +
                meses = {
         | 
| 83 | 
            +
                  '01' => 'enero',
         | 
| 84 | 
            +
                  '02' => 'febrero',
         | 
| 85 | 
            +
                  '03' => 'marzo',
         | 
| 86 | 
            +
                  '04' => 'abril',
         | 
| 87 | 
            +
                  '05' => 'mayo',
         | 
| 88 | 
            +
                  '06' => 'junio',
         | 
| 89 | 
            +
                  '07' => 'julio',
         | 
| 90 | 
            +
                  '08' => 'agosto',
         | 
| 91 | 
            +
                  '09' => 'septiembre',
         | 
| 92 | 
            +
                  '10' => 'octubre',
         | 
| 93 | 
            +
                  '11' => 'noviembre',
         | 
| 94 | 
            +
                  '12' => 'diciembre'
         | 
| 95 | 
            +
                }
         | 
| 96 | 
            +
                meses[mes]
         | 
| 97 | 
            +
              end
         | 
| 98 | 
            +
             | 
| 99 | 
            +
              # Cambiar el formato de la fecha de YYYY-MM-DD a DD de nombre_mes de YYYY
         | 
| 100 | 
            +
              def cambiar_formato_fecha(fecha)
         | 
| 101 | 
            +
                # split "-" or "/"
         | 
| 102 | 
            +
                fecha = fecha.split(%r{-|/})
         | 
| 103 | 
            +
                # si el formato de fecha es YYYY-MM-DD o YYYY/MM/DD, sino si es DD-MM-YYYY o DD/MM/YYYY
         | 
| 104 | 
            +
                if fecha[0].length == 4
         | 
| 105 | 
            +
                  "#{fecha[2]} de #{nombre_mes(fecha[1])} de #{fecha[0]}"
         | 
| 106 | 
            +
                else
         | 
| 107 | 
            +
                  "#{fecha[0]} de #{nombre_mes(fecha[1])} de #{fecha[2]}"
         | 
| 108 | 
            +
                end
         | 
| 109 | 
            +
              end
         | 
| 110 | 
            +
             | 
| 111 | 
            +
              def create
         | 
| 112 | 
            +
                super
         | 
| 113 | 
            +
                show(PLACEMENT_SCREEN)
         | 
| 114 | 
            +
              end
         | 
| 115 | 
            +
            end
         | 
| 116 | 
            +
             | 
| 117 | 
            +
            $conn = PG.connect(host: 'localhost', port: '5432', dbname: 'catecismo', user: 'postgres', password: 'postgres')
         | 
| 118 | 
            +
            # Comprobar conexión con la base de datos
         | 
| 119 | 
            +
            exit if $conn.status != PG::CONNECTION_OK
         | 
| @@ -0,0 +1,177 @@ | |
| 1 | 
            +
            require 'pg'
         | 
| 2 | 
            +
            require 'fox16'
         | 
| 3 | 
            +
            include Fox
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            class Consulta < FXMainWindow
         | 
| 6 | 
            +
              def initialize(app)
         | 
| 7 | 
            +
                super(app, 'Parroquia San Judas Tadeo', width: 700, height: 380)
         | 
| 8 | 
            +
                @app = app
         | 
| 9 | 
            +
                self.backColor = FXRGB(3, 187, 133)
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                # seccion encabezado
         | 
| 12 | 
            +
                # create label
         | 
| 13 | 
            +
                @lbltitle = FXLabel.new(self, 'Bienvenido a la Parroquia San Judas Tadeo',
         | 
| 14 | 
            +
                                        opts: LAYOUT_EXPLICIT | JUSTIFY_CENTER_X, width: 700, height: 20, x: 0, y: 20)
         | 
| 15 | 
            +
                @lbltitle.font = FXFont.new(app, 'Geneva', 16, FONTWEIGHT_BOLD)
         | 
| 16 | 
            +
                @lbltitle.backColor = FXRGB(3, 187, 133)
         | 
| 17 | 
            +
                # create label
         | 
| 18 | 
            +
                @lblsubtitle = FXLabel.new(self, 'ARQUIDIOSESIS DE QUITO - VICARIA NORTE SERVICIO PARROQUIAL DE SAN JUDAS TADEO',
         | 
| 19 | 
            +
                                           opts: LAYOUT_EXPLICIT | JUSTIFY_CENTER_X, width: 700, height: 20, x: 0, y: 40)
         | 
| 20 | 
            +
                @lblsubtitle.font = FXFont.new(app, 'Geneva', 10, FONTWEIGHT_BOLD)
         | 
| 21 | 
            +
                @lblsubtitle.backColor = FXRGB(3, 187, 133)
         | 
| 22 | 
            +
                # create label
         | 
| 23 | 
            +
                @date = Time.now.strftime('%d/%m/%Y')
         | 
| 24 | 
            +
                @lbldate = FXLabel.new(self, "Fecha: #{cambiar_formato_fecha(@date)} ", opts: LAYOUT_EXPLICIT | JUSTIFY_RIGHT,
         | 
| 25 | 
            +
                                                                                        width: 680, height: 20, x: 0, y: 60)
         | 
| 26 | 
            +
                @lbldate.font = FXFont.new(app, 'Geneva', 12, FONTWEIGHT_BOLD)
         | 
| 27 | 
            +
                @lbldate.backColor = FXRGB(3, 187, 133)
         | 
| 28 | 
            +
                # seccioan consulta
         | 
| 29 | 
            +
                @lbl_consulta = FXLabel.new(self, 'Consultar por: ', opts: LAYOUT_EXPLICIT, width: 150, height: 20,
         | 
| 30 | 
            +
                                                                     x: 10, y: 150)
         | 
| 31 | 
            +
                @lbl_consulta.backColor = FXRGB(3, 187, 133)
         | 
| 32 | 
            +
                @lbl_apellidos = FXLabel.new(self, 'Apellidos del alumno: ', opts: LAYOUT_EXPLICIT, width: 150, height: 20, x: 10,
         | 
| 33 | 
            +
                                                                  y: 180)
         | 
| 34 | 
            +
                @lbl_apellidos.backColor = FXRGB(3, 187, 133)
         | 
| 35 | 
            +
                @input_apellidos = FXTextField.new(self, 10, opts: LAYOUT_EXPLICIT, width: 150, height: 20, x: 170,
         | 
| 36 | 
            +
                                                             y: 180)
         | 
| 37 | 
            +
                @lbl_nombres = FXLabel.new(self, 'Nombres del alumno: ', opts: LAYOUT_EXPLICIT, width: 150, height: 20, x: 340,
         | 
| 38 | 
            +
                                                              y: 180)
         | 
| 39 | 
            +
                @lbl_nombres.backColor = FXRGB(3, 187, 133)
         | 
| 40 | 
            +
                @input_nombres = FXTextField.new(self, 10, opts: LAYOUT_EXPLICIT, width: 150, height: 20, x: 510,
         | 
| 41 | 
            +
                                                           y: 180)
         | 
| 42 | 
            +
                @lbl_cedula = FXLabel.new(self, 'Cédula del alumno: ', opts: LAYOUT_EXPLICIT, width: 150, height: 20, x: 10,
         | 
| 43 | 
            +
                                                            y: 210)
         | 
| 44 | 
            +
                @lbl_cedula.backColor = FXRGB(3, 187, 133)
         | 
| 45 | 
            +
                @input_cedula = FXTextField.new(self, 10, opts: LAYOUT_EXPLICIT, width: 150, height: 20, x: 170,
         | 
| 46 | 
            +
                                                          y: 210)
         | 
| 47 | 
            +
                @lbl_anio_lectivo = FXLabel.new(self, 'Año lectivo: ', opts: LAYOUT_EXPLICIT, width: 150,
         | 
| 48 | 
            +
                                                                       height: 20, x: 10, y: 240)
         | 
| 49 | 
            +
                @lbl_anio_lectivo.backColor = FXRGB(3, 187, 133)
         | 
| 50 | 
            +
                @input_anio_lectivo = FXTextField.new(self, 10, opts: LAYOUT_EXPLICIT, width: 150, height: 20, x: 170,
         | 
| 51 | 
            +
                                                                y: 240)
         | 
| 52 | 
            +
                @lbl_nivel = FXLabel.new(self, 'Nivel: ', opts: LAYOUT_EXPLICIT, width: 150, height: 20,
         | 
| 53 | 
            +
                                                          x: 330, y: 240)
         | 
| 54 | 
            +
                @lbl_nivel.backColor = FXRGB(3, 187, 133)
         | 
| 55 | 
            +
                @input_nivel = FXTextField.new(self, 10, opts: LAYOUT_EXPLICIT, width: 150, height: 20, x: 490,
         | 
| 56 | 
            +
                                                         y: 240)
         | 
| 57 | 
            +
                @lbl_sector = FXLabel.new(self, 'Sector: ', opts: LAYOUT_EXPLICIT, width: 150, height: 20,
         | 
| 58 | 
            +
                                                            x: 10, y: 270)
         | 
| 59 | 
            +
                @lbl_sector.backColor = FXRGB(3, 187, 133)
         | 
| 60 | 
            +
                @input_sector = FXTextField.new(self, 10, opts: LAYOUT_EXPLICIT, width: 150, height: 20, x: 170,
         | 
| 61 | 
            +
                                                          y: 270)
         | 
| 62 | 
            +
                @lbl_nombres_catequista = FXLabel.new(self, 'Nombres catequista: ', opts: LAYOUT_EXPLICIT, width: 150,
         | 
| 63 | 
            +
                                                                                    height: 20, x: 10, y: 300)
         | 
| 64 | 
            +
                @lbl_nombres_catequista.backColor = FXRGB(3, 187, 133)
         | 
| 65 | 
            +
                @input_nombres_catequista = FXTextField.new(self, 10, opts: LAYOUT_EXPLICIT, width: 150, height: 20, x: 170,
         | 
| 66 | 
            +
                                                                      y: 300)
         | 
| 67 | 
            +
                @lbl_apellidos_catequista = FXLabel.new(self, 'Apellidos catequista: ', opts: LAYOUT_EXPLICIT, width: 150,
         | 
| 68 | 
            +
                                                                                        height: 20, x: 330, y: 300)
         | 
| 69 | 
            +
                @lbl_apellidos_catequista.backColor = FXRGB(3, 187, 133)
         | 
| 70 | 
            +
                @input_apellidos_catequista = FXTextField.new(self, 10, opts: LAYOUT_EXPLICIT, width: 150, height: 20, x: 490,
         | 
| 71 | 
            +
                                                                        y: 300)
         | 
| 72 | 
            +
             | 
| 73 | 
            +
                # create buttons
         | 
| 74 | 
            +
                @btnsearch = FXButton.new(self, 'Buscar', opts: LAYOUT_EXPLICIT | BUTTON_NORMAL, width: 100, height: 30,
         | 
| 75 | 
            +
                                                          x: 450, y: 330)
         | 
| 76 | 
            +
                @btncancel = FXButton.new(self, 'Cancelar', opts: LAYOUT_EXPLICIT | BUTTON_NORMAL, width: 100, height: 30,
         | 
| 77 | 
            +
                                                            x: 560, y: 330)
         | 
| 78 | 
            +
             | 
| 79 | 
            +
                # connect buttons
         | 
| 80 | 
            +
                @btnsearch.connect(SEL_COMMAND) do
         | 
| 81 | 
            +
                  apellidos = @input_apellidos.text
         | 
| 82 | 
            +
                  nombres = @input_nombres.text
         | 
| 83 | 
            +
                  cedula = @input_cedula.text
         | 
| 84 | 
            +
                  anio_lectivo = @input_anio_lectivo.text
         | 
| 85 | 
            +
                  nivel = @input_nivel.text
         | 
| 86 | 
            +
                  sector = @input_sector.text
         | 
| 87 | 
            +
                  nombres_catequista = @input_nombres_catequista.text
         | 
| 88 | 
            +
                  apellidos_catequista = @input_apellidos_catequista.text
         | 
| 89 | 
            +
             | 
| 90 | 
            +
                  if apellidos.empty? && nombres.empty? && cedula.empty? && anio_lectivo.empty? && nivel.empty? && nombres_catequista.empty? && apellidos_catequista.empty? && sector.empty?
         | 
| 91 | 
            +
                    FXMessageBox.warning(self, MBOX_OK, 'Advertencia', 'Debe ingresar al menos un criterio de búsqueda')
         | 
| 92 | 
            +
                  else
         | 
| 93 | 
            +
                    # conectar a la base de datos
         | 
| 94 | 
            +
                    # tables
         | 
| 95 | 
            +
                    # tabla catequistas (id, nombres, apellidos, fecha de nacimiento, lugar de nacimiento, cedula)
         | 
| 96 | 
            +
                    # tabla alumnos (id, nombres, apellidos, lugar_nacimiento, fecha_nacimiento, cedula, fk_catequistas, fk_niveles)
         | 
| 97 | 
            +
                    # tabla niveles (id, nivel, sector, anio_lectivo)
         | 
| 98 | 
            +
                    sql = 'SELECT * FROM alumnos INNER JOIN niveles ON alumnos.id = niveles.id INNER JOIN catequistas ON alumnos.id = catequistas.id'
         | 
| 99 | 
            +
                    sql += " WHERE alumnos.apellidos LIKE '%#{apellidos}%'" unless apellidos.empty?
         | 
| 100 | 
            +
                    sql += " AND alumnos.nombres LIKE '%#{nombres}%'" unless nombres.empty?
         | 
| 101 | 
            +
                    sql += " AND alumnos.cedula = '#{cedula}'" unless cedula.empty?
         | 
| 102 | 
            +
                    sql += " AND niveles.anio_lectivo = '#{anio_lectivo}'" unless anio_lectivo.empty?
         | 
| 103 | 
            +
                    sql += " AND niveles.nivel = '#{nivel}'" unless nivel.empty?
         | 
| 104 | 
            +
                    sql += " AND catequistas.nombres LIKE '%#{nombres_catequista}%'" unless nombres_catequista.empty?
         | 
| 105 | 
            +
                    sql += " AND catequistas.apellidos LIKE '%#{apellidos_catequista}%'" unless apellidos_catequista.empty?
         | 
| 106 | 
            +
                    # Se escoge año lectivo, sector, catequista y nivel
         | 
| 107 | 
            +
                    unless anio_lectivo.empty? || nivel.empty? || nombres_catequista.empty? || apellidos_catequista.empty?
         | 
| 108 | 
            +
                      sql += " AND niveles.anio_lectivo = '#{anio_lectivo}' AND niveles.nivel = '#{nivel}' AND catequistas.nombres LIKE '%#{nombres_catequista}%' AND catequistas.apellidos LIKE '%#{apellidos_catequista}%'"
         | 
| 109 | 
            +
                    end
         | 
| 110 | 
            +
             | 
| 111 | 
            +
             | 
| 112 | 
            +
                    $conn.exec(sql) do |result|
         | 
| 113 | 
            +
                      if result.values.empty?
         | 
| 114 | 
            +
                        FXMessageBox.information(self, MBOX_OK, 'Información', 'No se encontraron registros')
         | 
| 115 | 
            +
                      else
         | 
| 116 | 
            +
                        # mostrar resultados
         | 
| 117 | 
            +
                        FXMessageBox.information(self, MBOX_OK, 'Información', "Se encontraron #{result.values.length} registros")
         | 
| 118 | 
            +
                        require_relative 'resultado'
         | 
| 119 | 
            +
                        vtnresultados = ResultadosConsulta.new(@app, result.values)
         | 
| 120 | 
            +
                        vtnresultados.create
         | 
| 121 | 
            +
                        vtnresultados.show(PLACEMENT_SCREEN)
         | 
| 122 | 
            +
                      end
         | 
| 123 | 
            +
                    end
         | 
| 124 | 
            +
                  end
         | 
| 125 | 
            +
                end
         | 
| 126 | 
            +
             | 
| 127 | 
            +
                @btncancel.connect(SEL_COMMAND) do
         | 
| 128 | 
            +
                  clear_input_fields
         | 
| 129 | 
            +
                end
         | 
| 130 | 
            +
             | 
| 131 | 
            +
                def clear_input_fields
         | 
| 132 | 
            +
                  @input_apellidos.text = ''
         | 
| 133 | 
            +
                  @input_nombres.text = ''
         | 
| 134 | 
            +
                  @input_cedula.text = ''
         | 
| 135 | 
            +
                  @input_anio_lectivo.text = ''
         | 
| 136 | 
            +
                  @input_nivel.text = ''
         | 
| 137 | 
            +
                  @input_nombres_catequista.text = ''
         | 
| 138 | 
            +
                  @input_apellidos_catequista.text = ''
         | 
| 139 | 
            +
                end
         | 
| 140 | 
            +
              end
         | 
| 141 | 
            +
             | 
| 142 | 
            +
              # Nombre del mes
         | 
| 143 | 
            +
              def nombre_mes(mes)
         | 
| 144 | 
            +
                meses = {
         | 
| 145 | 
            +
                  '01' => 'enero',
         | 
| 146 | 
            +
                  '02' => 'febrero',
         | 
| 147 | 
            +
                  '03' => 'marzo',
         | 
| 148 | 
            +
                  '04' => 'abril',
         | 
| 149 | 
            +
                  '05' => 'mayo',
         | 
| 150 | 
            +
                  '06' => 'junio',
         | 
| 151 | 
            +
                  '07' => 'julio',
         | 
| 152 | 
            +
                  '08' => 'agosto',
         | 
| 153 | 
            +
                  '09' => 'septiembre',
         | 
| 154 | 
            +
                  '10' => 'octubre',
         | 
| 155 | 
            +
                  '11' => 'noviembre',
         | 
| 156 | 
            +
                  '12' => 'diciembre'
         | 
| 157 | 
            +
                }
         | 
| 158 | 
            +
                meses[mes]
         | 
| 159 | 
            +
              end
         | 
| 160 | 
            +
             | 
| 161 | 
            +
              # Cambiar el formato de la fecha de YYYY-MM-DD a DD de nombre_mes de YYYY
         | 
| 162 | 
            +
              def cambiar_formato_fecha(fecha)
         | 
| 163 | 
            +
                # split "-" or "/"
         | 
| 164 | 
            +
                fecha = fecha.split(%r{-|/})
         | 
| 165 | 
            +
                # si el formato de fecha es YYYY-MM-DD o YYYY/MM/DD, sino si es DD-MM-YYYY o DD/MM/YYYY
         | 
| 166 | 
            +
                if fecha[0].length == 4
         | 
| 167 | 
            +
                  "#{fecha[2]} de #{nombre_mes(fecha[1])} de #{fecha[0]}"
         | 
| 168 | 
            +
                else
         | 
| 169 | 
            +
                  "#{fecha[0]} de #{nombre_mes(fecha[1])} de #{fecha[2]}"
         | 
| 170 | 
            +
                end
         | 
| 171 | 
            +
              end
         | 
| 172 | 
            +
             | 
| 173 | 
            +
              def create
         | 
| 174 | 
            +
                super
         | 
| 175 | 
            +
                show(PLACEMENT_SCREEN)
         | 
| 176 | 
            +
              end
         | 
| 177 | 
            +
            end
         |