Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[14.0][REF] l10n_br_account_payment_order, l10n_br_account_payment_brcobranca: Separando a Configuração do CNAB do Modo de Pagamento #3243

Conversation

mbcosta
Copy link
Contributor

@mbcosta mbcosta commented Jul 27, 2024

Unified CNAB Codes in only one object and separated CNAB Configuration from Payment Mode.

Unificando os Códigos CNAB em um único objeto e separando a Configuração do CNAB do Modo de Pagamento, apesar de alterar diversos arquivos nesse PR estão sendo feitas basicamento duas alterações:

1- Unificando os Códigos do CNAB

Para implementar o CNAB alguns campos foram deixados como CHAR e outros como objeto, inicialmente os "Códigos de Instrução e Retorno do Movimento" e recentemente foi incluído o "Código da Carteira" PR #2925 , olhando o PR sobre o "Código de Desconto" #3121 eu passei a considerar em fazer o mesmo que fiz para o "Código da Carteira" porque no Desconto

            # Código adotado pela FEBRABAN para identificação do desconto.
            # Domínio: 0 = Isento | 1 = Valor Fixo
            # if payment_mode_id.payment_method_code == "240":
            #    if self.discount_value:
            #        linhas_pagamentos["cod_desconto"] = "1"

            # Deveria ser um Padrão porém: 
            # Banco     | Possíveis Códigos de Desconto |
            #           | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
            # __________________________________________
            # Ailos     | X | X |   |   |   |   |   |   |
            # Bradesco  |   | X | X | X | X | X | X | X |
            # CEF       | X | X | X |   |   |   |   |   |
            # Santander | X | X | X | X |   |   |   |   |
            # Sicred    |   | X | X | X |   |   |   | X |  
            # Unicred   | X | X |   |   |   |   |   |   |

Os Bancos Bradesco e SICRED não enviam o caso "0 - Sem Desconto" o caso "1 - Valor Fixo" apenas varia de nomenclatura entre os Bancos porém hoje o código não permite os outros casos ex.: "2 - Percentual Até a Data Informada" , "3 - Valor por Antecipação Dia Corrido", etc e o Bradesco e SICRED parecem enviar o código "7 - Cancelamento de Desconto" ( é preciso confirmar se está faltando preencher esse campo para cancelar o desconto ).

OBS.: Nesse PR não está sendo resolvido essa questão do Desconto o PR já acabou sendo muito extenso e achei melhor deixar para outro PR para diminuir o "DIFF" e facilitar a revisão

Mas ao ver de transformar o campo em um objeto vi que essa solução estava gerando muito Código, Visões e Menus semelhantes quase duplicadas, e se isso fosse feito nos outros campos "Código de Tarifa, Abatimento e Multa" essa quantidade de código seria maior ainda por isso procurei uma forma de reduzir isso, o que fiz foi criar um objeto único "Código CNAB"/l10n_br_cnab.code e incluir um campo Seleção/selection "Tipo do Código"/code_type assim com um único objeto, visão e menu será possível incluir esses códigos evitando esse problema, coloquei a maioria dos possíveis casos

        selection=[
            ("instruction_move_code", "Instruction Move Code"),
            ("return_move_code", "Return Move Code"),
            ("wallet_code", "Wallet Code"),
            ("discount_code", "Discount Code"),
            ("protest_code", "Protest Code"),
            ("fee_code", "Fee Code"),
            ("interest_code", "Interest Code"),
            ("boleto_species", "Boleto Species"),
            ("boleto_accept", "Boleto Accept"),
            ("doc_finality_code", "DOC Finality Code"),
            ("ted_finality_code", "TED Finality Code"),
            ("complementary_finality_code", "Complementary Finality Code"),
            ("service_type", "Service Type"),
            ("release_form", "Release Form"),
            ("boleto_wallet", "Boleto Wallet"),
            ("boleto_modality", "Boleto Modality"),
            ("boleto_variation", "Boleto Variation"),
        ],

Ao acessar o Faturamento > Configurações é possível acessar o CNAB Codes

image

image

image

