Skip to content

Commit

Permalink
Merge be34c6e into fccd340
Browse files Browse the repository at this point in the history
  • Loading branch information
danimaribeiro committed Dec 17, 2018
2 parents fccd340 + be34c6e commit d5e8cc5
Show file tree
Hide file tree
Showing 11 changed files with 220 additions and 132 deletions.
9 changes: 3 additions & 6 deletions br_account_payment/models/company.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,7 @@ class ResCompany(models.Model):

l10n_br_interest_account_id = fields.Many2one(
'account.account',
string="Conta para recebimento de juros",
domain=[('user_type_id', '=', 'receivable')])

l10n_br_fine_account_id = fields.Many2one(
string="Conta para recebimento de juros/multa")
l10n_br_bankfee_account_id = fields.Many2one(
'account.account',
string="Conta para recebimento de multa",
domain=[('user_type_id.type', '=', 'receivable')])
string="Conta para tarifas bancárias")
8 changes: 6 additions & 2 deletions br_account_payment/models/payment_statement.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,13 +25,16 @@ def _compute_amount_total(self):
name = fields.Char(
string='Reference',
copy=False, readonly=True)
type = fields.Selection([('receivable', 'Receivable'),
('payable', 'Payable')], string="Type")
date = fields.Date(
copy=False, default=fields.Date.context_today)
amount_total = fields.Monetary(
'Valor Total',
currency_field='currency_id', compute='_compute_amount_total')
currency_id = fields.Many2one(
'res.currency', compute='_compute_currency', string="Currency")
'res.currency', compute='_compute_currency',
string="Currency", store=True)
journal_id = fields.Many2one(
'account.journal', string='Journal', required=True)
company_id = fields.Many2one(
Expand All @@ -50,7 +53,8 @@ class l10nBrPaymentStatementLine(models.Model):

name = fields.Char(string='Reference', required=True)
nosso_numero = fields.Char(string="Nosso Número")
date = fields.Date(string="Data")
date = fields.Date(string="Vencimento")
effective_date = fields.Date(string="Data ocorrência")
amount = fields.Monetary(
digits=0, currency_field='journal_currency_id', string="Valor")
journal_currency_id = fields.Many2one(
Expand Down
9 changes: 4 additions & 5 deletions br_account_payment/models/res_config_settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,10 +29,9 @@ class ResConfigSettings(models.TransientModel):
string="Conta para recebimento de juros",
help='Conta onde será creditado o montante dos juros recebidos'
)

l10n_br_fine_account_id = fields.Many2one(
l10n_br_bankfee_account_id = fields.Many2one(
'account.account',
related='company_id.l10n_br_fine_account_id',
string="Conta para recebimento de multa",
help='Conta onde será creditado o montante das multas recebidas'
related='company_id.l10n_br_bankfee_account_id',
string="Conta para tarifas bancárias",
help='Conta onde será debitado o montante de tarifas pagas'
)
3 changes: 3 additions & 0 deletions br_account_payment/views/payment_statement.xml
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
<field name="date"/>
<field name='company_id' options="{'no_create': True}" groups="base.group_multi_company" />
<field name="currency_id" invisible="1"/>
<field name="type" invisible="1"/>
</group>
<group>
<field name="create_uid"/>
Expand All @@ -47,6 +48,7 @@
<tree editable="bottom" string="Statement lines" decoration-bf="ignored==False" decoration-muted="ignored==True">
<field name="ignored" invisible="1" />
<field name="date" />
<field name="effective_date" />
<field name="nosso_numero" />
<field name="name" />
<field name="partner_id" domain="['|',('parent_id','=',False),('is_company','=',True)]"
Expand Down Expand Up @@ -84,6 +86,7 @@
<group col="4">
<field name="statement_id"/>
<field name="date"/>
<field name="effective_date"/>
<field name="name"/>
<field name="cnab_code"/>
<field name="cnab_message"/>
Expand Down
22 changes: 15 additions & 7 deletions br_account_payment/views/res_settings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -8,18 +8,26 @@
<xpath expr="//field[@name='module_account_batch_deposit']/parent::div/parent::div" position="after">
<div class="col-xs-12 col-md-6 o_setting_box" title="Define accounts to use for fine and interest.">
<div class="o_setting_right_pane">
<label string="Fines and Interests Accounts"/>
<label for="l10n_br_interest_account_id" />
<div class="text-muted">
Select account to pay interests and fines values
Selecione a conta usada para registrar juros/multas recebidas
</div>
<div class="content-group">
<div class="row mt16">
<label string="Interest Account" for="l10n_br_interest_account_id" class="col-md-3 o_light_label"/>
<field name="l10n_br_interest_account_id" domain="[('company_id', '=', company_id), ('user_type_id.type', '=', 'receivable')]"/>
<label string="Conta" class="col-md-3 o_light_label" />
<field name="l10n_br_interest_account_id" domain="[('company_id', '=', company_id)]"/>
</div>
<div class="row">
<label string="Fines Account" for="l10n_br_fine_account_id" class="col-md-3 o_light_label"/>
<field name="l10n_br_fine_account_id" domain="[('company_id', '=', company_id), ('user_type_id.type', '=', 'receivable')]"/>
</div>
</div>
<div class="o_setting_right_pane">
<label for="l10n_br_bankfee_account_id" />
<div class="text-muted">
Selecione a conta usada para registrar tarifas bancárias
</div>
<div class="content-group">
<div class="row mt16">
<label string="Conta" class="col-md-3 o_light_label" />
<field name="l10n_br_bankfee_account_id" domain="[('company_id', '=', company_id)]"/>
</div>
</div>
</div>
Expand Down
1 change: 1 addition & 0 deletions br_cnab/__manifest__.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
'data': [
'sequence/br_cnab_sequence.xml',
'views/payment_order.xml',
'views/payment_statement.xml',
'wizard/payment_cnab_import.xml',
],
'installable': True
Expand Down
1 change: 1 addition & 0 deletions br_cnab/models/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,4 @@
from . import payment_order
from . import account_bank_statement
from . import account_bank_statement_import
from . import payment_statement
174 changes: 96 additions & 78 deletions br_cnab/models/payment_order.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

import base64
from ..febraban.cnab import Cnab
from decimal import Decimal
from datetime import datetime, date
from odoo import api, models
from odoo.exceptions import UserError
Expand Down Expand Up @@ -42,107 +43,124 @@ def gerar_cnab(self):
})


