Hoppa till innehåll
Odoo Meny
  • Logga in
  • Prova gratis
  • Appar
    Ekonomi
    • Bokföring
    • Faktura
    • Utgifter
    • Kalkylark (Affärsanalyser)
    • Dokument
    • Underskrifter
    Försäljning
    • CRM
    • Försäljning
    • Kassasystem Butik
    • Kassasystem Restaurang
    • Prenumerationer
    • Uthyrning
    Hemsida
    • Hemsidesverktyg
    • E-handel
    • Blogg
    • Forum
    • Livechatt
    • Utbildning
    Försörjningskedja
    • Lager
    • Produktion
    • Produktens livscykel (PLM)
    • Inköp
    • Underhåll
    • Kvalitet
    HR
    • Anställda
    • Rekrytering
    • Ledighet
    • Utvärderingar
    • Rekommendationer
    • Fordon
    Marknadsföring
    • Sociala medier
    • E-postmarknadsföring
    • Sms-marknadsföring
    • Evenemang
    • Automatiserad marknadsföring
    • Enkäter
    Tjänster
    • Projekt
    • Tidrapporter
    • Fältservice
    • Kundtjänst
    • Planering
    • Tidsbokningar
    Produktivitet
    • Diskutera
    • AI
    • IoT
    • VoIP
    • Kunskap
    • WhatsApp
    Community-appar Odoo Studio Odoo Cloud
  • Branscher
    Butiker
    • Bokaffärer
    • Klädbutiker
    • Möbelaffärer
    • Mataffärer
    • Byggvaruhus
    • Leksaksaffärer
    Restaurang & Hotell
    • Barer och pubar
    • Restauranger
    • Snabbmatsrestauranger
    • Gästhus
    • Dryckesdistributörer
    • Hotell
    Fastigheter
    • Fastighetsbyråer
    • Arkitektfirmor
    • Byggföretag
    • Fastighetsägare
    • Trädgårdsmästare
    • Bostadsrättsföreningar
    Hitta en konsult
    • Redovisningsbyrå
    • Odoo Partner
    • Reklambyråer
    • Advokatbyråer
    • Rekrytering
    • Revisioner och certifieringar
    Produktion
    • Textilproduktion
    • Metallproduktion
    • Möbelproduktion
    • Livsmedelsproduktion
    • Bryggerier
    • Företagsgåvor
    Hälsa och fitness
    • Sportklubbar
    • Optiker
    • Träningscenter
    • Friskvård
    • Apotek
    • Frisörsalonger
    Hantverk
    • Hantverkare
    • IT-utrustning och kundtjänst
    • Solceller, solpaneler och solenergi
    • Skomakare
    • Städföretag
    • VVS-tjänster
    Övrigt
    • Ideella föreningar
    • Miljöförvaltningar
    • Uthyrning av reklamtavlor
    • Fotografer
    • Cykeluthyrning
    • Återförsäljare av mjukvara
    Upptäck alla Branscher
  • Community
    Utbildning
    • Instruktionsvideor
    • Dokumentation
    • Certifiering
    • Utbildningar
    • Blogg
    • Podcast
    Lär dig med oss
    • Workshops
    • Företagsspelet Scale Up!
    • Studiebesök hos Odoo
    Mjukvaran
    • Ladda ner
    • Jämför utgåvor
    • Versionsinformation
    Samverkan
    • GitHub
    • Forum
    • Evenemang
    • Översättningar
    • Bli en partner
    • Partnertjänster
    • Registrera din redovisningsbyrå
    Våra tjänster
    • Partners
    • Revisorer
    • Träffa en rådgivare
    • Implementering
    • Kundrecensioner
    • Kundtjänst
    • Uppgraderingar
    GitHub Youtube Twitter Linkedin Instagram Facebook Spotify
    +1 (650) 691-3277
    Boka en demo
  • Priser
  • Hjälp
Du måste vara registrerad för att kunna interagera med communityn.
Alla inlägg Personer Utmärkelser
Etiketter (Visa alla)
odoo accounting v14 pos v15
Om detta forum
Du måste vara registrerad för att kunna interagera med communityn.
Alla inlägg Personer Utmärkelser
Etiketter (Visa alla)
odoo accounting v14 pos v15
Om detta forum
Hjälp

View error context: '-no context-', Invalid attribute custom_gross_economic for element field, Element tree has extra content: field

Prenumerera

Få ett meddelande när det finns aktivitet på detta inlägg

Denna fråga har flaggats
xmljsodoo16
2 Svar
5019 Vyer
Avatar
Muhammad Ihza Putra Handayani

