Merge PR #487 into 14.0

Signed-off-by pedrobaeza
This commit is contained in:
OCA-git-bot
2022-08-24 10:23:42 +00:00
7 changed files with 143 additions and 26 deletions

View File

@@ -222,7 +222,6 @@ class AccountBankStatementLine(models.Model):
aml_obj.with_context(check_move_validity=False).create(liquidity_aml_dict) aml_obj.with_context(check_move_validity=False).create(liquidity_aml_dict)
self.sequence = self.statement_id.line_ids.ids.index(self.id) + 1 self.sequence = self.statement_id.line_ids.ids.index(self.id) + 1
self.move_id.ref = self._get_move_ref(self.statement_id.name)
counterpart_moves = counterpart_moves | self.move_id counterpart_moves = counterpart_moves | self.move_id
# Complete dicts to create both counterpart move lines and write-offs # Complete dicts to create both counterpart move lines and write-offs
@@ -246,6 +245,9 @@ class AccountBankStatementLine(models.Model):
if aml_dict["move_line"].partner_id.id: if aml_dict["move_line"].partner_id.id:
aml_dict["partner_id"] = aml_dict["move_line"].partner_id.id aml_dict["partner_id"] = aml_dict["move_line"].partner_id.id
aml_dict["account_id"] = aml_dict["move_line"].account_id.id aml_dict["account_id"] = aml_dict["move_line"].account_id.id
aml_dict["analytic_account_id"] = (
aml_dict["move_line"].analytic_account_id.id or False
)
counterpart_move_line = aml_dict.pop("move_line") counterpart_move_line = aml_dict.pop("move_line")
new_aml = aml_obj.with_context(check_move_validity=False).create(aml_dict) new_aml = aml_obj.with_context(check_move_validity=False).create(aml_dict)
@@ -272,12 +274,6 @@ class AccountBankStatementLine(models.Model):
return counterpart_moves return counterpart_moves
def _get_move_ref(self, move_ref):
ref = move_ref or ""
if self.ref:
ref = move_ref + " - " + self.ref if move_ref else self.ref
return ref
def _prepare_move_line_for_currency(self, aml_dict, date): def _prepare_move_line_for_currency(self, aml_dict, date):
self.ensure_one() self.ensure_one()
company_currency = self.journal_id.company_id.currency_id company_currency = self.journal_id.company_id.currency_id

View File

