Example #1
0
def test_parser_afiliado_con_empleador():
    html = './sss_beneficiarios_hospitales/html-samples/full-afiliado-con-empleador.html'

    parser = SSSParser(html)
    data = parser.get_all_data()
    # print(json.dumps(data, indent=2))

    assert data['title'] == "Superintendencia de Servicios de Salud"
    assert data["hay_afiliacion"]
    assert not data["no_hay_afiliacion"]

    for d in data['tablas']:
        assert "name" in d
        is_afiliacion = "AFILIACION" in [
            v for k, v in d.items() if k == 'name'
        ]
        is_persona = "AFILIADO" in [v for k, v in d.items() if k == 'name']
        is_declarado = "DECLARADO_POR_EMPLEADOR" in [
            v for k, v in d.items() if k == 'name'
        ]
        assert is_afiliacion or is_persona or is_declarado

        if is_afiliacion:
            assert d['data']["Parentesco"] == "TITULAR"
            assert d['data']["CUIL"] == "27-1XXXXX3-6"
            assert d['data']["Tipo de documento"] == "DOCUMENTO UNICO"
            assert d['data']["N\u00famero de documento"] == "1XXXXX3"
            assert d['data']["Apellido y nombre"] == "GOMEZ EDUARDO"
            assert d['data']["Provincia"] == "CAPITAL FEDERAL"
            assert d['data']["Fecha de nacimiento"] == "25-05-1977"
            assert d['data']["Sexo"] == "Masculino"

        if is_persona:
            assert d['data']["CUIL titular"] == "27-1XXXXX3-6"
            assert d['data']["CUIT de empleador"] == "30-70818659-3"
            assert d['data']["CUIL titular"] == "27-1XXXXX3-6"
            assert d['data'][
                "Tipo de beneficiario"] == "RELACION DE DEPENDENCIA"
            assert d['data']["C\u00f3digo de Obra Social"] == "4-0080-0"
            assert d['data'][
                "Denominaci\u00f3n Obra Social"] == "OBRA SOCIAL DE EJECUTIVOS Y DEL PERSONAL DE DIRECCION DE EMPRESAS"
            assert d['data']["Fecha Alta Obra Social"] == "01-06-1931"

        if is_declarado:
            assert d['data'][
                "Tipo Beneficiario Declarado"] == "RELACION DE DEPENDENCIA (DDJJ SIJP)"
            assert d['data']["Ultimo Per\u00edodo Declarado"] == "02-2020"
def test_parser_no_afiliado():
    html = get_html_sample('full-sin-datos')

    parser = SSSParser(html)
    data = parser.get_all_data()
    # print(json.dumps(data, indent=2))

    assert data['title'] == "Superintendencia de Servicios de Salud"
    assert data["afiliado"] == False

    for d in data['tablas']:
        assert "name" in d
        is_persona = "NO_AFILIADO" in [v for k, v in d.items() if k == 'name']
        assert is_persona

        assert d['data']["Apellido y Nombre"] == "BXXXXXXXXS FXXXL JUAN CARLOS"
        assert d['data']["Tipo Documento"] == "DU"
        assert d['data']["Nro Documento"] == "2XXXXX1"
        assert d['data']["CUIL"] == "202XXXXX18"
Example #3
0
def test_parser_no_afiliado():
    html = './sss_beneficiarios_hospitales/html-samples/full-sin-datos.html'

    parser = SSSParser(html)
    data = parser.get_all_data()
    # print(json.dumps(data, indent=2))

    assert data['title'] == "Superintendencia de Servicios de Salud"
    assert not data["hay_afiliacion"]
    assert data["no_hay_afiliacion"]

    for d in data['tablas']:
        assert "name" in d
        is_persona = "NO_AFILIADO" in [v for k, v in d.items() if k == 'name']
        assert is_persona

        assert d['data']["Apellido y Nombre"] == "BXXXXXXXXS FXXXL JUAN CARLOS"
        assert d['data']["Tipo Documento"] == "DU"
        assert d['data']["Nro Documento"] == "2XXXXX1"
        assert d['data']["CUIL"] == "202XXXXX18"