im adding a new func in js but its variable is can not be used
below is my js code


/** @odoo-module **/
var rpc = require('web.rpc');
import { patch } from "@web/core/utils/patch";
import { browser } from "@web/core/browser/browser";
import { CheckBox } from "@web/core/checkbox/checkbox";
import { Dropdown } from "@web/core/dropdown/dropdown";
import { DropdownItem } from "@web/core/dropdown/dropdown_item";
import { getActiveHotkey } from "@web/core/hotkeys/hotkey_service";
import { Pager } from "@web/core/pager/pager";
import { evaluateExpr } from "@web/core/py_js/py";
import { registry } from "@web/core/registry";
import { useBus, useService } from "@web/core/utils/hooks";
import { useSortable } from "@web/core/utils/sortable";
import { getTabableElements } from "@web/core/utils/ui";
import { Field } from "@web/views/fields/field";
import { getTooltipInfo } from "@web/views/fields/field_tooltip";
import { evalDomain, getClassNameFromDecoration } from "@web/views/utils";
import { ViewButton } from "@web/views/view_button/view_button";
import { useBounceButton } from "@web/views/view_hook";
import { Widget } from "@web/views/widgets/widget";
import { localization } from "@web/core/l10n/localization";
import { ListRenderer } from "@web/views/list/list_renderer";

const formatters = registry.category("formatters");

patch(ListRenderer.prototype, 'ListRenderer_custom', {
    get aggregates() {
        function checkCharNumberThreeFromEnd(inputString) {
            // Check if the inputString is a string and has at least 3 characters
            if (typeof inputString === 'string' && inputString.length >= 3) {
                // Get the character at the third position from the end
                const char = inputString.charAt(inputString.length - 3);
                if (char === ','){
                    inputString = inputString.replace(/\s/g, '');
                    inputString = inputString.replace(/,/g, '.');
                }
                else if(char === '.'){
                    inputString = inputString.replace(/,/g, '');
                }
                return parseFloat(inputString)
            }
        }


        let values;
        if (this.props.list.selection && this.props.list.selection.length) {
            values = this.props.list.selection.map((r) => r.data);
        } else if (this.props.list.isGrouped) {
            values = this.props.list.groups.map((g) => g.aggregates);
        } else {
            values = this.props.list.records.map((r) => r.data);
        }
        const aggregates = {};
        for (const fieldName in this.props.list.activeFields) {
            const field = this.fields[fieldName];
            const fieldValues = values.map((v) => v[fieldName]).filter((v) => v || v === 0);
            if (!fieldValues.length) {
                continue;
            }
            const type = field.type;
            if (type !== "integer" && type !== "float" && type !== "monetary") {
                if (field.name !== "margin" && field.name !== "cost_discount_percent" && field.name !== "sale_discount_percent" && field.name !== "gross_margin_percentage"){
                    continue;
                }
            }
            const { rawAttrs, widget } = this.props.list.activeFields[fieldName];
            let currencyId;
            if (type === "monetary" || widget === "monetary") {
                const currencyField =
                    this.props.list.activeFields[fieldName].options.currency_field ||
                    this.fields[fieldName].currency_field ||
                    "currency_id";
                currencyId =
                    currencyField in this.props.list.activeFields &&
                    values[0][currencyField] &&
                    values[0][currencyField][0];
                if (currencyId) {
                    const sameCurrency = values.every(
                        (value) => currencyId === value[currencyField][0]
                    );
                    if (!sameCurrency) {
                        aggregates[fieldName] = {
                            help: _t("Different currencies cannot be aggregated"),
                            value: "—",
                        };
                        continue;
                    }
                }
            }
            const func =
                (rawAttrs.sum && "sum") ||
                (rawAttrs.avg && "avg") ||
                (rawAttrs.max && "max") ||
                (rawAttrs.min && "min") ||
                (rawAttrs.custom_margin && "custom_margin") ||
                (rawAttrs.custom_cost_economic && "custom_cost_economic") ||
                (rawAttrs.custom_sale_economic && "custom_sale_economic") ||
                (rawAttrs.custom_gross_economic && "custom_gross_economic");
            if (func) {
                let aggregateValue = 0;
                if (func === "max") {
                    aggregateValue = Math.max(-Infinity, ...fieldValues);
                } else if (func === "min") {
                    aggregateValue = Math.min(Infinity, ...fieldValues);
                } else if (func === "avg") {
                    aggregateValue =
                        fieldValues.reduce((acc, val) => acc + val) / fieldValues.length;
                } else if (func === "sum") {
                    aggregateValue = fieldValues.reduce((acc, val) => acc + val);
                } else if (func === "custom_margin") {
                    var margin_value = checkCharNumberThreeFromEnd(aggregates['margin_integer']['value']);
                    var cost_final_value = checkCharNumberThreeFromEnd(aggregates['cost_final']['value']);
                    if (cost_final_value === 0){
                        aggregateValue = 0 + " %";
                    }
                    else{
                        var margin = (margin_value / cost_final_value) * 100
                        margin = margin.toFixed(2) + " %";
                        aggregateValue = margin;
                    }
                    aggregates[fieldName] = {
                        help: rawAttrs[func],
                        value: aggregateValue,
                    };
                    continue
                } else if (func === "custom_cost_economic") {
                    var cost_value = checkCharNumberThreeFromEnd(aggregates['cost_price']['value']);
                    var cost_discount_value = checkCharNumberThreeFromEnd(aggregates['cost_discount']['value']);
                    if (cost_value === 0){
                        aggregateValue = 0 + " %";
                    }
                    else{
                        var margin = (cost_discount_value / cost_value) * 100
                        margin = margin.toFixed(2) + " %";
                        aggregateValue = margin;
                    }
                    aggregates[fieldName] = {
                        help: rawAttrs[func],
                        value: aggregateValue,
                    };
                    continue
                } else if (func === "custom_sale_economic") {
                    var sale_value = checkCharNumberThreeFromEnd(aggregates['sale_price']['value']);
                    var sale_discount = checkCharNumberThreeFromEnd(aggregates['sale_discount']['value']);
                    if (sale_value === 0){
                        aggregateValue = 0 + " %";
                    }
                    else{
                        var margin = (sale_discount / sale_value) * 100
                        margin = margin.toFixed(2) + " %";
                        aggregateValue = margin;
                    }
                    aggregates[fieldName] = {
                        help: rawAttrs[func],
                        value: aggregateValue,
                    };
                    continue
                } else if (func === "custom_gross_economic") {
                    var saleFinalValue = checkCharNumberThreeFromEnd(aggregates['sale_final_no_tax']['value']);
                    var grossDiscount = checkCharNumberThreeFromEnd(aggregates['sale_final_tax']['value']);
                    if (saleFinalValue === 0) {
                        aggregateValue = "0 %";
                    } else {
                        var margin = (grossDiscount / saleFinalValue) * 100;
                        margin = margin.toFixed(2) + " %";
                        aggregateValue = margin;
                    }
                    aggregates[fieldName] = {
                        help: rawAttrs[func],
                        value: aggregateValue,
                    };
                    continue;
                }
                const formatter = formatters.get(widget, false) || formatters.get(type, false);
                const formatOptions = {
                    digits: rawAttrs.digits ? JSON.parse(rawAttrs.digits) : undefined,
                    escape: true,
                };
                if (currencyId) {
                    formatOptions.currencyId = currencyId;
                }
                aggregates[fieldName] = {
                    help: rawAttrs[func],
                    value: formatter ? formatter(aggregateValue, formatOptions) : aggregateValue,
                };
            }
        }
        return aggregates;
    }
});


