Merge branch '16-imp-ebics' into '16.0'

[IMP] account_ebics: add draft, done filters on ebics.file search view

See merge request Noviat/Noviat_Generic/accounting-ebics!79
This commit is contained in:
Luc De Meyer 2025-01-05 10:07:07 +00:00
commit 236b356b5b
11 changed files with 296 additions and 247 deletions

View File

@ -1,9 +1,9 @@
# Copyright 2009-2024 Noviat. # Copyright 2009-2025 Noviat.
# License LGPL-3 or later (http://www.gnu.org/licenses/lgpl). # License LGPL-3 or later (http://www.gnu.org/licenses/lgpl).
{ {
"name": "EBICS banking protocol", "name": "EBICS banking protocol",
"version": "16.0.1.10.3", "version": "16.0.2.0.0",
"license": "LGPL-3", "license": "LGPL-3",
"author": "Noviat", "author": "Noviat",
"website": "https://www.noviat.com/", "website": "https://www.noviat.com/",

View File

@ -0,0 +1,15 @@
# Copyright 2009-2025 Noviat.
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
def migrate(cr, version):
cr.execute( # pylint: disable=E8103
"""
UPDATE ebics_file ef
SET state = 'done'
FROM ebics_file_format eff
WHERE ef.format_id = eff.id
AND eff.type = 'down'
AND eff.download_process_method IS NULL;
"""
)

View File

@ -1,4 +1,4 @@
# Copyright 2009-2024 Noviat. # Copyright 2009-2025 Noviat.
# License LGPL-3 or later (http://www.gnu.org/licenses/lgpl). # License LGPL-3 or later (http://www.gnu.org/licenses/lgpl).
import base64 import base64
@ -36,7 +36,10 @@ class EbicsFile(models.Model):
format_id = fields.Many2one( format_id = fields.Many2one(
comodel_name="ebics.file.format", string="EBICS File Formats", readonly=True comodel_name="ebics.file.format", string="EBICS File Formats", readonly=True
) )
type = fields.Selection(related="format_id.type", readonly=True) download_process_method = fields.Selection(
related="format_id.download_process_method"
)
type = fields.Selection(related="format_id.type")
date_from = fields.Date( date_from = fields.Date(
readonly=True, help="'Date From' as entered in the download wizard." readonly=True, help="'Date From' as entered in the download wizard."
) )

View File

@ -1,4 +1,4 @@
<?xml version="1.0" ?> <?xml version="1.0" encoding="utf-8" ?>
<odoo> <odoo>
<record id="ebics_config_view_tree" model="ir.ui.view"> <record id="ebics_config_view_tree" model="ir.ui.view">

View File

@ -1,89 +1,89 @@
<?xml version="1.0" ?> <?xml version="1.0" encoding="utf-8" ?>
<odoo> <odoo>
<record id="ebics_file_format_view_tree" model="ir.ui.view"> <record id="ebics_file_format_view_tree" model="ir.ui.view">
<field name="name">ebics.file.format.tree</field> <field name="name">ebics.file.format.tree</field>
<field name="model">ebics.file.format</field> <field name="model">ebics.file.format</field>
<field name="arch" type="xml"> <field name="arch" type="xml">
<tree> <tree>
<field name="ebics_version" /> <field name="ebics_version" />
<field name="type" /> <field name="type" />
<field name="order_type" /> <field name="order_type" />
<field name="signature_class" /> <field name="signature_class" />
<field name="name" /> <field name="name" />
<field name="description" /> <field name="description" />
</tree> </tree>
</field> </field>
</record> </record>
<record id="ebics_file_format_view_form" model="ir.ui.view"> <record id="ebics_file_format_view_form" model="ir.ui.view">
<field name="name">ebics.file.format.form</field> <field name="name">ebics.file.format.form</field>
<field name="model">ebics.file.format</field> <field name="model">ebics.file.format</field>
<field name="arch" type="xml"> <field name="arch" type="xml">
<form string="EBICS File Format"> <form string="EBICS File Format">
<group name="main"> <group name="main">
<group name="main-left"> <group name="main-left">
<field name="ebics_version" /> <field name="ebics_version" />
<field name="type" /> <field name="type" />
<field name="suffix" /> <field name="suffix" />
<field <field
name="download_process_method" name="download_process_method"
attrs="{'invisible': [('type', '=', 'up')]}" attrs="{'invisible': [('type', '=', 'up')]}"
force_save="1" force_save="1"
/> />
<field name="signature_class" /> <field name="signature_class" />
</group> </group>
<group name="main-right"> <group name="main-right">
<field name="order_type" /> <field name="order_type" />
<field <field
name="name" name="name"
attrs="{'required': [('ebics_version', '=', '2')], 'invisible': [('ebics_version', '=', '3')]}" attrs="{'required': [('ebics_version', '=', '2')], 'invisible': [('ebics_version', '=', '3')]}"
/> />
<field <field
name="btf_service" name="btf_service"
attrs="{'required': [('ebics_version', '=', '3')], 'invisible': [('ebics_version', '=', '2')]}" attrs="{'required': [('ebics_version', '=', '3')], 'invisible': [('ebics_version', '=', '2')]}"
/> />
<field <field
name="btf_message" name="btf_message"
attrs="{'required': [('ebics_version', '=', '3')], 'invisible': [('ebics_version', '=', '2')]}" attrs="{'required': [('ebics_version', '=', '3')], 'invisible': [('ebics_version', '=', '2')]}"
/> />
<field <field
name="btf_scope" name="btf_scope"
attrs="{'invisible': [('ebics_version', '=', '2')]}" attrs="{'invisible': [('ebics_version', '=', '2')]}"
/> />
<field <field
name="btf_option" name="btf_option"
attrs="{'invisible': [('ebics_version', '=', '2')]}" attrs="{'invisible': [('ebics_version', '=', '2')]}"
/> />
<field <field
name="btf_container" name="btf_container"
attrs="{'invisible': [('ebics_version', '=', '2')]}" attrs="{'invisible': [('ebics_version', '=', '2')]}"
/> />
<field <field
name="btf_version" name="btf_version"
attrs="{'invisible': [('ebics_version', '=', '2')]}" attrs="{'invisible': [('ebics_version', '=', '2')]}"
/> />
<field <field
name="btf_variant" name="btf_variant"
attrs="{'invisible': [('ebics_version', '=', '2')]}" attrs="{'invisible': [('ebics_version', '=', '2')]}"
/> />
<field <field
name="btf_format" name="btf_format"
attrs="{'invisible': [('ebics_version', '=', '2')]}" attrs="{'invisible': [('ebics_version', '=', '2')]}"
/> />
</group> </group>
</group> </group>
<group name="description"> <group name="description">
<field name="description" /> <field name="description" />
</group> </group>
</form> </form>
</field> </field>
</record> </record>
<record id="ebics_file_format_action" model="ir.actions.act_window"> <record id="ebics_file_format_action" model="ir.actions.act_window">
<field name="name">EBICS File Formats</field> <field name="name">EBICS File Formats</field>
<field name="res_model">ebics.file.format</field> <field name="res_model">ebics.file.format</field>
<field name="view_mode">tree,form</field> <field name="view_mode">tree,form</field>
</record> </record>
</odoo> </odoo>

View File

@ -1,256 +1,284 @@
<?xml version="1.0" ?> <?xml version="1.0" encoding="utf-8" ?>
<odoo> <odoo>
<record id="ebics_file_view_search" model="ir.ui.view"> <record id="ebics_file_view_search" model="ir.ui.view">
<field name="name">ebics.file.search</field> <field name="name">ebics.file.search</field>
<field name="model">ebics.file</field> <field name="model">ebics.file</field>
<field name="arch" type="xml"> <field name="arch" type="xml">
<search string="Search EBICS Files"> <search string="Search EBICS Files">
<group col="10" colspan="4"> <field name="date_from" />
<field name="date_from" /> <field name="date_to" />
<field name="date_to" /> <field name="name" />
<field name="name" /> <field name="format_id" />
<field name="format_id" /> <field name="user_id" />
<field name="user_id" /> <field
<field name="company_ids"
name="company_ids" widget="selection"
widget="selection" groups="base.group_multi_company"
groups="base.group_multi_company" />
/> <filter
</group> string="Draft"
<newline /> name="draft"
<group expand="0" string="Group By"> domain="[('state', '=', 'draft')]"
<filter />
<filter string="Done" name="done" domain="[('state', '=', 'done')]" />
<group expand="0" string="Group By">
<filter
string="File Format" string="File Format"
name="file_format" name="file_format"
context="{'group_by':'format_id'}" context="{'group_by':'format_id'}"
/> />
<filter string="State" name="state" context="{'group_by':'state'}" /> <filter
<filter string="User" name="user" context="{'group_by':'user_id'}" /> string="State"
</group> name="state"
</search> context="{'group_by':'state'}"
</field> />
</record> <filter
string="User"
name="user"
context="{'group_by':'user_id'}"
/>
</group>
</search>
</field>
</record>
<!-- Download --> <!-- Download -->
<record id="ebics_file_view_tree_download" model="ir.ui.view"> <record id="ebics_file_view_tree_download" model="ir.ui.view">
<field name="name">ebics.file.tree</field> <field name="name">ebics.file.tree</field>
<field name="model">ebics.file</field> <field name="model">ebics.file</field>
<field name="arch" type="xml"> <field name="arch" type="xml">
<tree decoration-muted="state=='draft'" create="false"> <tree decoration-muted="state=='draft'" create="false">
<field name="date" string="Download Date" /> <field name="date" string="Download Date" />
<field name="name" /> <field name="name" />
<field name="date_from" /> <field name="date_from" />
<field name="date_to" /> <field name="date_to" />
<field name="user_id" /> <field name="user_id" />
<field name="state" /> <field name="state" />
<field name="format_id" /> <field name="format_id" />
<field <field
name="company_ids" name="company_ids"
widget="many2many_tags" widget="many2many_tags"
groups="base.group_multi_company" groups="base.group_multi_company"
/> />
</tree> </tree>
</field> </field>
</record> </record>
<record id="ebics_file_view_form_download" model="ir.ui.view"> <record id="ebics_file_view_form_download" model="ir.ui.view">
<field name="name">ebics.file.form</field> <field name="name">ebics.file.form</field>
<field name="model">ebics.file</field> <field name="model">ebics.file</field>
<field name="priority">1</field> <field name="priority">1</field>
<field name="arch" type="xml"> <field name="arch" type="xml">
<form string="EBICS File" create="false"> <form string="EBICS File" create="false">
<header> <header>
<button <field name="download_process_method" invisible="1" />
<button
name="set_to_draft" name="set_to_draft"
states="done" attrs="{'invisible': ['|', ('download_process_method', '=', False), ('state', '!=', 'done')]}"
string="Set to Draft" string="Set to Draft"
type="object" type="object"
groups="account.group_account_manager" groups="account.group_account_manager"
/> />
<button <button
name="process" name="process"
class="oe_highlight" class="oe_highlight"
states="draft" attrs="{'invisible': ['|', ('download_process_method', '=', False), ('state', '!=', 'draft')]}"
string="Process" string="Process"
type="object" type="object"
groups="account.group_account_invoice" groups="account.group_account_invoice"
help="Process the EBICS File" help="Process the EBICS File"
/> />
<button <button
name="set_to_done" name="set_to_done"
states="draft" attrs="{'invisible': ['|', ('download_process_method', '=', False), ('state', '!=', 'draft')]}"
string="Set to Done" string="Set to Done"
type="object" type="object"
groups="account.group_account_manager" groups="account.group_account_manager"
/> />
<field name="state" widget="statusbar" /> <field
</header> name="state"
<group colspan="4" col="4"> widget="statusbar"
<field name="date" string="Download Date" /> attrs="{'invisible': [('download_process_method', '=', False)]}"
<field name="name" />
<field name="data" filename="name" />
<field name="format_id" />
<field name="date_from" />
<field name="date_to" />
<field name="user_id" />
<field name="ebics_userid_id" />
<field
name="company_ids"
widget="many2many_tags"
groups="base.group_multi_company"
/> />
</group> </header>
<notebook> <group name="main">
<page string="Additional Information"> <group name="main-full-screen" colspan="2" col="2">
<field name="note" nolabel="1" /> <field name="name" />
</page> <field name="data" filename="name" />
<page <field name="format_id" />
</group>
<group name="main-left">
<field name="date" string="Download Date" />
<field name="user_id" />
<field name="ebics_userid_id" />
</group>
<group name="main-right">
<field name="date_from" />
<field name="date_to" />
<field
name="company_ids"
widget="many2many_tags"
groups="base.group_multi_company"
/>
</group>
</group>
<notebook>
<page string="Additional Information">
<field name="note" nolabel="1" />
</page>
<page
string="Bank Statements" string="Bank Statements"
attrs="{'invisible':[('bank_statement_ids','=',[])]}" attrs="{'invisible':[('bank_statement_ids','=',[])]}"
> >
<field name="bank_statement_ids" nolabel="1" /> <field name="bank_statement_ids" nolabel="1" />
</page> </page>
</notebook> </notebook>
</form> </form>
</field> </field>
</record> </record>
<record id="ebics_file_view_form_result" model="ir.ui.view"> <record id="ebics_file_view_form_result" model="ir.ui.view">
<field name="name">ebics.file.process.result</field> <field name="name">ebics.file.process.result</field>
<field name="model">ebics.file</field> <field name="model">ebics.file</field>
<field name="priority">2</field> <field name="priority">2</field>
<field name="arch" type="xml"> <field name="arch" type="xml">
<form string="Process EBICS File"> <form string="Process EBICS File">
<separator colspan="4" string="Results :" /> <separator colspan="4" string="Results :" />
<field name="note_process" colspan="4" nolabel="1" width="850" height="400" /> <field
<footer> name="note_process"
<button colspan="4"
nolabel="1"
width="850"
height="400"
/>
<footer>
<button
name="action_open_bank_statements" name="action_open_bank_statements"
string="View Bank Statement(s)" string="View Bank Statement(s)"
type="object" type="object"
class="oe_highlight" class="oe_highlight"
invisible="not context.get('statement_ids')" invisible="not context.get('statement_ids')"
/> />
<button name="button_close" type="object" string="Close" /> <button name="button_close" type="object" string="Close" />
</footer> </footer>
</form> </form>
</field> </field>
</record> </record>
<record id="ebics_file_action_download" model="ir.actions.act_window"> <record id="ebics_file_action_download" model="ir.actions.act_window">
<field name="name">EBICS Download Files</field> <field name="name">EBICS Download Files</field>
<field name="type">ir.actions.act_window</field> <field name="type">ir.actions.act_window</field>
<field name="res_model">ebics.file</field> <field name="res_model">ebics.file</field>
<field name="view_mode">tree,form</field> <field name="view_mode">tree,form</field>
<field name="view_id" eval="False" /> <field name="view_id" eval="False" />
<field name="domain">[('type','=','down')]</field> <field name="domain">[('type', '=', 'down')]</field>
<field name="search_view_id" ref="ebics_file_view_search" /> <field name="search_view_id" ref="ebics_file_view_search" />
</record> </record>
<record id="ebics_file_action_download_tree" model="ir.actions.act_window.view"> <record id="ebics_file_action_download_tree" model="ir.actions.act_window.view">
<field eval="1" name="sequence" /> <field eval="1" name="sequence" />
<field name="view_mode">tree</field> <field name="view_mode">tree</field>
<field name="view_id" ref="ebics_file_view_tree_download" /> <field name="view_id" ref="ebics_file_view_tree_download" />
<field name="act_window_id" ref="ebics_file_action_download" /> <field name="act_window_id" ref="ebics_file_action_download" />
</record> </record>
<record id="ebics_file_action_download_form" model="ir.actions.act_window.view"> <record id="ebics_file_action_download_form" model="ir.actions.act_window.view">
<field eval="2" name="sequence" /> <field eval="2" name="sequence" />
<field name="view_mode">form</field> <field name="view_mode">form</field>
<field name="view_id" ref="ebics_file_view_form_download" /> <field name="view_id" ref="ebics_file_view_form_download" />
<field name="act_window_id" ref="ebics_file_action_download" /> <field name="act_window_id" ref="ebics_file_action_download" />
</record> </record>
<!-- Upload --> <!-- Upload -->
<record id="ebics_file_view_tree_upload" model="ir.ui.view"> <record id="ebics_file_view_tree_upload" model="ir.ui.view">
<field name="name">ebics.file.tree</field> <field name="name">ebics.file.tree</field>
<field name="model">ebics.file</field> <field name="model">ebics.file</field>
<field name="arch" type="xml"> <field name="arch" type="xml">
<tree decoration-muted="state=='draft'" create="false"> <tree decoration-muted="state=='draft'" create="false">
<field name="date" string="Upload Date" /> <field name="date" string="Upload Date" />
<field name="name" /> <field name="name" />
<field name="user_id" /> <field name="user_id" />
<field name="state" /> <field name="state" />
<field name="format_id" /> <field name="format_id" />
<field <field
name="company_ids" name="company_ids"
widget="many2many_tags" widget="many2many_tags"
groups="base.group_multi_company" groups="base.group_multi_company"
/> />
</tree> </tree>
</field> </field>
</record> </record>
<record id="ebics_file_view_form_upload" model="ir.ui.view"> <record id="ebics_file_view_form_upload" model="ir.ui.view">
<field name="name">ebics.file.form</field> <field name="name">ebics.file.form</field>
<field name="model">ebics.file</field> <field name="model">ebics.file</field>
<field name="priority">1</field> <field name="priority">1</field>
<field name="arch" type="xml"> <field name="arch" type="xml">
<form string="EBICS File" create="false"> <form string="EBICS File" create="false">
<header> <header>
<button <button
name="set_to_draft" name="set_to_draft"
states="done" states="done"
string="Set to Draft" string="Set to Draft"
type="object" type="object"
groups="account.group_account_manager" groups="account.group_account_manager"
/> />
<button <button
name="set_to_done" name="set_to_done"
states="draft" states="draft"
string="Set to Done" string="Set to Done"
type="object" type="object"
groups="account.group_account_manager" groups="account.group_account_manager"
/> />
<field name="state" widget="statusbar" /> <field name="state" widget="statusbar" />
</header> </header>
<group colspan="4" col="4"> <group colspan="4" col="4">
<field name="date" string="Upload Date" /> <field name="date" string="Upload Date" />
<field name="name" /> <field name="name" />
<field name="data" filename="name" /> <field name="data" filename="name" />
<field name="format_id" /> <field name="format_id" />
<field name="user_id" /> <field name="user_id" />
<field name="ebics_userid_id" /> <field name="ebics_userid_id" />
<field <field
name="company_ids" name="company_ids"
widget="many2many_tags" widget="many2many_tags"
groups="base.group_multi_company" groups="base.group_multi_company"
/> />
</group> </group>
<notebook> <notebook>
<page string="Additional Information"> <page string="Additional Information">
<field name="note" nolabel="1" /> <field name="note" nolabel="1" />
</page> </page>
</notebook> </notebook>
</form> </form>
</field> </field>
</record> </record>
<record id="ebics_file_action_upload" model="ir.actions.act_window"> <record id="ebics_file_action_upload" model="ir.actions.act_window">
<field name="name">EBICS Upload Files</field> <field name="name">EBICS Upload Files</field>
<field name="type">ir.actions.act_window</field> <field name="type">ir.actions.act_window</field>
<field name="res_model">ebics.file</field> <field name="res_model">ebics.file</field>
<field name="view_mode">tree,form</field> <field name="view_mode">tree,form</field>
<field name="view_id" eval="False" /> <field name="view_id" eval="False" />
<field name="domain">[('type','=','up')]</field> <field name="domain">[('type', '=', 'up')]</field>
<field name="search_view_id" ref="ebics_file_view_search" /> <field name="search_view_id" ref="ebics_file_view_search" />
</record> </record>
<record id="ebics_file_action_upload_tree" model="ir.actions.act_window.view"> <record id="ebics_file_action_upload_tree" model="ir.actions.act_window.view">
<field eval="1" name="sequence" /> <field eval="1" name="sequence" />
<field name="view_mode">tree</field> <field name="view_mode">tree</field>
<field name="view_id" ref="ebics_file_view_tree_upload" /> <field name="view_id" ref="ebics_file_view_tree_upload" />
<field name="act_window_id" ref="ebics_file_action_upload" /> <field name="act_window_id" ref="ebics_file_action_upload" />
</record> </record>
<record id="ebics_file_action_upload_form" model="ir.actions.act_window.view"> <record id="ebics_file_action_upload_form" model="ir.actions.act_window.view">
<field eval="2" name="sequence" /> <field eval="2" name="sequence" />
<field name="view_mode">form</field> <field name="view_mode">form</field>
<field name="view_id" ref="ebics_file_view_form_upload" /> <field name="view_id" ref="ebics_file_view_form_upload" />
<field name="act_window_id" ref="ebics_file_action_upload" /> <field name="act_window_id" ref="ebics_file_action_upload" />
</record> </record>
</odoo> </odoo>

View File

@ -1,4 +1,4 @@
<?xml version="1.0" ?> <?xml version="1.0" encoding="utf-8" ?>
<odoo> <odoo>
<record id="ebics_userid_view_tree" model="ir.ui.view"> <record id="ebics_userid_view_tree" model="ir.ui.view">

View File

@ -1,4 +1,4 @@
<?xml version="1.0" ?> <?xml version="1.0" encoding="utf-8" ?>
<odoo> <odoo>
<menuitem <menuitem

View File

@ -1,4 +1,4 @@
# Copyright 2009-2024 Noviat. # Copyright 2009-2025 Noviat.
# License LGPL-3 or later (http://www.gnu.org/licenses/lgpl). # License LGPL-3 or later (http://www.gnu.org/licenses/lgpl).
import base64 import base64
@ -603,6 +603,7 @@ class EbicsXfer(models.TransientModel):
"date_from": self.date_from, "date_from": self.date_from,
"date_to": self.date_to, "date_to": self.date_to,
"format_id": file_format.id, "format_id": file_format.id,
"state": file_format.download_process_method and "draft" or "done",
"user_id": self._uid, "user_id": self._uid,
"ebics_userid_id": self.ebics_userid_id.id, "ebics_userid_id": self.ebics_userid_id.id,
"company_ids": self.ebics_config_id.company_ids.ids, "company_ids": self.ebics_config_id.company_ids.ids,

View File

@ -1,9 +1,9 @@
# Copyright 2009-2023 Noviat. # Copyright 2009-2025 Noviat.
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
{ {
"name": "EBICS Files batch import", "name": "EBICS Files batch import",
"version": "16.0.1.0.0", "version": "16.0.1.0.1",
"license": "AGPL-3", "license": "AGPL-3",
"author": "Noviat", "author": "Noviat",
"website": "https://www.noviat.com/", "website": "https://www.noviat.com/",

View File

@ -179,7 +179,9 @@ class EbicsBatchLog(models.Model):
return file_ids return file_ids
def _ebics_process(self, import_dict): def _ebics_process(self, import_dict):
to_process = self.file_ids.filtered(lambda r: r.state == "draft") to_process = self.file_ids.filtered(
lambda r: r.download_process_method and r.state == "draft"
)
for ebics_file in to_process: for ebics_file in to_process:
ebics_file.process() ebics_file.process()