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

Feature/cnab multiple payments #112

Open
wants to merge 894 commits into
base: 12.0-mig-l10n_br_account_payment_cobranca
Choose a base branch
from

Conversation

mileo
Copy link
Member

@mileo mileo commented Sep 29, 2020

Descrição do problema/nova funcionalidade deste Pull Resquest(PR):

Comportamento atual antes do PR:

Comportamento esperado depois do PR:

  • Esta mudança não altera a estrutura do banco de dados, portanto não precisa de script de migração.

--
Eu confirmo que eu assinei a CLA e li as recomendações de como contribuir:

@mileo mileo force-pushed the feature/cnab-multiple-payments branch from 9e2dee6 to 2a174de Compare September 30, 2020 11:27
@mbcosta
Copy link
Member

mbcosta commented Oct 2, 2020

ola @mileo @gabrielcardoso21

Acredito que o que levou a esse PR seria a seguinte situação:
"Por exemplo a empresa XPTO tem os seguintes pagamentos a realizar hoje:

  1. BOLETO: Lojas.com
  2. Pagamento Salário: Fulano
  3. DAS: referente ao mês anterior
  4. Outra conta da empresa "TED mesma titularidade
  5. TED: Para pró-labore do sócio Fulano.
  6. GPS: Referente a folha

Na modelagem atual seriam 6 ordens de pagamento, 6 arquivos de remessa.
Fica inviável de usar.
"

Pelo que vi aqui vocês criaram uma forma de agrupar tudo o que é referente ao Pagamento criando um Modo de Pagamento/account.payment.mode que possui dentro o TED, DAS, ISS e Pagamento de Utilitário para que assim seja criada uma Ordem de Pagto única. Achei ruim a implementação basicamente porque dentro de um Modo de Pagamento foi criado um novo objeto account.payment.mode.line que possui os campos name e payment_mode_id, quer dizer que dentro de um Modo de Pagto existem outros Modos de Pagtos, algo que não parece fazer sentido e pode ser confuso de explicar até para o usuário final, acredito que pode existir uma solução melhor, por isso gostaria de fazer algumas perguntas:

Inicialmente pensei que a necessidade seria criar um arquivo de remessa único com as 6 formas mas pelo o que foi feito parece que a necessidade seria apenas de juntar os referentes aos pagamentos (TED, DAS, ISS e Pagamento de Utilitário) sem a necessidade de ter a Cobrança junto na criação do arquivo de Remessa com Lote, seria isso ?

As remessas de Pagamentos são criadas diretamente na tela de Ordem de Pagamento sem um "documento de origem" ( como no caso da cobrança onde a Fatura gera as Linhas da Ordem de Pagto ) e até por isso vocês viram a necessidade de unifica-los e assim facilitar para o usuário final que vai criar apenas uma Ordem de Pagamento ?

Uma possível sugestão que tenho por enquanto baseado no que foi feito seria usar o os campos Code e Payment Type do objeto account.payment.method relacionado para fazer um "domain" e tornar visíveis ou invisíveis os campos referentes a Cobrança/CNAB 240 e 400/inbound ou ao CNAB 240 de Pagto/outbound "limpando" a tela ao deixar apenas os campos específicos de cada um e nesse caso incluindo os campos referentes a TED, DAS, ISS e Pagamento de Utilitário e etc para serem parametrizados, isso é dentro de apenas um Modo de Pagto estariam os campos para configurar o TED, DAS, ISS e Pagamento de Utilitário e etc; seria preciso incluir um campo de tipo Seleção nas linhas de Ordem de Pagto quando fosse o caso do CNAB 240 de Pagto/outbound para permitir a Seleção e identificação de quando é um TED, DAS, ISS e Pagamento de Utilitário e etc, o que vocês pensam sobre isso ?

Algo a se considerar também é se não poderia ser um problema agregar todos essas formas em um único Modo de Pagamento, tanto na solução feita no PR quanto na minha sugestão, por exemplo na utilização de relatórios padrões ou herdados que usam o campo Modo de Pagamento.

cc @renatonlima @rvalyi

@mileo
Copy link
Member Author

mileo commented Oct 2, 2020

ola @mileo @gabrielcardoso21

Acredito que o que levou a esse PR seria a seguinte situação:
"Por exemplo a empresa XPTO tem os seguintes pagamentos a realizar hoje:

  1. BOLETO: Lojas.com
  2. Pagamento Salário: Fulano
  3. DAS: referente ao mês anterior
  4. Outra conta da empresa "TED mesma titularidade
  5. TED: Para pró-labore do sócio Fulano.
  6. GPS: Referente a folha