Para tentar facilitar a revisão eu separei esse commit em dois o segundo tem apenas as alterações no arquivos data/cnab_codes que são o que acabam gerando mais volume no DIFF

2 - Separando as Configurações do CNAB do Modo de Pagamento

Fazendo a unificação dos códigos do CNAB acabei precisando, devido os scripts de migração, melhorar a definição de alguns campos por isso acabei decidindo fazer um melhoria que é essa separação do que são as informações do CNAB e do Modo de Pagamento/account.payment.mode para isso eu criei um novo objeto o l10n_br_cnab.config e agora no Modo de Pagamento é apenas informado o CNAB usado

Faturamento > Configurações > Modo de Pagamento

image

Faturamento > Configurações > CNAB Config

image

Isso é importante porque:

  • Deixa a implementação mais "limpa" e objetiva facilitando alterações, manutenções e correções porque a Configuração do CNAB está em um objeto especifico
  • Campos não precisam mais do prefixo "cnab_" ( exceção campos cnab_sequence_id e cnab_company_bank_code achei melhor mante-los assim para evitar confusões )
  • Permite separar ou restringir acessos exemplo o usuário pode acessar o Modo de Pagamento mas não as Configurações do CNAB
  • Casos de multi-localizações em um mesmo banco, tanto a tabela no BD quanto objeto do Modo de Pagamento deixam de ter a quantidade de campos que o CNAB acabava incluindo ali
  • Se necessário é possível relacionar o CNAB a outros objetos ou mover essa configuração por exemplo para o Banco/res.bank ( pensei em fazer isso porém isso pode acabar "engessando" a configuração, é preciso avaliar)

Sobre a Migração

Os scripts de migração devem criar todos os

  • Códigos de CNAB baseados nos que existem no BD
  • Configurações CNAB baseados nas configurações existentes nos Modos de Pagamento
  • Relacionar os Modos de Pagamento com a Configuração CNAB
  • Atualizar todas as account.move.line e account.payment.line com o novo "Código de Instrução de Movimento"

Depois de rodar a migração você pode verificar esses objetos para confirmar se tudo ocorreu como deveria

image

image

IMPORTANTE: Não atualize um Banco de Dados em Produção diretamente crie um novo Banco para Homologação em caso de algum erro por favor veja de colocar aqui o LOG com a mensagem.

Inicialmente não foi possível excluir o que não será mais usado porque o script de migração precisa buscar os dados, algo semelhante de quando o openupgrade deixa alguns campos como "old", mas isso também é importante para em caso de algum problema os dados ainda estarão no BD mesmo que para uma eventual consulta o que acredito que também vai garantir uma migração tranquila, porém isso vai ser algo temporário e nos próximos PRs eu pretendo ver de eliminar esses objetos, campos e visões.

cc @rvalyi @renatonlima @marcelsavegnago @mileo

@OCA-git-bot
Copy link
Contributor

Hi @rvalyi,
some modules you are maintaining are being modified, check this out!

class L10nBrCNABCode(models.Model):
_name = "l10n_br_cnab.code"
_inherit = "mail.thread"
_description = "CNAB Code"
Copy link
Sponsor Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

CNAB Code, não me parece um nome bom, poderia ser mais especifico, já que é um modelo para guardar a opção de valor que pode ser preenchido em um campo cnab, sugiro mudar o nome para "CNAB Field Option"

minha sugestão:
nome do arquivo: l10n_br_cnab_field_option.py
_name: l10n_br.cnab.field.option
_description = "CNAB Field Option""

o campo code_type podia mudar para field_name

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Colocar nomes em objetos ou campos pode ser um problema, o que faço para tentar descobrir qual é o melhor nome e de forma genérica tentar responder
"Qual o objetivo ou função do objeto ou campo?"
Nesse caso esse objeto é usados para armazenar, cadastrar os "Códigos do CNAB", cada CNAB tem um conjunto de Códigos, a maioria das Documentações que vi se referem a esses dados como Códigos, exemplo "Código de Instrução do Movimento", "Código de Retorno do Movimento", "Código de Alteração do Vencimento", "Código de Alteração do Valor do Título", etc no Arquivo de Remessa não é uma Opção não preencher o "Código de Instrução do Movimento" e cada código tem um objetivo