below is my xml



        Tree Vehicles Database Month
        vdl.vehicles_database
       
           
               
               
               
               
               
               
               
               
               
               
               
               
               
               
               
               
               
               
               
               
               
               
               
               
               
               
               
           
       
   


and it shows below eror


2024-05-28 03:37:45,367 11469 ERROR ihzacappassion odoo.tools.view_validation: :17:0:ERROR:RELAXNGV:RELAXNG_ERR_NOELEM: Expecting an element data, got nothing 2024-05-28 03:37:45,367 11469 ERROR ihzacappassion odoo.tools.view_validation: :17:0:ERROR:RELAXNGV:RELAXNG_ERR_INVALIDATTR: Invalid attribute custom_gross_economic for element field 2024-05-28 03:37:45,367 11469 ERROR ihzacappassion odoo.tools.view_validation: :3:0:ERROR:RELAXNGV:RELAXNG_ERR_EXTRACONTENT: Element tree has extra content: field 2024-05-28 03:37:45,367 11469 ERROR ihzacappassion odoo.tools.view_validation: Invalid XML: Get RNG validator and validate RNG file. 2024-05-28 03:37:45,368 11469 DEBUG ihzacappassion odoo.tools.translate: translation went wrong for "'Invalid view %(name)s definition in %(file)s'", skipped 

raise ParseError(msg) from None # Restart with "--log-handler odoo.tools.convert:DEBUG" for complete traceback odoo.tools.convert.ParseError: while parsing /opt/odoo/Odoo16_VDL/catalog/views/vehicles_database_month_view.xml:41 Invalid view Tree Vehicles Database Month (catalog.tree_vehicles_database_month) definition in catalog/views/vehicles_database_month_view.xml View error context: '-no context-'