TITULO_LIQUIDADO = '0000'
ENTRADA_CONFIRMADA = '1111'
BAIXA_TITULO = '2222'
ENTRADA_REJEITADA = '3333'


class PaymentOrderLine(models.Model):
_inherit = 'payment.order.line'

def mark_order_line_processed(self, cnab_code, cnab_message,
rejected=False, statement_id=None):
if self.type != 'receivable':
return super(PaymentOrderLine, self).mark_order_line_processed(
cnab_code, cnab_message, rejected, statement_id)
def process_receivable_line(self, statement_id, cnab_vals):
self.ensure_one()
state = message = payment_move = None
ignored = False
if cnab_vals['cnab_code'] == TITULO_LIQUIDADO:
state = 'paid'
payment_move = self.register_receivable_payment(cnab_vals)

elif cnab_vals['cnab_code'] == ENTRADA_CONFIRMADA:
state = 'processed'

state = 'processed'
if rejected:
elif cnab_vals['cnab_code'] == BAIXA_TITULO:
state = 'cancelled'
message = 'Item cancelado via baixa bancária'

elif cnab_vals['cnab_code'] == ENTRADA_REJEITADA: # Entrada Rejeitada
state = 'rejected'
else:
ignored = True

self.env['l10n_br.payment.statement.line'].sudo().create({
'statement_id': statement_id.id,
'name': self.name,
'partner_id': self.partner_id.id,
'amount': cnab_vals['titulo_pago'],
'nosso_numero': self.nosso_numero,
'date': cnab_vals['vencimento_titulo'],
'effective_date': cnab_vals['data_ocorrencia'],
'amount_fee': cnab_vals['titulo_acrescimos'],
'discount': cnab_vals['titulo_desconto'],
'original_amount': cnab_vals['valor_titulo'],
'bank_fee': cnab_vals['valor_tarifas'],
'cnab_code': cnab_vals['cnab_code'],
'cnab_message': cnab_vals['cnab_message'],
'move_id': payment_move and payment_move.id or self.move_id.id,
'ignored': ignored,
})
self.write({
'state': state, 'cnab_code': cnab_code,
'cnab_message': cnab_message
'state': state,
'cnab_code': cnab_vals['cnab_code'],
'cnab_message': message or cnab_vals['cnab_message'],
})
if not statement_id:
statement_id = self.env['l10n_br.payment.statement'].create({
'name': '0001/Manual',
'date': date.today(),
'state': 'validated',
})
for item in self:
self.env['l10n_br.payment.statement.line'].create({
'statement_id': statement_id.id,
'date': date.today(),
'name': item.name,
'partner_id': item.partner_id.id,
'amount': item.amount_total,
'cnab_code': cnab_code,
'cnab_message': cnab_message,
'nosso_numero': item.nosso_numero,
})
return statement_id