Example #4
0
    def query(self, dni):
        logger.info('DBH query')
        if not self.logged_in:
            self.login()
        if not self.logged_in:
            return {'ok': False, 'error': 'Unable to login'}

        params = {
            'pagina_consulta': '',
            'cuil_b': '',
            'nro_doc': dni,
            'B1': 'Consultar'
        }
        sleep(self.pause_before_requests)

        ret = self._request(self.query_url, params=params)
        if ret['ok']:
            self.query_response = ret['response']
        else:
            raise Exception('Unable to Query from SSS page. {}'.format(
                ret['error']))

        logger.info('Query {}'.format(self.query_response.status_code))

        self._save_response('query', self.query_response)
        if self.fake_env:
            # DNI should be a file in html-samples folder e.g. "full-afiliado"
            html = f'/html-samples/{dni}.html'
            # dejar un valor predeterminado
            if not os.path.isfile(html):
                html = f'/html-samples/full-afiliado.html'
            module_dir = os.path.dirname(__file__)
            html = module_dir + html
        else:
            html = self.query_response.text
        self.parser = SSSParser(html)
        self.parser.debug = self.debug
        data = self.parser.get_all_data()

        return {'ok': True, 'resultados': data}
Example #5
0
def test_parser_afiliado():
    html = './sss_beneficiarios_hospitales/html-samples/full-afiliado.html'

    parser = SSSParser(html)
    data = parser.get_all_data()
    # print(json.dumps(data, indent=2))

    assert data['title'] == "Superintendencia de Servicios de Salud"
    assert data["hay_afiliacion"]
    assert not data["no_hay_afiliacion"]

    for d in data['tablas']:
        assert "name" in d
        is_afiliacion = "AFILIACION" in [
            v for k, v in d.items() if k == 'name'
        ]
        is_persona = "AFILIADO" in [v for k, v in d.items() if k == 'name']
        assert is_afiliacion or is_persona

        if is_afiliacion:
            assert d['data']["Parentesco"] == "TITULAR"
            assert d['data']["CUIL"] == "27-1XXXXX3-6"
            assert d['data']["Tipo de documento"] == "DOCUMENTO UNICO"
            assert d['data']["N\u00famero de documento"] == "1XXXXX3"
            assert d['data']["Apellido y nombre"] == "FXXXL  MARIA"
            assert d['data']["Provincia"] == "CORDOBA"
            assert d['data']["Fecha de nacimiento"] == "09-09-1961"
            assert d['data']["Sexo"] == "Femenino"

        if is_persona:
            assert d['data']["CUIL titular"] == "27-1XXXXX3-6"
            assert d['data']["CUIT de empleador"] == "33-63761744-9"
            assert d['data']["CUIL titular"] == "27-1XXXXX3-6"
            assert d['data'][
                "Tipo de beneficiario"] == "JUBILADOS Y PENSIONADOS DE PAMI"
            assert d['data']["C\u00f3digo de Obra Social"] == "5-0080-7"
            assert d['data'][
                "Denominaci\u00f3n Obra Social"] == "INSTITUTO NACIONAL DE SERVICIOS SOCIALES PARA JUBILADOS Y PENSIONADOS"
            assert d['data']["Fecha Alta Obra Social"] == "01-08-2012"