Na modelagem atual seriam 6 ordens de pagamento, 6 arquivos de remessa.
Fica inviável de usar.
"

Pelo que vi aqui vocês criaram uma forma de agrupar tudo o que é referente ao Pagamento criando um Modo de Pagamento/account.payment.mode que possui dentro o TED, DAS, ISS e Pagamento de Utilitário para que assim seja criada uma Ordem de Pagto única. Achei ruim a implementação basicamente porque dentro de um Modo de Pagamento foi criado um novo objeto account.payment.mode.line que possui os campos name e payment_mode_id, quer dizer que dentro de um Modo de Pagto existem outros Modos de Pagtos, algo que não parece fazer sentido e pode ser confuso de explicar até para o usuário final, acredito que pode existir uma solução melhor, por isso gostaria de fazer algumas perguntas:

Inicialmente pensei que a necessidade seria criar um arquivo de remessa único com as 6 formas mas pelo o que foi feito parece que a necessidade seria apenas de juntar os referentes aos pagamentos (TED, DAS, ISS e Pagamento de Utilitário) sem a necessidade de ter a Cobrança junto na criação do arquivo de Remessa com Lote, seria isso ?

Sim, a cobrança não precisa estar necessariamente junto. A ideia é que o fluxo de pagamentos saída seja unificado.

As remessas de Pagamentos são criadas diretamente na tela de Ordem de Pagamento sem um "documento de origem" ( como no caso da cobrança onde a Fatura gera as Linhas da Ordem de Pagto ) e até por isso vocês viram a necessidade de unifica-los e assim facilitar para o usuário final que vai criar apenas uma Ordem de Pagamento ?

Pare esta prova de conceito sim, mas em um segundo momento as informações deverão vir de outros módulos do sistema, como por exemplo a fatura.

Uma possível sugestão que tenho por enquanto baseado no que foi feito seria usar o os campos Code e Payment Type do objeto account.payment.method relacionado para fazer um "domain" e tornar visíveis ou invisíveis os campos referentes a Cobrança/CNAB 240 e 400/inbound ou ao CNAB 240 de Pagto/outbound "limpando" a tela ao deixar apenas os campos específicos de cada um e nesse caso incluindo os campos referentes a TED, DAS, ISS e Pagamento de Utilitário e etc para serem parametrizados, isso é dentro de apenas um Modo de Pagto estariam os campos para configurar o TED, DAS, ISS e Pagamento de Utilitário e etc; seria preciso incluir um campo de tipo Seleção nas linhas de Ordem de Pagto quando fosse o caso do CNAB 240 de Pagto/outbound para permitir a Seleção e identificação de quando é um TED, DAS, ISS e Pagamento de Utilitário e etc, o que vocês pensam sobre isso ?

Sim, foi isso que implementamos, entretanto a visão ainda não foi customizada para cada caso.

image
image
image

Algo a se considerar também é se não poderia ser um problema agregar todos essas formas em um único Modo de Pagamento, tanto na solução feita no PR quanto na minha sugestão, por exemplo na utilização de relatórios padrões ou herdados que usam o campo Modo de Pagamento.

cc @renatonlima @rvalyi

@mbcosta
Copy link
Member

mbcosta commented Oct 5, 2020

ola @mileo

"Sim, foi isso que implementamos, entretanto a visão ainda não foi customizada para cada caso." A sugestão que fiz seria sem o objeto account.payment.mode.line e a necessidade de ter Modos de Pagamento dentro de um Modo de Pagamento.

Mas como a resposta sobre o "documento de origem" foi "Pare esta prova de conceito sim, mas em um segundo momento as informações deverão vir de outros módulos do sistema, como por exemplo a fatura." é isso seria incluir dois Modos de Pagamentos a serem selecionados pelo usuário o Modo Principal e a linha que seria outro Modo de Pagamento ou !?!? o mesmo !?!?! ( ex.: no caso Cheque e !?!? Cheque !?!? ou Boleto X e !?!? Boleto X !?!? ), algo que parece não fazer muito sentido escolher dois modos de pagamentos, por isso eu acredito que podemos tentar abordar o problema de outra forma:

