Repository
OCA/l10n-germany · module folder · Try on Runboat
Module version
1.0.0
Category
Accounting
Folder size
3.29 MB
License
AGPL-3
Application
No
Auto-installable
No
Website
https://github.com/OCA/l10n-germany
Last tracking update
2026-08-07 08:42:57
Authors
Odoo Community Association (OCA), initOS GmbH, Guenter Selbert, Thorsten Vocks, Maciej Wichowski, Daniela Scarpa, Maria Sparenberg, Jan Sierpina
Maintainers
Odoo Community Association (OCA), initOS GmbH, Guenter Selbert, Thorsten Vocks, Maciej Wichowski, Daniela Scarpa, Maria Sparenberg, Jan Sierpina
Committers
Holger Brunn, OCA-git-bot, oca-ci
Odoo dependencies
Python dependencies
None
System dependencies
None
Required by
None
Description
## Odoo Export to DATEV XML

The datev_export_xml module allows to export invoices and bills with
their origin digitized receipts in order to transmitt structured
accounting data via file-based DATEV XML format. The transfer of these
files created by this module to the invoice books in DATEV Unternehmen
Online can be done currently via the free DATEV document transfer app.

The DATEV XML interface cannot cover use cases such as:

- Pure G/L account postings (G/L account to G/L account, e.g. payment
  postings)
- Master data transfer for business partners (customers/creditors)
- certain §13b UStG issues (see permissible tax codes for DATEV
  Unternehmen online)

Code Analysis

Views touched (13)
XML IDNameModelTypeStatus
datev_export_view_kanban datev.export.xml.kanban datev.export.xml kanban New
datev_export_view_tree datev.export.xml.view.list datev.export.xml list New
export_invoice export_invoice ir.ui.view qweb New
export_invoice_document export_invoice_document ir.ui.view qweb New
export_invoice_line export_invoice_line ir.ui.view qweb New
export_invoice_line_item export_invoice_line_item ir.ui.view qweb New
export_party export_party ir.ui.view qweb New
res_config_settings_view_form res.config.settings.datev.view.form res.config.settings form Inherits datev_export.res_config_settings_view_form
view_account_invoice_filter account.move Inherits account.view_account_invoice_filter
view_datev_export_form datev.export.xml.form datev.export.xml form New
view_datev_export_popup_form datev.export.xml.popup.form datev.export.xml form Inherits view_datev_export_form
view_move_datev_validation account.move list New
view_move_form account.move form Inherits account.view_move_form
HTTP endpoints (1)
Route(s)HandlerAuthTypeMethodsFlags
/datev/xml/download/<int:line_id> DatevHome.datev_xml_download_attachment user http ALL
Models touched (9)

New fields (2)
  • datev_exported Boolean
    copy=False help='When finishing a datev export the processed invoices are marked as exported.\nIf you need to export the invoices again, set this field to False.' string='Exported to Datev'
  • datev_validation Text
Public methods (8)
  • datev_delivery_date(self)
  • datev_filename(self, extension='.pdf')
  • datev_format_total(self, value, prec=2)
  • datev_invoice_id(self)
  • datev_invoice_type(self)
  • datev_order_id(self)
  • datev_party_attributes(self, partner)
  • datev_sanitize(self, value, length=36)

New fields (0)

No new fields.

Public methods (2)
  • datev_analytic_account(self)
  • datev_price_information(self)

New fields (19)
  • check_xsd Boolean
    default=True required=True args: 'Check XSD'
  • client_number Char
    readonly=True related='company_id.datev_client_number'
  • company_id Many2one → res.company
    default=<expr> readonly=True required=True args: 'res.company'
  • consultant_number Char
    readonly=True related='company_id.datev_consultant_number'
  • date_start Date
    default=_default_start args: 'From Date'
  • date_stop Date
    default=_default_stop args: 'To Date'
  • exception_info Text
    readonly=True
  • export_invoice Boolean
    default=True args: 'Export Invoices'
  • export_refund Boolean
    default=True args: 'Export Refunds'
  • export_type Selection
    default='out' required=True args: [('out', 'Customers'), ('in', 'Vendors')]
  • invoice_ids Many2many → account.move
    comodel_name='account.move' string='Invoices'
  • invoices_count Integer
    compute='_compute_invoices_count' store=True string='Total Invoices'
  • invoices_exported_count Integer
    compute='_compute_invoices_count' store=True string='Exported Invoices'
  • line_count Integer
    compute='_compute_line_count'
  • line_ids One2many → datev.export.xml.line
    args: 'datev.export.xml.line', 'export_id', 'Lines'
  • manually_document_selection Boolean
    default=False
  • name Char
  • problematic_invoices_count Integer
    compute='_compute_problematic_invoices_count'
  • state Selection
    default='draft' readonly=True required=True string='Status' tracking=True args: [('draft', 'Draft'), ('pending', 'Pending'), ('running', 'Running'), ('done', 'Done'), ('failed', 'Failed')]