O campo code_type deriva da explicação acima porque os Códigos são agrupados em conjuntos os de Instrução não são iguais aos de Retorno e até possuem o mesmo valor no campo code exemplo o 01 pode ser tanto uma Instrução quanto um Retorno, o que acredito que difere entre eles, e o termo que que encontrei, é o Tipo existem o Códigos CNAB do Tipo Instrução de Movimento, do Tipo Retorno de Movimento, do Tipo Código da Carteira, do Tipo Código de Desconto e etc não vejo relação com um field_name/ Nome do Campo o objeto já possui um campo name

@antoniospneto
Copy link
Sponsor Contributor

No geral me parece uma boa mudança, deixei umas observações a cima que eu acho que pode ajudar a deixar mais claro.
Ainda vou olhar com mais detalhes e testar em base de homologação, valeu!

@mileo
Copy link
Member

mileo commented Jul 29, 2024

Unified CNAB Codes in only one object and separated CNAB Configuration from Payment Mode.

Unificando os Códigos CNAB em um único objeto e separando a Configuração do CNAB do Modo de Pagamento, apesar de alterar diversos arquivos nesse PR estão sendo feitas basicamento duas alterações:

1- Unificando os Códigos do CNAB

Para implementar o CNAB alguns campos foram deixados como CHAR e outros como objeto, inicialmente os "Códigos de Instrução e Retorno do Movimento" e recentemente foi incluído o "Código da Carteira" PR #2925 , olhando o PR sobre o "Código de Desconto" #3121 eu passei a considerar em fazer o mesmo que fiz para o "Código da Carteira" porque no Desconto

            # Código adotado pela FEBRABAN para identificação do desconto.
            # Domínio: 0 = Isento | 1 = Valor Fixo
            # if payment_mode_id.payment_method_code == "240":
            #    if self.discount_value:
            #        linhas_pagamentos["cod_desconto"] = "1"

            # Deveria ser um Padrão porém: 
            # Banco     | Possíveis Códigos de Desconto |
            #           | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
            # __________________________________________
            # Ailos     | X | X |   |   |   |   |   |   |
            # Bradesco  |   | X | X | X | X | X | X | X |
            # CEF       | X | X | X |   |   |   |   |   |
            # Santander | X | X | X | X |   |   |   |   |
            # Sicred    |   | X | X | X |   |   |   | X |  
            # Unicred   | X | X |   |   |   |   |   |   |

Os Bancos Bradesco e SICRED não enviam o caso "0 - Sem Desconto" o caso "1 - Valor Fixo" apenas varia de nomenclatura entre os Bancos porém hoje o código não permite os outros casos ex.: "2 - Percentual Até a Data Informada" , "3 - Valor por Antecipação Dia Corrido", etc e o Bradesco e SICRED parecem enviar o código "7 - Cancelamento de Desconto" ( é preciso confirmar se está faltando preencher esse campo para cancelar o desconto ).

OBS.: Nesse PR não está sendo resolvido essa questão do Desconto o PR já acabou sendo muito extenso e achei melhor deixar para outro PR para diminuir o "DIFF" e facilitar a revisão

Mas ao ver de transformar o campo em um objeto vi que essa solução estava gerando muito Código, Visões e Menus semelhantes quase duplicadas, e se isso fosse feito nos outros campos "Código de Tarifa, Abatimento e Multa" essa quantidade de código seria maior ainda por isso procurei uma forma de reduzir isso, o que fiz foi criar um objeto único "Código CNAB"/l10n_br_cnab.code e incluir um campo Seleção/selection "Tipo do Código"/code_type assim com um único objeto, visão e menu será possível incluir esses códigos evitando esse problema, coloquei a maioria dos possíveis casos

        selection=[
            ("instruction_move_code", "Instruction Move Code"),
            ("return_move_code", "Return Move Code"),
            ("wallet_code", "Wallet Code"),
            ("discount_code", "Discount Code"),
            ("protest_code", "Protest Code"),
            ("fee_code", "Fee Code"),
            ("interest_code", "Interest Code"),
            ("boleto_species", "Boleto Species"),
            ("boleto_accept", "Boleto Accept"),
            ("doc_finality_code", "DOC Finality Code"),
            ("ted_finality_code", "TED Finality Code"),
            ("complementary_finality_code", "Complementary Finality Code"),
            ("service_type", "Service Type"),
            ("release_form", "Release Form"),
            ("boleto_wallet", "Boleto Wallet"),
            ("boleto_modality", "Boleto Modality"),
            ("boleto_variation", "Boleto Variation"),
        ],