@@ -42,8 +42,13 @@ class AccountReconciliation(models.AbstractModel):
) )
del aml_dict["counterpart_aml_id"] del aml_dict["counterpart_aml_id"]
vals = {}
if datum.get("partner_id") is not None: if datum.get("partner_id") is not None:
st_line.write({"partner_id": datum["partner_id"]}) vals["partner_id"] = datum["partner_id"]
if datum.get("ref") is not None:
vals["ref"] = datum["ref"]
if vals:
st_line.write(vals)
ctx["default_to_check"] = datum.get("to_check") ctx["default_to_check"] = datum.get("to_check")
moves = st_line.with_context(ctx).process_reconciliation( moves = st_line.with_context(ctx).process_reconciliation(
@@ -906,6 +911,7 @@ class AccountReconciliation(models.AbstractModel):
"already_paid": line.account_id.internal_type == "liquidity", "already_paid": line.account_id.internal_type == "liquidity",
"account_code": line.account_id.code, "account_code": line.account_id.code,
"account_name": line.account_id.name, "account_name": line.account_id.name,
"analytic_account_code": line.analytic_account_id.display_name or "",
"account_type": line.account_id.internal_type, "account_type": line.account_id.internal_type,
"date_maturity": format_date(self.env, line.date_maturity), "date_maturity": format_date(self.env, line.date_maturity),
"date": format_date(self.env, line.date), "date": format_date(self.env, line.date),
@@ -1016,6 +1022,8 @@ class AccountReconciliation(models.AbstractModel):
"""Returns the data required by the bank statement reconciliation """Returns the data required by the bank statement reconciliation
widget to display a statement line""" widget to display a statement line"""
group_analytic = self.env.user.has_group("analytic.group_analytic_accounting")
group_analytic_tags = self.env.user.has_group("analytic.group_analytic_tags")
statement_currency = ( statement_currency = (
st_line.journal_id.currency_id or st_line.journal_id.company_id.currency_id st_line.journal_id.currency_id or st_line.journal_id.company_id.currency_id
) )
@@ -1062,6 +1070,8 @@ class AccountReconciliation(models.AbstractModel):
"amount_currency": amount_currency, "amount_currency": amount_currency,
"has_no_partner": not st_line.partner_id.id, "has_no_partner": not st_line.partner_id.id,
"company_id": st_line.company_id.id, "company_id": st_line.company_id.id,
"group_analytic_accounting": group_analytic,
"group_analytic_tags": group_analytic_tags,
} }
if st_line.partner_id: if st_line.partner_id:
data["open_balance_account_id"] = ( data["open_balance_account_id"] = (

View File

@@ -21,6 +21,7 @@ odoo.define("account.ReconciliationClientAction", function (require) {
change_filter: "_onAction", change_filter: "_onAction",
change_offset: "_onAction", change_offset: "_onAction",
change_partner: "_onAction", change_partner: "_onAction",
change_ref: "_onAction",
add_proposition: "_onAction", add_proposition: "_onAction",
remove_proposition: "_onAction", remove_proposition: "_onAction",
update_proposition: "_onAction", update_proposition: "_onAction",
@@ -86,6 +87,7 @@ odoo.define("account.ReconciliationClientAction", function (require) {
this._super.apply(this, arguments); this._super.apply(this, arguments);
this.action_manager = parent; this.action_manager = parent;
this.params = params; this.params = params;
this.notifications = params.context.notifications || [];
this.searchModelConfig.modelName = "account.bank.statement.line"; this.searchModelConfig.modelName = "account.bank.statement.line";
this.controlPanelProps.cp_content = {}; this.controlPanelProps.cp_content = {};
this.model = new this.config.Model(this, { this.model = new this.config.Model(this, {
@@ -157,6 +159,7 @@ odoo.define("account.ReconciliationClientAction", function (require) {
valuemax: self.model.valuemax, valuemax: self.model.valuemax,
defaultDisplayQty: self.model.defaultDisplayQty, defaultDisplayQty: self.model.defaultDisplayQty,
title: title, title: title,
notifications: self.notifications,
}); });
}); });
}); });

View File