Minha sugestão seria criar no Diário/Account Journal ( acredito que em comum todos esses Modos de Pagamento devem usar o mesmo Diário ) um boolean ex.: "Gerar Arquivo de Remessa com Lotes", quando a opção estiver marcada ao criar uma nova Ordem de Pagamento também seria criado um novo objeto ex.: CNAB.REMESSA.LOTES em uma estrutura semelhante ao que existia na importação l10n_br.cnab/l10n_br.lote/l10n_br.evento mas nesse caso seria ESSE_NOVO_OBJETO/payment.order/payment.order.line assim as linhas desse novo objeto seriam as Ordens de Pagamento, isso ficaria transparente ao usuário, ele poderia acessar pelo menu apenas esse novo objeto, seria preciso sobre escrever os métodos de mudanças de status na Ordem de Pagamento e criar um campo/link/one2many para redirecionar para esse novo objeto, aparentemente isso parece atender o problema e juntaria tantos os boletos quanto os pagamento sem a necessidade de grandes alterações em objetos,métodos e visões herdadas. O que vocês pensam sobre isso ?

@gabrielcardoso21
Copy link
Member

@mbcosta, bom dia.

Obrigado pelas sugestões, o que você disse faz bastante sentido. Penso que não é realmente necessário criar um novo objeto para o arquivo com mais de um lote do CNAB 240, visto que a única diferença do agrupamento é que se colocam mais lotes dentro do mesmo arquivo. Essa diferenciação pode confundir o usuário e acabar atrapalhando ao invés de ajudar. Sobre a eliminação do account.payment.mode.line, concordo que a nomenclatura do modelo pode levar a confundir os conceitos, e aceito sugestões de mudança. Continuo preferindo, porém, que o modelo com essa função continue existindo, pois essa abstração pode ser usada em outros casos para resolver problemas similares. Sugiro também que seja incluído no modelo um campo many2many com o modelo ir.model.fields, com o domínio filtrando os campos da linha de pagamento, para que se possa escolher dinamicamente quais campos esconder se esse tipo de pagamento for selecionado.

@mbcosta
Copy link
Member

mbcosta commented Oct 14, 2020

ola @gabrielcardoso21 , alterar a nomeclatura do objeto account.payment.mode.line não vai alterar o fato de que dentro dele ser feita uma ligação com outro account.payment.mode https://github.com/odoo-brazil/l10n-brazil/blob/feature/cnab-multiple-payments/l10n_br_account_payment_order/models/account_payment_mode_line.py#L17 o que significa ter dentro de um Modo de Pagamento outros Modos de Pagamentos.

"Continuo preferindo, porém, que o modelo com essa função continue existindo, pois essa abstração pode ser usada em outros casos para resolver problemas similares. " Quais ?

Tenho outra sugestão para resolver esse problema que acredito que vai atender as especificações:

  • Criar um campo ex.: cnab_lot do tipo Boolean dentro do objeto account.payment.mode ( melhor do que dentro do Diário como havia sugerido antes por permitir diferentes configurações )

  • Criar um campo ex.: lot_payment_mode_ids do tipo many2many dentro do objeto account.payment.order

  • Criar um campo ex.: payment_mode_id do tipo many2one dentro do objeto account.payment.line ( e outros "related" com o "store=True" que precisem ser registrados )

  • Quando for criada uma Ordem de Pagamento e o Modo de Pagto tiver marcado com o campo boolean deixamos invisível o campo payment_mode_id ( original do modulo account_payment_order ) no account.payment.order e visível o campo lot_payment_mode_ids mostrando na visão/tela ao usuário que aquela Ordem de Pagto é composta de mais de um Modo de Pagto e na criação da linha/account.payment.line preenchemos o payment_mode_id do objeto account.payment.line

  • Ao criar essa nova Ordem o programa deverá buscar se já existe alguma com o mesmo Diário/account.journal e com o Modo de Pagto com o boolean preenchido( acredito que também será preciso usar como filtro o Metodo de Pagto, a confirmar, pois isso fará com que não seja possível unificar as Cobrança/Ordens de Débito com os Pagamentos/Ordens de Credito ), se sim será apenas adicionado na Ordem de Pagmento existente o Modo de Pagamento no campo many2many e na criação da account.payment.line o campo payment_mode_id podendo assim diferenciar os Modos de Pagamento

Dessa forma teremos seis Modos de Pagamentos porém somente uma Ordem de Pagamento e um arquivo de Remessa, o que pensam sobre isso ?

@gabrielcardoso21
Copy link
Member

ola @gabrielcardoso21 , alterar a nomeclatura do objeto account.payment.mode.line não vai alterar o fato de que dentro dele ser feita uma ligação com outro account.payment.mode https://github.com/odoo-brazil/l10n-brazil/blob/feature/cnab-multiple-payments/l10n_br_account_payment_order/models/account_payment_mode_line.py#L17 o que significa ter dentro de um Modo de Pagamento outros Modos de Pagamentos.