0
Avatar
Avbryt
Avatar
Dương Nguyễn
Bästa svar

I think u should create a widget call 'custom_gross_economic' instead of using it as an attribute because odoo will not understand it

0
Avatar
Avbryt
Muhammad Ihza Putra Handayani
Författare

<xpath expr="//notebook" position="inside">
<page string='Economic sheet' attrs="{'invisible': [('vdl_check', '=', False)]}">
<field name="economy_id">
<tree editable="bottom">
<field name="product_id" string="Name"/>
<field name="cost_price" string="Cost (No Tax)" sum="TOTAL"/>
<field name="cost_discount" string="Discount" sum="TOTAL"/>
<field name="cost_discount_percent" nolabel='1' custom_cost_economic='custom_cost_economic'/>
<field name="cost_final" string="Final Cost (No Tax)" sum="TOTAL" readonly='1' />
<field name="sale_price" string="Sales Price (No Tax)" sum="TOTAL"/>
<field name="sale_price_tax" string="Sale Price (Tax)" sum="TOTAL"/>
<field name="sale_discount" string="Discount" sum="TOTAL"/>
<field name="sale_discount_percent" nolabel='1' custom_sale_economic='custom_sale_economic'/>
<field name="sale_final" string="Final Sale Price (No Tax)" sum="TOTAL" readonly='1' />
<field name="margin_integer" string="Margin" readonly='1' sum="TOTAL"/>
<field name="margin" nolabel="1" readonly='1' custom_margin="custom_margin"/>
</tree>
</field>
</page>
</xpath>

but it works in other file

Dương Nguyễn

OK so it load ok but does it work as you expected (the js code is what i'm taking about) ?

Muhammad Ihza Putra Handayani
Författare

yes but only the custom_gross_economic that doesnt work, im clueless

Dương Nguyễn

so when u debugging , js code run into to your code right, it just get error when load view that have 'custom_gross_economic'.
In that case, i can only think to option to create a widget, because widget is a valid xml attribute in odoo

Avatar
Muhammad Ihza Putra Handayani
Författare Bästa svar


0
Avatar
Avbryt
Njuter du av diskussionen? Läs inte bara, delta också!

Skapa ett konto idag för att ta del av exklusiva funktioner och engagera dig i vår fantastiska community!

Registrera dig
Relaterade inlägg Svar Vyer Verksamhet
compatibility problem with qweb report
xml report odoo16
Avatar
Avatar
1
nov. 25
2663
How to hide "section-financials" from the ProductInfoPopup in POS Screen Löst
javascript xml odoo16
Avatar
Avatar
2
juli 24
3002
How to extend class js FloatField in odoo 16 Löst
js OWL odoo16
Avatar
Avatar
2
maj 24
4405
Call variable in a template to have a dynamic url
xml templates js
Avatar
0
dec. 23
3582
How to export xlsx in Odoo14 Web
xml js v14
Avatar
Avatar
1
aug. 23
5850
Community
  • Instruktionsvideor
  • Dokumentation
  • Forum
Öppen källkod
  • Ladda ner
  • GitHub
  • Runbot
  • Översättningar
Tjänster
  • Odoo.sh Hosting
  • Kundtjänst
  • Uppgradera
  • Anpassningsbara modifikationer
  • Utbildning
  • Revisorer
  • Partners
  • Bli en partner
Om oss
  • Vårt företag
  • Varumärkestillgångar
  • Kontakta oss
  • Jobb
  • Evenemang
  • Podcast
  • Blogg
  • Kunder
  • Juridiskt • Integritet
  • Säkerhet
الْعَرَبيّة Català 简体中文 繁體中文 (台灣) Čeština Dansk Nederlands English Suomi Français Deutsch हिंदी Bahasa Indonesia Italiano 日本語 한국어 (KR) Lietuvių kalba Język polski Português (BR) română русский язык Slovenský jazyk Slovenščina Español (América Latina) Español Svenska ภาษาไทย Türkçe українська Tiếng Việt

Odoo är ett affärssystem med öppen källkod som täcker alla dina företagsbehov: CRM, e-handel, bokföring, lager, kassasystem, projektledning, och så vidare.

Odoos unika värdeförslag är att samtidigt vara väldigt enkel att använda men också helt integrerad.

Website made with

Odoo Experience on YouTube

1. Use the live chat to ask your questions.
2. The operator answers within a few minutes.

Live support on Youtube
Watch now