Public methods (16)
  • action_done(self)
  • action_draft(self)
  • action_invalidate_lines(self)
  • action_pending(self)
  • action_show_invalid_invoices_view(self)
  • action_show_related_invoices_view(self)
  • action_validate(self)
  • create(self, vals_list)
    @api.model_create_multi
  • cron_run_pending_export(self)
    @api.model
    A Cron job can't execute parallel, so if we run this cron and there is currently a running datev export we can restart it.
  • export_zip(self)
  • export_zip_invoice(self, invoice_ids=None)
    @api.model
  • get_invoices(self)
  • get_type_list(self)
  • get_zip(self)
  • validate_types(self)
    @api.constrains('export_invoice', 'export_refund', 'export_type')
  • write(self, vals)

New fields (6)
  • attachment_id Many2one → ir.attachment
    ondelete='cascade' readonly=True args: 'ir.attachment'
  • export_id Many2one → datev.export.xml
    readonly=True args: 'datev.export.xml'
  • filename Char
    readonly=True related='attachment_id.name'
  • filesize Char
    compute='_compute_filesize'
  • invoice_ids Many2many → account.move
    readonly=True args: 'account.move'
  • invoices_count Integer
    compute='_compute_invoices_count' store=True string='Invoices'
Public methods (3)
  • action_datev_download(self)
  • action_open_invoices(self)
  • unlink(self)

New fields (0)

No new fields.

Public methods (3)
  • find_existing_attachments(self, invoice)
    @api.model
  • generate_pdf(self, invoice)
    @api.model
  • report_name(self)
    @api.model

New fields (0)

No new fields.

Public methods (3)
  • check_xml_file(self, doc_name, root, xsd=None, invoice=None)
    @api.model
  • generate_xml_document(self, invoices, check_xsd=True)
    @api.model
  • generate_xml_invoice(self, invoice, check_xsd=True)
    @api.model

New fields (0)

No new fields.

Public methods (2)
  • check_valid_data(self, invoices)
    @api.model
  • generate_zip(self, invoices, check_xsd)
    @api.model

New fields (5)
  • datev_customer_order_ref Selection
    default='odoo' required=True args: [('odoo', 'Odoo Reference'), ('partner', 'Partner Reference'), ('payment', 'Payment Reference')], 'Customer Order Reference'
  • datev_default_period Selection
    default='week' help='Used to get default values for start and stop date at DATEV Export!' args: [('day', 'Day'), ('week', 'Week'), ('month', 'Month'), ('year', 'Year')]
  • datev_export_state Boolean
    help='If set, the invoices are marked as exported when finishing a Datev export.'
  • datev_package_limit Integer
    default=100 string='Package Limit in MB'
  • datev_vendor_order_ref Selection
    default='odoo' required=True args: [('odoo', 'Odoo Reference'), ('partner', 'Partner Reference'), ('payment', 'Payment Reference')], 'Vendor Order Reference'
Public methods (0)

No public methods.

New fields (5)
  • datev_customer_order_ref Selection
    readonly=False related='company_id.datev_customer_order_ref'
  • datev_default_period Selection
    readonly=False related='company_id.datev_default_period'
  • datev_export_state Boolean
    readonly=False related='company_id.datev_export_state'
  • datev_package_limit Integer
    readonly=False related='company_id.datev_package_limit'
  • datev_vendor_order_ref Selection
    readonly=False related='company_id.datev_vendor_order_ref'
Public methods (0)

No public methods.

Loading…

Loading…

Loading…

Loading…

Loading…