Ao acessar o Faturamento > Configurações é possível acessar o CNAB Codes

image

image

image

Para tentar facilitar a revisão eu separei esse commit em dois o segundo tem apenas as alterações no arquivos data/cnab_codes que são o que acabam gerando mais volume no DIFF

2 - Separando as Configurações do CNAB do Modo de Pagamento

Fazendo a unificação dos códigos do CNAB acabei precisando, devido os scripts de migração, melhorar a definição de alguns campos por isso acabei decidindo fazer um melhoria que é essa separação do que são as informações do CNAB e do Modo de Pagamento/account.payment.mode para isso eu criei um novo objeto o l10n_br_cnab.config e agora no Modo de Pagamento é apenas informado o CNAB usado

Faturamento > Configurações > Modo de Pagamento

image

Faturamento > Configurações > CNAB Config

image

Isso é importante porque:

  • Deixa a implementação mais "limpa" e objetiva facilitando alterações, manutenções e correções porque a Configuração do CNAB está em um objeto especifico
  • Campos não precisam mais do prefixo "cnab_" ( exceção campos cnab_sequence_id e cnab_company_bank_code achei melhor mante-los assim para evitar confusões )
  • Permite separar ou restringir acessos exemplo o usuário pode acessar o Modo de Pagamento mas não as Configurações do CNAB
  • Casos de multi-localizações em um mesmo banco, tanto a tabela no BD quanto objeto do Modo de Pagamento deixam de ter a quantidade de campos que o CNAB acabava incluindo ali
  • Se necessário é possível relacionar o CNAB a outros objetos ou mover essa configuração por exemplo para o Banco/res.bank ( pensei em fazer isso porém isso pode acabar "engessando" a configuração, é preciso avaliar)

Sobre a Migração

Os scripts de migração devem criar todos os

  • Códigos de CNAB baseados nos que existem no BD
  • Configurações CNAB baseados nas configurações existentes nos Modos de Pagamento
  • Relacionar os Modos de Pagamento com a Configuração CNAB
  • Atualizar todas as account.move.line e account.payment.line com o novo "Código de Instrução de Movimento"

Depois de rodar a migração você pode verificar esses objetos para confirmar se tudo ocorreu como deveria

image

image

IMPORTANTE: Não atualize um Banco de Dados em Produção diretamente crie um novo Banco para Homologação em caso de algum erro por favor veja de colocar aqui o LOG com a mensagem.

Inicialmente não foi possível excluir o que não será mais usado porque o script de migração precisa buscar os dados, algo semelhante de quando o openupgrade deixa alguns campos como "old", mas isso também é importante para em caso de algum problema os dados ainda estarão no BD mesmo que para uma eventual consulta o que acredito que também vai garantir uma migração tranquila, porém isso vai ser algo temporário e nos próximos PRs eu pretendo ver de eliminar esses objetos, campos e visões.

cc @rvalyi @renatonlima @marcelsavegnago @mileo

Muito bom! Vai ajudar a mantermos dados de configuração para as carteiras! Reviso em breve.

@mbcosta mbcosta force-pushed the 14.0-REF-unify_cnab_code_separate_cnab_from_payment_mode branch from 9223764 to ce32888 Compare August 1, 2024 20:36
@mbcosta
Copy link
Contributor Author

mbcosta commented Aug 1, 2024

Force-push para atualizar o README dos módulos, alguns pontos:

  • Com essa mudança alguns campos estão sendo renomeados exemplo mov_instruction_code_id para instruction_move_code_id em outros casos está sendo removido o prefixo cnab_* por isso caso vejam que algum outro campo pode ser melhorado isso pode ser visto
  • Com o CNAB Config vai ser possível tanto carregar como Dados Iniciais em novos Bancos de Dados quanto incluir no módulo como Data