@@ -298,6 +298,13 @@ odoo.define("account.ReconciliationModel", function (require) {
); );
}); });
}, },
// eslint-disable-next-line no-unused-vars
changeRef: function (handle, ref, preserveMode) {
var line = this.getLine(handle);
line.st_line.ref = ref;
return Promise.resolve();
},
/** /**
* Close the statement * Close the statement
* @returns {Promise<Number>} resolves to the res_id of the closed statements * @returns {Promise<Number>} resolves to the res_id of the closed statements
@@ -479,6 +486,7 @@ odoo.define("account.ReconciliationModel", function (require) {
self.lines[handle] = { self.lines[handle] = {
id: res.st_line.id, id: res.st_line.id,
partner_id: res.st_line.partner_id, partner_id: res.st_line.partner_id,
ref: res.st_line.ref,
handle: handle, handle: handle,
reconciled: false, reconciled: false,
mode: "inactive", mode: "inactive",
@@ -521,11 +529,22 @@ odoo.define("account.ReconciliationModel", function (require) {
_.pluck(accounts, "code") _.pluck(accounts, "code")
); );
}); });
var def_analytic_account = this._rpc({
model: "account.analytic.account",
method: "search_read",
fields: ["display_name"],
}).then(function (accounts) {
self.analytic_accounts = _.object(
_.pluck(accounts, "id"),
_.pluck(accounts, "display_name")
);
});
var def_taxes = self._loadTaxes(); var def_taxes = self._loadTaxes();
return Promise.all([ return Promise.all([
def_statement, def_statement,
def_reconcileModel, def_reconcileModel,
def_account, def_account,
def_analytic_account,
def_taxes, def_taxes,
]).then(function () { ]).then(function () {
_.each(self.lines, function (line) { _.each(self.lines, function (line) {
@@ -888,6 +907,12 @@ odoo.define("account.ReconciliationModel", function (require) {
? this.accounts[prop.account_id.id] ? this.accounts[prop.account_id.id]
: ""; : "";
} }
if ("analytic_account_id" in values) {
prop.analytic_account_code = prop.analytic_account_id
? this.analytic_accounts[prop.analytic_account_id.id]
: "";
}
if ("amount" in values) { if ("amount" in values) {
prop.base_amount = values.amount; prop.base_amount = values.amount;
if (prop.reconcileModelId) { if (prop.reconcileModelId) {
@@ -967,6 +992,7 @@ odoo.define("account.ReconciliationModel", function (require) {
Promise.resolve(computeLinePromise).then(function () { Promise.resolve(computeLinePromise).then(function () {
var values_dict = { var values_dict = {
partner_id: line.st_line.partner_id, partner_id: line.st_line.partner_id,
ref: line.st_line.ref,
counterpart_aml_dicts: _.map( counterpart_aml_dicts: _.map(
_.filter(props, function (prop) { _.filter(props, function (prop) {
return !isNaN(prop.id) && !prop.is_liquidity_line; return !isNaN(prop.id) && !prop.is_liquidity_line;
@@ -1589,6 +1615,7 @@ odoo.define("account.ReconciliationModel", function (require) {
values = values || {}; values = values || {};
var today = new moment().utc().format(); var today = new moment().utc().format();
var account = this._formatNameGet(values.account_id); var account = this._formatNameGet(values.account_id);
var analytic_account = this._formatNameGet(values.analytic_account_id);
var formatOptions = { var formatOptions = {
currency_id: line.st_line.currency_id, currency_id: line.st_line.currency_id,
}; };
@@ -1632,7 +1659,10 @@ odoo.define("account.ReconciliationModel", function (require) {
label: values.label || line.st_line.payment_ref, label: values.label || line.st_line.payment_ref,
account_id: account, account_id: account,
account_code: account ? this.accounts[account.id] : "", account_code: account ? this.accounts[account.id] : "",
analytic_account_id: this._formatNameGet(values.analytic_account_id), analytic_account_id: analytic_account,
analytic_account_code: analytic_account
? this.analytic_accounts[analytic_account.id]
: "",
analytic_tag_ids: this._formatMany2ManyTags( analytic_tag_ids: this._formatMany2ManyTags(
values.analytic_tag_ids || [] values.analytic_tag_ids || []
), ),

View File

@@ -38,6 +38,9 @@ odoo.define("account.ReconciliationRenderer", function (require) {
var defs = [this._super.apply(this, arguments)]; var defs = [this._super.apply(this, arguments)];
this.time = Date.now(); this.time = Date.now();
this.$progress = $(""); this.$progress = $("");
if (this._initialState.notifications.length > 0) {
this._renderNotifications(this._initialState.notifications);
}
return Promise.all(defs); return Promise.all(defs);
}, },
@@ -325,20 +328,31 @@ odoo.define("account.ReconciliationRenderer", function (require) {
} }
), ),
}; };
self.fields.partner_id.insertAfter( self.fields.partner_id.insertBefore(
self.$(".accounting_view caption .o_buttons") self.$(".accounting_view caption .caption-input")
); );
}); });
var def3 = session // Ref
.user_has_group("analytic.group_analytic_tags") var def5 = this._makeRefRecord(this._initialState.st_line.ref).then(
.then(function (has_group) { function (recordID) {
self.group_tags = has_group; self.fields.ref = new basic_fields.FieldChar(
}); self,
var def4 = session "ref",
.user_has_group("analytic.group_analytic_accounting") self.model.get(recordID),
.then(function (has_group) { {
self.group_acc = has_group; mode: "edit",
}); attrs: {
placeholder:
self._initialState.st_line.ref || _t("Reference"),
},
}
);
self.fields.ref.prependTo(
self.$(".accounting_view caption .caption-input")
);
}
);
$('<span class="line_info_button fa fa-info-circle"/>') $('<span class="line_info_button fa fa-info-circle"/>')
.appendTo(this.$("thead .cell_info_popover")) .appendTo(this.$("thead .cell_info_popover"))
.attr( .attr(
@@ -360,7 +374,7 @@ odoo.define("account.ReconciliationRenderer", function (require) {
toggle: "popover", toggle: "popover",
}); });
var def2 = this._super.apply(this, arguments); var def2 = this._super.apply(this, arguments);
return Promise.all([def1, def2, def3, def4]); return Promise.all([def1, def2, def5]);
}, },
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
@@ -402,6 +416,12 @@ odoo.define("account.ReconciliationRenderer", function (require) {
self.$el.attr("data-partner", state.st_line.partner_id); self.$el.attr("data-partner", state.st_line.partner_id);
}); });
// Ref
this._makeRefRecord(state.st_line.ref).then(function (recordID) {
self.fields.ref.reset(self.model.get(recordID));
self.$el.attr("data-ref", state.st_line.ref);
});
// Mode // Mode
this.$el.data("mode", state.mode).attr("data-mode", state.mode); this.$el.data("mode", state.mode).attr("data-mode", state.mode);
this.$(".o_notebook li a").attr("aria-selected", false); this.$(".o_notebook li a").attr("aria-selected", false);
@@ -574,6 +594,7 @@ odoo.define("account.ReconciliationRenderer", function (require) {
} }
if (fieldName === "tax_ids") { if (fieldName === "tax_ids") {
if ( if (
state.createForm[fieldName] === undefined ||
!state.createForm[fieldName].length || !state.createForm[fieldName].length ||
state.createForm[fieldName].length > 1 state.createForm[fieldName].length > 1
) { ) {
@@ -662,6 +683,17 @@ odoo.define("account.ReconciliationRenderer", function (require) {
}); });
}, },
_makeRefRecord: function (ref) {
var field = {
type: "char",
name: "ref",
};
if (ref) {
field.value = ref;
}
return this.model.makeRecord("account.bank.statement.line", [field], {});
},
/** /**
* Create account_id, tax_ids, analytic_account_id, analytic_tag_ids, label and amount fields * Create account_id, tax_ids, analytic_account_id, analytic_tag_ids, label and amount fields
* *
@@ -714,6 +746,10 @@ odoo.define("account.ReconciliationRenderer", function (require) {
type: "char", type: "char",
name: "label", name: "label",
}, },
{
type: "char",
name: "ref",
},
{ {
type: "float", type: "float",
name: "amount", name: "amount",
@@ -815,8 +851,6 @@ odoo.define("account.ReconciliationRenderer", function (require) {
var $create = $( var $create = $(
qweb.render("reconciliation.line.create", { qweb.render("reconciliation.line.create", {
state: state, state: state,
group_tags: self.group_tags,
group_acc: self.group_acc,
}) })
); );
@@ -945,6 +979,9 @@ odoo.define("account.ReconciliationRenderer", function (require) {
if (fieldName === "partner_id") { if (fieldName === "partner_id") {
var partner_id = event.data.changes.partner_id; var partner_id = event.data.changes.partner_id;
this.trigger_up("change_partner", {data: partner_id}); this.trigger_up("change_partner", {data: partner_id});
} else if (fieldName === "ref") {
var ref = event.data.changes.ref;
this.trigger_up("change_ref", {data: ref});
} else { } else {
if (event.data.changes.amount && isNaN(event.data.changes.amount)) { if (event.data.changes.amount && isNaN(event.data.changes.amount)) {
return; return;

View File

@@ -56,6 +56,16 @@
.strike_amount { .strike_amount {
text-decoration: line-through; text-decoration: line-through;
} }
.move_name {
font-size: 80%;
margin-left: 1em;
display: flex;
align-items: center;
}
.caption-input {
margin-left: 1em;
display: inline-flex;
}
tbody tr:hover .cell_account_code::before { tbody tr:hover .cell_account_code::before {
content: "\f068"; content: "\f068";
font-family: FontAwesome; font-family: FontAwesome;
@@ -146,6 +156,9 @@
width: 80px; width: 80px;
padding-left: 5px; padding-left: 5px;
} }
.cell_analytic_account {
width: 230px;
}
.cell_due_date { .cell_due_date {
width: 100px; width: 100px;
} }
@@ -177,6 +190,7 @@
.cell_label, .cell_label,
.cell_due_date, .cell_due_date,
.cell_account_code, .cell_account_code,
.cell_analytic_account,
.cell_info_popover { .cell_info_popover {
box-shadow: 0 1px 0 #eaeaea; box-shadow: 0 1px 0 #eaeaea;
} }

View File

@@ -126,6 +126,9 @@
<div class="o_reconciliation_line" t-att-data-mode="state.mode" tabindex="0"> <div class="o_reconciliation_line" t-att-data-mode="state.mode" tabindex="0">
<table class="accounting_view"> <table class="accounting_view">
<caption style="caption-side: top;"> <caption style="caption-side: top;">
<div class="caption-input">
<span class="move_name"><t t-esc="state.st_line.name" /></span>
</div>
<div class="float-right o_buttons"> <div class="float-right o_buttons">
<button <button
t-attf-class="o_no_valid btn btn-secondary #{state.balance.type &lt; 0 ? '' : 'd-none'}" t-attf-class="o_no_valid btn btn-secondary #{state.balance.type &lt; 0 ? '' : 'd-none'}"
@@ -148,6 +151,12 @@
t-esc="state.st_line.account_code" t-esc="state.st_line.account_code"
/></td> /></td>
<td class="cell_due_date"><t t-esc="state.st_line.date" /></td> <td class="cell_due_date"><t t-esc="state.st_line.date" /></td>
<td
class="cell_analytic_account"
t-if="state.st_line.group_analytic_accounting"
>
<t t-esc="state.st_line.analytic_account_code" />
</td>
<td class="cell_label"><t <td class="cell_label"><t
t-if="state.st_line.payment_ref" t-if="state.st_line.payment_ref"
t-esc="state.st_line.payment_ref" t-esc="state.st_line.payment_ref"
@@ -280,6 +289,12 @@
<tr t-if="state.balance.show_balance"> <tr t-if="state.balance.show_balance">
<td class="cell_account_code"><t t-esc="state.balance.account_code" /></td> <td class="cell_account_code"><t t-esc="state.balance.account_code" /></td>
<td class="cell_due_date" /> <td class="cell_due_date" />
<td
class="cell_analytic_account"
t-if="state.st_line.group_analytic_accounting"
>
<t t-esc="state.balance.analytic_account_code" />
</td>
<td class="cell_label"><t t-if="state.st_line.partner_id">Open balance</t><t <td class="cell_label"><t t-if="state.st_line.partner_id">Open balance</t><t
t-else="" t-else=""
>Choose counterpart or Create Write-off</t></td> >Choose counterpart or Create Write-off</t></td>
@@ -384,13 +399,19 @@
>Taxes</label></td> >Taxes</label></td>
<td class="o_td_field" /> <td class="o_td_field" />
</tr> </tr>
<tr class="create_analytic_account_id" t-if="group_acc"> <tr
class="create_analytic_account_id"
t-if="state.st_line.group_analytic_accounting"
>
<td class="o_td_label"><label <td class="o_td_label"><label
class="o_form_label" class="o_form_label"
>Analytic Acc.</label></td> >Analytic Acc.</label></td>
<td class="o_td_field" /> <td class="o_td_field" />
</tr> </tr>
<tr class="create_analytic_tag_ids" t-if="group_tags"> <tr
class="create_analytic_tag_ids"
t-if="state.st_line.group_analytic_tags"
>
<td class="o_td_label"><label <td class="o_td_label"><label
class="o_form_label" class="o_form_label"
>Analytic Tags.</label></td> >Analytic Tags.</label></td>
@@ -498,6 +519,12 @@
</t> </t>
<t t-else="" t-esc="line.date_maturity || line.date" /> <t t-else="" t-esc="line.date_maturity || line.date" />
</td> </td>
<td
class="cell_analytic_account"
t-if="state.st_line.group_analytic_accounting"
>
<t t-esc="line.analytic_account_code" />
</td>
<td class="cell_label"> <td class="cell_label">
<t <t
t-if="line.partner_id &amp;&amp; line.partner_id !== state.st_line.partner_id" t-if="line.partner_id &amp;&amp; line.partner_id !== state.st_line.partner_id"