Skip to Content
Odoo मेन्यू
  • साइन इन करें
  • मुफ़्त में आज़माएं
  • ऐप्लिकेशन
    फ़ाइनेंस
    • अकाउंटिंग
    • इनवॉइसिंग
    • एक्सपेंस
    • स्प्रेडशीट (बीआई)
    • डॉक्यूमेंट्स
    • साइन
    सेल्स
    • सीआरएम
    • सेल्स
    • पीओएस शॉप
    • पीओएस रेस्टोरेंट
    • सब्सक्रिप्शन
    • रेंटल
    वेबसाइट
    • वेबसाइट बिल्डर
    • ई-कॉमर्स
    • ब्लॉग
    • फ़ोरम
    • लाइव चैट
    • ई-लर्निंग
    सप्लाई चेन
    • इन्वेंट्री
    • मैन्युफ़ैक्चरिंग
    • पीएलएम
    • परचेज़
    • मेंटेनेंस
    • क्वालिटी
    मानव संसाधन
    • कर्मचारी
    • रिक्रूटमेंट
    • टाइम ऑफ़
    • अप्रेज़ल
    • रेफ़रल
    • फ़्लीट
    मार्केटिंग
    • सोशल मार्केटिंग
    • ईमेल मार्केटिंग
    • एसएमएस मार्केटिंग
    • इवेंट
    • मार्केटिंग ऑटोमेशन
    • सर्वे
    सेवाएं
    • प्रोजेक्ट
    • टाइमशीट
    • फ़ील्ड सर्विस
    • हेल्पडेस्क
    • प्लानिंग
    • अपॉइंटमेंट
    प्रॉडक्टिविटी
    • डिस्कस
    • आर्टिफ़िशियल इंटेलिजेंस
    • आईओटी
    • वीओआईपी
    • नॉलेज
    • WhatsApp
    तीसरे पक्ष के ऐप्लिकेशन Odoo स्टूडियो Odoo क्लाउड प्लेटफ़ॉर्म
  • इंडस्ट्री
    रीटेल
    • बुक स्टोर
    • क्लोदिंग स्टोर
    • फ़र्नीचर स्टोर
    • ग्रॉसरी स्टोर
    • हार्डवेयर स्टोर
    • टॉय स्टोर
    फ़ूड & हॉस्पिटैलिटी
    • बार और पब
    • रेस्टोरेंट
    • फ़ास्ट फ़ूड
    • Guest House
    • बेवरिज डिस्ट्रीब्यूटर
    • होटल
    रियल एस्टेट
    • Real Estate Agency
    • आर्किटेक्चर फ़र्म
    • कंसट्रक्शन
    • Property Management
    • गार्ड्निंग
    • प्रॉपर्टी ओनर असोसिएशन
    कंसल्टिंग
    • अकाउंटिंग फ़र्म
    • Odoo पार्टनर
    • मार्केटिंग एजेंसी
    • लॉ फ़र्म
    • टैलेंट ऐक्विज़िशन
    • ऑडिट & सर्टिफ़िकेशन
    मैन्युफ़ैक्चरिंग
    • टेक्सटाइल
    • Metal
    • फ़र्नीचर
    • फ़ूड
    • ब्रुअरी
    • कॉर्पोरेट गिफ़्ट
    हेल्थ & फिटनेस
    • स्पोर्ट्स क्लब
    • आईवियर स्टोर
    • फिटनेस सेंटर
    • वेलनेस प्रैक्टिशनर
    • फॉर्मेसी
    • हेयर सैलून
    Trades
    • Handyman
    • आईटी हॉर्डवेयर और सपोर्ट
    • Solar Energy Systems
    • Shoe Maker
    • साफ-सफाई से जुड़ी सेवाएं
    • HVAC Services
    अन्य
    • Nonprofit Organization
    • एन्वायरमेंटल एजेंसी
    • बिलबोर्ड रेंटल
    • फ़ोटोग्राफी
    • बाइक लीजिंग
    • सॉफ़्टवेयर रीसेलर
    सभी इंडस्ट्री को ब्राउज़ करें
  • कम्यूनिटी
    सीखें
    • ट्यूटोरियल्स
    • दस्तावेज़
    • सर्टिफ़िकेशन
    • ट्रेनिंग
    • ब्लॉग
    • पॉडकास्ट
    शिक्षा को बढ़ावा दें
    • एजुकेशन प्रोग्राम
    • स्केल अप! बिजनेस गेम
    • Odoo के ऑफ़िस में आएं
    सॉफ़्टवेयर पाएं
    • डाउनलोड
    • वर्शन की तुलना करें
    • रिलीज़
    साथ मिलकर काम करें
    • Github
    • फ़ोरम
    • इवेंट
    • अनुवाद
    • पार्टनर बनें
    • Services for Partners
    • अपना अकाउंटिंग फ़र्म रजिस्टर करें
    सेवाएं पाएं
    • पार्टनर ढूंढें
    • अकाउंटेंट खोजें
    • सलाहकार की मदद लें
    • इम्प्लिमेंटेशन सेवाएं
    • कस्टमर रेफ़रेंस
    • सहायता
    • अपग्रेड
    Github Youtube Twitter Linkedin Instagram Facebook Spotify
    +1 (650) 691-3277
    डेमो देखें
  • कीमत
  • सहायता