@rvalyi
Copy link
Member

rvalyi commented Aug 8, 2024

@mbcosta rola um rebase por favor?

@mileo
Copy link
Member

mileo commented Aug 16, 2024

@mbcosta já da pra revisar? Ou vc pretende mudar mais coisa?

@mbcosta mbcosta force-pushed the 14.0-REF-unify_cnab_code_separate_cnab_from_payment_mode branch 2 times, most recently from 323eb35 to c8e3a1c Compare August 17, 2024 15:56
@mbcosta
Copy link
Contributor Author

mbcosta commented Aug 17, 2024

valeu @rvalyi @mileo , fiz um Force-Push para fazer o rebase ontem e acabei resolvendo um conflito de arquivo errado e acabou gerando erro nos testes, já corrigido.

Por enquanto a única alteração que estou considerando é separar as alterações nos README em um commit específico, talvez isso seja melhor para revisão, o que acham, seria melhor?

Para quem for fazer a Revisão eu recomendo ao invés de ir direto na aba Arquivos Alterado/Files changed clicar nos Commits para ver por partes, uma breve descrição dos commits:

1 - [REF] l10n_br_account_payment_order: Unified CNAB Codes in only one object and separated CNAB Configuration from Payment Mode

Aqui estão as principais alterações, uma forma de visualizar a separação do Modo de Pagamento das Configurações CNAB é olhar como ficaram os Dados de Demonstração do Modo de Pagamento e do novo arquivo CNAB Config, o que reflete no Banco de Dados, ou também pelo README

2 - [REF] l10n_br_account_payment_order: Unified CNAB Codes Data in only one object

O que gera o maior DIFF porque ao unificar os Códigos CNAB é preciso alterar nos arquivos DATA esse novo objeto e incluir o campo Tipo do Código, o que permite unir os campos, então esse commit é repetitivo é aqui os erros que podem existir são de Digitação, algum nome ou valor de campo errado, nesses casos pode ocorrer Warnings ou mesmo ERROR no LOG.

3 - [REF] l10n_br_account_payment_brcobranca: Unified CNAB Codes in only one object and separated CNAB Configuration from Payment Mode

As alterações necessárias no modulo do BRCobranca para usar o CNAB Config para obter os dados do CNAB e não mas diretamente do Modo de Pagamento e ao consultar algum Código CNAB usar o novo objeto l10n_br_cnab.code e incluir o Tipo do Código se é uma Instrução de Movimento, Retorno do Movimento ou Código de Carteira (por enquanto os possíveis códigos).

Infelizmente não vejo uma forma de extrair essas alterações em PRs menores para facilitar a Revisão sem gerar erro nos testes do CI.

O LOG passou a retornar WARNINGS de campos com nomes iguais e a Cobertura dos Testes diminui com esse PR, porém como escrevi antes isso é temporário e foi necessário manter para rodar os Scripts de Migração, mas também garante que esses Dados podem ser consultados eventualmente em caso de algum problema depois do Merge, acredito que depois de alterar os Códigos de Desconto, Multa, ????? de CHAR para Objetos já poderá ser feito um PR de "limpeza" removendo Campos, Visões e Objetos o que vai resolver esse Warnings no LOG e melhorando a Cobertura dos Testes.

@antoniospneto
Copy link
Sponsor Contributor

antoniospneto commented Sep 9, 2024

@mbcosta coloquei essa PR em rascunho já que tá sendo quebrado em PR menores ok
Vou revisar ali o #3337

@mbcosta mbcosta force-pushed the 14.0-REF-unify_cnab_code_separate_cnab_from_payment_mode branch 2 times, most recently from 4e2d07b to b175eb8 Compare September 10, 2024 22:05
@mbcosta
Copy link
Contributor Author

mbcosta commented Sep 10, 2024

