diff --git a/.copier-answers.yml b/.copier-answers.yml index c13a05f74d25a7f451a6203def4158b8766e38d7..c7ffefe9b41f674af55a2782528f499139a37c32 100644 --- a/.copier-answers.yml +++ b/.copier-answers.yml @@ -1,9 +1,11 @@ # Do NOT update manually; changes here will be overwritten by Copier -_commit: v1.14.2 +_commit: v1.29 _src_path: https://github.com/OCA/oca-addons-repo-template.git -ci: false -dependency_installation_mode: PIP -generate_requirements_txt: false +additional_ruff_rules: [] +ci: GitHub +convert_readme_fragments_to_markdown: true +enable_checklog_odoo: true +generate_requirements_txt: true github_check_license: false github_ci_extra_env: {} github_enable_codecov: false @@ -11,14 +13,15 @@ github_enable_makepot: false github_enable_stale_action: false github_enforce_dev_status_compatibility: false include_wkhtmltopdf: false -odoo_version: 16.0 +odoo_test_flavor: OCB +odoo_version: 17.0 org_name: Le Filament org_slug: lefilament rebel_module_groups: [] -repo_description: null -repo_name: Module Template -repo_slug: template_module -repo_website: https://le-filament.com -travis_apt_packages: [] -travis_apt_sources: [] +repo_description: '' +repo_name: Template module +repo_slug: lefilament +repo_website: https://le-filament.com +use_pyproject_toml: true +use_ruff: true diff --git a/.eslintrc.yml b/.eslintrc.yml index 9429bc688aab4993eae460767368f65089afa323..0b382039586ae1303994e343dfca336fe46b0bdd 100644 --- a/.eslintrc.yml +++ b/.eslintrc.yml @@ -4,7 +4,7 @@ env: # See https://github.com/OCA/odoo-community.org/issues/37#issuecomment-470686449 parserOptions: - ecmaVersion: 2019 + ecmaVersion: 2022 overrides: - files: @@ -22,6 +22,7 @@ globals: odoo: readonly openerp: readonly owl: readonly + luxon: readonly # Styling is handled by Prettier, so we only need to enable AST rules; # see https://github.com/OCA/maintainer-quality-tools/pull/618#issuecomment-558576890 diff --git a/.flake8 b/.flake8 deleted file mode 100644 index e397e8ed4e3e7f7fe7785dd391bb80aa6d85575e..0000000000000000000000000000000000000000 --- a/.flake8 +++ /dev/null @@ -1,12 +0,0 @@ -[flake8] -max-line-length = 88 -max-complexity = 16 -# B = bugbear -# B9 = bugbear opinionated (incl line length) -select = C,E,F,W,B,B9 -# E203: whitespace before ':' (black behaviour) -# E501: flake8 line length (covered by bugbear B950) -# W503: line break before binary operator (black behaviour) -ignore = E203,E501,W503 -per-file-ignores= - __init__.py:F401 diff --git a/.gitignore b/.gitignore index 9c283fd41f6cc3330653f1d90a820b85e23caf65..c9f42387ef7051b2a868a9361f4f3cb6d562d4ed 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,7 @@ __pycache__/ *.py[cod] /.venv /.pytest_cache +/.ruff_cache # C extensions *.so @@ -23,6 +24,16 @@ var/ .installed.cfg *.egg *.eggs +.copier-answers.yml + +# Debian packages +*.deb + +# Redhat packages +*.rpm + +# MacOS packages +*.dmg # Installer logs pip-log.txt diff --git a/.isort.cfg b/.isort.cfg deleted file mode 100644 index 0ec187efd1bf802844749f508cda0c8f138970f9..0000000000000000000000000000000000000000 --- a/.isort.cfg +++ /dev/null @@ -1,13 +0,0 @@ -[settings] -; see https://github.com/psf/black -multi_line_output=3 -include_trailing_comma=True -force_grid_wrap=0 -combine_as_imports=True -use_parentheses=True -line_length=88 -known_odoo=odoo -known_odoo_addons=odoo.addons -sections=FUTURE,STDLIB,THIRDPARTY,ODOO,ODOO_ADDONS,FIRSTPARTY,LOCALFOLDER -default_section=THIRDPARTY -ensure_newline_before_comments = True diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 3c66a0116c6fb5fd335029bb9254e944523753fb..f58f2c6608a042bb13f2c7559889e33bf3f46733 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -12,6 +12,12 @@ exclude: | /static/(src/)?lib/| # Repos using Sphinx to generate docs don't need prettying ^docs/_templates/.*\.html$| + # Don't bother non-technical authors with formatting issues in docs + readme/.*\.(rst|md)$| + # Ignore build and dist directories in addons + /build/|/dist/| + # Ignore test files in addons + /tests/samples/.*| # You don't usually want a bot to modify your legal texts (LICENSE.*|COPYING.*) default_language_version: @@ -31,35 +37,39 @@ repos: name: en.po files cannot exist entry: found a en.po file language: fail - files: '[a-zA-Z0-9_]*/i18n/en\.po$' + files: + '[a-zA-Z0-9_]*/i18n/en\.po$' + # - repo: https://github.com/sbidoul/whool + # rev: v0.5 + # hooks: + # - id: whool-init - repo: https://github.com/oca/maintainer-tools - rev: 4cd2b852214dead80822e93e6749b16f2785b2fe + rev: d5fab7ee87fceee858a3d01048c78a548974d935 hooks: # update the NOT INSTALLABLE ADDONS section above - id: oca-update-pre-commit-excluded-addons - id: oca-fix-manifest-website args: ["https://le-filament.com"] - - repo: https://github.com/myint/autoflake - rev: v1.6.1 - hooks: - - id: autoflake + - id: oca-gen-addon-readme args: - - --expand-star-imports - - --ignore-init-module-imports - - --in-place - - --remove-all-unused-imports - - --remove-duplicate-keys - - --remove-unused-variables - - repo: https://github.com/psf/black - rev: 22.8.0 + - --addons-dir=. + - --branch=17.0 + - --org-name=lefilament + - --repo-name=template_module + - --if-source-changed + - --keep-source-digest + - --convert-fragments-to-markdown + # - id: oca-gen-external-dependencies + - repo: https://github.com/OCA/odoo-pre-commit-hooks + rev: v0.0.25 hooks: - - id: black + - id: oca-checks-odoo-module + - id: oca-checks-po - repo: https://github.com/pre-commit/mirrors-prettier rev: v2.7.1 hooks: - id: prettier name: prettier (with plugin-xml) - exclude: ^templates/ additional_dependencies: - "prettier@2.7.1" - "@prettier/plugin-xml@2.2.0" @@ -96,27 +106,14 @@ repos: - id: check-xml - id: mixed-line-ending args: ["--fix=lf"] - - repo: https://github.com/asottile/pyupgrade - rev: v2.38.2 - hooks: - - id: pyupgrade - args: ["--keep-percent-format"] - - repo: https://github.com/PyCQA/isort - rev: 5.12.0 - hooks: - - id: isort - name: isort except __init__.py - args: - - --settings=. - exclude: /__init__\.py$ - - repo: https://github.com/PyCQA/flake8 - rev: 3.9.2 + - repo: https://github.com/astral-sh/ruff-pre-commit + rev: v0.1.3 hooks: - - id: flake8 - name: flake8 - additional_dependencies: ["flake8-bugbear==21.9.2"] + - id: ruff + args: [--fix, --exit-non-zero-on-fix] + - id: ruff-format - repo: https://github.com/OCA/pylint-odoo - rev: 7.0.2 + rev: v9.0.4 hooks: - id: pylint_odoo name: pylint with optional checks diff --git a/.pylintrc b/.pylintrc index 71c476d4f10ac08a7333729b93705c9573d240d5..4fb9ba5362fb402b42c1a587d56b28ed71e8f933 100644 --- a/.pylintrc +++ b/.pylintrc @@ -5,12 +5,12 @@ load-plugins=pylint_odoo score=n [ODOOLINT] -readme_template_url="https://github.com/OCA/maintainer-tools/blob/master/template/module/README.rst" -manifest_required_authors=Le Filament -manifest_required_keys=license -manifest_deprecated_keys=description,active -license_allowed=AGPL-3,GPL-2,GPL-2 or any later version,GPL-3,GPL-3 or any later version,LGPL-3 -valid_odoo_versions=16.0 +readme-template-url="https://github.com/OCA/maintainer-tools/blob/master/template/module/README.rst" +manifest-required-authors=Le Filament +manifest-required-keys=license +manifest-deprecated-keys=description,active +license-allowed=AGPL-3,GPL-2,GPL-2 or any later version,GPL-3,GPL-3 or any later version,LGPL-3 +valid-odoo-versions=17.0 [MESSAGES CONTROL] disable=all diff --git a/.pylintrc-mandatory b/.pylintrc-mandatory index ed2c2171ffe63ac191e30ed0759c4b6211ad5f15..42885e9b5eb0cde47fa65d308683c29504934143 100644 --- a/.pylintrc-mandatory +++ b/.pylintrc-mandatory @@ -4,12 +4,12 @@ load-plugins=pylint_odoo score=n [ODOOLINT] -readme_template_url="https://github.com/OCA/maintainer-tools/blob/master/template/module/README.rst" -manifest_required_authors=Le Filament -manifest_required_keys=license -manifest_deprecated_keys=description,active -license_allowed=AGPL-3,GPL-2,GPL-2 or any later version,GPL-3,GPL-3 or any later version,LGPL-3 -valid_odoo_versions=16.0 +readme-template-url="https://github.com/OCA/maintainer-tools/blob/master/template/module/README.rst" +manifest-required-authors=Le Filament +manifest-required-keys=license +manifest-deprecated-keys=description,active +license-allowed=AGPL-3,GPL-2,GPL-2 or any later version,GPL-3,GPL-3 or any later version,LGPL-3 +valid-odoo-versions=17.0 [MESSAGES CONTROL] disable=all diff --git a/.ruff.toml b/.ruff.toml new file mode 100644 index 0000000000000000000000000000000000000000..0240c75f6a4ae4550f3473ad0a5faaef022bf6c7 --- /dev/null +++ b/.ruff.toml @@ -0,0 +1,30 @@ + +target-version = "py310" +fix = true + +[lint] +extend-select = [ + "B", + "C90", + "E501", # line too long (default 88) + "I", # isort + "UP", # pyupgrade +] +exclude = ["setup/*"] + +[format] +exclude = ["setup/*"] + +[per-file-ignores] +"__init__.py" = ["F401", "I001"] # ignore unused and unsorted imports in __init__.py +"__manifest__.py" = ["B018"] # useless expression + +[isort] +section-order = ["future", "standard-library", "third-party", "odoo", "odoo-addons", "first-party", "local-folder"] + +[isort.sections] +"odoo" = ["odoo"] +"odoo-addons" = ["odoo.addons"] + +[mccabe] +max-complexity = 16 diff --git a/__manifest__.py b/__manifest__.py index 94f1afed630319439be0ce36d6d3cc2986c5735c..1de5461549e68e7c56b656bd79db2d26b9969cc0 100644 --- a/__manifest__.py +++ b/__manifest__.py @@ -6,35 +6,19 @@ "author": "Le Filament", "category": "dashboard", "website": "https://le-filament.com", - "version": "16.0.1.0.0", + "version": "17.0.1.0.0", "license": "AGPL-3", - "depends": ["account", "crm", "hr_expense", "sale"], + "depends": ["account_usability", "crm", "hr_expense", "sale"], "data": [ # security "security/lefilament_dashboard_security.xml", "security/ir.model.access.csv", # datas - # templates - "templates/dashboard_detail.xml", - "templates/lefilament_dashboard.xml", # views - "views/account_bank_statement_line.xml", - "views/account_move.xml", "views/lefilament_dashboard.xml", "views/res_company.xml", + # templates # menus "views/menus.xml", ], - "assets": { - "web._assets_primary_variables": [], - "web._assets_frontend_helpers": [], - "web.assets_frontend": [], - "web.assets_backend": [ - "lefilament_tdb/static/src/js/dashboard_detail.js", - "lefilament_tdb/static/src/js/dashboard_overview.js", - "lefilament_tdb/static/src/css/lefilament_tdb.css", - ], - "web.assets_tests": [], - "web.assets_qweb": [], - }, } diff --git a/data/cron_dashboard.xml b/data/cron_dashboard.xml new file mode 100644 index 0000000000000000000000000000000000000000..b7438abab73890412432a0c3d01323ed282f7840 --- /dev/null +++ b/data/cron_dashboard.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8" ?> +<odoo noupdate="1"> + <record id="ir_cron_lefilament_tdb" forcecreate="True" model="ir.cron"> + <field name="name">Tableau de Bord - Le Filament</field> + <field eval="True" name="active" /> + <field name="user_id" ref="base.user_root" /> + <field name="interval_number">1</field> + <field name="interval_type">months</field> + <field name="numbercall">-1</field> + <field name="model_id" ref="model_lefilament_dashboard" /> + <field name="nextcall">2017-01-31 23:10:00</field> + <field name="state">code</field> + <field name="code">model.cron_new_data()</field> + </record> +</odoo> diff --git a/models/lefilament_tdb.py b/models/lefilament_tdb.py index e6f6a8e06848fbc02f328554c5fac894c38f3172..8dc632617a918cb30290343680dceca3d50db070 100644 --- a/models/lefilament_tdb.py +++ b/models/lefilament_tdb.py @@ -4,7 +4,6 @@ from datetime import date from dateutil.relativedelta import relativedelta -from psycopg2.extensions import AsIs from odoo import api, fields, models from odoo.tools.safe_eval import safe_eval @@ -150,7 +149,6 @@ class LeFilamentTdb(models.Model): # ------------------------------------------------------ @api.model def open_detail(self, target_model, name=None, domain=None, views=None): - action = { "name": name or target_model, "type": "ir.actions.act_window", @@ -169,337 +167,3 @@ class LeFilamentTdb(models.Model): def get_month_values(self): for data in self: data._compute_dashboard_values() - - @api.model - def retrieve_datas_dashboard(self): - # Get fiscal years - fiscal_date = date( - date.today().year, - int(self.env.company.fiscalyear_last_month), - int(self.env.company.fiscalyear_last_day), - ) - if date.today() > fiscal_date: - fiscal_year = fiscal_date - fiscal_year_next = fiscal_date + relativedelta(years=1) - else: - fiscal_year = fiscal_date - relativedelta(years=1) - fiscal_year_next = fiscal_date - - res = {} - res["fiscal_year"] = fiscal_year - res["fiscal_year_next"] = fiscal_year_next - res["target"] = self.env.company.ca_target - # Invoices - res["invoice_ids"] = self.env["account.move"].search( - [ - ("move_type", "in", ("out_invoice", "out_refund")), - ("state", "=", "posted"), - ("invoice_date", ">", fiscal_year), - ("invoice_date", "<=", fiscal_year_next), - ] - ) - # Orders - res["order_line_ids"] = self.env["sale.order.line"].search( - [ - ("invoice_status", "=", "to invoice"), - ] - ) - # Opportunities - res["lead_ids"] = self.env["crm.lead"].search( - [ - "|", - ("date_deadline", ">", fiscal_year_next), - ("date_deadline", "=", False), - ] - ) - - res["progress"] = ( - sum(res["invoice_ids"].mapped("amount_untaxed_signed")) - / self.env.company.ca_target - if self.env.company.ca_target - else 0 - ) - - res["pipe_win"] = sum( - self.env["crm.lead"] - .search( - [ - ("probability", "=", 100), - "|", - ("date_deadline", "<=", fiscal_year_next), - ("date_deadline", "=", False), - ] - ) - .mapped(lambda l: l.expected_revenue * l.probability / 100) - ) - res["pipe_to_win"] = sum( - self.env["crm.lead"] - .search( - [ - ("probability", "!=", 100), - "|", - ("date_deadline", "<=", fiscal_year_next), - ("date_deadline", "=", False), - ] - ) - .mapped(lambda l: l.expected_revenue * l.probability / 100) - ) - - res["to_get"] = self.env["account.move"].search( - [ - ("move_type", "in", ("out_invoice", "out_refund")), - ("state", "=", "posted"), - ("payment_state", "in", ["not_paid", "partial", "in_payment"]), - ] - ) - res["to_pay"] = self.env["account.move"].search( - [ - ("move_type", "in", ("in_invoice", "in_refund")), - ("state", "=", "posted"), - ("payment_state", "in", ["not_paid", "partial", "in_payment"]), - ] - ) - - res["date_maj"] = ( - self.env["account.bank.statement.line"] - .search([], order="date desc", limit=1) - .date - ) - res["statement_line_ids"] = self.env["account.bank.statement.line"].search([]) - res["cash_by_bank"] = self.env["account.bank.statement.line"].read_group( - domain=[], - fields=["journal_id", "amount"], - groupby=["journal_id"], - orderby="journal_id", - ) - - res["in"] = self.env["account.bank.statement.line"].search( - [ - ("amount", ">", 0), - ("date", ">", fiscal_year), - ] - ) - res["out"] = self.env["account.bank.statement.line"].search( - [ - ("amount", "<", 0), - ("date", ">", fiscal_year), - ] - ) - res["variation"] = self.env["account.bank.statement.line"].search( - [ - ("date", ">", fiscal_year), - ] - ) - res["company_id"] = self.env.company - - return res - - @api.model - def dashboard_detail_values(self, date_start=None, date_end=None): - return { - "customer": self._customer_detail(date_start, date_end), - "employee_time": self._employee_time(date_start, date_end), - "date_start": date_start, - "date_end": date_end, - } - - @api.model - def dashboard_detail_values_template(self, date_start=None, date_end=None): - return self.env["ir.ui.view"]._render_template( - "lefilament_tdb.dashboard_detail_values", - self.dashboard_detail_values(date_start, date_end), - ) - - def _customer_detail(self, date_start=None, date_end=None): - clause = "where 1=1 " - if date_start: - clause += f"and line_date >= '{date_start}' " - if date_end: - clause += f"and line_date <= '{date_end}' " - - query = """ - select - customer as "Client", - sum(prod) as "Imput.", - sum(invoiced + purchase + expense)::int as "Balance Prod", - sum(invoiced + purchase + expense)/NULLIF(sum(prod), 0) as "Taux Horaire", - sum(invoiced + invoiced_mco) as "Tot. Fact.", - sum(invoiced)::int as "Fact. Prod", - sum(invoiced_mco)::int as "Fact. Maint", - sum(purchase)::int as "Achats", - sum(expense)::int as "NdF" - from - ( - -- Sélection des heures - select - aal.date as line_date, - p.name as customer, - -- contact != Filament et projet != Maintenance et pas flagué vacances - case when aal.partner_id != 1 or aal.partner_id is null and aal.holiday_id is null and project_id != 19 then unit_amount else 0 end as prod, - 0 as invoiced, - 0 as invoiced_mco, - 0 as purchase, - 0 as expense - from - account_analytic_line aal - left join - res_partner p on aal.partner_id = p.id - left join - hr_leave l on aal.holiday_id = l.id - left join - hr_leave_type lt on l.holiday_status_id = lt.id - where - aal.project_id is not null - and aal.date <= CURRENT_DATE - and (lt.active is true or lt.active is null) - and partner_id != 1 - - -- Sélection du facturé hors maintenance - union all - select - aml.date as line_date, - p.name as customer, - 0 as prod, - (aml.credit - aml.debit) as invoiced, - 0 as invoiced_mco, - 0 as purchase, - 0 as expense - from account_move_line aml - left join account_move i on aml.move_id = i.id - left join res_partner p on i.beneficiary_id = p.id - where - i.move_type in ('out_invoice', 'out_refund') - and i.state = 'posted' - and aml.product_id is not null - and aml.product_id not in (33, 34, 50, 51, 61, 62) - - -- Sélection du facturé Maintenance - union all - select - aml.date as line_date, - p.name as customer, - 0 as prod, - 0 as invoiced, - (aml.credit - aml.debit) as invoiced_mco, - 0 as purchase, - 0 as expense - from account_move_line aml - left join account_move i on aml.move_id = i.id - left join res_partner p on i.beneficiary_id = p.id - where - i.move_type in ('out_invoice', 'out_refund') - and i.state = 'posted' - and aml.product_id is not null - and aml.product_id in (33, 34, 50, 51, 61, 62) - - -- Sélection des charges - union all - select - aal.date as line_date, - p.name as customer, - 0 as prod, - 0 as invoiced, - 0 as invoiced_mco, - amount as purchase, - 0 as expense - from account_analytic_line aal - left join account_move_line aml on aal.move_line_id = aml.id - left join account_move i on aml.move_id = i.id - left join account_analytic_account a on aal.account_id = a.id - left join res_partner p on a.partner_id = p.id - where - (aal.plan_id is null or aal.plan_id = 1) - and i.state = 'posted' - and aml.journal_id = 2 - - -- Sélection des NDF - union all - select - aal.date as line_date, - p.name as customer, - 0 as prod, - 0 as invoiced, - 0 as invoiced_mco, - 0 as purchase, - amount as expense - from account_analytic_line aal - left join account_move_line aml on aal.move_line_id = aml.id - left join account_move i on aml.move_id = i.id - left join account_analytic_account a on aal.account_id = a.id - left join res_partner p on a.partner_id = p.id - where - (aal.plan_id is null or aal.plan_id = 1) - and i.state = 'posted' - and aml.journal_id = 9 - ) query - %s - group by - customer - order by - sum(invoiced) desc - """ - self.env.cr.execute(query, (AsIs(clause),)) - - result = self.env.cr.dictfetchall() - return result - - def _employee_time(self, date_start=None, date_end=None): - clause = "" - if date_start: - clause += f" and aal.date >= '{date_start}'" - if date_end: - clause += f" and aal.date <= '{date_end}'" - - query = """ - select - employee as "Employé", - sum(production) as "Prod", - sum(internal) as "Interne", - sum(revenue) as "CA" - - from ( - select - p.name as employee, - 0 as production, - 0 as internal, - sum(aal.amount) as revenue - from - account_analytic_line aal - left join - account_analytic_account aa on aal.account_id = aa.id - left join - account_analytic_plan aap on aa.plan_id = aap.id - left join - res_partner p on aa.partner_id = p.id - where - aap.id = 3 - %s - group by p.name - - union - - select - e.name as employee, - sum(case when aal.partner_id != 1 or aal.partner_id is null and aal.holiday_id is null then unit_amount else 0 end) as production, - sum(case when aal.partner_id = 1 and aal.holiday_id is null then unit_amount else 0 end) as internal, - 0 as revenue - from - account_analytic_line aal - left join - hr_employee e on aal.employee_id = e.id - left join - hr_leave l on aal.holiday_id = l.id - left join - hr_leave_type lt on l.holiday_status_id = lt.id - where - aal.project_id is not null - %s - group by e.name - ) query - group by employee - order by sum(production) desc - """ - self.env.cr.execute(query, (AsIs(clause), AsIs(clause),)) - - result = self.env.cr.dictfetchall() - return result diff --git a/static/src/css/lefilament_tdb.css b/static/src/css/lefilament_tdb.css deleted file mode 100644 index 07acd844cc7d993bab748c415fb0098557c8ecb5..0000000000000000000000000000000000000000 --- a/static/src/css/lefilament_tdb.css +++ /dev/null @@ -1,43 +0,0 @@ -.lefilament_dashboard { - padding-top: 40px; - padding-bottom: 40px; - background-color: #fefefe; -} -.lefilament_dashboard .display-6, -.lefilament_dashboard .card-title { - color: #495057; -} -.lefilament_dashboard a.dashboard_view { - cursor: pointer; -} - -p.card-maj { - font-size: 10px; - font-style: italic; - font-weight: 300; -} - -/* Legende ProgressBar */ -.table-legend { - width: 100%; - max-width: 100%; - margin: 10px 0; - border-collapse: separate; - border-spacing: 8px; - font-size: 11px; -} -.table-legend .nb { - text-align: right; -} -.table-legend-total td { - border-top: 1px solid #eee; - border-bottom: 1px solid #eee; - font-weight: 700; - padding: 2px 0; -} - -.dashboard_detail { - padding-top: 10px; - padding-bottom: 40px; - background-color: #fefefe; -} diff --git a/static/src/js/dashboard_detail.js b/static/src/js/dashboard_detail.js deleted file mode 100644 index 53ba80332ec77819e507f0ecc78799205b83bdbc..0000000000000000000000000000000000000000 --- a/static/src/js/dashboard_detail.js +++ /dev/null @@ -1,61 +0,0 @@ -odoo.define("lefilament_tdb.dashboard_detail", function (require) { - "use strict"; - - const qweb = require("web.qweb"); - const viewRegistry = require("web.view_registry"); - - const Controller = qweb.Controller.extend({ - events: _.extend({}, qweb.Controller.prototype.events, { - "click .button-period": "_onClickButtonPeriod", - "click #button-custom-date": "_onClickButtonCustomDate", - }), - - async _onClickButtonPeriod(e) { - e.preventDefault(); - var $target = $(e.currentTarget); - var data = $target.data(); - var dashboard_detail_values = this.$el.find("#dashboard_detail_values"); - - await this._rpc({ - model: "lefilament.dashboard", - method: "dashboard_detail_values_template", - args: [], - kwargs: { - date_start: data.dateStart || null, - date_end: data.dateEnd || null, - }, - }).then(function (result) { - dashboard_detail_values.html(result); - }); - }, - - async _onClickButtonCustomDate(e) { - e.preventDefault(); - var dashboard_detail_values = this.$el.find("#dashboard_detail_values"); - var date_start = this.$el.find("#custom-date-start")[0]; - var date_end = this.$el.find("#custom-date-end")[0]; - - await this._rpc({ - model: "lefilament.dashboard", - method: "dashboard_detail_values_template", - args: [], - kwargs: { - date_start: date_start.value || null, - date_end: date_end.value || null, - }, - }).then(function (result) { - dashboard_detail_values.html(result); - }); - }, - }); - - const DashboardDetail = qweb.View.extend({ - withSearchBar: false, - searchMenuTypes: [], - config: _.extend({}, qweb.View.prototype.config, { - Controller: Controller, - }), - }); - - viewRegistry.add("dashboard_detail", DashboardDetail); -}); diff --git a/static/src/js/dashboard_overview.js b/static/src/js/dashboard_overview.js deleted file mode 100644 index 1f7d69926a47947010540a0b49529eb7e5d08607..0000000000000000000000000000000000000000 --- a/static/src/js/dashboard_overview.js +++ /dev/null @@ -1,49 +0,0 @@ -odoo.define("lefilament_tdb.dashboard_overview", function (require) { - "use strict"; - - const qweb = require("web.qweb"); - const viewRegistry = require("web.view_registry"); - - const Controller = qweb.Controller.extend({ - events: _.extend({}, qweb.Controller.prototype.events, { - "click #update_view": "_onClickUpdateView", - "click .dashboard_view": "_onClickDashboardAction", - }), - - _onClickUpdateView() { - this.reload(); - }, - - async _onClickDashboardAction(e) { - e.preventDefault(); - var $target = $(e.currentTarget); - var self = this; - var data = $target.data(); - - await this._rpc({ - model: "lefilament.dashboard", - method: "open_detail", - args: [data.targetModel], - kwargs: { - name: data.title, - domain: data.domain || null, - views: data.views || null, - }, - }).then(function (action) { - if (action !== undefined) { - self.do_action(action); - } - }); - }, - }); - - const DashboardOverview = qweb.View.extend({ - withSearchBar: false, - searchMenuTypes: [], - config: _.extend({}, qweb.View.prototype.config, { - Controller: Controller, - }), - }); - - viewRegistry.add("dashboard_overview", DashboardOverview); -}); diff --git a/templates/dashboard_detail.xml b/templates/dashboard_detail.xml deleted file mode 100644 index 46ef24eade833c23cbc6a41e16c0304a0600d295..0000000000000000000000000000000000000000 --- a/templates/dashboard_detail.xml +++ /dev/null @@ -1,162 +0,0 @@ -<?xml version="1.0" encoding="utf-8" ?> -<odoo> - <!-- Template layout --> - <record id="lefilament_dashboard_detail" model="ir.ui.view"> - <field name="name">lefilament.dashboard.detail</field> - <field name="type">qweb</field> - <field name="model">lefilament.dashboard</field> - <field name="arch" type="xml"> - <qweb js_class="dashboard_detail"> - <nav class="o_qweb_cp_buttons"> - <div class="btn-group" role="group" aria-label="Dates buttons"> - <button - type="object" - class="btn btn-outline-primary button-period" - name="this_month" - t-att-data-date-start="datetime.date.today().replace(day=1).strftime('%Y-%m-%d')" - t-att-data-date-end="(datetime.date.today().replace(day=1) + relativedelta(months=1, days=-1)).strftime('%Y-%m-%d')" - > - Ce mois-ci - </button> - <button - type="object" - class="btn btn-outline-primary button-period" - name="last_month" - t-att-data-date-start="(datetime.date.today().replace(day=1) + relativedelta(months=-1)).strftime('%Y-%m-%d')" - t-att-data-date-end="(datetime.date.today().replace(day=1) + relativedelta(days=-1)).strftime('%Y-%m-%d')" - > - Le mois dernier - </button> - <button - type="object" - class="btn btn-outline-primary button-period" - name="this_year" - t-att-data-date-start="datetime.date.today().replace(day=1, month=1).strftime('%Y-%m-%d')" - t-att-data-date-end="datetime.date.today().replace(day=31, month=12).strftime('%Y-%m-%d')" - > - Cette année - </button> - <button - type="object" - class="btn btn-outline-primary button-period" - name="last_year" - t-att-data-date-start="(datetime.date.today().replace(day=1, month=1) + relativedelta(years=-1)).strftime('%Y-%m-%d')" - t-att-data-date-end="(datetime.date.today().replace(day=31, month=12) + relativedelta(years=-1)).strftime('%Y-%m-%d')" - > - L'année dernière - </button> - <button - type="object" - class="btn btn-outline-primary button-period" - name="all" - data-date-start="" - data-date-end="" - > - Tout - </button> - </div> - - <div class="btn-group ms-5" role="group"> - <input type="date" class="form-control text-center" id="custom-date-start" /> - <input type="date" class="form-control text-center" id="custom-date-end" /> - <button - type="object" - id="button-custom-date" - class="btn btn-outline-primary" - > - Mettre à jour - </button> - </div> - </nav> - <div id="dashboard_detail_values"> - <t t-value="records.dashboard_detail_values()" t-set="init_data" /> - <t t-value="init_data.get('customer')" t-set="customer" /> - <t t-value="init_data.get('employee_time')" t-set="employee_time" /> - <t t-call="lefilament_tdb.dashboard_detail_values" /> - </div> - </qweb> - </field> - </record> - - <!-- Dashboard Values --> - <template id="dashboard_detail_values" name="dashboard_detail_values"> - <div class="dashboard_detail"> - <div class="container-fluid"> - <div class="row"> - <div class="col-12"> - <div class="mt-2 mb-4 display-6 text-center"> - Période : - <t t-out="date_start" t-options="{'widget': 'date', 'format': 'dd/MM/YYYY'}" /> - - <t t-out="date_end" t-options="{'widget': 'date', 'format': 'dd/MM/YYYY'}" /> - </div> - </div> - <div class="col-7"> - <h3 class="text-uppercase py-2 mb-0">Rentabilité client</h3> - <hr class="mt-0" /> - <t t-call="lefilament_tdb.dashboard_detail_table"> - <t t-set="data" t-value="customer" /> - </t> - </div> - <div class="col-5"> - <h3 class="text-uppercase py-2 mb-0">Imputations</h3> - <hr class="mt-0" /> - <t t-call="lefilament_tdb.dashboard_detail_table"> - <t t-set="data" t-value="employee_time" /> - </t> - </div> - </div> - </div> - </div> - </template> - - <!-- Table Template --> - <template id="dashboard_detail_table" name="dashboard_detail_table"> - <div t-if="data" class="px-4 mb-5" style="max-height: 600px; overflow: scroll; border: 1px solid #eee;"> - <table class="table table-hover table-striped"> - <thead> - <tr class="bg-100"> - <th>#</th> - <th t-foreach="data[0].keys()" t-as="header"> - <t t-out="header" /> - </th> - </tr> - </thead> - <tbody> - <tr t-foreach="data" t-as="line"> - <td t-out="line_index + 1" /> - <t t-foreach="line.values()" t-as="v"> - <td t-if="isinstance(v, (int, float))" class="text-end"> - <t t-out="v" t-options="{'widget': 'float', 'precision': 0}" /> - </td> - <td t-else=""> - <t t-out="v" /> - </td> - </t> - </tr> - </tbody> - <tfoot> - <tr class="bg-100"> - <th>Total</th> - <th t-foreach="data[-1].items()" t-as="footer" class="text-end"> - <t t-if="isinstance(footer[1], (int, float))"> - <t - t-out="sum(list(map(lambda d: d.get(footer[0]) if d.get(footer[0]) else 0.0, data)))" - t-options="{'widget': 'float', 'precision': 0}" - /> - </t> - </th> - </tr> - </tfoot> - </table> - </div> - </template> - - <!-- Action --> - <record id="le_filament_dashboard_detail_action" model="ir.actions.act_window"> - <field name="name">Détail</field> - <field name="res_model">lefilament.dashboard</field> - <field name="view_mode">qweb</field> - <field name="view_id" ref="lefilament_dashboard_detail"/> - <field name="context">{'active_test': False}</field> - </record> -</odoo> diff --git a/templates/lefilament_dashboard.xml b/templates/lefilament_dashboard.xml deleted file mode 100644 index 3e451a750b8be851548db33f334e0a704ac958f3..0000000000000000000000000000000000000000 --- a/templates/lefilament_dashboard.xml +++ /dev/null @@ -1,541 +0,0 @@ -<?xml version="1.0" encoding="utf-8" ?> -<odoo> - <record id="lefilament_dashboard_overview_form" model="ir.ui.view"> - <field name="name">lefilament.dashboard.overview</field> - <field name="type">qweb</field> - <field name="model">lefilament.dashboard</field> - <field name="arch" type="xml"> - <qweb js_class="dashboard_overview"> - <nav class="o_qweb_cp_buttons"> - <button type="object" class="btn" id="update_view"> - <i class="fa fa-refresh" /> - </button> - </nav> - <div class="lefilament_dashboard"> - <div class="container"> - <t - t-set="values" - t-value="records.retrieve_datas_dashboard()" - /> - <div class="row"> - <!-- Column 1 --> - <div class="col-12 col-md-6 col-lg-4"> - <h3 - class="text-uppercase fw-bolder o_horizontal_separator mb-4" - >En Cours</h3> - <!-- Facturé --> - <div class="card mb32"> - <t - t-set="invoiced" - t-value="sum(values.get('invoice_ids').mapped('amount_untaxed_signed'))" - /> - <div class="card-body"> - <a - class="dashboard_view" - data-target-model="account.move" - data-method="open_detail" - t-att-data-domain="[('id', 'in', values.get('invoice_ids').ids)]" - data-title="Factures client" - t-att-data-views="[[%(lefilament_tdb.view_invoice_tree)d, 'tree'], [0, 'pivot'], [0, 'graph'], [0, 'form']]" - > - <h5 class="card-title">Facturé</h5> - <p class="display-6"> - <t - t-out="invoiced" - t-options="{'widget': 'monetary', 'display_currency': values['company_id'].currency_id}" - /> - </p> - </a> - </div> - </div> - <!-- Commandes --> - <div class="card mb32"> - <t - t-set="ordered" - t-value="sum(values.get('order_line_ids').mapped('price_subtotal'))" - /> - <div class="card-body"> - <a - type="action" - data-model="sale.order" - t-att-data-domain="[('id','in', values.get('order_line_ids').mapped('order_id').ids)]" - data-views='[[0, "list"], [0, "pivot"], [0, "graph"], [0, "form"]]' - tabindex="-1" - > - <h5 - class="card-title" - >Commandes en cours</h5> - <p class="display-6"> - <t - t-out="ordered" - t-options="{'widget': 'monetary', 'display_currency': values['company_id'].currency_id}" - /> - - </p> - </a> - </div> - </div> - <!-- Pipe --> - <div class="card mb32"> - <div class="card-body"> - <a - type="action" - data-model="crm.lead" - t-att-data-domain="[('id','in', values.get('lead_ids').ids)]" - data-views='[[0, "kanban"],[0, "list"], [0, "pivot"], [0, "graph"], [0, "form"]]' - tabindex="-1" - > - <h5 class="card-title">Pipe</h5> - <p class="display-6"> - <t - t-out="sum(values.get('lead_ids').mapped('prorated_revenue'))" - t-options="{'widget': 'monetary', 'display_currency': values['company_id'].currency_id}" - /> - - </p> - </a> - </div> - </div> - </div> - - <!-- Column 2 --> - <div class="col-12 col-md-6 col-lg-4"> - <h3 - class="text-uppercase fw-bolder o_horizontal_separator mb-4" - >Objectif</h3> - <div class="card"> - <div class="card-body"> - <p class="display-5 mb16"> - <t - t-out="values.get('target')" - t-options="{'widget': 'monetary', 'display_currency': values['company_id'].currency_id}" - /> - - </p> - <div class="progress" style="height: 60px;"> - <div - class="progress-bar progress-bar-striped bg-success" - role="progressbar" - t-att-aria-valuenow="values['progress'] * 100" - aria-valuemin="0" - aria-valuemax="100" - t-attf-style="width: {{values['progress'] * 100}}%; font-size: 14px; font-weight: 600;" - > - <t - t-out="round(values.get('progress') * 100, 0)" - t-options="{'widget': 'float', 'precision': 0}" - /> % - </div> - </div> - <table class="table-legend mt16"> - <tr> - <td - style="background-color: #8ED8A2; width: 20px;" - class="progress-bar-striped" - /> - <td>Facturé</td> - <td class="nb"><t - t-out="invoiced" - t-options="{'widget': 'monetary', 'display_currency': values['company_id'].currency_id}" - /></td> - <td class="nb"> - <t - t-out="values['progress'] * 100" - t-options="{'widget': 'float', 'precision': 0}" - /> % - </td> - </tr> - <tr> - <td - style="background-color: #F6DCA2; width: 20px;" - class="progress-bar-striped" - /> - <td>Commandes</td> - <td class="nb"><t - t-out="ordered" - t-options="{'widget': 'monetary', 'display_currency': values['company_id'].currency_id}" - /></td> - <td class="nb"> - <t - t-out="round(ordered / values['target'], 2) * 100" - t-options="{'widget': 'float', 'precision': 0}" - /> % - </td> - </tr> - <tr> - <td - style="background-color: #F6CCA2; width: 20px;" - class="progress-bar-striped" - /> - <td>Pipe Gagné</td> - <td class="nb"><t - t-out="values['pipe_win']" - t-options="{'widget': 'monetary', 'display_currency': values['company_id'].currency_id}" - /></td> - <td class="nb"><t - t-out="round(values['pipe_win'] / values['target'], 2) * 100" - t-options="{'widget': 'float', 'precision': 0}" - /> %</td> - </tr> - <tr class="table-legend-total"> - <td style="width: 20px;" /> - <td>Total</td> - <td class="nb"><t - t-out="(values['pipe_win'] + ordered + invoiced)" - t-options="{'widget': 'monetary', 'display_currency': values['company_id'].currency_id}" - /></td> - <td class="nb"> - <t - t-out="round((values['pipe_win'] + ordered + invoiced) / values['target'], 2) * 100" - t-options="{'widget': 'float', 'precision': 0}" - /> % - </td> - </tr> - <tr> - <td style="width: 20px;" /> - <td /> - <td class="nb" /> - <td class="nb" /> - </tr> - <tr> - <td - style="background-color: #eee; width: 20px;" - class="progress-bar-striped" - /> - <td>À facturer</td> - <td class="nb"> - <t - t-out="values['target'] - invoiced" - t-options="{'widget': 'monetary', 'display_currency': values['company_id'].currency_id}" - /> - </td> - <td class="nb"> - <t - t-out="round((values['target'] - invoiced) / values['target'], 2) * 100" - t-options="{'widget': 'float', 'precision': 0}" - /> % - </td> - </tr> - </table> - </div> - </div> - </div> - - <!-- Column 3 --> - <div class="col-12 col-md-6 col-lg-4"> - <h3 - class="text-uppercase fw-bolder o_horizontal_separator mb-4" - >Trésorerie</h3> - <!-- Banques --> - <div class="card mb32"> - <div class="card-body"> - <ul - class="nav nav-tabs" - id="cash-tab" - role="tablist" - > - <li - class="nav-item" - role="presentation" - > - <button - class="nav-link active" - id="cash-tab" - data-bs-toggle="tab" - data-bs-target="#cash" - type="button" - role="tab" - aria-controls="cash" - aria-selected="true" - > - Trésorerie - </button> - </li> - <li - class="nav-item" - role="presentation" - > - <button - class="nav-link" - id="bank-tab" - data-bs-toggle="tab" - data-bs-target="#bank" - type="button" - role="tab" - aria-controls="bank" - aria-selected="false" - >Banques - </button> - </li> - </ul> - <div - class="tab-content mt16" - id="cashContent" - > - <div - class="tab-pane fade show active" - id="cash" - role="tabpanel" - aria-labelledby="cash-tab" - > - <p class="card-maj"> - Denière mise à jour le <t - t-out="values['date_maj']" - t-options="{'widget': 'date', 'format': 'dd MMM yyyy'}" - /></p> - <a - type="action" - data-model="account.bank.statement" - t-att-data-domain="[('id','in', values.get('statement_line_ids').mapped('statement_id').ids)]" - data-views='[[0, "list"], [0, "pivot"], [0, "graph"], [0, "form"]]' - tabindex="-1" - > - <p class="display-6"> - <t - t-out="sum(values.get('statement_line_ids').mapped('amount'))" - t-options="{'widget': 'monetary', 'display_currency': values['company_id'].currency_id}" - /> - - </p> - </a> - </div> - <div - class="tab-pane fade" - id="bank" - role="tabpanel" - aria-labelledby="bank-tab" - > - <table - class="table table-striped table-sm table-bordered table-hover" - > - <t - t-foreach="values['cash_by_bank']" - t-as="bank" - > - <tr> - <td - t-out="bank['journal_id'][1]" - /> - <td - class="text-right" - t-out="bank['amount']" - t-options="{'widget': 'monetary', 'display_currency': values['company_id'].currency_id}" - /> - </tr> - </t> - </table> - </div> - </div> - </div> - </div> - - <!-- To paid --> - <div class="card mb32"> - <div class="card-body"> - <ul - class="nav nav-tabs" - id="cash-tab" - role="tablist" - > - <li - class="nav-item" - role="presentation" - > - <button - class="nav-link active" - id="cust_to_pay-tab" - data-bs-toggle="tab" - data-bs-target="#cust_to_pay" - type="button" - role="tab" - aria-controls="cust_to_pay" - aria-selected="true" - > - Facturé non encaissé - </button> - </li> - <li - class="nav-item" - role="presentation" - > - <button - class="nav-link" - id="provider_to_pay-tab" - data-bs-toggle="tab" - data-bs-target="#provider_to_pay" - type="button" - role="tab" - aria-controls="provider_to_pay" - aria-selected="false" - >Fournisseurs - </button> - </li> - </ul> - <div - class="tab-content mt16" - id="toPayContent" - > - <div - class="tab-pane fade show active" - id="cust_to_pay" - role="tabpanel" - aria-labelledby="cust_to_pay-tab" - > - <a - class="dashboard_view" - data-target-model="account.move" - data-method="open_detail" - t-att-data-domain="[('id', 'in', values.get('to_get').ids)]" - data-title="Factures à encaisser" - t-att-data-views="[[%(lefilament_tdb.view_invoice_tree)d, 'tree'], [0, 'pivot'], [0, 'graph'], [0, 'form']]" - > - <p class="display-6"> - <t - t-out="sum(values.get('to_get').mapped('amount_residual_signed'))" - t-options="{'widget': 'monetary', 'display_currency': values['company_id'].currency_id}" - /> - </p> - </a> - </div> - <div - class="tab-pane fade" - id="provider_to_pay" - role="tabpanel" - aria-labelledby="provider_to_pay-tab" - > - <a - class="dashboard_view" - data-target-model="account.move" - data-method="open_detail" - t-att-data-domain="[('id', 'in', values.get('to_pay').ids)]" - data-title="Factures fournisseurs" - t-att-data-views="[[%(lefilament_tdb.view_invoice_tree)d, 'tree'], [0, 'pivot'], [0, 'graph'], [0, 'form']]" - > - <p class="display-6"> - <t - t-out="sum(values.get('to_pay').mapped('amount_residual_signed'))" - t-options="{'widget': 'monetary', 'display_currency': values['company_id'].currency_id}" - /> - </p> - </a> - </div> - </div> - </div> - </div> - - <!-- Variation --> - <div class="card mb32"> - <div class="card-body"> - <ul - class="nav nav-tabs" - id="variation-tab" - role="tablist" - > - <li - class="nav-item" - role="presentation" - > - <button - class="nav-link active" - id="variation-tab" - data-bs-toggle="tab" - data-bs-target="#variation" - type="button" - role="tab" - aria-controls="variation" - aria-selected="true" - > - Variation - </button> - </li> - <li - class="nav-item" - role="presentation" - > - <button - class="nav-link" - id="inout-tab" - data-bs-toggle="tab" - data-bs-target="#inout" - type="button" - role="tab" - aria-controls="inout" - aria-selected="false" - >Entrées/Sorties - </button> - </li> - </ul> - <div - class="tab-content mt16" - id="variationContent" - > - <div - class="tab-pane fade show active" - id="variation" - role="tabpanel" - aria-labelledby="variation-tab" - > - <a - type="action" - data-model="account.bank.statement.line" - t-att-data-domain="[('id','in', values.get('variation').ids)]" - data-views='[[0, "list"], [0, "pivot"], [0, "graph"], [0, "form"]]' - tabindex="-1" - > - <p class="display-6"> - <t - t-out="sum(values.get('variation').mapped('amount'))" - t-options="{'widget': 'monetary', 'display_currency': values['company_id'].currency_id}" - /> - - </p> - </a> - </div> - <div - class="tab-pane fade" - id="inout" - role="tabpanel" - aria-labelledby="inout-tab" - > - <div class="row"> - <div class="col-6"> - <p><strong - >Encaissé</strong></p> - <p class="display-6"> - <t - t-out="sum(values.get('in').mapped('amount'))" - t-options="{'widget': 'monetary', 'display_currency': values['company_id'].currency_id}" - /> - </p> - </div> - <div class="col-6"> - <p><strong - >Décaissé</strong></p> - <p class="display-6"> - <t - t-out="sum(values.get('out').mapped('amount'))" - t-options="{'widget': 'monetary', 'display_currency': values['company_id'].currency_id}" - /> - </p> - </div> - </div> - </div> - </div> - </div> - </div> - </div> - </div> - </div> - </div> - </qweb> - </field> - </record> - - <record id="le_filament_dashboard_overview_action" model="ir.actions.act_window"> - <field name="name">Rapport Annuel</field> - <field name="res_model">lefilament.dashboard</field> - <field name="view_mode">qweb</field> - <field name="view_id" ref="lefilament_dashboard_overview_form" /> - <field name="context">{'active_test': False}</field> - </record> -</odoo> diff --git a/views/account_bank_statement_line.xml b/views/account_bank_statement_line.xml deleted file mode 100644 index 4bda0cdf2692f5e407230a28c6a8725a7b31d9d5..0000000000000000000000000000000000000000 --- a/views/account_bank_statement_line.xml +++ /dev/null @@ -1,22 +0,0 @@ -<?xml version="1.0" encoding="utf-8" ?> -<!-- Copyright 2023 Le Filament (<https://www.le-filament.com>) - License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). --> -<odoo> - <record id="account_bank_statement_line_tree" model="ir.ui.view"> - <field name="name">account.bank.statement.line.tree</field> - <field name="model">account.bank.statement.line</field> - <field name="arch" type="xml"> - <tree> - <field name="statement_id" /> - <field name="move_id" /> - <field name="date" /> - <field name="payment_ref" optional="show" /> - <field name="ref" optional="show" /> - <field name="partner_id" /> - <field name="amount" /> - <field name="running_balance" optional="hide" /> - <field name="transaction_type" optional="hide" /> - </tree> - </field> - </record> -</odoo> diff --git a/views/account_move.xml b/views/account_move.xml deleted file mode 100644 index 2ab14c8c8d0e6c40d125e242d9f3bc496e61ee42..0000000000000000000000000000000000000000 --- a/views/account_move.xml +++ /dev/null @@ -1,59 +0,0 @@ -<?xml version="1.0" encoding="utf-8" ?> -<!-- Copyright 2017 Le Filament (<https://www.le-filament.com>) - License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). --> -<odoo> - - <record id="view_invoice_tree" model="ir.ui.view"> - <field name="name">account.invoice.tree</field> - <field name="model">account.move</field> - <field name="arch" type="xml"> - <tree> - <field name="name" decoration-bf="1" /> - <field name="invoice_date" string="Date Facturation" /> - <field name="partner_id" string="Client" /> - <field name="invoice_date_due" /> - <field name="invoice_origin" /> - <field name="payment_reference" optional="hide" /> - <field name="ref" optional="hide" /> - <field name="invoice_user_id" widget="many2one_avatar_user" /> - <field - name="amount_untaxed_signed" - string="Montant HT" - sum="Total" - decoration-bf="1" - /> - <field name="amount_tax_signed" sum="Total" optional="hide" /> - <field - name="amount_total_signed" - string="Total" - sum="Total" - optional="show" - /> - <field - name="amount_residual_signed" - string="Montant Dû" - sum="Amount Due" - optional="show" - /> - <field name="currency_id" invisible="1" /> - <field name="company_currency_id" invisible="1" /> - <field - name="state" - widget="badge" - decoration-success="state == 'posted'" - decoration-info="state == 'draft'" - optional="show" - /> - <field - name="payment_state" - widget="badge" - decoration-danger="payment_state == 'not_paid'" - decoration-warning="payment_state in ('partial', 'in_payment')" - decoration-success="payment_state in ('paid', 'reversed')" - attrs="{'invisible': [('payment_state', 'in', ('invoicing_legacy'))]}" - /> - <field name="move_type" invisible="1" /> - </tree> - </field> - </record> -</odoo> diff --git a/views/lefilament_dashboard.xml b/views/lefilament_dashboard.xml index d9331aaf94c2901f61b9ab478e6633bbffd57fc4..af9db75f1da180c036f4604d599aa79b7921c6b2 100644 --- a/views/lefilament_dashboard.xml +++ b/views/lefilament_dashboard.xml @@ -28,11 +28,11 @@ <field name="model">lefilament.dashboard</field> <field name="type">pivot</field> <field name="arch" type="xml"> - <graph string="TDB Le Filament"> + <pivot string="TDB Le Filament"> <field name="ca_mois" type="measure" /> <field name="pipe_mois" type="measure" /> <field name="date_tdb" type="row" /> - </graph> + </pivot> </field> </record> diff --git a/views/menus.xml b/views/menus.xml index 90d346f15bbf8059b7517eb462c0ebb69aa716f2..91f611f6d41a3945bead3372ed2b5178e74c01ba 100644 --- a/views/menus.xml +++ b/views/menus.xml @@ -10,27 +10,6 @@ web_icon="lefilament_tdb,static/description/icon_menu.png" /> - <menuitem - id="lefilament_dashboard_report" - parent="lefilament_dashboard_menu" - name="Rapports" - sequence="1" - /> - - <menuitem - id="lefilament_dashboard_report_year" - parent="lefilament_dashboard_report" - name="Annuel" - sequence="1" - action="lefilament_tdb.le_filament_dashboard_overview_action" - /> - <menuitem - id="lefilament_dashboard_report_detail" - parent="lefilament_dashboard_report" - name="Détail" - sequence="1" - action="lefilament_tdb.le_filament_dashboard_detail_action" - /> <menuitem id="lefilament_dashboard_conf" parent="lefilament_dashboard_menu"