Example #6
0
class DataBeneficiariosSSSHospital:
    """ Consultas al PadrĂ³n de Beneficiarios de los Agentes 
        Nacionales del Seguro de Salud. Requiere credenciales 
        de Hospital habilitado. """
    def __init__(self, user, password, headers=None):
        self.user = user
        self.password = password
        self.session = requests.session()
        self.verify_ssl = False
        self.login_url = 'https://seguro.sssalud.gob.ar/login.php?b_publica=Acceso+Restringido+para+Hospitales&opc=bus650&user=HPGD'
        self.logged_in = False
        self.query_url = 'https://seguro.sssalud.gob.ar/indexss.php?opc=bus650&user=HPGD&cat=consultas'
        logger.debug('DBH started')
        self.pause_before_requests = 2
        default_headers = {
            'User-Agent':
            'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36'
        }
        if headers is not None:
            default_headers.update(headers)

        self.session.headers.update(default_headers)
        self.debug = False
        self.fake_env = user == 'FAKE' and password == 'FAKE'

    def login(self):

        if self.fake_env:
            self.logged_in = True
            return True

        params = {
            '_user_name_': self.user,
            '_pass_word_': self.password,
            'submitbtn': 'Ingresar'
        }

        sleep(self.pause_before_requests)

        ret = self._request(self.login_url, params=params)
        if ret['ok']:
            self.login_response = ret['response']
        else:
            raise Exception('Unable to login to SSS page. {}'.format(
                ret['error']))

        self._save_response('login', self.login_response)
        self.logged_in = self._validate_logged_in()
        if not self.logged_in:
            logger.error('Failed to log in {}'.format(
                self.login_response.status_code))
        else:
            logger.info('Logged in')

        return self.logged_in

    def query(self, dni):
        logger.info('DBH query')
        if not self.logged_in:
            self.login()
        if not self.logged_in:
            return {'ok': False, 'error': 'Unable to login'}

        params = {
            'pagina_consulta': '',
            'cuil_b': '',
            'nro_doc': dni,
            'B1': 'Consultar'
        }
        sleep(self.pause_before_requests)

        ret = self._request(self.query_url, params=params)
        if ret['ok']:
            self.query_response = ret['response']
        else:
            raise Exception('Unable to Query from SSS page. {}'.format(
                ret['error']))

        logger.info('Query {}'.format(self.query_response.status_code))

        self._save_response('query', self.query_response)
        if self.fake_env:
            # DNI should be a file in html-samples folder e.g. "full-afiliado"
            html = get_html_sample(dni)
            # dejar un valor predeterminado
            if not os.path.isfile(html):
                html = get_html_sample('full-afiliado')
        else:
            html = self.query_response.text
        self.parser = SSSParser(html)
        self.parser.debug = self.debug
        data = self.parser.get_all_data()

        return {'ok': True, 'resultados': data}

    def _save_response(self, filename, resp):
        if self.fake_env:
            return

        f = open(f'{filename}.html', 'w')
        f.write(resp.text)
        f.close()

        data = {
            'headers': dict(resp.headers),
            'cookies': resp.cookies.get_dict(),
            'encoding': resp.encoding,
            'status_code': resp.status_code
        }

        str_data = json.dumps(data, indent=4)

        f = open(f'{filename}.json', 'w')
        f.write(str_data)
        f.close()

    def _validate_logged_in(self):
        """ validate login worked fine """
        ok1 = 'usuario_logueado' in self.login_response.text
        ok2 = 'nro_doc' in self.login_response.text
        return ok1 and ok2

    def _request(self, url, method='POST', params={}):

        ret = {'ok': True}
        if self.fake_env:

            class FakeResponse:
                status_code = 0

            ret['response'] = FakeResponse()
            return ret

        if method == 'GET':
            try:
                res = self.session.get(url, verify=self.verify_ssl)
            except Exception as e:
                ret['ok'] = False
                error = f'Error requesting {method} {url}: {e}'

        elif method == 'POST':
            try:
                res = self.session.post(url,
                                        data=params,
                                        verify=self.verify_ssl)
            except Exception as e:
                ret['ok'] = False
                error = f'Error requesting {method} {url}: {e}'

        else:
            error = f'Invalid method {method}'
            ret['ok'] = False

        if ret['ok']:
            ret['response'] = res
        else:
            logger.error(error)
            ret['error'] = error

        return ret