Com a extração das alterações referentes a Unificar os Códigos CNAB esse PR passou a depender do PR #3337 eu incluí aqui os commits para evitar erros mas assim que houver o merge eu vou ver de fazer o rebase e aqui deverá ter apenas os commits referentes a Separar a Configuração CNAB do Modo de Pagamento.

Com essa alteração a Migração também foi dividida:

  • 14.0.6.0.0 Unifica os Códigos CNAB
  • 14.0.7.0.0 Separa a Configuração CNAB do Modo de Pagamento

Aproveitei e também dividi os commits para facilitar a revisão:

Removi as alterações do README para diminuir o DIFF, pretendo fazer em outro PR.

Peço desculpas para quem eu havia falado que o PR estava pronto para Revisão antes, @rvalyi @mileo , porque ao separar vi que alguns Códigos do CNAB do Bradesco e um do AILOS estavam sem informar o novo campo code_type o que identifica se é um Código de Instrução ou Retorno ou Carteira, acredito que agora está tudo certo e que devido a quantidade de Aprovações no PR #3337 esse PR agora passa apenas a aguardar o merge mas já é possível fazer a Revisão.

@mbcosta mbcosta marked this pull request as ready for review September 10, 2024 22:56
@mbcosta mbcosta force-pushed the 14.0-REF-unify_cnab_code_separate_cnab_from_payment_mode branch 3 times, most recently from 6fdf2e2 to 18b3e72 Compare September 11, 2024 14:42
@mbcosta mbcosta changed the title [14.0][REF] l10n_br_account_payment_order, l10n_br_account_payment_brcobranca: Unificando os Códigos CNAB e separando a Configuração do CNAB do Modo de Pagamento [14.0][REF] l10n_br_account_payment_order, l10n_br_account_payment_brcobranca: Separando a Configuração do CNAB do Modo de Pagamento Sep 12, 2024
@mbcosta
Copy link
Contributor Author

mbcosta commented Sep 12, 2024

Apenas para registrar que com o merge do PR #3337 aqui passou a conter apenas a Separação das Configurações CNAB do Modo de Pagamento, agora o DIFF está menor e o PR está mais especifico, os commits também foram divididos, o que deve facilitar a Revisão.

tracking=True,
)

comment = fields.Text()
Copy link
Sponsor Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Qual é a função desse campo? Notei que ele não está sendo utilizado. Isso realmente é necessário?

<field name="name">CNAB Config</field>
<field name="res_model">l10n_br_cnab.config</field>
<field name="view_mode">tree,form</field>
<field name="context">{'group_by':['bank_id', 'payment_method_id']}</field>
Copy link
Sponsor Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Será que não seria melhor deixar o padrão sem agrupamento? O agrupamento automático prejudica a visualização e, o pior, não há como desabilitá-lo, ficando fixo. Seria mais interessante deixar a opção de agrupar disponível como filtro, mas não ativada por padrão.

Copy link
Sponsor Contributor

@antoniospneto antoniospneto left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Testei uma base cópia de migração e deu tudo certo.
Fiz uns comentário acima, mas nada de mais.

Copy link
Sponsor Member

@marcelsavegnago marcelsavegnago left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

Copy link
Member

@mileo mileo left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

Seria importante colocar company_id nos domínios dos relacionais das configurações, como por exemplo a sequencia, isso sempre da problema na configuração de um ambiente multi company.

@rvalyi
Copy link
Member

rvalyi commented Sep 17, 2024

pessoal, como o PR eh grande, ja vou dar o merge para nao aumentar o trabalho caso #3345 entrar antes.

@rvalyi
Copy link
Member

rvalyi commented Sep 17, 2024

/ocabot merge nobump

@OCA-git-bot
Copy link
Contributor

Hey, thanks for contributing! Proceeding to merge this for you.
Prepared branch 14.0-ocabot-merge-pr-3243-by-rvalyi-bump-nobump, awaiting test results.

@OCA-git-bot OCA-git-bot merged commit 1accc49 into OCA:14.0 Sep 17, 2024
6 of 7 checks passed
@OCA-git-bot
Copy link
Contributor

Congratulations, your PR was merged at b16d37e. Thanks a lot for contributing to OCA. ❤️

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

9 participants