"Continuo preferindo, porém, que o modelo com essa função continue existindo, pois essa abstração pode ser usada em outros casos para resolver problemas similares. " Quais ?

Tenho outra sugestão para resolver esse problema que acredito que vai atender as especificações:

  • Criar um campo ex.: cnab_lot do tipo Boolean dentro do objeto account.payment.mode ( melhor do que dentro do Diário como havia sugerido antes por permitir diferentes configurações )
  • Criar um campo ex.: lot_payment_mode_ids do tipo many2many dentro do objeto account.payment.order
  • Criar um campo ex.: payment_mode_id do tipo many2one dentro do objeto account.payment.line ( e outros "related" com o "store=True" que precisem ser registrados )
  • Quando for criada uma Ordem de Pagamento e o Modo de Pagto tiver marcado com o campo boolean deixamos invisível o campo payment_mode_id ( original do modulo account_payment_order ) no account.payment.order e visível o campo lot_payment_mode_ids mostrando na visão/tela ao usuário que aquela Ordem de Pagto é composta de mais de um Modo de Pagto e na criação da linha/account.payment.line preenchemos o payment_mode_id do objeto account.payment.line
  • Ao criar essa nova Ordem o programa deverá buscar se já existe alguma com o mesmo Diário/account.journal e com o Modo de Pagto com o boolean preenchido( acredito que também será preciso usar como filtro o Metodo de Pagto, a confirmar, pois isso fará com que não seja possível unificar as Cobrança/Ordens de Débito com os Pagamentos/Ordens de Credito ), se sim será apenas adicionado na Ordem de Pagmento existente o Modo de Pagamento no campo many2many e na criação da account.payment.line o campo payment_mode_id podendo assim diferenciar os Modos de Pagamento

Dessa forma teremos seis Modos de Pagamentos porém somente uma Ordem de Pagamento e um arquivo de Remessa, o que pensam sobre isso ?

@mbcosta realmente essa solução resolve os problemas sem perdas na usabilidade. Tendo um tempo vejo se consigo implementar. Obrigado, novamente, pelas sugestões.

@mbcosta mbcosta force-pushed the 12.0-mig-l10n_br_account_payment_cobranca branch from 54d342e to 507f916 Compare October 14, 2020 19:10
domain="[('id', 'in', payment_mode_ids)]",
)

