R/import_t4.R

Defines functions import_t4

Documented in import_t4

#' Importar arquivo de contratos de cartões Visa
#'
#' Importa o arquivo T4 para o R ou para o MySQL.
#'
#' @export
#'
#' @param caminho String. O caminho do arquivo a ser importado, incluindo a
#'   extensão (.txt).
#' @param MySQL Logical. Se TRUE, entao o arquivo será importado para o MySQL.
#' @param schema String. Se MySQL = TRUE, o nome do schema que conterá a tabela
#'   T4 no MySQL. O schema deve existir no MySQL antes de executar a função.
#' @param tabela String. Se MySQL = TRUE, o nome da tabela a ser criada no
#'   servidor que conterá os dados importados.
#'
#' @details Se for importar apenas para o R, lembre-se de nomear um objeto para
#'   o resultado da função. Caso for importar para o MySQL, não é necessário
#'   criar um objeto. Note que a tabela será sobrescrita se já existir.
#'
#' @examples
#' \dontrun{
#' # para importar para o R:
#' data = import_gco("C:\\Arquivos\\GCO\\202009.txt")
#'
#' # para importar para o MySQL:
#' import_gco(
#'     "C:\\Arquivos\\GCO\\202009.txt",
#'     mysql = TRUE,
#'     tabela = "t202009",
#'     user = "alberson"
#' )
#' }
#'
import_t4 = function(caminho,
                     mysql = FALSE,
                     schema = "t4",
                     tabela,
                     drop = FALSE,
                     metodo = c("vroom", "readr"),
                     host,
                     port,
                     user,
                     password = NULL) {

    # evaluate arg tabela
    if (mysql == TRUE && is.null(tabela)) {
        stop("tabela deve ser informada")
    }

    # evaluate arg host
    if (mysql == TRUE && is.null(user)) {
        stop("host deve ser informado")
    }

    # evaluate arg user
    if (mysql == TRUE && is.null(user)) {
        stop("user deve ser informado")
    }

    # evaluate arg metodo
    match.arg(metodo)

    # conexao com MySQL
    if (mysql == TRUE) {
        tryCatch(
            {
                con = DBI::dbConnect(
                    RMySQL::MySQL(),
                    host = host,
                    port = port,
                    db = schema,
                    user = user,
                    password = ifelse(
                        is.null(password),
                        rstudioapi::askForPassword("Database password"),
                        password
                    )
                )
            },
            error = function(cond) {
                message(cond)
                stop(
                    paste(
                        "Talvez você não tenha criado o schema",
                        schema,
                        "no MySQL?"
                    )
                )
            }
        )
    }

    # leitura arquivo
    colunas = c(
        "cid", "conta_corrente", "status_conta", "tit", "cpfcnpj", "nome",
        "nome_embosso", "limite", "nr_plastico", "saldo_devedor",
        "dias_atraso", "vencimento", "tel_fixo", "ddd_fixo",
        "tel_recado", "ddd_recado", "tel_celular", "ddd_celular",
        "bloq_visa", "bloq_mon", "bloq_plastico", "status_contrato",
        "spfc", "tp_cc", "cod_ar", "fatura_digital", "dt_modificacao",
        "ult_canal_alt", "status_sms", "dt_modificacao_2", "dt_solic_cc",
        "nr_pedido_via_atual", "motivo_solic", "status_aut", "status_plastico",
        "nr_via", "pct", "dia_fatura", "debito_automatico", "dt_venc_cnt",
        "status_conta_visa", "verified_by_visa", "qnt_pts_fideli",
        "debito_forcado", "dt_venda", "origem_contrato", "localizacao_cnt",
        "env_esteira", "dt_ult_trans_visa_elec", "dt_ult_debito_forcado",
        "nr_id_cli", "id_plastico", "nr_contrato_credito", "nr_conta_visa"
    )

    col_types = readr::cols(
        cpfcnpj = readr::col_character(),
        nr_conta_visa = readr::col_character(),
        vencimento = readr::col_date("%Y%m%d"),
        dt_modificacao = readr::col_date("%Y%m%d"),
        dt_modificacao_2 = readr::col_date("%Y%m%d"),
        dt_solic_cc = readr::col_date("%Y%m%d"),
        dt_venc_cnt = readr::col_date("%Y%m%d"),
        dt_venda = readr::col_date("%Y%m%d"),
        dt_ult_debito_forcado = readr::col_date("%Y%m%d"),
        dt_ult_trans_visa_elec = readr::col_date("%Y%m%d"),
        limite = readr::col_double(),
        saldo_devedor = readr::col_double(),
        dias_atraso = readr::col_double(),
        qnt_pts_fideli = readr::col_double()
    )

    # importar arquivo para o R via {readr}
    if (metodo == "readr") {
        data = readr::read_csv(
            caminho,
            col_names = colunas,
            col_types = col_types
        )
    }

    # importar arquivo para o R via {vroom}
    if (metodo == "vroom") {
        data = vroom::vroom(
            caminho,
            delim = ";",
            col_types = col_types,
            col_names = colunas
        )
    }

    # criar tabela no MySQL
    if (mysql == TRUE) {

        # sobrescrever tabela
        if (drop == TRUE) {

            # dropar tabela
            DBI::dbSendQuery(con, paste("DROP TABLE IF EXISTS", tabela))
            # gravar tabela
            DBI::dbWriteTable(con, DBI::SQL(tabela), data)
            # gravar índices
            DBI::dbSendQuery(con, paste0("
            ALTER TABLE ", schema, ".", tabela, "
            ADD INDEX idx_nr_conta_visa (nr_conta_visa(16)),
            ADD INDEX idx_cpfcnpj (cpfcnpj(14));
            "))
        } else {

            # append da tabela
            DBI::dbWriteTable(con, DBI::SQL(tabela), data, append = TRUE)
        }


        # desconectando
        DBI::dbDisconnect(con)
    } else {
        data
    }
}
albersonmiranda/MySQLimport documentation built on Dec. 19, 2021, 12:24 a.m.