You need to be registered to interact with the community.
All Posts People Badges
टैग (View all)
odoo accounting v14 pos v15
About this forum
You need to be registered to interact with the community.
All Posts People Badges
टैग (View all)
odoo accounting v14 pos v15
About this forum
सहायता

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

Subscribe

Get notified when there's activity on this post

This question has been flagged
xmljsodoo16
2 Replies
5052 डेटा देखने का तरीका
अवतार
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
अवतार
खारिज करें
अवतार
Dương Nguyễn
Best Answer

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
अवतार
खारिज करें
Muhammad Ihza Putra Handayani
लेखक

<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
लेखक

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

अवतार
Muhammad Ihza Putra Handayani
लेखक Best Answer


0
अवतार
खारिज करें
Enjoying the discussion? Don't just read, join in!

Create an account today to enjoy exclusive features and engage with our awesome community!

साइन अप करें
Related Posts Replies डेटा देखने का तरीका ऐक्टिविटी
compatibility problem with qweb report
xml report odoo16
अवतार
अवतार
1
नव॰ 25
2698
How to hide "section-financials" from the ProductInfoPopup in POS Screen Solved
javascript xml odoo16
अवतार
अवतार
2
जुल॰ 24
3036
How to extend class js FloatField in odoo 16 Solved
js OWL odoo16
अवतार
अवतार
2
मई 24
4428
Call variable in a template to have a dynamic url
xml templates js
अवतार
0
दिस॰ 23
3605
How to export xlsx in Odoo14 Web
xml js v14
अवतार
अवतार
1
अग॰ 23
5875
कम्यूनिटी
  • ट्यूटोरियल्स
  • दस्तावेज़
  • फ़ोरम
ओपन सोर्स
  • डाउनलोड
  • Github
  • रनबॉट
  • अनुवाद
सेवाएं
  • Odoo.sh Hosting
  • सहायता
  • अपग्रेड
  • कस्टम डेवलपमेंट्स
  • शिक्षा
  • अकाउंटेंट खोजें
  • पार्टनर ढूंढें
  • पार्टनर बनें
हमारे बारे में
  • हमारी कंपनी
  • ब्रांड ऐसेट
  • संपर्क करें
  • नौकरियां
  • इवेंट
  • पॉडकास्ट
  • ब्लॉग
  • ग्राहक
  • लीगल • गोपनीयता
  • सुरक्षा
الْعَرَبيّة 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, बिज़नेस से जुड़े ऐप्लिकेशन का एक कलेक्शन है जो ओपन सोर्स पर आधारित है. इसमें आपकी कंपनी की हर ज़रूरत के लिए ऐप्लिकेशन हैं. जैसे, सीआरएम, ई-कॉमर्स, अकाउंटिंग, इन्वेंट्री, पॉइंट ऑफ़ सेल, प्रोजेक्ट मैनेजमेंट वगैरह.

Odoo की सबसे बड़ी खासियत है कि यह इस्तेमाल करने में बहुत आसान है और यह पूरी तरह से इंटिग्रेट किया हुआ है.

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