def create_receivable_move_and_reconcile(self, order_line):
def register_receivable_payment(self, cnab_vals):
self.ensure_one()
move = self.env['account.move'].create({
'name': '/',
'journal_id': order_line.journal_id.id,
'company_id': order_line.journal_id.company_id.id,
'date': date.today(),
'ref': order_line.name,
'journal_id': self.journal_id.id,
'company_id': self.journal_id.company_id.id,
'date': cnab_vals['data_ocorrencia'],
'ref': self.name,
})
aml_obj = self.env['account.move.line'].with_context(
check_move_validity=False)
counterpart_aml_dict = {
'name': order_line.name,
'name': self.name,
'move_id': move.id,
'partner_id': order_line.partner_id.id,
'partner_id': self.partner_id.id,
'debit': 0.0,
'credit': order_line.amount_total,
'currency_id': order_line.currency_id.id,
'account_id': order_line.move_line_id.account_id.id,
'credit': float(cnab_vals['valor_titulo'] -
cnab_vals['titulo_desconto']),
'currency_id': self.currency_id.id,
'account_id': self.move_line_id.account_id.id,
}
liquidity_aml_dict = {
'name': order_line.name,
'name': self.name,
'move_id': move.id,
'partner_id': order_line.partner_id.id,
'debit': order_line.amount_total,
'partner_id': self.partner_id.id,
'debit': float(
cnab_vals['valor_titulo'] + cnab_vals['titulo_acrescimos'] -
cnab_vals['titulo_desconto'] - cnab_vals['valor_tarifas']
),
'credit': 0.0,
'currency_id': order_line.currency_id.id,
'account_id': order_line.journal_id.default_debit_account_id.id,
'currency_id': self.currency_id.id,
'account_id': self.journal_id.default_debit_account_id.id,
}
if cnab_vals['titulo_acrescimos'] > Decimal(0):
account_id = self.journal_id.company_id.l10n_br_interest_account_id
if not account_id:
raise UserError(
'Configure a conta de recebimento de juros/multa')
ext_line = {
'name': 'Título Acréscimos (juros/multa)',
'move_id': move.id,
'partner_id': self.partner_id.id,
'debit': 0.0,
'credit': float(cnab_vals['titulo_acrescimos']),
'currency_id': self.currency_id.id,
'account_id': account_id.id,
}
aml_obj.create(ext_line)
if cnab_vals['valor_tarifas'] > Decimal(0):
account_id = self.journal_id.company_id.l10n_br_bankfee_account_id
if not account_id:
raise UserError(
'Configure a conta de tarifas bancárias')
ext_line = {
'name': 'Tarifas bancárias (boleto)',
'move_id': move.id,
'partner_id': self.partner_id.id,
'debit': float(cnab_vals['valor_tarifas']),
'credit': 0.0,
'currency_id': self.currency_id.id,
'account_id': account_id.id,
}
aml_obj.create(ext_line)

counterpart_aml = aml_obj.create(counterpart_aml_dict)
aml_obj.create(liquidity_aml_dict)
move.post()
(counterpart_aml + order_line.move_line_id).reconcile()
(counterpart_aml + self.move_line_id).reconcile()
return move

def mark_order_line_paid(self, cnab_code, cnab_message, statement_id=None,
autenticacao=None, protocolo=None):
if self.type != 'receivable':
return super(PaymentOrderLine, self).mark_order_line_paid(
cnab_code, cnab_message, statement_id,
autenticacao=autenticacao, protocolo=protocolo)

bank_account_ids = self.mapped('src_bank_account_id')
for account in bank_account_ids:
order_lines = self.filtered(
lambda x: x.src_bank_account_id == account)
journal_id = self.env['account.journal'].search(
[('bank_account_id', '=', account.id)], limit=1)
if not statement_id:
statement_id = self.env['l10n_br.payment.statement'].create({
'name':
journal_id.l10n_br_sequence_statements.next_by_id(),
'date': date.today(),
'state': 'validated',
'journal_id': journal_id.id,
})
for item in order_lines:
move_id = self.create_receivable_move_and_reconcile(item)
self.env['l10n_br.payment.statement.line'].create({
'statement_id': statement_id.id,
'date': date.today(),
'name': item.name,
'partner_id': item.partner_id.id,
'amount': item.amount_total,
'move_id': move_id.id,
'cnab_code': cnab_code,
'cnab_message': cnab_message,
})
order_lines.write({'state': 'paid'})
13 changes: 13 additions & 0 deletions br_cnab/models/payment_statement.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# © 2016 Danimar Ribeiro <danimaribeiro@gmail.com>, Trustcode
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).

from odoo import fields, models


class L10nBrPaymentStatementLine(models.Model):
_inherit = 'l10n_br.payment.statement.line'

amount_fee = fields.Float(string="Juros/Multa")
original_amount = fields.Float(string="Valor Título")
discount = fields.Float(string="Desconto")
bank_fee = fields.Float(string="Valor Tarifas")
18 changes: 18 additions & 0 deletions br_cnab/views/payment_statement.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
<odoo>

<record id="view_trustcode_l10n_br_payment_statement_tree" model="ir.ui.view">
<field name="name">view.trustcode.l10n_br.payment.statement.tree</field>
<field name="model">l10n_br.payment.statement</field>
<field name="inherit_id" ref="br_account_payment.view_payment_statement_form" />
<field name="arch" type="xml" >
<field name="amount" position="before" >
<field name="original_amount" attrs="{'column_invisible': [('parent.type', '!=', 'receivable')]}" />
<field name="amount_fee" attrs="{'column_invisible': [('parent.type', '!=', 'receivable')]}" />
<field name="discount" attrs="{'column_invisible': [('parent.type', '!=', 'receivable')]}" />
<field name="bank_fee" attrs="{'column_invisible': [('parent.type', '!=', 'receivable')]}" />
</field>
</field>
</record>

</odoo>

0 comments on commit d5e8cc5

Please sign in to comment.