payment_mode_ids = fields.Many2many(
Copy link
Member

Choose a reason for hiding this comment

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

Qual o motivo de ter esse campo aqui ? Já que uma linha só poderá ser associada a um Payment Mode, e caso seja preciso essa informação pode ser obtida pelo campo order_id

Copy link
Member

Choose a reason for hiding this comment

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

Por causa da usabilidade. Eu não consegui uma forma de ajustar o domínio dinamicamente pelos modos de pagamento selecionados no order_id. Quando coloquei no onchange o domínio dinâmico não funcionou, e quando coloquei "[('id', 'in', order_id.payment_mode_ids)]" deu um erro de javascript. Com o campo related readonly foi o único jeito que funcionou.

Copy link
Member

Choose a reason for hiding this comment

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

Sim isso "[('id', 'in', order_id.payment_mode_ids)]" não funciona, minha pergunta tem relação com a criação da Ordem de Pagto somente através da Fatura por isso não havia entendido a necessidade de ter esse campo aqui, mas me parece que o que você fez tem relação com a questão do "documento de origem", isso é você precisa desse campo pois alguns casos seriam cadastrados diretamente na tela/objeto account.payment.order seria isso mesmo ? Como o @mileo escreveu isso "Pare esta prova de conceito sim, mas em um segundo momento as informações deverão vir de outros módulos do sistema, como por exemplo a fatura." seria importante já identificar esses casos adicionando dados de demo do que é feito através de uma Fatura/account.invoice é o que não é, até para serem usados no testes e confirmando se realmente existe o caso de cadastro direto na Ordem de Pagto, já que também será necessário sobre escrever o método create_account_payment_line do objeto account.invoice ( https://github.com/OCA/bank-payment/blob/12.0/account_payment_order/models/account_invoice.py#L67 ) para identificar quando será preciso criar uma nova Ordem de Pagto/account.payment.order ou incluir a linha em uma já existente no caso do Modo de Pagto relacionado estiver com o campo is_cnab_lot marcado.

domain="[('id', 'in', payment_mode_ids)]",
)

payment_mode_ids = fields.Many2many(
Copy link
Member

Choose a reason for hiding this comment

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

Qual o motivo de ter esse campo aqui ? Já que uma linha só poderá ser associada a um Payment Mode, e caso seja preciso essa informação pode ser obtida pelo campo order_id

Copy link
Member

Choose a reason for hiding this comment

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

Por causa da usabilidade. Eu não consegui uma forma de ajustar o domínio dinamicamente pelos modos de pagamento selecionados no order_id. Quando coloquei no onchange o domínio dinâmico não funcionou, e quando coloquei "[('id', 'in', order_id.payment_mode_ids)]" deu um erro de javascript. Com o campo related readonly foi o único jeito que funcionou.

Copy link
Member

Choose a reason for hiding this comment

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

No caso do account.payment.line pode existir a questão de se cadastrar uma linha diretamente na tela, mas no caso do objeto bank.payment.line por ser criado automaticamente existe alguma necessidade de existir aqui ?

("release_form", "Forma de Lançamento"),
("service_type", "Tipo de Serviço"),
("ted_finality_code", "Código Finalidade da TED"),
("doc_finality_code", "Código Finalidade da DOC"),
Copy link
Member

Choose a reason for hiding this comment

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

Ao invés de juntar esses diferentes códigos não seria melhor separa-los, criando um objeto para cada um ex.: cnab.release.form.code, cnab.service.type.code, cnab.ted.finality.code e cnab.doc.finality.code ? E assim adiciona-los nos objetos como campos sem o objeto intermediario l10n_br.cnab.configuration e tornando a própria parametrização mais clara e com menor possibilidade de erro de cadastro

Copy link
Member

Choose a reason for hiding this comment

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

ola @gabrielcardoso21 uma questão importante aqui seria se existe um padrão nesses códigos entre os bancos, até onde sei os Pagamentos só existem no CNAB 240 que em teoria seria mais padronizado, vocês encontraram diferenças desses códigos entre os bancos ? Porque se não existirem eu acredito que seria melhor deixa-los como campos do tipo Seleção, eu vi um problema semelhante no caso dos Códigos de Retorno como encontrei diferenças https://github.com/odoo-brazil/l10n-brazil/blob/12.0-mig-l10n_br_account_payment_cobranca/l10n_br_account_payment_order/data/l10n_br_cnab_return_move_code_data.xml#L5 acabei achando melhor criar um novo objeto para assim permitir novas implementações através de cadastro, seria importante identificar se isso também ocorre aqui

@rvalyi rvalyi force-pushed the 12.0-mig-l10n_br_account_payment_cobranca branch from 21e85ab to 5b9296c Compare November 4, 2020 23:18
@mbcosta mbcosta force-pushed the 12.0-mig-l10n_br_account_payment_cobranca branch from 412bb2f to 6e50560 Compare November 6, 2020 21:40
@mileo mileo force-pushed the feature/cnab-multiple-payments branch from 6a41c6b to dbe1df2 Compare November 27, 2020 13:09
@renatonlima renatonlima force-pushed the 12.0-mig-l10n_br_account_payment_cobranca branch from d4b2fdd to 6298062 Compare January 26, 2021 12:48
@mbcosta mbcosta force-pushed the 12.0-mig-l10n_br_account_payment_cobranca branch 2 times, most recently from b20c4b4 to b581fa2 Compare February 26, 2021 16:37
@mbcosta mbcosta force-pushed the 12.0-mig-l10n_br_account_payment_cobranca branch from f8d376c to 56c9300 Compare March 9, 2021 19:39
@mbcosta mbcosta force-pushed the 12.0-mig-l10n_br_account_payment_cobranca branch 3 times, most recently from e86ee5c to d90ae30 Compare March 29, 2021 18:00
@mbcosta mbcosta force-pushed the 12.0-mig-l10n_br_account_payment_cobranca branch from 753557a to a9260a5 Compare April 8, 2021 15:21
@mbcosta mbcosta force-pushed the 12.0-mig-l10n_br_account_payment_cobranca branch 2 times, most recently from 917e88a to df500dc Compare April 29, 2021 21:31
@mbcosta mbcosta force-pushed the 12.0-mig-l10n_br_account_payment_cobranca branch from df500dc to 2a09609 Compare May 4, 2021 19:26
@mbcosta mbcosta force-pushed the 12.0-mig-l10n_br_account_payment_cobranca branch from eb948a2 to 7cbae07 Compare May 20, 2021 13:01
@mbcosta mbcosta force-pushed the 12.0-mig-l10n_br_account_payment_cobranca branch 2 times, most recently from a30e40b to a14cc8e Compare May 28, 2021 15:26
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

8 participants