From 69a3b0a34e22d34c247aa365a4e4982ccc8d3b55 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 17 Jun 2026 21:38:58 +0000 Subject: [PATCH] feat(odoo-spo): FK target/inverse_name (P1) + deep reads_field (P0) corpus enrichment MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Implements the odoo-rs UPSTREAM_WISHLIST P1 (FK target override) + coupled P0 (deep reads_field) enrichment of the Odoo SPO corpus, lance-graph only. The coupling: P0 is built ON P1 — lifting @api.depends('line_ids.amount_residual') into a deep read requires resolving line_ids → account.move.line, which IS the P1 target map. So P1 first (relation map), then P0 resolves dotted depends through it. New stdlib-only generator tools/odoo-blueprint-extractor/odoo_blueprint_extractor/spo_enrich.py: - builds (model, field) → (comodel, inverse) from /home/user/odoo/addons via ast (the same source the ORM extractor parses); - P1: emits target/inverse_name sibling triples keyed by the relation IRI, matching the cross-language-ratified shape from AdaWorldAPI/ruff#18 (WorkPackage.owner, class_name, "User") → (account_move.line_ids, target, "account.move.line") + (…, inverse_name, "move_id"). Object is the raw dotted comodel string so od-ontology RelationMap::from_corpus reads it directly; - P0: resolves each dotted @api.depends path through the target map and lifts a deep reads_field onto the field's emitting method, in addition to the existing shallow relation read. Self-loops dropped; unknown-hop paths skipped + counted. Additive, deterministic, idempotent ((s,p,o) dedup; re-run adds 0). Corpus odoo_ontology.spo.ndjson regenerated: 22 245 → 23 701 triples (+618 target, +102 inverse_name, +736 deep reads_field; 567 unknown-hop skips). odoo_ontology.rs: module-doc + provenance updated, count test 22 245→23 701, histogram extended (target/inverse_name/reads_field), 2 new enrichment tests. 14 new spo_enrich unit tests. Generation-path finding: the corpus's documented original generator (emit_ontology2.py over methods.parquet) is absent from the tree — only its output is committed; the blueprint extractor emits typed Rust OdooEntity consts (a separate artifact). Enrichment runs over the shipped corpus + present Odoo source, the correct additive stage. Cross-repo validation (local only, no odoo-rs commit): od_ontology::RecomputeDag on a slice-2-scoped enriched fixture. Baseline 0 cross-model compute edges → enriched 27, with the edge account_move_line._compute_amount_residual → account_move._compute_amount now PRESENT (the wishlist's P0 ask delivered). But the audit's MISSED-1 is a unidirectional ORDERING edge, not a cycle (move depends on line; line does not depend back on move's totals), so odoo-rs's slice_2_compute_subset_no_cross_model_cycle no-cycle assertion legitimately still holds. Reported, not faked. Tests: cargo test -p lance-graph --lib odoo_ontology 9/9 + action_emitter/spo green; python -m unittest tests.test_spo_enrich 14/14 + uom smoke green. cargo fmt clean; lance-graph crate clippy clean (the -D warnings deprecation errors are pre-existing v2-layout debt in causal-edge/p64-bridge/lance-graph- planner, untouched here). Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_01CcpLeEC3XK8Eye53GKBVvi --- .claude/board/AGENT_LOG.md | 18 + .claude/board/EPIPHANIES.md | 16 + .claude/board/LATEST_STATE.md | 2 + .../src/graph/spo/odoo_ontology.rs | 149 +- .../src/graph/spo/odoo_ontology.spo.ndjson | 1456 +++++++++++++++++ .../odoo_blueprint_extractor/spo_enrich.py | 432 +++++ .../tests/test_spo_enrich.py | 232 +++ 7 files changed, 2300 insertions(+), 5 deletions(-) create mode 100644 tools/odoo-blueprint-extractor/odoo_blueprint_extractor/spo_enrich.py create mode 100644 tools/odoo-blueprint-extractor/tests/test_spo_enrich.py diff --git a/.claude/board/AGENT_LOG.md b/.claude/board/AGENT_LOG.md index 118a64bb7..2229f7cd3 100644 --- a/.claude/board/AGENT_LOG.md +++ b/.claude/board/AGENT_LOG.md @@ -1,3 +1,21 @@ +## 2026-06-17 — odoo SPO corpus enrichment: P1 FK-target + P0 deep-reads_field (UPSTREAM_WISHLIST) + +**Main thread (Opus) — single implementer**, branch `claude/odoo-spo-fk-target-deep-reads`. Implements the odoo-rs `UPSTREAM_WISHLIST` P1 (FK `target`/`inverse_name`) + coupled P0 (deep `reads_field`) corpus enrichment, lance-graph only. + +**Shipped:** +- `tools/odoo-blueprint-extractor/odoo_blueprint_extractor/spo_enrich.py` (new, stdlib-only): builds a `(model, field) → (comodel, inverse)` relation map from `/home/user/odoo/addons` via `ast`, then (P1) emits `target`/`inverse_name` sibling triples keyed by the relation IRI (ruff#18 shape, raw dotted comodel object) for every relational field on a corpus-declared model, and (P0) resolves each dotted `@api.depends` path through the map and lifts a deep `reads_field` onto the field's emitting method. Additive, deterministic, idempotent (`(s,p,o)` dedup); self-loops dropped; unknown-hop paths skipped + counted. CLI: `python3 -m odoo_blueprint_extractor.spo_enrich --corpus … --addons …`. +- `crates/lance-graph/src/graph/spo/odoo_ontology.spo.ndjson` regenerated: 22 245 → **23 701** triples (**+618 `target`, +102 `inverse_name`, +736 deep `reads_field`**; 567 dotted-path skips for unknown hops). +- `crates/lance-graph/src/graph/spo/odoo_ontology.rs`: module-doc updated (new predicates + provenance/regeneration note), triple-count test 22 245→23 701, histogram test extended (`target`=618, `inverse_name`=102, `reads_field`=2 831), 2 new tests (`enrichment_emits_fk_target_and_inverse_name`, `enrichment_emits_cross_model_deep_reads_field`). +- `tools/odoo-blueprint-extractor/tests/test_spo_enrich.py` (new): 14 unittest cases (path resolution, P1/P0 emission, dedup/idempotence, self-loop drop, unknown-model guard). + +**Tests:** lance-graph `cargo test -p lance-graph --lib odoo_ontology` 9/9 green; `action_emitter`/`spo` green (no regression — function count 3 328 unchanged, `_ =>{}` dispatch absorbs new predicates). Extractor `python3 -m unittest tests.test_spo_enrich` 14/14 + `tests/test_smoke_uom.py` green. `cargo fmt` + `cargo clippy -p lance-graph --lib` clean. + +**Cross-repo validation (LOCAL ONLY, no odoo-rs commit):** built a slice-2-scoped enriched fixture, ran `od_ontology::RecomputeDag` from a throwaway `origin/main` worktree. **Baseline:** 0 cross-model compute edges, edge `_compute_amount_residual → _compute_amount` ABSENT. **Enriched:** 27 compute edges, that cross-model edge PRESENT — the wishlist's P0 ask (visible cross-model ordering) is delivered. **Correction:** the graph stays acyclic; the MISSED-1 dependency is an *ordering edge*, not a cycle (move depends on line; line does not depend back on move's totals), so odoo-rs's `slice_2_compute_subset_no_cross_model_cycle` no-cycle assertion legitimately still holds. Reported, not faked. Worktree removed. + +**Finding:** the corpus's original generator (`emit_ontology2.py` over `methods.parquet`) is absent from the tree; the blueprint extractor emits typed Rust `OdooEntity` consts (separate artifact). Enrichment runs over shipped corpus + present Odoo source — the correct additive stage. See `EPIPHANIES.md` E-ODOO-FK-DEEP-READS. + +--- + ## 2026-06-17 — W3+W4a atomic read/write shim landed (BindSpace→MailboxSoA migration, first behaviour-touching step) **Main thread (Opus) — single implementer**, on branch `claude/bindspace-mailbox-soa-w3-w4a` (plan v2 already committed). Sole-owner working tree; ran cargo freely against the shared `target/`. diff --git a/.claude/board/EPIPHANIES.md b/.claude/board/EPIPHANIES.md index da63016f2..755719edc 100644 --- a/.claude/board/EPIPHANIES.md +++ b/.claude/board/EPIPHANIES.md @@ -16,6 +16,22 @@ **The leptonica epiphany:** leptonica is an *install*, not a transcode. It is only a *link* dep of the C++ oracle harness — never in the Rust path (the unicharset path is text parsing, never touches `Pix`). Transcoding leptonica (~250k LOC of pointer-heavy C image-processing, the hand-port category) is the far-off zero-C end-state, NOT a prerequisite to prove the pipeline. The whole "we need the operator's leptonica host" framing collapsed to one `apt-get`. **Scope (honest):** this proves the unicharset adapter's id↔unichar bijection + content-store tier at byte-parity — the doctrine's designated falsifier (`PROBE-OGAR-ADAPTER-UNICHARSET`), now FINDING. The `classid → ClassView → UnifiedStep` dispatch wiring is mechanical remainder; each future method-body leaf is its own parity check, but the core-first adapter pattern is no longer a conjecture. Cross-ref: `core-first-transcode-doctrine.md` § falsifier RESULT; `transcode-extend-core-probe-v1.md` § BYTE-PARITY ACHIEVED. +## 2026-06-17 — E-ODOO-FK-DEEP-READS — P1 FK-target is the prerequisite for P0 deep-`reads_field`; the cross-language predicate shape (ruff#18) is ratified, and the audit's MISSED-1 is an ordering EDGE, not a cycle + +**Status:** FINDING (shipped on branch `claude/odoo-spo-fk-target-deep-reads`). The Odoo SPO corpus (`graph/spo/odoo_ontology.spo.ndjson`) gains two additive predicate families via `tools/odoo-blueprint-extractor/odoo_blueprint_extractor/spo_enrich.py`: **618 `target` + 102 `inverse_name`** (P1) and **736 deep `reads_field`** (P0). 22 245 → 23 701 triples. lance-graph-side: 9 `odoo_ontology` tests green (incl. 2 new enrichment tests); extractor: 14 new `spo_enrich` unit tests + the existing uom smoke test green. Idempotent (re-run adds 0). + +**The coupling (the structural insight).** P0 (deep `reads_field`) is **not independent of** P1 (FK `target`) — it is *built on* it. To lift `@api.depends('line_ids.amount_residual')` into a deep read on the right model, the generator must resolve `line_ids → account.move.line` — which IS the P1 target map. So the work order is forced: P1 first (build the relation map), then P0 resolves dotted depends paths through it. A session that tries P0 alone re-derives P1 implicitly and worse. + +**The predicate shape is cross-language-ratified, not invented.** `AdaWorldAPI/ruff#18` lifted Rails `belongs_to :owner, class_name:'User'` into a sibling triple `(WorkPackage.owner, class_name, "User")` — a triple keyed by the relation IRI whose object is the *raw* target class string. We match that shape exactly: `(odoo:account_move.line_ids, target, "account.move.line")` + `(…, inverse_name, "move_id")`. Object is the raw Odoo dotted model name (NOT an `odoo:` IRI), so `od-ontology::RelationMap::from_corpus` reads it directly. The wishlist's named phantom-target case (`invoice_line_ids`, whose `_` convention misses `account.move.line`) is fixed by the same emission. + +**The honest correction — MISSED-1 is an ordering edge, not a cycle (cross-repo-verified).** The task framing expected the deep-read lift to make odoo-rs's `slice_2_compute_subset_no_cross_model_cycle` test's no-cycle assertion *fail* (a cycle appears). It does **NOT**, and faking it would be wrong. Verified locally against `od_ontology::RecomputeDag` on a slice-2-scoped enriched fixture: +- **Baseline (surface reads):** 0 cross-model compute edges. `_compute_amount`'s only relevant read is the relation `account_move.line_ids` (no emitter → no edge). The line→move dependency is structurally invisible. +- **Enriched (deep reads):** the edge `account_move_line._compute_amount_residual → account_move._compute_amount` IS present (27 compute edges total). This is **exactly the wishlist's P0 acceptance** — the cross-model recompute-ordering dependency becomes a structural annotation, retiring the hand-audit ritual. +- **But still acyclic.** The dependency is *unidirectional*: `account.move._compute_amount` reads line fields; `account.move.line._compute_amount_residual` reads only same-model line fields and never reads back any field `_compute_amount` emits (verified: no method reads any `_compute_amount` output). The audit's "logically circular" framing is a *semantic* circularity (filtering by a computed `reconciled` field inside the body), not a `reads_field`↔`emitted_by` structural back-edge. So `RecomputeDag` correctly sees an ordering edge (line-before-move), not a cycle, and the no-cycle assertion legitimately still holds. + +**Consequence for the consumer.** odoo-rs should adopt the enriched corpus (`RelationMap::from_corpus` becomes whole-corpus, the 14-row hand-crafted `slice_2.relations.ndjson` obsolete), and re-frame its P0 expectation from "catch a cycle" to "emit `DEFINE FUNCTION`/`DEFINE EVENT` in the topological order the new cross-model edges now impose." Their adoption is their call (silence-is-alignment); no odoo-rs change was committed. + +**Generation-path finding.** The corpus's documented original generator (`emit_ontology2.py` over `methods.parquet`) is **absent from the tree** — only its output is committed. The blueprint extractor (`tools/odoo-blueprint-extractor`) emits typed Rust `OdooEntity` consts into `lance-graph-ontology`, a *separate* artifact from the SPO ndjson. The enrichment therefore runs over the shipped corpus + the present Odoo source (`/home/user/odoo/addons`), which is the same tree the extractor parses — additive, deterministic, idempotent. This is the right stage given the missing regenerator. ## 2026-06-17 — E-MATERIALIZED-AWARENESS-2 — the driver wire is live (provenance-only); the four vocabularies are one 2-axis structure diff --git a/.claude/board/LATEST_STATE.md b/.claude/board/LATEST_STATE.md index 893131616..e6d27aa35 100644 --- a/.claude/board/LATEST_STATE.md +++ b/.claude/board/LATEST_STATE.md @@ -10,6 +10,8 @@ --- +> **2026-06-17 — IN PR (branch `claude/odoo-spo-fk-target-deep-reads`)** — Odoo SPO corpus enrichment (odoo-rs `UPSTREAM_WISHLIST` P1 + coupled P0). The corpus `crates/lance-graph/src/graph/spo/odoo_ontology.spo.ndjson` now carries **two new predicate families** (was 7 predicates: `depends_on / emitted_by / has_function / raises / rdf:type / reads_field / traverses_relation`): **`target`** (618) + **`inverse_name`** (102) — the relational comodel/inverse keyed by the relation IRI, ruff#18 sibling-triple shape `(odoo:account_move.line_ids, target, "account.move.line")`; and **+736 deep `reads_field`** (so `reads_field` 2 095 → 2 831) — each `@api.depends('rel.leaf', …)` resolved through the new target map and lifted onto the field's emitting method as a transitive read. Corpus 22 245 → **23 701** triples. New stdlib-only generator `tools/odoo-blueprint-extractor/odoo_blueprint_extractor/spo_enrich.py` (+14 unit tests) reads `/home/user/odoo/addons` (the same source the ORM extractor parses) to build the `(model, field) → (comodel, inverse)` map; additive, deterministic, idempotent. `odoo_ontology.rs` doc + tests updated (count 23 701, histogram incl. new predicates, 2 new enrichment tests); `action_emitter`/`spo` unaffected (function count 3 328 unchanged). **Cross-repo finding (verified, not faked):** the deep reads make the cross-model recompute-ordering edge `account_move_line._compute_amount_residual → account_move._compute_amount` *visible* to `od_ontology::RecomputeDag` (baseline: 0 cross-model compute edges → enriched: 27), delivering the wishlist's P0 ask — but the audit's MISSED-1 is a unidirectional *ordering edge*, NOT a cycle, so odoo-rs's `slice_2_compute_subset_no_cross_model_cycle` no-cycle assertion legitimately still holds (the "circularity" is semantic, not a `reads_field`↔`emitted_by` back-edge). The corpus's original generator (`emit_ontology2.py`/`methods.parquet`) is absent from the tree — only its output is committed; enrichment runs at the correct additive stage over the shipped corpus + present source. See `EPIPHANIES.md` E-ODOO-FK-DEEP-READS. + > **2026-06-17 — IN PR (branch `claude/bindspace-mailbox-soa-w3-w4a`)** — W3+W4a atomic read/write shim, the first behaviour-touching step of the BindSpace→MailboxSoA migration. New `cognitive-shader-driver::backing` module (`pub(crate)`): `BackingStore<'a>` (read) + `BackingStoreWrite<'a>` (write) — an enum with a `Singleton(&BindSpace)` arm (live default) and a `#[cfg(feature = "mailbox-thoughtspace")] Mailbox(&MailboxSoA<1024>)` arm. New Cargo feature **`mailbox-thoughtspace`** — **default-OFF, NOT in `lab`**; production stays singleton-read+write until W7. `driver.run()` keeps ONE body: all six dispatch reads (meta_prefilter / qualia17d / content_row / edge / entity_type / len) re-pointed through a `self.backing()` selector (`const DEFAULT_MAILBOX: MailboxId = 0`, `debug_assert!(mailboxes.len() <= 1)`, singleton fallback when no mailbox registered); `ontology()` stays on the singleton (re-home is W4b). Gates: **W2 differential** (`tests/w2_differential.rs`, 4 tests) asserts the WHOLE `ShaderCrystal` bit-identical (`f32::to_bits()`) across both arms incl. a non-zero-window case + non-vacuity; firewall CI lint (`tests/firewall.rs`) bars the two `CausalEdge64` twins (`ndarray::hpc::causal_diff` / `thinking_engine::layered`) from `src/`; field-isolation matrix + cycle-drop footprint (~6 KB/row vs ~71.6 KB) in `mailbox_soa.rs`. `unbind_busdto` C5 downgrade: cycle-plane index recovery feature-gated OUT under `mailbox-thoughtspace` (cycle plane never migrated — D-DIST-5), headline survives via `qualia[9]`; singleton build keeps bit-exact recovery. Tests: default **97 lib + 2 firewall + 2 e2e**; feature-on **98 lib + 2 firewall + 2 e2e + 4 w2**; clippy `--all-targets` (both cfgs) + fmt clean on touched files. **Pre-existing P0 surfaced (NOT introduced, NOT fixed here):** the `with-engine` build does not compile on `main`/HEAD (`engine_bridge.rs:259` uses `QUALIA_DIMS` without importing it); the busdto round-trip tests have never run, and (separately) the D-CSV-5b i4-qualia cutover breaks the `codebook_index` round-trip (stored in i4 `qualia[9]`, ±7 range, cannot hold a u16). Left untouched to keep scope to W3+W4a — flagged for operator. Plan: `.claude/plans/bindspace-mailbox-soa-w3-w4a-impl-v1.md`. > > **2026-06-16 — MERGED #512** (perturbation-sim review fixes + **core-first transcode doctrine**): +591/-5 across 11 files. **Code fixes (review of #511):** `examples/calibrate.rs` divide-by-zero guard on degenerate grid; `src/hhtl.rs::basin_lambda2` `assert_eq!(keys.len(), grid.n, …)` precondition (silent corruption→loud panic); `TECH_DEBT.md` MD018 reflow. **Doctrine (the structural delivery):** new mandatory-read `core-first-transcode-doctrine.md` (218 LOC) + 3 new agent cards (`core-first-architect`, `core-gap-auditor`, `adapter-shaper`) + `BOOT.md`/`README.md` wires + EPIPHANIES entry + CLAUDE.md (+21 LOC, doctrine wire-up — NEW content unread by this session). Likely directly aligned with the ontology-first stance the operator locked on odoo-rs. Branch `claude/happy-hamilton-0azlw4`, merge `1e23c410`. 75 lib tests + clippy + fmt clean. diff --git a/crates/lance-graph/src/graph/spo/odoo_ontology.rs b/crates/lance-graph/src/graph/spo/odoo_ontology.rs index fa0a5176f..0edf684cb 100644 --- a/crates/lance-graph/src/graph/spo/odoo_ontology.rs +++ b/crates/lance-graph/src/graph/spo/odoo_ontology.rs @@ -22,6 +22,30 @@ //! | `reads_field` | `odoo:.` | `odoo:.` | body read (inferred) | //! | `raises` | `odoo:.` | `exc:` | body raise (authoritative) | //! | `traverses_relation` | `odoo:.` | `odoo:.` | body for-loop (inferred) | +//! | `target` | `odoo:.` | `""` | relational comodel (declared) | +//! | `inverse_name` | `odoo:.` | `""` | One2many/inverse (declared) | +//! +//! ## FK-target + deep-read enrichment (`spo_enrich`) +//! +//! Two additive predicate families layer on top of the base extraction +//! (`tools/odoo-blueprint-extractor/odoo_blueprint_extractor/spo_enrich.py`, +//! the `UPSTREAM_WISHLIST` P1 + P0 corpus enrichment): +//! +//! - **`target` / `inverse_name`** (P1, ruff#18 sibling-triple shape): for +//! every relational field (Many2one / One2many / Many2many / Reference) on a +//! corpus model whose comodel resolves from the Odoo source, a sibling +//! triple keyed by the relation IRI carries the *raw* dotted comodel name +//! (e.g. `(odoo:account_move.line_ids, target, "account.move.line")` + +//! `(…, inverse_name, "move_id")`). This is the cross-language analog of +//! ruff#18's `(WorkPackage.owner, class_name, "User")`. +//! - **deep `reads_field`** (P0): each `@api.depends('rel.leaf', …)` whose +//! `rel` is a relational field is resolved through the `target` map and the +//! transitive read lifted onto the field's emitting method — e.g. +//! `(odoo:account_move._compute_amount, reads_field, +//! odoo:account_move_line.amount_residual)` is emitted *in addition to* the +//! shallow relation read `(…, reads_field, odoo:account_move.line_ids)`. +//! This surfaces the cross-model recompute-ordering edge that the +//! surface-only corpus left invisible to `od_ontology::RecomputeDag`. //! //! Truth values (NARS `(frequency, confidence)`) carry the provenance: //! structural edges are certain `(1.0, 1.0)`; decorator/body-authoritative @@ -42,9 +66,16 @@ //! //! # Provenance //! -//! Data file `odoo_ontology.spo.ndjson` is regenerable: -//! `python3 .claude/odoo/emit_ontology2.py` over `.claude/odoo/methods.parquet`. -//! 22 245 triples, 388 Object Types, 3 107 Properties, 3 328 Functions. +//! Data file `odoo_ontology.spo.ndjson` carries the base extraction (388 +//! Object Types, 3 107 Properties, 3 328 Functions) plus the `spo_enrich` +//! P1/P0 layer (618 `target` + 102 `inverse_name` + 736 deep `reads_field`), +//! for 23 701 triples total. The base extraction's original generator +//! (`emit_ontology2.py` over a `methods.parquet`) is not present in this +//! tree — only its output is — so the enrichment is applied over the shipped +//! corpus + the Odoo source via +//! `python3 -m odoo_blueprint_extractor.spo_enrich --corpus +//! crates/lance-graph/src/graph/spo/odoo_ontology.spo.ndjson` (idempotent; +//! re-running de-duplicates the new triples by `(s, p, o)`). use crate::graph::fingerprint::{dn_hash, label_fp}; use crate::graph::spo::builder::SpoBuilder; @@ -115,8 +146,9 @@ mod tests { #[test] fn parses_all_triples() { let triples = parse_triples(ONTOLOGY); - // 22 245 triples per the emit_ontology2.py run (2026-05-28). - assert_eq!(triples.len(), 22_245, "triple count drifted from data file"); + // 22 245 base triples + 1 456 spo_enrich triples (618 target + + // 102 inverse_name + 736 deep reads_field) = 23 701. + assert_eq!(triples.len(), 23_701, "triple count drifted from data file"); } #[test] @@ -133,6 +165,8 @@ mod tests { "reads_field" => "reads_field", "raises" => "raises", "traverses_relation" => "traverses_relation", + "target" => "target", + "inverse_name" => "inverse_name", _ => "other", }) .or_default() += 1; @@ -141,6 +175,11 @@ mod tests { assert_eq!(hist.get("depends_on"), Some(&6309)); assert_eq!(hist.get("emitted_by"), Some(&3228)); assert_eq!(hist.get("rdf:type"), Some(&6823)); + // spo_enrich P1/P0 layer: FK target/inverse_name + deep reads_field. + assert_eq!(hist.get("target"), Some(&618)); + assert_eq!(hist.get("inverse_name"), Some(&102)); + // reads_field grew from 2 095 (base) to 2 831 with 736 deep lifts. + assert_eq!(hist.get("reads_field"), Some(&2831)); assert_eq!(hist.get("other"), None, "unexpected predicate kind"); } @@ -214,6 +253,106 @@ mod tests { ); } + /// `spo_enrich` P1 — the FK target/inverse_name layer is present and + /// carries the wishlist's canonical `account_move.line_ids` case: the + /// One2many's comodel (`account.move.line`) and inverse (`move_id`) are + /// lifted into sibling triples keyed by the relation IRI (ruff#18 shape). + /// This is the parity check on the upstream side: `RelationMap::from_corpus` + /// in `od-ontology` resolves `(model, field) → (target, inverse)` directly + /// from these triples. + #[test] + fn enrichment_emits_fk_target_and_inverse_name() { + let triples = parse_triples(ONTOLOGY); + + let target = triples.iter().any(|t| { + t.s == "odoo:account_move.line_ids" && t.p == "target" && t.o == "account.move.line" + }); + assert!( + target, + "P1: account_move.line_ids must carry target=\"account.move.line\"" + ); + + let inverse = triples.iter().any(|t| { + t.s == "odoo:account_move.line_ids" && t.p == "inverse_name" && t.o == "move_id" + }); + assert!( + inverse, + "P1: account_move.line_ids must carry inverse_name=\"move_id\"" + ); + + // The phantom-target case the wishlist names explicitly: the + // `invoice_line_ids` field name's `_` convention + // (`invoice_line`) misses the real comodel (`account.move.line`). + // The target triple is the corpus's correction of that phantom. + let phantom_fix = triples.iter().any(|t| { + t.s == "odoo:account_move.invoice_line_ids" + && t.p == "target" + && t.o == "account.move.line" + }); + assert!( + phantom_fix, + "P1: invoice_line_ids phantom-target must resolve to account.move.line" + ); + } + + /// `spo_enrich` P0 — at least one deep `reads_field` lands on a DIFFERENT + /// model than the reading method, proving the cross-model recompute edge + /// is now structurally visible. The canonical case: + /// `account.move._compute_amount` reads `account_move_line.amount_residual` + /// (resolved through `@api.depends('line_ids.amount_residual')`), where the + /// surface corpus only had the relation read `(_compute_amount, reads_field, + /// account_move.line_ids)`. + #[test] + fn enrichment_emits_cross_model_deep_reads_field() { + let triples = parse_triples(ONTOLOGY); + + // The exact cross-model deep read that makes `RecomputeDag` see the + // line→move ordering edge (line.amount_residual is emitted_by + // account_move_line._compute_amount_residual). + let deep = triples.iter().any(|t| { + t.s == "odoo:account_move._compute_amount" + && t.p == "reads_field" + && t.o == "odoo:account_move_line.amount_residual" + }); + assert!( + deep, + "P0: _compute_amount must carry a deep reads_field on \ + account_move_line.amount_residual (cross-model)" + ); + + // The shallow relation read is STILL present (the deep read is + // additive, never a replacement). + let shallow = triples.iter().any(|t| { + t.s == "odoo:account_move._compute_amount" + && t.p == "reads_field" + && t.o == "odoo:account_move.line_ids" + }); + assert!( + shallow, + "P0: the original shallow relation read must be preserved" + ); + + // No deep read is a self-loop (reads_field object == reading method). + let self_loop = triples.iter().any(|t| t.p == "reads_field" && t.o == t.s); + assert!(!self_loop, "deep reads_field must never be a self-loop"); + + // Count: at least one deep read crosses model boundaries (object's + // model differs from the reading method's model). + let cross_model = triples + .iter() + .filter(|t| t.p == "reads_field") + .filter(|t| { + let s_model = t.s.strip_prefix("odoo:").and_then(|b| b.split('.').next()); + let o_model = t.o.strip_prefix("odoo:").and_then(|b| b.split('.').next()); + matches!((s_model, o_model), (Some(a), Some(b)) if a != b) + }) + .count(); + assert!( + cross_model > 0, + "P0: at least one reads_field must cross model boundaries" + ); + } + /// Lock the module-doc claim "3 328 Functions" against drift so the /// downstream `action_emitter::shipped_ontology_produces_expected_function_count` /// (which asserts the same number on its own) can't get out of sync diff --git a/crates/lance-graph/src/graph/spo/odoo_ontology.spo.ndjson b/crates/lance-graph/src/graph/spo/odoo_ontology.spo.ndjson index d101c6e01..fafc2c386 100644 --- a/crates/lance-graph/src/graph/spo/odoo_ontology.spo.ndjson +++ b/crates/lance-graph/src/graph/spo/odoo_ontology.spo.ndjson @@ -22243,3 +22243,1459 @@ {"s":"odoo:website_visitor.time_since_last_action","p":"emitted_by","o":"odoo:website_visitor._compute_time_statistics","f":0.95,"c":0.9} {"s":"odoo:website_visitor.is_connected","p":"depends_on","o":"odoo:website_visitor.last_connection_datetime","f":0.95,"c":0.9} {"s":"odoo:website_visitor.time_since_last_action","p":"depends_on","o":"odoo:website_visitor.last_connection_datetime","f":0.95,"c":0.9} +{"s":"odoo:account_account._compute_tds_tcs_features","p":"reads_field","o":"odoo:res_company.l10n_in_tcs_feature","f":0.85,"c":0.75} +{"s":"odoo:account_account._compute_tds_tcs_features","p":"reads_field","o":"odoo:res_company.l10n_in_tds_feature","f":0.85,"c":0.75} +{"s":"odoo:account_account.company_ids","p":"target","o":"res.company","f":0.95,"c":0.9} +{"s":"odoo:account_account.group_id","p":"target","o":"account.group","f":0.95,"c":0.9} +{"s":"odoo:account_account.root_id","p":"target","o":"account.root","f":0.95,"c":0.9} +{"s":"odoo:account_account.tax_ids","p":"target","o":"account.tax","f":0.95,"c":0.9} +{"s":"odoo:account_analytic_line.partner_id","p":"target","o":"res.partner","f":0.95,"c":0.9} +{"s":"odoo:account_analytic_line.product_uom_id","p":"target","o":"uom.uom","f":0.95,"c":0.9} +{"s":"odoo:account_bank_statement._compute_balance_end","p":"reads_field","o":"odoo:account_bank_statement_line.amount","f":0.85,"c":0.75} +{"s":"odoo:account_bank_statement._compute_balance_end","p":"reads_field","o":"odoo:account_bank_statement_line.state","f":0.85,"c":0.75} +{"s":"odoo:account_bank_statement._compute_currency_id","p":"reads_field","o":"odoo:account_journal.currency_id","f":0.85,"c":0.75} +{"s":"odoo:account_bank_statement._compute_currency_id","p":"reads_field","o":"odoo:res_company.currency_id","f":0.85,"c":0.75} +{"s":"odoo:account_bank_statement._compute_date","p":"reads_field","o":"odoo:account_bank_statement_line.internal_index","f":0.85,"c":0.75} +{"s":"odoo:account_bank_statement._compute_date","p":"reads_field","o":"odoo:account_bank_statement_line.state","f":0.85,"c":0.75} +{"s":"odoo:account_bank_statement._compute_first_line_index","p":"reads_field","o":"odoo:account_bank_statement_line.internal_index","f":0.85,"c":0.75} +{"s":"odoo:account_bank_statement._compute_first_line_index","p":"reads_field","o":"odoo:account_bank_statement_line.state","f":0.85,"c":0.75} +{"s":"odoo:account_bank_statement._compute_is_complete","p":"reads_field","o":"odoo:account_bank_statement_line.amount","f":0.85,"c":0.75} +{"s":"odoo:account_bank_statement._compute_is_complete","p":"reads_field","o":"odoo:account_bank_statement_line.state","f":0.85,"c":0.75} +{"s":"odoo:account_bank_statement._compute_journal_id","p":"reads_field","o":"odoo:account_bank_statement_line.journal_id","f":0.85,"c":0.75} +{"s":"odoo:account_bank_statement.company_id","p":"target","o":"res.company","f":0.95,"c":0.9} +{"s":"odoo:account_bank_statement.currency_id","p":"target","o":"res.currency","f":0.95,"c":0.9} +{"s":"odoo:account_bank_statement.journal_id","p":"target","o":"account.journal","f":0.95,"c":0.9} +{"s":"odoo:account_bank_statement.line_ids","p":"inverse_name","o":"statement_id","f":0.95,"c":0.9} +{"s":"odoo:account_bank_statement.line_ids","p":"target","o":"account.bank.statement.line","f":0.95,"c":0.9} +{"s":"odoo:account_bank_statement_line._compute_currency_id","p":"reads_field","o":"odoo:account_journal.currency_id","f":0.85,"c":0.75} +{"s":"odoo:account_bank_statement_line._compute_is_reconciled","p":"reads_field","o":"odoo:account_move.checked","f":0.85,"c":0.75} +{"s":"odoo:account_bank_statement_line._compute_is_reconciled","p":"reads_field","o":"odoo:account_move_line.account_id","f":0.85,"c":0.75} +{"s":"odoo:account_bank_statement_line._compute_is_reconciled","p":"reads_field","o":"odoo:account_move_line.amount_currency","f":0.85,"c":0.75} +{"s":"odoo:account_bank_statement_line._compute_is_reconciled","p":"reads_field","o":"odoo:account_move_line.amount_residual_currency","f":0.85,"c":0.75} +{"s":"odoo:account_bank_statement_line._compute_is_reconciled","p":"reads_field","o":"odoo:account_move_line.currency_id","f":0.85,"c":0.75} +{"s":"odoo:account_bank_statement_line._compute_is_reconciled","p":"reads_field","o":"odoo:account_move_line.matched_credit_ids","f":0.85,"c":0.75} +{"s":"odoo:account_bank_statement_line._compute_is_reconciled","p":"reads_field","o":"odoo:account_move_line.matched_debit_ids","f":0.85,"c":0.75} +{"s":"odoo:account_bank_statement_line.currency_id","p":"target","o":"res.currency","f":0.95,"c":0.9} +{"s":"odoo:account_bank_statement_line.journal_id","p":"target","o":"account.journal","f":0.95,"c":0.9} +{"s":"odoo:account_bank_statement_line.move_id","p":"target","o":"account.move","f":0.95,"c":0.9} +{"s":"odoo:account_code_mapping._compute_code","p":"reads_field","o":"odoo:account_account.code","f":0.85,"c":0.75} +{"s":"odoo:account_code_mapping.account_id","p":"target","o":"account.account","f":0.95,"c":0.9} +{"s":"odoo:account_journal._compute_compatible_edi_ids","p":"reads_field","o":"odoo:res_company.account_fiscal_country_id","f":0.85,"c":0.75} +{"s":"odoo:account_journal._compute_edi_format_ids","p":"reads_field","o":"odoo:res_company.account_fiscal_country_id","f":0.85,"c":0.75} +{"s":"odoo:account_journal._compute_l10n_hr_is_mer_journal","p":"reads_field","o":"odoo:res_company.l10n_hr_mer_purchase_journal_id","f":0.85,"c":0.75} +{"s":"odoo:account_journal._compute_l10n_tr_default_sales_return_account_id","p":"reads_field","o":"odoo:res_company.country_code","f":0.85,"c":0.75} +{"s":"odoo:account_journal.available_payment_method_ids","p":"target","o":"account.payment.method","f":0.95,"c":0.9} +{"s":"odoo:account_journal.company_id","p":"target","o":"res.company","f":0.95,"c":0.9} +{"s":"odoo:account_journal.default_account_id","p":"target","o":"account.account","f":0.95,"c":0.9} +{"s":"odoo:account_journal.inbound_payment_method_line_ids","p":"inverse_name","o":"journal_id","f":0.95,"c":0.9} +{"s":"odoo:account_journal.inbound_payment_method_line_ids","p":"target","o":"account.payment.method.line","f":0.95,"c":0.9} +{"s":"odoo:account_journal.loss_account_id","p":"target","o":"account.account","f":0.95,"c":0.9} +{"s":"odoo:account_journal.outbound_payment_method_line_ids","p":"inverse_name","o":"journal_id","f":0.95,"c":0.9} +{"s":"odoo:account_journal.outbound_payment_method_line_ids","p":"target","o":"account.payment.method.line","f":0.95,"c":0.9} +{"s":"odoo:account_journal.profit_account_id","p":"target","o":"account.account","f":0.95,"c":0.9} +{"s":"odoo:account_journal.suspense_account_id","p":"target","o":"account.account","f":0.95,"c":0.9} +{"s":"odoo:account_move._compute_always_tax_exigible","p":"reads_field","o":"odoo:account_account.account_type","f":0.85,"c":0.75} +{"s":"odoo:account_move._compute_amount","p":"reads_field","o":"odoo:account_move_line.amount_currency","f":0.85,"c":0.75} +{"s":"odoo:account_move._compute_amount","p":"reads_field","o":"odoo:account_move_line.amount_residual","f":0.85,"c":0.75} +{"s":"odoo:account_move._compute_amount","p":"reads_field","o":"odoo:account_move_line.amount_residual_currency","f":0.85,"c":0.75} +{"s":"odoo:account_move._compute_amount","p":"reads_field","o":"odoo:account_move_line.balance","f":0.85,"c":0.75} +{"s":"odoo:account_move._compute_amount","p":"reads_field","o":"odoo:account_move_line.currency_id","f":0.85,"c":0.75} +{"s":"odoo:account_move._compute_amount","p":"reads_field","o":"odoo:account_move_line.full_reconcile_id","f":0.85,"c":0.75} +{"s":"odoo:account_move._compute_amount","p":"reads_field","o":"odoo:account_payment.is_matched","f":0.85,"c":0.75} +{"s":"odoo:account_move._compute_amount","p":"reads_field","o":"odoo:account_payment.state","f":0.85,"c":0.75} +{"s":"odoo:account_move._compute_checked","p":"reads_field","o":"odoo:account_journal.type","f":0.85,"c":0.75} +{"s":"odoo:account_move._compute_invoice_incoterm_placeholder","p":"reads_field","o":"odoo:res_company.incoterm_id","f":0.85,"c":0.75} +{"s":"odoo:account_move._compute_invoice_partner_display_info","p":"reads_field","o":"odoo:res_partner.display_name","f":0.85,"c":0.75} +{"s":"odoo:account_move._compute_l10n_ar_afip_concept","p":"reads_field","o":"odoo:account_move_line.product_id","f":0.85,"c":0.75} +{"s":"odoo:account_move._compute_l10n_ar_afip_concept","p":"reads_field","o":"odoo:product_product.type","f":0.85,"c":0.75} +{"s":"odoo:account_move._compute_l10n_es_edi_is_required","p":"reads_field","o":"odoo:account_move_line.tax_ids","f":0.85,"c":0.75} +{"s":"odoo:account_move._compute_l10n_es_edi_verifactu_available_clave_regimens","p":"reads_field","o":"odoo:account_move_line.tax_ids","f":0.85,"c":0.75} +{"s":"odoo:account_move._compute_l10n_es_edi_verifactu_clave_regimen","p":"reads_field","o":"odoo:account_move_line.tax_ids","f":0.85,"c":0.75} +{"s":"odoo:account_move._compute_l10n_es_is_simplified","p":"reads_field","o":"odoo:account_move_line.balance","f":0.85,"c":0.75} +{"s":"odoo:account_move._compute_l10n_fr_is_company_french","p":"reads_field","o":"odoo:res_company.country_code","f":0.85,"c":0.75} +{"s":"odoo:account_move._compute_l10n_id_coretax_efaktur_available","p":"reads_field","o":"odoo:account_move_line.tax_ids","f":0.85,"c":0.75} +{"s":"odoo:account_move._compute_l10n_it_edi_doi_id","p":"reads_field","o":"odoo:res_partner.commercial_partner_id","f":0.85,"c":0.75} +{"s":"odoo:account_move._compute_l10n_it_edi_is_self_invoice","p":"reads_field","o":"odoo:account_move_line.tax_tag_ids","f":0.85,"c":0.75} +{"s":"odoo:account_move._compute_l10n_it_partner_is_public_administration","p":"reads_field","o":"odoo:res_partner.l10n_it_pa_index","f":0.85,"c":0.75} +{"s":"odoo:account_move._compute_l10n_it_partner_pa","p":"reads_field","o":"odoo:res_partner.l10n_it_pa_index","f":0.85,"c":0.75} +{"s":"odoo:account_move._compute_l10n_it_payment_method","p":"reads_field","o":"odoo:account_move_line.matching_number","f":0.85,"c":0.75} +{"s":"odoo:account_move._compute_l10n_jo_edi_invoice_type","p":"reads_field","o":"odoo:res_partner.country_code","f":0.85,"c":0.75} +{"s":"odoo:account_move._compute_l10n_my_edi_display_tax_exemption_reason","p":"reads_field","o":"odoo:account_move_line.tax_ids","f":0.85,"c":0.75} +{"s":"odoo:account_move._compute_l10n_tw_edi_invoice_type","p":"reads_field","o":"odoo:account_move_line.tax_ids","f":0.85,"c":0.75} +{"s":"odoo:account_move._compute_l10n_tw_edi_is_zero_tax_rate","p":"reads_field","o":"odoo:account_move_line.tax_ids","f":0.85,"c":0.75} +{"s":"odoo:account_move._compute_landed_costs_visible","p":"reads_field","o":"odoo:account_move_line.is_landed_costs_line","f":0.85,"c":0.75} +{"s":"odoo:account_move._compute_narration","p":"reads_field","o":"odoo:res_partner.lang","f":0.85,"c":0.75} +{"s":"odoo:account_move._compute_next_payment_date","p":"reads_field","o":"odoo:account_move_line.payment_date","f":0.85,"c":0.75} +{"s":"odoo:account_move._compute_next_payment_date","p":"reads_field","o":"odoo:account_move_line.reconciled","f":0.85,"c":0.75} +{"s":"odoo:account_move._compute_no_followup","p":"reads_field","o":"odoo:account_move_line.no_followup","f":0.85,"c":0.75} +{"s":"odoo:account_move._compute_origin_so_count","p":"reads_field","o":"odoo:account_move_line.sale_line_ids","f":0.85,"c":0.75} +{"s":"odoo:account_move._compute_payment_state","p":"reads_field","o":"odoo:account_payment.state","f":0.85,"c":0.75} +{"s":"odoo:account_move._compute_payments_widget_reconciled_info","p":"reads_field","o":"odoo:account_move_line.amount_residual","f":0.85,"c":0.75} +{"s":"odoo:account_move._compute_qr_code_str","p":"reads_field","o":"odoo:account_journal.l10n_sa_production_csid_json","f":0.85,"c":0.75} +{"s":"odoo:account_move._compute_qr_code_str","p":"reads_field","o":"odoo:res_company.vat","f":0.85,"c":0.75} +{"s":"odoo:account_move._compute_quick_edit_mode","p":"reads_field","o":"odoo:account_journal.type","f":0.85,"c":0.75} +{"s":"odoo:account_move._compute_quick_encoding_vals","p":"reads_field","o":"odoo:account_move_line.price_total","f":0.85,"c":0.75} +{"s":"odoo:account_move._compute_reconciled_payment_ids","p":"reads_field","o":"odoo:account_move_line.matched_credit_ids","f":0.85,"c":0.75} +{"s":"odoo:account_move._compute_reconciled_payment_ids","p":"reads_field","o":"odoo:account_move_line.matched_debit_ids","f":0.85,"c":0.75} +{"s":"odoo:account_move._compute_reconciled_payment_ids","p":"reads_field","o":"odoo:account_payment.state","f":0.85,"c":0.75} +{"s":"odoo:account_move._compute_sale_warning_text","p":"reads_field","o":"odoo:product_product.display_name","f":0.85,"c":0.75} +{"s":"odoo:account_move._compute_sale_warning_text","p":"reads_field","o":"odoo:product_product.sale_line_warn_msg","f":0.85,"c":0.75} +{"s":"odoo:account_move._compute_sale_warning_text","p":"reads_field","o":"odoo:res_partner.name","f":0.85,"c":0.75} +{"s":"odoo:account_move._compute_sale_warning_text","p":"reads_field","o":"odoo:res_partner.sale_warn_msg","f":0.85,"c":0.75} +{"s":"odoo:account_move._compute_tax_lock_date_message","p":"reads_field","o":"odoo:account_move_line.credit","f":0.85,"c":0.75} +{"s":"odoo:account_move._compute_tax_lock_date_message","p":"reads_field","o":"odoo:account_move_line.debit","f":0.85,"c":0.75} +{"s":"odoo:account_move._compute_tax_lock_date_message","p":"reads_field","o":"odoo:account_move_line.tax_ids","f":0.85,"c":0.75} +{"s":"odoo:account_move._compute_tax_lock_date_message","p":"reads_field","o":"odoo:account_move_line.tax_line_id","f":0.85,"c":0.75} +{"s":"odoo:account_move._compute_tax_lock_date_message","p":"reads_field","o":"odoo:account_move_line.tax_tag_ids","f":0.85,"c":0.75} +{"s":"odoo:account_move._compute_tax_totals","p":"reads_field","o":"odoo:account_move_line.currency_rate","f":0.85,"c":0.75} +{"s":"odoo:account_move._compute_tax_totals","p":"reads_field","o":"odoo:account_move_line.price_subtotal","f":0.85,"c":0.75} +{"s":"odoo:account_move._compute_tax_totals","p":"reads_field","o":"odoo:account_move_line.price_total","f":0.85,"c":0.75} +{"s":"odoo:account_move._compute_tax_totals","p":"reads_field","o":"odoo:account_move_line.tax_base_amount","f":0.85,"c":0.75} +{"s":"odoo:account_move._compute_tax_totals","p":"reads_field","o":"odoo:account_move_line.tax_line_id","f":0.85,"c":0.75} +{"s":"odoo:account_move._compute_taxes_legal_notes","p":"reads_field","o":"odoo:account_move_line.tax_ids","f":0.85,"c":0.75} +{"s":"odoo:account_move._compute_timesheet_total_duration","p":"reads_field","o":"odoo:res_company.timesheet_encode_uom_id","f":0.85,"c":0.75} +{"s":"odoo:account_move.bank_partner_id","p":"target","o":"res.partner","f":0.95,"c":0.9} +{"s":"odoo:account_move.commercial_partner_id","p":"target","o":"res.partner","f":0.95,"c":0.9} +{"s":"odoo:account_move.company_id","p":"target","o":"res.company","f":0.95,"c":0.9} +{"s":"odoo:account_move.currency_id","p":"target","o":"res.currency","f":0.95,"c":0.9} +{"s":"odoo:account_move.duplicated_ref_ids","p":"target","o":"account.move","f":0.95,"c":0.9} +{"s":"odoo:account_move.fiscal_position_id","p":"target","o":"account.fiscal.position","f":0.95,"c":0.9} +{"s":"odoo:account_move.invoice_incoterm_id","p":"target","o":"account.incoterms","f":0.95,"c":0.9} +{"s":"odoo:account_move.invoice_line_ids","p":"inverse_name","o":"move_id","f":0.95,"c":0.9} +{"s":"odoo:account_move.invoice_line_ids","p":"target","o":"account.move.line","f":0.95,"c":0.9} +{"s":"odoo:account_move.invoice_payment_term_id","p":"target","o":"account.payment.term","f":0.95,"c":0.9} +{"s":"odoo:account_move.invoice_user_id","p":"target","o":"res.users","f":0.95,"c":0.9} +{"s":"odoo:account_move.invoice_vendor_bill_id","p":"target","o":"account.move","f":0.95,"c":0.9} +{"s":"odoo:account_move.journal_id","p":"target","o":"account.journal","f":0.95,"c":0.9} +{"s":"odoo:account_move.line_ids","p":"inverse_name","o":"move_id","f":0.95,"c":0.9} +{"s":"odoo:account_move.line_ids","p":"target","o":"account.move.line","f":0.95,"c":0.9} +{"s":"odoo:account_move.matched_payment_ids","p":"target","o":"account.payment","f":0.95,"c":0.9} +{"s":"odoo:account_move.partner_bank_id","p":"target","o":"res.partner.bank","f":0.95,"c":0.9} +{"s":"odoo:account_move.partner_id","p":"target","o":"res.partner","f":0.95,"c":0.9} +{"s":"odoo:account_move.partner_shipping_id","p":"target","o":"res.partner","f":0.95,"c":0.9} +{"s":"odoo:account_move.preferred_payment_method_line_id","p":"target","o":"account.payment.method.line","f":0.95,"c":0.9} +{"s":"odoo:account_move.reconciled_payment_ids","p":"target","o":"account.payment","f":0.95,"c":0.9} +{"s":"odoo:account_move.suitable_journal_ids","p":"target","o":"account.journal","f":0.95,"c":0.9} +{"s":"odoo:account_move_line._compute_allowed_uom_ids","p":"reads_field","o":"odoo:product_product.uom_id","f":0.85,"c":0.75} +{"s":"odoo:account_move_line._compute_allowed_uom_ids","p":"reads_field","o":"odoo:product_product.uom_ids","f":0.85,"c":0.75} +{"s":"odoo:account_move_line._compute_currency_id","p":"reads_field","o":"odoo:account_move.currency_id","f":0.85,"c":0.75} +{"s":"odoo:account_move_line._compute_currency_rate","p":"reads_field","o":"odoo:account_move.date","f":0.85,"c":0.75} +{"s":"odoo:account_move_line._compute_currency_rate","p":"reads_field","o":"odoo:account_move.invoice_currency_rate","f":0.85,"c":0.75} +{"s":"odoo:account_move_line._compute_epd_needed","p":"reads_field","o":"odoo:account_move.needed_terms","f":0.85,"c":0.75} +{"s":"odoo:account_move_line._compute_is_refund","p":"reads_field","o":"odoo:account_move.move_type","f":0.85,"c":0.75} +{"s":"odoo:account_move_line._compute_l10n_gr_edi_available_cls_category","p":"reads_field","o":"odoo:account_move.l10n_gr_edi_correlation_id","f":0.85,"c":0.75} +{"s":"odoo:account_move_line._compute_l10n_gr_edi_available_cls_category","p":"reads_field","o":"odoo:account_move.l10n_gr_edi_inv_type","f":0.85,"c":0.75} +{"s":"odoo:account_move_line._compute_l10n_gr_edi_available_cls_type","p":"reads_field","o":"odoo:account_move.l10n_gr_edi_correlation_id","f":0.85,"c":0.75} +{"s":"odoo:account_move_line._compute_l10n_gr_edi_cls_category","p":"reads_field","o":"odoo:account_move.l10n_gr_edi_inv_type","f":0.85,"c":0.75} +{"s":"odoo:account_move_line._compute_l10n_gr_edi_cls_type","p":"reads_field","o":"odoo:account_move.l10n_gr_edi_inv_type","f":0.85,"c":0.75} +{"s":"odoo:account_move_line._compute_l10n_gr_edi_detail_type","p":"reads_field","o":"odoo:account_move.l10n_gr_edi_inv_type","f":0.85,"c":0.75} +{"s":"odoo:account_move_line._compute_l10n_in_hsn_code","p":"reads_field","o":"odoo:product_product.l10n_in_hsn_code","f":0.85,"c":0.75} +{"s":"odoo:account_move_line._compute_l10n_my_edi_classification_code","p":"reads_field","o":"odoo:product_product.product_tmpl_id","f":0.85,"c":0.75} +{"s":"odoo:account_move_line._compute_l10n_tr_ctsp_number","p":"reads_field","o":"odoo:product_product.l10n_tr_ctsp_number","f":0.85,"c":0.75} +{"s":"odoo:account_move_line._compute_name","p":"reads_field","o":"odoo:account_move.payment_reference","f":0.85,"c":0.75} +{"s":"odoo:account_move_line._compute_name","p":"reads_field","o":"odoo:account_move.ref","f":0.85,"c":0.75} +{"s":"odoo:account_move_line._compute_sale_line_warn_msg","p":"reads_field","o":"odoo:product_product.sale_line_warn_msg","f":0.85,"c":0.75} +{"s":"odoo:account_move_line._inverse_debit","p":"reads_field","o":"odoo:account_move.is_storno","f":0.85,"c":0.75} +{"s":"odoo:account_move_line.allowed_uom_ids","p":"target","o":"uom.uom","f":0.95,"c":0.9} +{"s":"odoo:account_move_line.currency_id","p":"target","o":"res.currency","f":0.95,"c":0.9} +{"s":"odoo:account_move_line.move_id","p":"target","o":"account.move","f":0.95,"c":0.9} +{"s":"odoo:account_move_line.product_id","p":"target","o":"product.product","f":0.95,"c":0.9} +{"s":"odoo:account_move_line.product_uom_id","p":"target","o":"uom.uom","f":0.95,"c":0.9} +{"s":"odoo:account_move_line.reconciled_lines_excluding_exchange_diff_ids","p":"target","o":"account.move.line","f":0.95,"c":0.9} +{"s":"odoo:account_move_line.reconciled_lines_ids","p":"target","o":"account.move.line","f":0.95,"c":0.9} +{"s":"odoo:account_move_line.tax_ids","p":"target","o":"account.tax","f":0.95,"c":0.9} +{"s":"odoo:account_partial_reconcile._compute_max_date","p":"reads_field","o":"odoo:account_move_line.date","f":0.85,"c":0.75} +{"s":"odoo:account_partial_reconcile.company_id","p":"target","o":"res.company","f":0.95,"c":0.9} +{"s":"odoo:account_partial_reconcile.credit_move_id","p":"target","o":"account.move.line","f":0.95,"c":0.9} +{"s":"odoo:account_partial_reconcile.debit_move_id","p":"target","o":"account.move.line","f":0.95,"c":0.9} +{"s":"odoo:account_payment._compute_amount_company_currency_signed","p":"reads_field","o":"odoo:account_move.amount_total_signed","f":0.85,"c":0.75} +{"s":"odoo:account_payment._compute_display_name","p":"reads_field","o":"odoo:account_move.name","f":0.85,"c":0.75} +{"s":"odoo:account_payment._compute_name","p":"reads_field","o":"odoo:account_move.name","f":0.85,"c":0.75} +{"s":"odoo:account_payment._compute_qr_code","p":"reads_field","o":"odoo:account_move.state","f":0.85,"c":0.75} +{"s":"odoo:account_payment._compute_reconciliation_status","p":"reads_field","o":"odoo:account_move_line.account_id","f":0.85,"c":0.75} +{"s":"odoo:account_payment._compute_reconciliation_status","p":"reads_field","o":"odoo:account_move_line.amount_residual","f":0.85,"c":0.75} +{"s":"odoo:account_payment._compute_reconciliation_status","p":"reads_field","o":"odoo:account_move_line.amount_residual_currency","f":0.85,"c":0.75} +{"s":"odoo:account_payment._compute_show_check_number","p":"reads_field","o":"odoo:account_payment_method_line.code","f":0.85,"c":0.75} +{"s":"odoo:account_payment._compute_stat_buttons_from_reconciliation","p":"reads_field","o":"odoo:account_move_line.matched_credit_ids","f":0.85,"c":0.75} +{"s":"odoo:account_payment._compute_stat_buttons_from_reconciliation","p":"reads_field","o":"odoo:account_move_line.matched_debit_ids","f":0.85,"c":0.75} +{"s":"odoo:account_payment._compute_state","p":"reads_field","o":"odoo:account_move.payment_state","f":0.85,"c":0.75} +{"s":"odoo:account_payment._compute_state","p":"reads_field","o":"odoo:account_move_line.amount_residual","f":0.85,"c":0.75} +{"s":"odoo:account_payment.available_journal_ids","p":"target","o":"account.journal","f":0.95,"c":0.9} +{"s":"odoo:account_payment.available_partner_bank_ids","p":"target","o":"res.partner.bank","f":0.95,"c":0.9} +{"s":"odoo:account_payment.available_payment_method_line_ids","p":"target","o":"account.payment.method.line","f":0.95,"c":0.9} +{"s":"odoo:account_payment.company_id","p":"target","o":"res.company","f":0.95,"c":0.9} +{"s":"odoo:account_payment.currency_id","p":"target","o":"res.currency","f":0.95,"c":0.9} +{"s":"odoo:account_payment.destination_account_id","p":"target","o":"account.account","f":0.95,"c":0.9} +{"s":"odoo:account_payment.duplicate_payment_ids","p":"target","o":"account.payment","f":0.95,"c":0.9} +{"s":"odoo:account_payment.journal_id","p":"target","o":"account.journal","f":0.95,"c":0.9} +{"s":"odoo:account_payment.move_id","p":"target","o":"account.move","f":0.95,"c":0.9} +{"s":"odoo:account_payment.outstanding_account_id","p":"target","o":"account.account","f":0.95,"c":0.9} +{"s":"odoo:account_payment.partner_bank_id","p":"target","o":"res.partner.bank","f":0.95,"c":0.9} +{"s":"odoo:account_payment.payment_method_line_id","p":"target","o":"account.payment.method.line","f":0.95,"c":0.9} +{"s":"odoo:account_payment.reconciled_bill_ids","p":"target","o":"account.move","f":0.95,"c":0.9} +{"s":"odoo:account_payment.reconciled_invoice_ids","p":"target","o":"account.move","f":0.95,"c":0.9} +{"s":"odoo:account_payment.reconciled_statement_line_ids","p":"target","o":"account.bank.statement.line","f":0.95,"c":0.9} +{"s":"odoo:account_payment_register.currency_id","p":"target","o":"res.currency","f":0.95,"c":0.9} +{"s":"odoo:account_payment_register_withholding_line._compute_comodel_currency_id","p":"reads_field","o":"odoo:account_payment_register.currency_id","f":0.85,"c":0.75} +{"s":"odoo:account_payment_register_withholding_line._compute_comodel_date","p":"reads_field","o":"odoo:account_payment_register.payment_date","f":0.85,"c":0.75} +{"s":"odoo:account_payment_register_withholding_line._compute_comodel_payment_type","p":"reads_field","o":"odoo:account_payment_register.payment_type","f":0.85,"c":0.75} +{"s":"odoo:account_payment_register_withholding_line._compute_comodel_percentage_paid_factor","p":"reads_field","o":"odoo:account_payment_register.amount","f":0.85,"c":0.75} +{"s":"odoo:account_payment_register_withholding_line._compute_comodel_percentage_paid_factor","p":"reads_field","o":"odoo:account_payment_register.can_edit_wizard","f":0.85,"c":0.75} +{"s":"odoo:account_payment_register_withholding_line._compute_company_id","p":"reads_field","o":"odoo:account_payment_register.company_id","f":0.85,"c":0.75} +{"s":"odoo:account_payment_register_withholding_line._compute_type_tax_use","p":"reads_field","o":"odoo:account_payment_register.payment_type","f":0.85,"c":0.75} +{"s":"odoo:account_payment_register_withholding_line.payment_register_id","p":"target","o":"account.payment.register","f":0.95,"c":0.9} +{"s":"odoo:account_payment_term._compute_example_preview","p":"reads_field","o":"odoo:account_payment_term_line.nb_days","f":0.85,"c":0.75} +{"s":"odoo:account_payment_term._compute_example_preview","p":"reads_field","o":"odoo:account_payment_term_line.value","f":0.85,"c":0.75} +{"s":"odoo:account_payment_term._compute_example_preview","p":"reads_field","o":"odoo:account_payment_term_line.value_amount","f":0.85,"c":0.75} +{"s":"odoo:account_payment_term.currency_id","p":"target","o":"res.currency","f":0.95,"c":0.9} +{"s":"odoo:account_payment_term.line_ids","p":"inverse_name","o":"payment_id","f":0.95,"c":0.9} +{"s":"odoo:account_payment_term.line_ids","p":"target","o":"account.payment.term.line","f":0.95,"c":0.9} +{"s":"odoo:account_payment_withholding_line._compute_comodel_date","p":"reads_field","o":"odoo:account_payment.date","f":0.85,"c":0.75} +{"s":"odoo:account_payment_withholding_line._compute_comodel_payment_type","p":"reads_field","o":"odoo:account_payment.payment_type","f":0.85,"c":0.75} +{"s":"odoo:account_payment_withholding_line._compute_type_tax_use","p":"reads_field","o":"odoo:account_payment.payment_type","f":0.85,"c":0.75} +{"s":"odoo:account_payment_withholding_line.payment_id","p":"target","o":"account.payment","f":0.95,"c":0.9} +{"s":"odoo:account_reconcile_model._compute_partner_mapping","p":"reads_field","o":"odoo:account_reconcile_model_line.account_id","f":0.85,"c":0.75} +{"s":"odoo:account_reconcile_model._compute_partner_mapping","p":"reads_field","o":"odoo:account_reconcile_model_line.partner_id","f":0.85,"c":0.75} +{"s":"odoo:account_reconcile_model.line_ids","p":"inverse_name","o":"model_id","f":0.95,"c":0.9} +{"s":"odoo:account_reconcile_model.line_ids","p":"target","o":"account.reconcile.model.line","f":0.95,"c":0.9} +{"s":"odoo:account_reconcile_model.mapped_partner_id","p":"target","o":"res.partner","f":0.95,"c":0.9} +{"s":"odoo:account_report.country_id","p":"target","o":"res.country","f":0.95,"c":0.9} +{"s":"odoo:account_tax._compute_has_negative_factor","p":"reads_field","o":"odoo:account_tax_repartition_line.factor","f":0.85,"c":0.75} +{"s":"odoo:account_tax._compute_has_negative_factor","p":"reads_field","o":"odoo:account_tax_repartition_line.repartition_type","f":0.85,"c":0.75} +{"s":"odoo:account_tax._compute_is_domestic","p":"reads_field","o":"odoo:res_company.domestic_fiscal_position_id","f":0.85,"c":0.75} +{"s":"odoo:account_tax._compute_l10n_in_gst_tax_type","p":"reads_field","o":"odoo:account_tax_repartition_line.tag_ids","f":0.85,"c":0.75} +{"s":"odoo:account_tax._compute_repartition_lines_str","p":"reads_field","o":"odoo:account_tax_repartition_line.account_id","f":0.85,"c":0.75} +{"s":"odoo:account_tax._compute_repartition_lines_str","p":"reads_field","o":"odoo:account_tax_repartition_line.factor_percent","f":0.85,"c":0.75} +{"s":"odoo:account_tax._compute_repartition_lines_str","p":"reads_field","o":"odoo:account_tax_repartition_line.sequence","f":0.85,"c":0.75} +{"s":"odoo:account_tax._compute_repartition_lines_str","p":"reads_field","o":"odoo:account_tax_repartition_line.tag_ids","f":0.85,"c":0.75} +{"s":"odoo:account_tax._compute_repartition_lines_str","p":"reads_field","o":"odoo:account_tax_repartition_line.use_in_tax_closing","f":0.85,"c":0.75} +{"s":"odoo:account_tax._compute_tag_ids_domain","p":"reads_field","o":"odoo:res_company.account_fiscal_country_id","f":0.85,"c":0.75} +{"s":"odoo:account_tax._compute_tag_ids_domain","p":"reads_field","o":"odoo:res_company.multi_vat_foreign_country_ids","f":0.85,"c":0.75} +{"s":"odoo:account_tax.children_tax_ids","p":"target","o":"account.tax","f":0.95,"c":0.9} +{"s":"odoo:account_tax.company_id","p":"target","o":"res.company","f":0.95,"c":0.9} +{"s":"odoo:account_tax.country_id","p":"target","o":"res.country","f":0.95,"c":0.9} +{"s":"odoo:account_tax.invoice_repartition_line_ids","p":"inverse_name","o":"tax_id","f":0.95,"c":0.9} +{"s":"odoo:account_tax.invoice_repartition_line_ids","p":"target","o":"account.tax.repartition.line","f":0.95,"c":0.9} +{"s":"odoo:account_tax.refund_repartition_line_ids","p":"inverse_name","o":"tax_id","f":0.95,"c":0.9} +{"s":"odoo:account_tax.refund_repartition_line_ids","p":"target","o":"account.tax.repartition.line","f":0.95,"c":0.9} +{"s":"odoo:account_tax.repartition_line_ids","p":"inverse_name","o":"tax_id","f":0.95,"c":0.9} +{"s":"odoo:account_tax.repartition_line_ids","p":"target","o":"account.tax.repartition.line","f":0.95,"c":0.9} +{"s":"odoo:account_tax.tax_group_id","p":"target","o":"account.tax.group","f":0.95,"c":0.9} +{"s":"odoo:account_withholding_line.account_id","p":"target","o":"account.account","f":0.95,"c":0.9} +{"s":"odoo:analytic_mixin.distribution_analytic_account_ids","p":"target","o":"account.analytic.account","f":0.95,"c":0.9} +{"s":"odoo:base_automation.action_server_ids","p":"inverse_name","o":"base_automation_id","f":0.95,"c":0.9} +{"s":"odoo:base_automation.action_server_ids","p":"target","o":"ir.actions.server","f":0.95,"c":0.9} +{"s":"odoo:base_automation.on_change_field_ids","p":"target","o":"ir.model.fields","f":0.95,"c":0.9} +{"s":"odoo:base_automation.trg_date_calendar_id","p":"target","o":"resource.calendar","f":0.95,"c":0.9} +{"s":"odoo:base_automation.trg_date_id","p":"target","o":"ir.model.fields","f":0.95,"c":0.9} +{"s":"odoo:base_automation.trg_selection_field_id","p":"target","o":"ir.model.fields.selection","f":0.95,"c":0.9} +{"s":"odoo:base_automation.trigger_field_ids","p":"target","o":"ir.model.fields","f":0.95,"c":0.9} +{"s":"odoo:base_document_layout.report_layout_id","p":"target","o":"report.layout","f":0.95,"c":0.9} +{"s":"odoo:calendar_alarm.mail_template_id","p":"target","o":"mail.template","f":0.95,"c":0.9} +{"s":"odoo:calendar_attendee._compute_common_name","p":"reads_field","o":"odoo:res_partner.name","f":0.85,"c":0.75} +{"s":"odoo:calendar_attendee.partner_id","p":"target","o":"res.partner","f":0.95,"c":0.9} +{"s":"odoo:calendar_event._compute_current_attendee","p":"reads_field","o":"odoo:calendar_attendee.state","f":0.85,"c":0.75} +{"s":"odoo:calendar_event.attendee_ids","p":"inverse_name","o":"event_id","f":0.95,"c":0.9} +{"s":"odoo:calendar_event.attendee_ids","p":"target","o":"calendar.attendee","f":0.95,"c":0.9} +{"s":"odoo:calendar_event.current_attendee","p":"target","o":"calendar.attendee","f":0.95,"c":0.9} +{"s":"odoo:calendar_event.invalid_email_partner_ids","p":"target","o":"res.partner","f":0.95,"c":0.9} +{"s":"odoo:calendar_event.unavailable_partner_ids","p":"target","o":"res.partner","f":0.95,"c":0.9} +{"s":"odoo:calendar_recurrence._compute_dtstart","p":"reads_field","o":"odoo:calendar_event.start","f":0.85,"c":0.75} +{"s":"odoo:calendar_recurrence.calendar_event_ids","p":"inverse_name","o":"recurrence_id","f":0.95,"c":0.9} +{"s":"odoo:calendar_recurrence.calendar_event_ids","p":"target","o":"calendar.event","f":0.95,"c":0.9} +{"s":"odoo:chatbot_script._compute_first_step_warning","p":"reads_field","o":"odoo:chatbot_script_step.is_forward_operator","f":0.85,"c":0.75} +{"s":"odoo:chatbot_script._compute_first_step_warning","p":"reads_field","o":"odoo:chatbot_script_step.step_type","f":0.85,"c":0.75} +{"s":"odoo:chatbot_script.script_step_ids","p":"inverse_name","o":"chatbot_script_id","f":0.95,"c":0.9} +{"s":"odoo:chatbot_script.script_step_ids","p":"target","o":"chatbot.script.step","f":0.95,"c":0.9} +{"s":"odoo:chatbot_script_step._compute_is_forward_operator_child","p":"reads_field","o":"odoo:chatbot_script_step.answer_ids","f":0.85,"c":0.75} +{"s":"odoo:chatbot_script_step._compute_is_forward_operator_child","p":"reads_field","o":"odoo:chatbot_script_step.is_forward_operator","f":0.85,"c":0.75} +{"s":"odoo:chatbot_script_step._compute_is_forward_operator_child","p":"reads_field","o":"odoo:chatbot_script_step.sequence","f":0.85,"c":0.75} +{"s":"odoo:chatbot_script_step._compute_is_forward_operator_child","p":"reads_field","o":"odoo:chatbot_script_step.step_type","f":0.85,"c":0.75} +{"s":"odoo:chatbot_script_step._compute_is_forward_operator_child","p":"reads_field","o":"odoo:chatbot_script_step.triggering_answer_ids","f":0.85,"c":0.75} +{"s":"odoo:chatbot_script_step.chatbot_script_id","p":"target","o":"chatbot.script","f":0.95,"c":0.9} +{"s":"odoo:chatbot_script_step.triggering_answer_ids","p":"target","o":"chatbot.script.answer","f":0.95,"c":0.9} +{"s":"odoo:crm_iap_lead_mining_request._compute_lead_count","p":"reads_field","o":"odoo:crm_lead.lead_mining_request_id","f":0.85,"c":0.75} +{"s":"odoo:crm_iap_lead_mining_request.available_state_ids","p":"target","o":"res.country.state","f":0.95,"c":0.9} +{"s":"odoo:crm_iap_lead_mining_request.lead_ids","p":"inverse_name","o":"lead_mining_request_id","f":0.95,"c":0.9} +{"s":"odoo:crm_iap_lead_mining_request.lead_ids","p":"target","o":"crm.lead","f":0.95,"c":0.9} +{"s":"odoo:crm_iap_lead_mining_request.state_ids","p":"target","o":"res.country.state","f":0.95,"c":0.9} +{"s":"odoo:crm_iap_lead_mining_request.team_id","p":"target","o":"crm.team","f":0.95,"c":0.9} +{"s":"odoo:crm_lead._compute_email_from","p":"reads_field","o":"odoo:res_partner.email","f":0.85,"c":0.75} +{"s":"odoo:crm_lead._compute_meeting_display","p":"reads_field","o":"odoo:calendar_event.start","f":0.85,"c":0.75} +{"s":"odoo:crm_lead._compute_phone_state","p":"reads_field","o":"odoo:res_country.code","f":0.85,"c":0.75} +{"s":"odoo:crm_lead._compute_recurring_revenue_monthly","p":"reads_field","o":"odoo:crm_recurring_plan.number_of_months","f":0.85,"c":0.75} +{"s":"odoo:crm_lead._onchange_phone_validation","p":"reads_field","o":"odoo:res_partner.phone","f":0.85,"c":0.75} +{"s":"odoo:crm_lead.calendar_event_ids","p":"inverse_name","o":"opportunity_id","f":0.95,"c":0.9} +{"s":"odoo:crm_lead.calendar_event_ids","p":"target","o":"calendar.event","f":0.95,"c":0.9} +{"s":"odoo:crm_lead.commercial_partner_id","p":"target","o":"res.partner","f":0.95,"c":0.9} +{"s":"odoo:crm_lead.company_currency","p":"target","o":"res.currency","f":0.95,"c":0.9} +{"s":"odoo:crm_lead.company_id","p":"target","o":"res.company","f":0.95,"c":0.9} +{"s":"odoo:crm_lead.country_id","p":"target","o":"res.country","f":0.95,"c":0.9} +{"s":"odoo:crm_lead.duplicate_lead_ids","p":"target","o":"crm.lead","f":0.95,"c":0.9} +{"s":"odoo:crm_lead.lang_id","p":"target","o":"res.lang","f":0.95,"c":0.9} +{"s":"odoo:crm_lead.partner_id","p":"target","o":"res.partner","f":0.95,"c":0.9} +{"s":"odoo:crm_lead.recurring_plan","p":"target","o":"crm.recurring.plan","f":0.95,"c":0.9} +{"s":"odoo:crm_lead.stage_id","p":"target","o":"crm.stage","f":0.95,"c":0.9} +{"s":"odoo:crm_lead.team_id","p":"target","o":"crm.team","f":0.95,"c":0.9} +{"s":"odoo:crm_lead.user_company_ids","p":"target","o":"res.company","f":0.95,"c":0.9} +{"s":"odoo:crm_team._compute_assignment_max","p":"reads_field","o":"odoo:crm_team_member.assignment_max","f":0.85,"c":0.75} +{"s":"odoo:crm_team._compute_lead_all_assigned_month_count","p":"reads_field","o":"odoo:crm_team_member.lead_month_count","f":0.85,"c":0.75} +{"s":"odoo:crm_team._compute_member_ids","p":"reads_field","o":"odoo:crm_team_member.active","f":0.85,"c":0.75} +{"s":"odoo:crm_team.crm_team_member_ids","p":"inverse_name","o":"crm_team_id","f":0.95,"c":0.9} +{"s":"odoo:crm_team.crm_team_member_ids","p":"target","o":"crm.team.member","f":0.95,"c":0.9} +{"s":"odoo:crm_team.member_company_ids","p":"target","o":"res.company","f":0.95,"c":0.9} +{"s":"odoo:crm_team.member_ids","p":"target","o":"res.users","f":0.95,"c":0.9} +{"s":"odoo:crm_team_member.user_company_ids","p":"target","o":"res.company","f":0.95,"c":0.9} +{"s":"odoo:crm_team_member.user_in_teams_ids","p":"target","o":"res.users","f":0.95,"c":0.9} +{"s":"odoo:data_recycle_record.company_id","p":"target","o":"res.company","f":0.95,"c":0.9} +{"s":"odoo:delivery_carrier._compute_fixed_price","p":"reads_field","o":"odoo:product_product.list_price","f":0.85,"c":0.75} +{"s":"odoo:delivery_carrier._compute_fixed_price","p":"reads_field","o":"odoo:product_template.list_price","f":0.85,"c":0.75} +{"s":"odoo:delivery_carrier._compute_is_mondialrelay","p":"reads_field","o":"odoo:product_product.default_code","f":0.85,"c":0.75} +{"s":"odoo:delivery_carrier.product_id","p":"target","o":"product.product","f":0.95,"c":0.9} +{"s":"odoo:delivery_carrier.state_ids","p":"target","o":"res.country.state","f":0.95,"c":0.9} +{"s":"odoo:delivery_carrier.zip_prefix_ids","p":"target","o":"delivery.zip.prefix","f":0.95,"c":0.9} +{"s":"odoo:discuss_channel._compute_channel_partner_ids","p":"reads_field","o":"odoo:discuss_channel_member.partner_id","f":0.85,"c":0.75} +{"s":"odoo:discuss_channel._compute_group_public_id","p":"reads_field","o":"odoo:discuss_channel.group_public_id","f":0.85,"c":0.75} +{"s":"odoo:discuss_channel._compute_invited_member_ids","p":"reads_field","o":"odoo:discuss_channel_member.rtc_inviting_session_id","f":0.85,"c":0.75} +{"s":"odoo:discuss_channel._compute_livechat_agent_history_ids","p":"reads_field","o":"odoo:im_livechat_channel_member_history.livechat_member_type","f":0.85,"c":0.75} +{"s":"odoo:discuss_channel._compute_livechat_agent_partner_ids","p":"reads_field","o":"odoo:im_livechat_channel_member_history.partner_id","f":0.85,"c":0.75} +{"s":"odoo:discuss_channel._compute_livechat_bot_history_ids","p":"reads_field","o":"odoo:im_livechat_channel_member_history.livechat_member_type","f":0.85,"c":0.75} +{"s":"odoo:discuss_channel._compute_livechat_bot_partner_ids","p":"reads_field","o":"odoo:im_livechat_channel_member_history.partner_id","f":0.85,"c":0.75} +{"s":"odoo:discuss_channel._compute_livechat_customer_history_ids","p":"reads_field","o":"odoo:im_livechat_channel_member_history.livechat_member_type","f":0.85,"c":0.75} +{"s":"odoo:discuss_channel._compute_livechat_customer_partner_ids","p":"reads_field","o":"odoo:im_livechat_channel_member_history.partner_id","f":0.85,"c":0.75} +{"s":"odoo:discuss_channel.channel_member_ids","p":"inverse_name","o":"channel_id","f":0.95,"c":0.9} +{"s":"odoo:discuss_channel.channel_member_ids","p":"target","o":"discuss.channel.member","f":0.95,"c":0.9} +{"s":"odoo:discuss_channel.channel_name_member_ids","p":"target","o":"discuss.channel.member","f":0.95,"c":0.9} +{"s":"odoo:discuss_channel.channel_partner_ids","p":"target","o":"res.partner","f":0.95,"c":0.9} +{"s":"odoo:discuss_channel.group_public_id","p":"target","o":"res.groups","f":0.95,"c":0.9} +{"s":"odoo:discuss_channel.invited_member_ids","p":"target","o":"discuss.channel.member","f":0.95,"c":0.9} +{"s":"odoo:discuss_channel.livechat_agent_history_ids","p":"target","o":"im_livechat.channel.member.history","f":0.95,"c":0.9} +{"s":"odoo:discuss_channel.livechat_agent_partner_ids","p":"target","o":"res.partner","f":0.95,"c":0.9} +{"s":"odoo:discuss_channel.livechat_agent_providing_help_history","p":"target","o":"im_livechat.channel.member.history","f":0.95,"c":0.9} +{"s":"odoo:discuss_channel.livechat_agent_requesting_help_history","p":"target","o":"im_livechat.channel.member.history","f":0.95,"c":0.9} +{"s":"odoo:discuss_channel.livechat_bot_history_ids","p":"target","o":"im_livechat.channel.member.history","f":0.95,"c":0.9} +{"s":"odoo:discuss_channel.livechat_bot_partner_ids","p":"target","o":"res.partner","f":0.95,"c":0.9} +{"s":"odoo:discuss_channel.livechat_channel_member_history_ids","p":"inverse_name","o":"channel_id","f":0.95,"c":0.9} +{"s":"odoo:discuss_channel.livechat_channel_member_history_ids","p":"target","o":"im_livechat.channel.member.history","f":0.95,"c":0.9} +{"s":"odoo:discuss_channel.livechat_customer_history_ids","p":"target","o":"im_livechat.channel.member.history","f":0.95,"c":0.9} +{"s":"odoo:discuss_channel.livechat_customer_partner_ids","p":"target","o":"res.partner","f":0.95,"c":0.9} +{"s":"odoo:discuss_channel.parent_channel_id","p":"target","o":"discuss.channel","f":0.95,"c":0.9} +{"s":"odoo:discuss_channel.self_member_id","p":"target","o":"discuss.channel.member","f":0.95,"c":0.9} +{"s":"odoo:discuss_channel_member._compute_display_name","p":"reads_field","o":"odoo:discuss_channel.display_name","f":0.85,"c":0.75} +{"s":"odoo:discuss_channel_member._compute_display_name","p":"reads_field","o":"odoo:mail_guest.name","f":0.85,"c":0.75} +{"s":"odoo:discuss_channel_member._compute_display_name","p":"reads_field","o":"odoo:res_partner.name","f":0.85,"c":0.75} +{"s":"odoo:discuss_channel_member._compute_is_pinned","p":"reads_field","o":"odoo:discuss_channel.last_interest_dt","f":0.85,"c":0.75} +{"s":"odoo:discuss_channel_member._compute_message_unread","p":"reads_field","o":"odoo:discuss_channel.message_ids","f":0.85,"c":0.75} +{"s":"odoo:discuss_channel_member.channel_id","p":"target","o":"discuss.channel","f":0.95,"c":0.9} +{"s":"odoo:discuss_channel_member.guest_id","p":"target","o":"mail.guest","f":0.95,"c":0.9} +{"s":"odoo:discuss_channel_member.partner_id","p":"target","o":"res.partner","f":0.95,"c":0.9} +{"s":"odoo:event_event._compute_event_registrations_open","p":"reads_field","o":"odoo:event_event_ticket.sale_available","f":0.85,"c":0.75} +{"s":"odoo:event_event._compute_event_registrations_sold_out","p":"reads_field","o":"odoo:event_event_ticket.sale_available","f":0.85,"c":0.75} +{"s":"odoo:event_event._compute_sale_price_total","p":"reads_field","o":"odoo:res_company.currency_id","f":0.85,"c":0.75} +{"s":"odoo:event_event._compute_seats","p":"reads_field","o":"odoo:event_registration.active","f":0.85,"c":0.75} +{"s":"odoo:event_event._compute_seats","p":"reads_field","o":"odoo:event_registration.state","f":0.85,"c":0.75} +{"s":"odoo:event_event._compute_start_sale_date","p":"reads_field","o":"odoo:event_event_ticket.start_sale_datetime","f":0.85,"c":0.75} +{"s":"odoo:event_event.address_search","p":"target","o":"res.partner","f":0.95,"c":0.9} +{"s":"odoo:event_event.company_id","p":"target","o":"res.company","f":0.95,"c":0.9} +{"s":"odoo:event_event.event_mail_ids","p":"inverse_name","o":"event_id","f":0.95,"c":0.9} +{"s":"odoo:event_event.event_mail_ids","p":"target","o":"event.mail","f":0.95,"c":0.9} +{"s":"odoo:event_event.event_ticket_ids","p":"inverse_name","o":"event_id","f":0.95,"c":0.9} +{"s":"odoo:event_event.event_ticket_ids","p":"target","o":"event.event.ticket","f":0.95,"c":0.9} +{"s":"odoo:event_event.question_ids","p":"target","o":"event.question","f":0.95,"c":0.9} +{"s":"odoo:event_event.registration_ids","p":"inverse_name","o":"event_id","f":0.95,"c":0.9} +{"s":"odoo:event_event.registration_ids","p":"target","o":"event.registration","f":0.95,"c":0.9} +{"s":"odoo:event_event.tag_ids","p":"target","o":"event.tag","f":0.95,"c":0.9} +{"s":"odoo:event_lead_rule.lead_user_id","p":"target","o":"res.users","f":0.95,"c":0.9} +{"s":"odoo:event_mail._compute_scheduled_date","p":"reads_field","o":"odoo:event_event.date_begin","f":0.85,"c":0.75} +{"s":"odoo:event_mail._compute_scheduled_date","p":"reads_field","o":"odoo:event_event.date_end","f":0.85,"c":0.75} +{"s":"odoo:event_mail.event_id","p":"target","o":"event.event","f":0.95,"c":0.9} +{"s":"odoo:event_mail_registration._compute_scheduled_date","p":"reads_field","o":"odoo:event_mail.interval_type","f":0.85,"c":0.75} +{"s":"odoo:event_mail_registration._compute_scheduled_date","p":"reads_field","o":"odoo:event_mail.interval_unit","f":0.85,"c":0.75} +{"s":"odoo:event_mail_registration.scheduler_id","p":"target","o":"event.mail","f":0.95,"c":0.9} +{"s":"odoo:event_mail_slot._compute_scheduled_date","p":"reads_field","o":"odoo:event_mail.interval_type","f":0.85,"c":0.75} +{"s":"odoo:event_mail_slot._compute_scheduled_date","p":"reads_field","o":"odoo:event_mail.interval_unit","f":0.85,"c":0.75} +{"s":"odoo:event_mail_slot._compute_scheduled_date","p":"reads_field","o":"odoo:event_slot.end_datetime","f":0.85,"c":0.75} +{"s":"odoo:event_mail_slot._compute_scheduled_date","p":"reads_field","o":"odoo:event_slot.start_datetime","f":0.85,"c":0.75} +{"s":"odoo:event_mail_slot.event_slot_id","p":"target","o":"event.slot","f":0.95,"c":0.9} +{"s":"odoo:event_mail_slot.scheduler_id","p":"target","o":"event.mail","f":0.95,"c":0.9} +{"s":"odoo:event_registration.event_slot_id","p":"target","o":"event.slot","f":0.95,"c":0.9} +{"s":"odoo:event_registration.event_ticket_id","p":"target","o":"event.event.ticket","f":0.95,"c":0.9} +{"s":"odoo:event_registration.utm_campaign_id","p":"target","o":"utm.campaign","f":0.95,"c":0.9} +{"s":"odoo:event_registration.utm_medium_id","p":"target","o":"utm.medium","f":0.95,"c":0.9} +{"s":"odoo:event_registration.utm_source_id","p":"target","o":"utm.source","f":0.95,"c":0.9} +{"s":"odoo:event_slot._compute_is_sold_out","p":"reads_field","o":"odoo:event_event.seats_limited","f":0.85,"c":0.75} +{"s":"odoo:event_slot._compute_seats","p":"reads_field","o":"odoo:event_event.seats_max","f":0.85,"c":0.75} +{"s":"odoo:event_slot._compute_seats","p":"reads_field","o":"odoo:event_registration.active","f":0.85,"c":0.75} +{"s":"odoo:event_slot._compute_seats","p":"reads_field","o":"odoo:event_registration.state","f":0.85,"c":0.75} +{"s":"odoo:event_slot.event_id","p":"target","o":"event.event","f":0.95,"c":0.9} +{"s":"odoo:event_slot.registration_ids","p":"inverse_name","o":"event_slot_id","f":0.95,"c":0.9} +{"s":"odoo:event_slot.registration_ids","p":"target","o":"event.registration","f":0.95,"c":0.9} +{"s":"odoo:event_sponsor._compute_is_in_opening_hours","p":"reads_field","o":"odoo:event_event.date_begin","f":0.85,"c":0.75} +{"s":"odoo:event_sponsor._compute_is_in_opening_hours","p":"reads_field","o":"odoo:event_event.date_end","f":0.85,"c":0.75} +{"s":"odoo:event_sponsor._compute_is_in_opening_hours","p":"reads_field","o":"odoo:event_event.is_ongoing","f":0.85,"c":0.75} +{"s":"odoo:event_sponsor._compute_website_image_url","p":"reads_field","o":"odoo:res_partner.image_256","f":0.85,"c":0.75} +{"s":"odoo:event_sponsor._compute_website_url","p":"reads_field","o":"odoo:event_event.name","f":0.85,"c":0.75} +{"s":"odoo:event_sponsor.event_id","p":"target","o":"event.event","f":0.95,"c":0.9} +{"s":"odoo:event_sponsor.partner_id","p":"target","o":"res.partner","f":0.95,"c":0.9} +{"s":"odoo:event_track._compute_contact_email","p":"reads_field","o":"odoo:res_partner.email","f":0.85,"c":0.75} +{"s":"odoo:event_track._compute_contact_phone","p":"reads_field","o":"odoo:res_partner.phone","f":0.85,"c":0.75} +{"s":"odoo:event_track._compute_is_reminder_on","p":"reads_field","o":"odoo:event_track_visitor.is_blacklisted","f":0.85,"c":0.75} +{"s":"odoo:event_track._compute_is_reminder_on","p":"reads_field","o":"odoo:event_track_visitor.is_wishlisted","f":0.85,"c":0.75} +{"s":"odoo:event_track._compute_is_reminder_on","p":"reads_field","o":"odoo:event_track_visitor.partner_id","f":0.85,"c":0.75} +{"s":"odoo:event_track._compute_is_reminder_on","p":"reads_field","o":"odoo:event_track_visitor.visitor_id","f":0.85,"c":0.75} +{"s":"odoo:event_track._compute_partner_company_name","p":"reads_field","o":"odoo:res_partner.company_type","f":0.85,"c":0.75} +{"s":"odoo:event_track._compute_quiz_data","p":"reads_field","o":"odoo:event_track_visitor.partner_id","f":0.85,"c":0.75} +{"s":"odoo:event_track._compute_quiz_data","p":"reads_field","o":"odoo:event_track_visitor.quiz_completed","f":0.85,"c":0.75} +{"s":"odoo:event_track._compute_quiz_data","p":"reads_field","o":"odoo:event_track_visitor.quiz_points","f":0.85,"c":0.75} +{"s":"odoo:event_track._compute_quiz_data","p":"reads_field","o":"odoo:event_track_visitor.visitor_id","f":0.85,"c":0.75} +{"s":"odoo:event_track._compute_website_image_url","p":"reads_field","o":"odoo:res_partner.image_256","f":0.85,"c":0.75} +{"s":"odoo:event_track._compute_wishlist_visitor_ids","p":"reads_field","o":"odoo:event_track_visitor.is_wishlisted","f":0.85,"c":0.75} +{"s":"odoo:event_track._compute_wishlist_visitor_ids","p":"reads_field","o":"odoo:event_track_visitor.visitor_id","f":0.85,"c":0.75} +{"s":"odoo:event_track.event_track_visitor_ids","p":"inverse_name","o":"track_id","f":0.95,"c":0.9} +{"s":"odoo:event_track.event_track_visitor_ids","p":"target","o":"event.track.visitor","f":0.95,"c":0.9} +{"s":"odoo:event_track.partner_id","p":"target","o":"res.partner","f":0.95,"c":0.9} +{"s":"odoo:event_track.wishlist_visitor_ids","p":"target","o":"website.visitor","f":0.95,"c":0.9} +{"s":"odoo:event_track_visitor.partner_id","p":"target","o":"res.partner","f":0.95,"c":0.9} +{"s":"odoo:fleet_vehicle._compute_vehicle_name","p":"reads_field","o":"odoo:fleet_vehicle_model.name","f":0.85,"c":0.75} +{"s":"odoo:fleet_vehicle._compute_vehicle_name","p":"reads_field","o":"odoo:fleet_vehicle_model_brand.name","f":0.85,"c":0.75} +{"s":"odoo:fleet_vehicle.model_id","p":"target","o":"fleet.vehicle.model","f":0.95,"c":0.9} +{"s":"odoo:fleet_vehicle_log_contract._compute_contract_name","p":"reads_field","o":"odoo:fleet_vehicle.name","f":0.85,"c":0.75} +{"s":"odoo:fleet_vehicle_log_contract.vehicle_id","p":"target","o":"fleet.vehicle","f":0.95,"c":0.9} +{"s":"odoo:fleet_vehicle_log_services.purchaser_id","p":"target","o":"res.partner","f":0.95,"c":0.9} +{"s":"odoo:fleet_vehicle_log_services.vehicle_id","p":"target","o":"fleet.vehicle","f":0.95,"c":0.9} +{"s":"odoo:fleet_vehicle_model_brand._compute_model_count","p":"reads_field","o":"odoo:fleet_vehicle_model.active","f":0.85,"c":0.75} +{"s":"odoo:fleet_vehicle_model_brand.model_ids","p":"inverse_name","o":"brand_id","f":0.95,"c":0.9} +{"s":"odoo:fleet_vehicle_model_brand.model_ids","p":"target","o":"fleet.vehicle.model","f":0.95,"c":0.9} +{"s":"odoo:fleet_vehicle_odometer.driver_id","p":"target","o":"res.partner","f":0.95,"c":0.9} +{"s":"odoo:forum_forum._compute_tag_ids_usage","p":"reads_field","o":"odoo:forum_post.tag_ids","f":0.85,"c":0.75} +{"s":"odoo:forum_forum._compute_tag_ids_usage","p":"reads_field","o":"odoo:forum_tag.posts_count","f":0.85,"c":0.75} +{"s":"odoo:forum_forum.last_post_id","p":"target","o":"forum.post","f":0.95,"c":0.9} +{"s":"odoo:forum_forum.post_ids","p":"inverse_name","o":"forum_id","f":0.95,"c":0.9} +{"s":"odoo:forum_forum.post_ids","p":"target","o":"forum.post","f":0.95,"c":0.9} +{"s":"odoo:forum_forum.tag_most_used_ids","p":"target","o":"forum.tag","f":0.95,"c":0.9} +{"s":"odoo:forum_forum.tag_unused_ids","p":"target","o":"forum.tag","f":0.95,"c":0.9} +{"s":"odoo:forum_post._compute_has_validated_answer","p":"reads_field","o":"odoo:forum_post.is_correct","f":0.85,"c":0.75} +{"s":"odoo:forum_post._compute_relevancy","p":"reads_field","o":"odoo:forum_forum.relevancy_post_vote","f":0.85,"c":0.75} +{"s":"odoo:forum_post._compute_relevancy","p":"reads_field","o":"odoo:forum_forum.relevancy_time_decay","f":0.85,"c":0.75} +{"s":"odoo:forum_post._compute_vote_count","p":"reads_field","o":"odoo:forum_post_vote.vote","f":0.85,"c":0.75} +{"s":"odoo:forum_post.child_ids","p":"inverse_name","o":"parent_id","f":0.95,"c":0.9} +{"s":"odoo:forum_post.child_ids","p":"target","o":"forum.post","f":0.95,"c":0.9} +{"s":"odoo:forum_post.forum_id","p":"target","o":"forum.forum","f":0.95,"c":0.9} +{"s":"odoo:forum_post.vote_ids","p":"inverse_name","o":"post_id","f":0.95,"c":0.9} +{"s":"odoo:forum_post.vote_ids","p":"target","o":"forum.post.vote","f":0.95,"c":0.9} +{"s":"odoo:forum_tag._compute_posts_count","p":"reads_field","o":"odoo:forum_post.active","f":0.85,"c":0.75} +{"s":"odoo:forum_tag._compute_posts_count","p":"reads_field","o":"odoo:forum_post.state","f":0.85,"c":0.75} +{"s":"odoo:forum_tag._compute_posts_count","p":"reads_field","o":"odoo:forum_post.tag_ids","f":0.85,"c":0.75} +{"s":"odoo:forum_tag._compute_website_url","p":"reads_field","o":"odoo:forum_forum.name","f":0.85,"c":0.75} +{"s":"odoo:forum_tag.forum_id","p":"target","o":"forum.forum","f":0.95,"c":0.9} +{"s":"odoo:forum_tag.post_ids","p":"target","o":"forum.post","f":0.95,"c":0.9} +{"s":"odoo:gamification_badge._get_badge_user_stats","p":"reads_field","o":"odoo:gamification_badge_user.badge_id","f":0.85,"c":0.75} +{"s":"odoo:gamification_badge._get_badge_user_stats","p":"reads_field","o":"odoo:gamification_badge_user.create_date","f":0.85,"c":0.75} +{"s":"odoo:gamification_badge._get_badge_user_stats","p":"reads_field","o":"odoo:gamification_badge_user.user_id","f":0.85,"c":0.75} +{"s":"odoo:gamification_badge.owner_ids","p":"inverse_name","o":"badge_id","f":0.95,"c":0.9} +{"s":"odoo:gamification_badge.owner_ids","p":"target","o":"gamification.badge.user","f":0.95,"c":0.9} +{"s":"odoo:gamification_goal._get_completion","p":"reads_field","o":"odoo:gamification_goal_definition.condition","f":0.85,"c":0.75} +{"s":"odoo:gamification_goal.definition_id","p":"target","o":"gamification.goal.definition","f":0.95,"c":0.9} +{"s":"odoo:hr_applicant._compute_date_closed","p":"reads_field","o":"odoo:hr_recruitment_stage.hired_stage","f":0.85,"c":0.75} +{"s":"odoo:hr_applicant._compute_matching_skill_ids","p":"reads_field","o":"odoo:hr_job.expected_degree","f":0.85,"c":0.75} +{"s":"odoo:hr_applicant._compute_matching_skill_ids","p":"reads_field","o":"odoo:hr_job.job_skill_ids","f":0.85,"c":0.75} +{"s":"odoo:hr_applicant._compute_meeting_display","p":"reads_field","o":"odoo:calendar_event.start","f":0.85,"c":0.75} +{"s":"odoo:hr_applicant._compute_talent_pool_count","p":"reads_field","o":"odoo:hr_applicant.talent_pool_ids","f":0.85,"c":0.75} +{"s":"odoo:hr_applicant.company_id","p":"target","o":"res.company","f":0.95,"c":0.9} +{"s":"odoo:hr_applicant.department_id","p":"target","o":"hr.department","f":0.95,"c":0.9} +{"s":"odoo:hr_applicant.job_id","p":"target","o":"hr.job","f":0.95,"c":0.9} +{"s":"odoo:hr_applicant.meeting_ids","p":"inverse_name","o":"applicant_id","f":0.95,"c":0.9} +{"s":"odoo:hr_applicant.meeting_ids","p":"target","o":"calendar.event","f":0.95,"c":0.9} +{"s":"odoo:hr_applicant.pool_applicant_id","p":"target","o":"hr.applicant","f":0.95,"c":0.9} +{"s":"odoo:hr_applicant.stage_id","p":"target","o":"hr.recruitment.stage","f":0.95,"c":0.9} +{"s":"odoo:hr_applicant.user_id","p":"target","o":"res.users","f":0.95,"c":0.9} +{"s":"odoo:hr_attendance.linked_overtime_ids","p":"target","o":"hr.attendance.overtime.line","f":0.95,"c":0.9} +{"s":"odoo:hr_department._compute_complete_name","p":"reads_field","o":"odoo:hr_department.complete_name","f":0.85,"c":0.75} +{"s":"odoo:hr_department.company_id","p":"target","o":"res.company","f":0.95,"c":0.9} +{"s":"odoo:hr_department.master_department_id","p":"target","o":"hr.department","f":0.95,"c":0.9} +{"s":"odoo:hr_department.parent_id","p":"target","o":"hr.department","f":0.95,"c":0.9} +{"s":"odoo:hr_employee._compute_current_version_id","p":"reads_field","o":"odoo:hr_version.active","f":0.85,"c":0.75} +{"s":"odoo:hr_employee._compute_current_version_id","p":"reads_field","o":"odoo:hr_version.date_version","f":0.85,"c":0.75} +{"s":"odoo:hr_employee._compute_is_trusted_bank_account","p":"reads_field","o":"odoo:res_partner_bank.allow_out_payment","f":0.85,"c":0.75} +{"s":"odoo:hr_employee._compute_presence_state","p":"reads_field","o":"odoo:res_users.im_status","f":0.85,"c":0.75} +{"s":"odoo:hr_employee._compute_work_contact_details","p":"reads_field","o":"odoo:res_partner.email","f":0.85,"c":0.75} +{"s":"odoo:hr_employee._compute_work_contact_details","p":"reads_field","o":"odoo:res_partner.phone","f":0.85,"c":0.75} +{"s":"odoo:hr_employee._compute_work_location_name","p":"reads_field","o":"odoo:hr_work_location.name","f":0.85,"c":0.75} +{"s":"odoo:hr_employee._compute_work_location_type","p":"reads_field","o":"odoo:hr_work_location.location_type","f":0.85,"c":0.75} +{"s":"odoo:hr_employee._onchange_phone_validation_employee","p":"reads_field","o":"odoo:res_partner.email","f":0.85,"c":0.75} +{"s":"odoo:hr_employee._onchange_phone_validation_employee","p":"reads_field","o":"odoo:res_partner.phone","f":0.85,"c":0.75} +{"s":"odoo:hr_employee.bank_account_ids","p":"target","o":"res.partner.bank","f":0.95,"c":0.9} +{"s":"odoo:hr_employee.coach_id","p":"target","o":"hr.employee","f":0.95,"c":0.9} +{"s":"odoo:hr_employee.current_version_id","p":"target","o":"hr.version","f":0.95,"c":0.9} +{"s":"odoo:hr_employee.primary_bank_account_id","p":"target","o":"res.partner.bank","f":0.95,"c":0.9} +{"s":"odoo:hr_employee.user_id","p":"target","o":"res.users","f":0.95,"c":0.9} +{"s":"odoo:hr_employee.version_id","p":"target","o":"hr.version","f":0.95,"c":0.9} +{"s":"odoo:hr_employee.version_ids","p":"inverse_name","o":"employee_id","f":0.95,"c":0.9} +{"s":"odoo:hr_employee.version_ids","p":"target","o":"hr.version","f":0.95,"c":0.9} +{"s":"odoo:hr_employee.work_contact_id","p":"target","o":"res.partner","f":0.95,"c":0.9} +{"s":"odoo:hr_expense._compute_can_be_reinvoiced","p":"reads_field","o":"odoo:product_product.expense_policy","f":0.85,"c":0.75} +{"s":"odoo:hr_expense._compute_from_employee_id","p":"reads_field","o":"odoo:hr_employee.department_id","f":0.85,"c":0.75} +{"s":"odoo:hr_expense._compute_state","p":"reads_field","o":"odoo:account_move.payment_state","f":0.85,"c":0.75} +{"s":"odoo:hr_expense._compute_state","p":"reads_field","o":"odoo:account_move.state","f":0.85,"c":0.75} +{"s":"odoo:hr_expense._compute_total_amount","p":"reads_field","o":"odoo:res_users.partner_id","f":0.85,"c":0.75} +{"s":"odoo:hr_expense._compute_uom_id","p":"reads_field","o":"odoo:product_product.uom_id","f":0.85,"c":0.75} +{"s":"odoo:hr_expense.account_id","p":"target","o":"account.account","f":0.95,"c":0.9} +{"s":"odoo:hr_expense.account_move_id","p":"target","o":"account.move","f":0.95,"c":0.9} +{"s":"odoo:hr_expense.currency_id","p":"target","o":"res.currency","f":0.95,"c":0.9} +{"s":"odoo:hr_expense.department_id","p":"target","o":"hr.department","f":0.95,"c":0.9} +{"s":"odoo:hr_expense.duplicate_expense_ids","p":"target","o":"hr.expense","f":0.95,"c":0.9} +{"s":"odoo:hr_expense.employee_id","p":"target","o":"hr.employee","f":0.95,"c":0.9} +{"s":"odoo:hr_expense.manager_id","p":"target","o":"res.users","f":0.95,"c":0.9} +{"s":"odoo:hr_expense.payment_method_line_id","p":"target","o":"account.payment.method.line","f":0.95,"c":0.9} +{"s":"odoo:hr_expense.product_id","p":"target","o":"product.product","f":0.95,"c":0.9} +{"s":"odoo:hr_expense.product_uom_id","p":"target","o":"uom.uom","f":0.95,"c":0.9} +{"s":"odoo:hr_expense.same_receipt_expense_ids","p":"target","o":"hr.expense","f":0.95,"c":0.9} +{"s":"odoo:hr_expense.selectable_payment_method_line_ids","p":"target","o":"account.payment.method.line","f":0.95,"c":0.9} +{"s":"odoo:hr_expense.tax_ids","p":"target","o":"account.tax","f":0.95,"c":0.9} +{"s":"odoo:hr_individual_skill_mixin.skill_id","p":"target","o":"hr.skill","f":0.95,"c":0.9} +{"s":"odoo:hr_individual_skill_mixin.skill_level_id","p":"target","o":"hr.skill.level","f":0.95,"c":0.9} +{"s":"odoo:hr_job._compute_employees","p":"reads_field","o":"odoo:hr_employee.active","f":0.85,"c":0.75} +{"s":"odoo:hr_job._compute_employees","p":"reads_field","o":"odoo:hr_employee.job_id","f":0.85,"c":0.75} +{"s":"odoo:hr_job._compute_extended_interviewer_ids","p":"reads_field","o":"odoo:hr_applicant.interviewer_ids","f":0.85,"c":0.75} +{"s":"odoo:hr_job._compute_no_of_hired_employee","p":"reads_field","o":"odoo:hr_applicant.date_closed","f":0.85,"c":0.75} +{"s":"odoo:hr_job.allowed_user_ids","p":"target","o":"res.users","f":0.95,"c":0.9} +{"s":"odoo:hr_job.application_ids","p":"inverse_name","o":"job_id","f":0.95,"c":0.9} +{"s":"odoo:hr_job.application_ids","p":"target","o":"hr.applicant","f":0.95,"c":0.9} +{"s":"odoo:hr_job.employee_ids","p":"inverse_name","o":"job_id","f":0.95,"c":0.9} +{"s":"odoo:hr_job.employee_ids","p":"target","o":"hr.employee","f":0.95,"c":0.9} +{"s":"odoo:hr_job.extended_interviewer_ids","p":"target","o":"res.users","f":0.95,"c":0.9} +{"s":"odoo:hr_leave._compute_duration","p":"reads_field","o":"odoo:hr_leave_type.request_unit","f":0.85,"c":0.75} +{"s":"odoo:hr_leave._compute_tz","p":"reads_field","o":"odoo:resource_calendar.tz","f":0.85,"c":0.75} +{"s":"odoo:hr_leave.company_id","p":"target","o":"res.company","f":0.95,"c":0.9} +{"s":"odoo:hr_leave.department_id","p":"target","o":"hr.department","f":0.95,"c":0.9} +{"s":"odoo:hr_leave.holiday_status_id","p":"target","o":"hr.leave.type","f":0.95,"c":0.9} +{"s":"odoo:hr_leave.resource_calendar_id","p":"target","o":"resource.calendar","f":0.95,"c":0.9} +{"s":"odoo:hr_leave.supported_attachment_ids","p":"target","o":"ir.attachment","f":0.95,"c":0.9} +{"s":"odoo:hr_leave_accrual_plan._compute_company_id","p":"reads_field","o":"odoo:hr_leave_type.company_id","f":0.85,"c":0.75} +{"s":"odoo:hr_leave_accrual_plan.company_id","p":"target","o":"res.company","f":0.95,"c":0.9} +{"s":"odoo:hr_leave_accrual_plan.time_off_type_id","p":"target","o":"hr.leave.type","f":0.95,"c":0.9} +{"s":"odoo:hr_leave_allocation.accrual_plan_id","p":"target","o":"hr.leave.accrual.plan","f":0.95,"c":0.9} +{"s":"odoo:hr_leave_allocation.department_id","p":"target","o":"hr.department","f":0.95,"c":0.9} +{"s":"odoo:hr_leave_allocation.holiday_status_id","p":"target","o":"hr.leave.type","f":0.95,"c":0.9} +{"s":"odoo:hr_leave_allocation.manager_id","p":"target","o":"hr.employee","f":0.95,"c":0.9} +{"s":"odoo:hr_leave_type.country_id","p":"target","o":"res.country","f":0.95,"c":0.9} +{"s":"odoo:hr_recruitment_source._compute_url","p":"reads_field","o":"odoo:hr_job.company_id","f":0.85,"c":0.75} +{"s":"odoo:hr_recruitment_source.job_id","p":"target","o":"hr.job","f":0.95,"c":0.9} +{"s":"odoo:hr_version._compute_company_id","p":"reads_field","o":"odoo:hr_employee.company_id","f":0.85,"c":0.75} +{"s":"odoo:hr_version._compute_dates","p":"reads_field","o":"odoo:hr_version.date_version","f":0.85,"c":0.75} +{"s":"odoo:hr_version._compute_is_flexible","p":"reads_field","o":"odoo:resource_calendar.flexible_hours","f":0.85,"c":0.75} +{"s":"odoo:hr_version._compute_job_title","p":"reads_field","o":"odoo:hr_job.name","f":0.85,"c":0.75} +{"s":"odoo:hr_version.allowed_country_state_ids","p":"target","o":"res.country.state","f":0.95,"c":0.9} +{"s":"odoo:hr_version.company_id","p":"target","o":"res.company","f":0.95,"c":0.9} +{"s":"odoo:hr_version.employee_id","p":"target","o":"hr.employee","f":0.95,"c":0.9} +{"s":"odoo:hr_version.job_id","p":"target","o":"hr.job","f":0.95,"c":0.9} +{"s":"odoo:hr_version.resource_calendar_id","p":"target","o":"resource.calendar","f":0.95,"c":0.9} +{"s":"odoo:hr_version.structure_type_id","p":"target","o":"hr.payroll.structure.type","f":0.95,"c":0.9} +{"s":"odoo:hr_work_entry.version_id","p":"target","o":"hr.version","f":0.95,"c":0.9} +{"s":"odoo:im_livechat_channel._compute_available_operator_ids","p":"reads_field","o":"odoo:res_users.channel_member_ids","f":0.85,"c":0.75} +{"s":"odoo:im_livechat_channel._compute_available_operator_ids","p":"reads_field","o":"odoo:res_users.im_status","f":0.85,"c":0.75} +{"s":"odoo:im_livechat_channel._compute_available_operator_ids","p":"reads_field","o":"odoo:res_users.is_in_call","f":0.85,"c":0.75} +{"s":"odoo:im_livechat_channel._compute_available_operator_ids","p":"reads_field","o":"odoo:res_users.partner_id","f":0.85,"c":0.75} +{"s":"odoo:im_livechat_channel._compute_chatbot_script_count","p":"reads_field","o":"odoo:im_livechat_channel_rule.chatbot_script_id","f":0.85,"c":0.75} +{"s":"odoo:im_livechat_channel._compute_ongoing_sessions_count","p":"reads_field","o":"odoo:discuss_channel.livechat_end_dt","f":0.85,"c":0.75} +{"s":"odoo:im_livechat_channel._compute_remaining_session_capacity","p":"reads_field","o":"odoo:res_users.livechat_is_in_call","f":0.85,"c":0.75} +{"s":"odoo:im_livechat_channel._compute_remaining_session_capacity","p":"reads_field","o":"odoo:res_users.livechat_ongoing_session_count","f":0.85,"c":0.75} +{"s":"odoo:im_livechat_channel.available_operator_ids","p":"target","o":"res.users","f":0.95,"c":0.9} +{"s":"odoo:im_livechat_channel.channel_ids","p":"inverse_name","o":"livechat_channel_id","f":0.95,"c":0.9} +{"s":"odoo:im_livechat_channel.channel_ids","p":"target","o":"discuss.channel","f":0.95,"c":0.9} +{"s":"odoo:im_livechat_channel.rule_ids","p":"inverse_name","o":"channel_id","f":0.95,"c":0.9} +{"s":"odoo:im_livechat_channel.rule_ids","p":"target","o":"im_livechat.channel.rule","f":0.95,"c":0.9} +{"s":"odoo:im_livechat_channel.user_ids","p":"target","o":"res.users","f":0.95,"c":0.9} +{"s":"odoo:im_livechat_channel_member_history._compute_avatar_128","p":"reads_field","o":"odoo:mail_guest.avatar_128","f":0.85,"c":0.75} +{"s":"odoo:im_livechat_channel_member_history._compute_avatar_128","p":"reads_field","o":"odoo:res_partner.avatar_128","f":0.85,"c":0.75} +{"s":"odoo:im_livechat_channel_member_history._compute_call_duration_hour","p":"reads_field","o":"odoo:discuss_call_history.duration_hour","f":0.85,"c":0.75} +{"s":"odoo:im_livechat_channel_member_history._compute_display_name","p":"reads_field","o":"odoo:mail_guest.name","f":0.85,"c":0.75} +{"s":"odoo:im_livechat_channel_member_history._compute_display_name","p":"reads_field","o":"odoo:res_partner.display_name","f":0.85,"c":0.75} +{"s":"odoo:im_livechat_channel_member_history._compute_display_name","p":"reads_field","o":"odoo:res_partner.name","f":0.85,"c":0.75} +{"s":"odoo:im_livechat_channel_member_history._compute_help_status","p":"reads_field","o":"odoo:discuss_channel.livechat_agent_providing_help_history","f":0.85,"c":0.75} +{"s":"odoo:im_livechat_channel_member_history._compute_help_status","p":"reads_field","o":"odoo:discuss_channel.livechat_agent_requesting_help_history","f":0.85,"c":0.75} +{"s":"odoo:im_livechat_channel_member_history._compute_rating_id","p":"reads_field","o":"odoo:discuss_channel.rating_ids","f":0.85,"c":0.75} +{"s":"odoo:im_livechat_channel_member_history._compute_session_duration_hour","p":"reads_field","o":"odoo:discuss_channel.livechat_end_dt","f":0.85,"c":0.75} +{"s":"odoo:im_livechat_channel_member_history._compute_session_duration_hour","p":"reads_field","o":"odoo:discuss_channel.message_ids","f":0.85,"c":0.75} +{"s":"odoo:im_livechat_channel_member_history.agent_expertise_ids","p":"target","o":"im_livechat.expertise","f":0.95,"c":0.9} +{"s":"odoo:im_livechat_channel_member_history.call_history_ids","p":"target","o":"discuss.call.history","f":0.95,"c":0.9} +{"s":"odoo:im_livechat_channel_member_history.channel_id","p":"target","o":"discuss.channel","f":0.95,"c":0.9} +{"s":"odoo:im_livechat_channel_member_history.chatbot_script_id","p":"target","o":"chatbot.script","f":0.95,"c":0.9} +{"s":"odoo:im_livechat_channel_member_history.guest_id","p":"target","o":"mail.guest","f":0.95,"c":0.9} +{"s":"odoo:im_livechat_channel_member_history.partner_id","p":"target","o":"res.partner","f":0.95,"c":0.9} +{"s":"odoo:im_livechat_channel_member_history.rating_id","p":"target","o":"rating.rating","f":0.95,"c":0.9} +{"s":"odoo:ir_actions_server.activity_type_id","p":"target","o":"mail.activity.type","f":0.95,"c":0.9} +{"s":"odoo:ir_actions_server.activity_user_id","p":"target","o":"res.users","f":0.95,"c":0.9} +{"s":"odoo:ir_actions_server.partner_ids","p":"target","o":"res.partner","f":0.95,"c":0.9} +{"s":"odoo:ir_actions_server.template_id","p":"target","o":"mail.template","f":0.95,"c":0.9} +{"s":"odoo:l10n_ar_payment_register_withholding._compute_base_amount","p":"reads_field","o":"odoo:account_payment_register.amount","f":0.85,"c":0.75} +{"s":"odoo:l10n_ar_payment_register_withholding.payment_register_id","p":"target","o":"account.payment.register","f":0.95,"c":0.9} +{"s":"odoo:l10n_in_ewaybill._compute_is_process_through_irn","p":"reads_field","o":"odoo:account_move.l10n_in_edi_status","f":0.85,"c":0.75} +{"s":"odoo:l10n_in_ewaybill.account_move_id","p":"target","o":"account.move","f":0.95,"c":0.9} +{"s":"odoo:l10n_in_ewaybill.company_id","p":"target","o":"res.company","f":0.95,"c":0.9} +{"s":"odoo:l10n_in_ewaybill.partner_bill_from_id","p":"target","o":"res.partner","f":0.95,"c":0.9} +{"s":"odoo:l10n_in_ewaybill.partner_bill_to_id","p":"target","o":"res.partner","f":0.95,"c":0.9} +{"s":"odoo:l10n_in_ewaybill.partner_ship_from_id","p":"target","o":"res.partner","f":0.95,"c":0.9} +{"s":"odoo:l10n_in_ewaybill.partner_ship_to_id","p":"target","o":"res.partner","f":0.95,"c":0.9} +{"s":"odoo:l10n_latam_check._compute_bank_id","p":"reads_field","o":"odoo:account_payment.partner_id","f":0.85,"c":0.75} +{"s":"odoo:l10n_latam_check._compute_current_journal","p":"reads_field","o":"odoo:account_payment.state","f":0.85,"c":0.75} +{"s":"odoo:l10n_latam_check._compute_issue_state","p":"reads_field","o":"odoo:account_move_line.amount_residual","f":0.85,"c":0.75} +{"s":"odoo:l10n_latam_check._compute_issuer_vat","p":"reads_field","o":"odoo:account_payment.partner_id","f":0.85,"c":0.75} +{"s":"odoo:l10n_latam_check.bank_id","p":"target","o":"res.bank","f":0.95,"c":0.9} +{"s":"odoo:l10n_latam_check.current_journal_id","p":"target","o":"account.journal","f":0.95,"c":0.9} +{"s":"odoo:l10n_latam_check.operation_ids","p":"target","o":"account.payment","f":0.95,"c":0.9} +{"s":"odoo:l10n_latam_check.outstanding_line_id","p":"target","o":"account.move.line","f":0.95,"c":0.9} +{"s":"odoo:l10n_latam_check.payment_id","p":"target","o":"account.payment","f":0.95,"c":0.9} +{"s":"odoo:l10n_latam_payment_mass_transfer.company_id","p":"target","o":"res.company","f":0.95,"c":0.9} +{"s":"odoo:l10n_latam_payment_mass_transfer.journal_id","p":"target","o":"account.journal","f":0.95,"c":0.9} +{"s":"odoo:l10n_latam_payment_register_check._compute_bank_id","p":"reads_field","o":"odoo:account_payment_method_line.code","f":0.85,"c":0.75} +{"s":"odoo:l10n_latam_payment_register_check._compute_bank_id","p":"reads_field","o":"odoo:account_payment_register.partner_id","f":0.85,"c":0.75} +{"s":"odoo:l10n_latam_payment_register_check._compute_issuer_vat","p":"reads_field","o":"odoo:account_payment_method_line.code","f":0.85,"c":0.75} +{"s":"odoo:l10n_latam_payment_register_check._compute_issuer_vat","p":"reads_field","o":"odoo:account_payment_register.partner_id","f":0.85,"c":0.75} +{"s":"odoo:l10n_latam_payment_register_check.bank_id","p":"target","o":"res.bank","f":0.95,"c":0.9} +{"s":"odoo:l10n_latam_payment_register_check.payment_register_id","p":"target","o":"account.payment.register","f":0.95,"c":0.9} +{"s":"odoo:link_tracker._compute_count","p":"reads_field","o":"odoo:link_tracker_click.link_id","f":0.85,"c":0.75} +{"s":"odoo:link_tracker.link_click_ids","p":"inverse_name","o":"link_id","f":0.95,"c":0.9} +{"s":"odoo:link_tracker.link_click_ids","p":"target","o":"link.tracker.click","f":0.95,"c":0.9} +{"s":"odoo:loyalty_program._compute_mail_template_id","p":"reads_field","o":"odoo:loyalty_mail.mail_template_id","f":0.85,"c":0.75} +{"s":"odoo:loyalty_program._compute_payment_program_discount_product_id","p":"reads_field","o":"odoo:loyalty_reward.discount_line_product_id","f":0.85,"c":0.75} +{"s":"odoo:loyalty_program._compute_pos_report_print_id","p":"reads_field","o":"odoo:loyalty_mail.pos_report_print_id","f":0.85,"c":0.75} +{"s":"odoo:loyalty_program.communication_plan_ids","p":"inverse_name","o":"program_id","f":0.95,"c":0.9} +{"s":"odoo:loyalty_program.communication_plan_ids","p":"target","o":"loyalty.mail","f":0.95,"c":0.9} +{"s":"odoo:loyalty_program.currency_id","p":"target","o":"res.currency","f":0.95,"c":0.9} +{"s":"odoo:loyalty_program.mail_template_id","p":"target","o":"mail.template","f":0.95,"c":0.9} +{"s":"odoo:loyalty_program.payment_program_discount_product_id","p":"target","o":"product.product","f":0.95,"c":0.9} +{"s":"odoo:loyalty_program.pos_config_ids","p":"target","o":"pos.config","f":0.95,"c":0.9} +{"s":"odoo:loyalty_program.pos_report_print_id","p":"target","o":"ir.actions.report","f":0.95,"c":0.9} +{"s":"odoo:loyalty_program.reward_ids","p":"inverse_name","o":"program_id","f":0.95,"c":0.9} +{"s":"odoo:loyalty_program.reward_ids","p":"target","o":"loyalty.reward","f":0.95,"c":0.9} +{"s":"odoo:loyalty_reward._compute_reward_product_uom_id","p":"reads_field","o":"odoo:product_template.uom_id","f":0.85,"c":0.75} +{"s":"odoo:loyalty_reward.all_discount_product_ids","p":"target","o":"product.product","f":0.95,"c":0.9} +{"s":"odoo:loyalty_reward.reward_product_id","p":"target","o":"product.product","f":0.95,"c":0.9} +{"s":"odoo:loyalty_reward.reward_product_ids","p":"target","o":"product.product","f":0.95,"c":0.9} +{"s":"odoo:loyalty_reward.reward_product_uom_id","p":"target","o":"uom.uom","f":0.95,"c":0.9} +{"s":"odoo:loyalty_rule.valid_product_ids","p":"target","o":"product.product","f":0.95,"c":0.9} +{"s":"odoo:lunch_product._compute_product_image","p":"reads_field","o":"odoo:lunch_product_category.image_128","f":0.85,"c":0.75} +{"s":"odoo:lunch_product.category_id","p":"target","o":"lunch.product.category","f":0.95,"c":0.9} +{"s":"odoo:mail_activity.activity_type_id","p":"target","o":"mail.activity.type","f":0.95,"c":0.9} +{"s":"odoo:mail_activity.user_id","p":"target","o":"res.users","f":0.95,"c":0.9} +{"s":"odoo:mail_activity_mixin._compute_activity_calendar_event_id","p":"reads_field","o":"odoo:mail_activity.calendar_event_id","f":0.85,"c":0.75} +{"s":"odoo:mail_activity_mixin._compute_activity_date_deadline","p":"reads_field","o":"odoo:mail_activity.date_deadline","f":0.85,"c":0.75} +{"s":"odoo:mail_activity_mixin._compute_activity_exception_type","p":"reads_field","o":"odoo:mail_activity_type.decoration_type","f":0.85,"c":0.75} +{"s":"odoo:mail_activity_mixin._compute_activity_exception_type","p":"reads_field","o":"odoo:mail_activity_type.icon","f":0.85,"c":0.75} +{"s":"odoo:mail_activity_mixin._compute_activity_state","p":"reads_field","o":"odoo:mail_activity.state","f":0.85,"c":0.75} +{"s":"odoo:mail_activity_mixin._compute_activity_user_id","p":"reads_field","o":"odoo:mail_activity.user_id","f":0.85,"c":0.75} +{"s":"odoo:mail_activity_mixin._compute_my_activity_date_deadline","p":"reads_field","o":"odoo:mail_activity.date_deadline","f":0.85,"c":0.75} +{"s":"odoo:mail_activity_mixin._compute_my_activity_date_deadline","p":"reads_field","o":"odoo:mail_activity.user_id","f":0.85,"c":0.75} +{"s":"odoo:mail_activity_mixin.activity_ids","p":"inverse_name","o":"res_id","f":0.95,"c":0.9} +{"s":"odoo:mail_activity_mixin.activity_ids","p":"target","o":"mail.activity","f":0.95,"c":0.9} +{"s":"odoo:mail_activity_mixin.activity_user_id","p":"target","o":"res.users","f":0.95,"c":0.9} +{"s":"odoo:mail_activity_plan._compute_has_user_on_demand","p":"reads_field","o":"odoo:mail_activity_plan_template.responsible_type","f":0.85,"c":0.75} +{"s":"odoo:mail_activity_plan.res_model_id","p":"target","o":"ir.model","f":0.95,"c":0.9} +{"s":"odoo:mail_activity_plan.template_ids","p":"inverse_name","o":"plan_id","f":0.95,"c":0.9} +{"s":"odoo:mail_activity_plan.template_ids","p":"target","o":"mail.activity.plan.template","f":0.95,"c":0.9} +{"s":"odoo:mail_activity_plan_template.next_activity_ids","p":"target","o":"mail.activity.type","f":0.95,"c":0.9} +{"s":"odoo:mail_activity_plan_template.responsible_id","p":"target","o":"res.users","f":0.95,"c":0.9} +{"s":"odoo:mail_activity_type.mail_template_ids","p":"target","o":"mail.template","f":0.95,"c":0.9} +{"s":"odoo:mail_activity_type.suggested_next_type_ids","p":"target","o":"mail.activity.type","f":0.95,"c":0.9} +{"s":"odoo:mail_activity_type.triggered_next_type_id","p":"target","o":"mail.activity.type","f":0.95,"c":0.9} +{"s":"odoo:mail_alias._compute_alias_full_name","p":"reads_field","o":"odoo:mail_alias_domain.name","f":0.85,"c":0.75} +{"s":"odoo:mail_alias.alias_domain_id","p":"target","o":"mail.alias.domain","f":0.95,"c":0.9} +{"s":"odoo:mail_group._compute_mail_group_message_last_month_count","p":"reads_field","o":"odoo:mail_group_message.create_date","f":0.85,"c":0.75} +{"s":"odoo:mail_group._compute_mail_group_message_last_month_count","p":"reads_field","o":"odoo:mail_group_message.moderation_status","f":0.85,"c":0.75} +{"s":"odoo:mail_group._compute_mail_group_message_moderation_count","p":"reads_field","o":"odoo:mail_group_message.moderation_status","f":0.85,"c":0.75} +{"s":"odoo:mail_group.mail_group_message_ids","p":"inverse_name","o":"mail_group_id","f":0.95,"c":0.9} +{"s":"odoo:mail_group.mail_group_message_ids","p":"target","o":"mail.group.message","f":0.95,"c":0.9} +{"s":"odoo:mail_group.member_partner_ids","p":"target","o":"res.partner","f":0.95,"c":0.9} +{"s":"odoo:mail_group.moderator_ids","p":"target","o":"res.users","f":0.95,"c":0.9} +{"s":"odoo:mail_group_member._compute_email","p":"reads_field","o":"odoo:res_partner.email","f":0.85,"c":0.75} +{"s":"odoo:mail_group_member.partner_id","p":"target","o":"res.partner","f":0.95,"c":0.9} +{"s":"odoo:mail_guest._compute_im_status","p":"reads_field","o":"odoo:mail_presence.status","f":0.85,"c":0.75} +{"s":"odoo:mail_guest.presence_ids","p":"inverse_name","o":"guest_id","f":0.95,"c":0.9} +{"s":"odoo:mail_guest.presence_ids","p":"target","o":"mail.presence","f":0.95,"c":0.9} +{"s":"odoo:mail_mail.unrestricted_attachment_ids","p":"target","o":"ir.attachment","f":0.95,"c":0.9} +{"s":"odoo:mail_message.linked_message_ids","p":"target","o":"mail.message","f":0.95,"c":0.9} +{"s":"odoo:mail_thread.message_partner_ids","p":"target","o":"res.partner","f":0.95,"c":0.9} +{"s":"odoo:mailing_mailing._compute_sms_has_iap_failure","p":"reads_field","o":"odoo:mailing_trace.failure_type","f":0.85,"c":0.75} +{"s":"odoo:mailing_mailing.mailing_model_id","p":"target","o":"ir.model","f":0.95,"c":0.9} +{"s":"odoo:mailing_mailing.mailing_trace_ids","p":"inverse_name","o":"mass_mailing_id","f":0.95,"c":0.9} +{"s":"odoo:mailing_mailing.mailing_trace_ids","p":"target","o":"mailing.trace","f":0.95,"c":0.9} +{"s":"odoo:mailing_mailing.medium_id","p":"target","o":"utm.medium","f":0.95,"c":0.9} +{"s":"odoo:mrp_bom._compute_possible_product_template_attribute_value_ids","p":"reads_field","o":"odoo:product_attribute.create_variant","f":0.85,"c":0.75} +{"s":"odoo:mrp_bom._compute_possible_product_template_attribute_value_ids","p":"reads_field","o":"odoo:product_template_attribute_line.value_ids","f":0.85,"c":0.75} +{"s":"odoo:mrp_bom._compute_possible_product_template_attribute_value_ids","p":"reads_field","o":"odoo:product_template_attribute_value.ptav_active","f":0.85,"c":0.75} +{"s":"odoo:mrp_bom.possible_product_template_attribute_value_ids","p":"target","o":"product.template.attribute.value","f":0.95,"c":0.9} +{"s":"odoo:mrp_bom.product_id","p":"target","o":"product.product","f":0.95,"c":0.9} +{"s":"odoo:mrp_bom.product_tmpl_id","p":"target","o":"product.template","f":0.95,"c":0.9} +{"s":"odoo:mrp_bom.product_uom_id","p":"target","o":"uom.uom","f":0.95,"c":0.9} +{"s":"odoo:mrp_production._compute_allowed_uom_ids","p":"reads_field","o":"odoo:product_product.bom_ids","f":0.85,"c":0.75} +{"s":"odoo:mrp_production._compute_allowed_uom_ids","p":"reads_field","o":"odoo:product_product.uom_id","f":0.85,"c":0.75} +{"s":"odoo:mrp_production._compute_allowed_uom_ids","p":"reads_field","o":"odoo:product_product.uom_ids","f":0.85,"c":0.75} +{"s":"odoo:mrp_production._compute_components_availability","p":"reads_field","o":"odoo:stock_move.forecast_availability","f":0.85,"c":0.75} +{"s":"odoo:mrp_production._compute_components_availability","p":"reads_field","o":"odoo:stock_move.forecast_expected_date","f":0.85,"c":0.75} +{"s":"odoo:mrp_production._compute_date_deadline","p":"reads_field","o":"odoo:stock_move.date_deadline","f":0.85,"c":0.75} +{"s":"odoo:mrp_production._compute_date_finished","p":"reads_field","o":"odoo:mrp_workorder.duration_expected","f":0.85,"c":0.75} +{"s":"odoo:mrp_production._compute_delay_alert_date","p":"reads_field","o":"odoo:stock_move.delay_alert_date","f":0.85,"c":0.75} +{"s":"odoo:mrp_production._compute_duration","p":"reads_field","o":"odoo:mrp_workorder.duration","f":0.85,"c":0.75} +{"s":"odoo:mrp_production._compute_duration_expected","p":"reads_field","o":"odoo:mrp_workorder.duration_expected","f":0.85,"c":0.75} +{"s":"odoo:mrp_production._compute_is_planned","p":"reads_field","o":"odoo:mrp_workorder.date_finished","f":0.85,"c":0.75} +{"s":"odoo:mrp_production._compute_is_planned","p":"reads_field","o":"odoo:mrp_workorder.date_start","f":0.85,"c":0.75} +{"s":"odoo:mrp_production._compute_lines","p":"reads_field","o":"odoo:stock_move.move_line_ids","f":0.85,"c":0.75} +{"s":"odoo:mrp_production._compute_move_line_raw_ids","p":"reads_field","o":"odoo:stock_move.move_line_ids","f":0.85,"c":0.75} +{"s":"odoo:mrp_production._compute_mrp_production_backorder","p":"reads_field","o":"odoo:mrp_production_group.production_ids","f":0.85,"c":0.75} +{"s":"odoo:mrp_production._compute_mrp_production_child_count","p":"reads_field","o":"odoo:mrp_production_group.production_ids","f":0.85,"c":0.75} +{"s":"odoo:mrp_production._compute_mrp_production_source_count","p":"reads_field","o":"odoo:mrp_production_group.production_ids","f":0.85,"c":0.75} +{"s":"odoo:mrp_production._compute_product_uom_qty","p":"reads_field","o":"odoo:product_product.uom_id","f":0.85,"c":0.75} +{"s":"odoo:mrp_production._compute_purchase_order_count","p":"reads_field","o":"odoo:stock_reference.purchase_ids","f":0.85,"c":0.75} +{"s":"odoo:mrp_production._compute_reservation_state","p":"reads_field","o":"odoo:stock_move.state","f":0.85,"c":0.75} +{"s":"odoo:mrp_production._compute_sale_order_count","p":"reads_field","o":"odoo:stock_reference.sale_ids","f":0.85,"c":0.75} +{"s":"odoo:mrp_production._compute_show_generate_bom","p":"reads_field","o":"odoo:stock_move.product_id","f":0.85,"c":0.75} +{"s":"odoo:mrp_production._compute_show_lots","p":"reads_field","o":"odoo:product_product.tracking","f":0.85,"c":0.75} +{"s":"odoo:mrp_production._compute_state","p":"reads_field","o":"odoo:mrp_workorder.state","f":0.85,"c":0.75} +{"s":"odoo:mrp_production._compute_state","p":"reads_field","o":"odoo:stock_move.picked","f":0.85,"c":0.75} +{"s":"odoo:mrp_production._compute_state","p":"reads_field","o":"odoo:stock_move.quantity","f":0.85,"c":0.75} +{"s":"odoo:mrp_production._compute_state","p":"reads_field","o":"odoo:stock_move.state","f":0.85,"c":0.75} +{"s":"odoo:mrp_production._compute_unreserve_visible","p":"reads_field","o":"odoo:stock_move.product_uom_qty","f":0.85,"c":0.75} +{"s":"odoo:mrp_production._get_produced_qty","p":"reads_field","o":"odoo:mrp_workorder.state","f":0.85,"c":0.75} +{"s":"odoo:mrp_production._get_produced_qty","p":"reads_field","o":"odoo:stock_move.quantity","f":0.85,"c":0.75} +{"s":"odoo:mrp_production.allowed_uom_ids","p":"target","o":"uom.uom","f":0.95,"c":0.9} +{"s":"odoo:mrp_production.bom_id","p":"target","o":"mrp.bom","f":0.95,"c":0.9} +{"s":"odoo:mrp_production.finished_move_line_ids","p":"target","o":"stock.move.line","f":0.95,"c":0.9} +{"s":"odoo:mrp_production.location_dest_id","p":"target","o":"stock.location","f":0.95,"c":0.9} +{"s":"odoo:mrp_production.location_src_id","p":"target","o":"stock.location","f":0.95,"c":0.9} +{"s":"odoo:mrp_production.move_byproduct_ids","p":"target","o":"stock.move","f":0.95,"c":0.9} +{"s":"odoo:mrp_production.move_finished_ids","p":"inverse_name","o":"production_id","f":0.95,"c":0.9} +{"s":"odoo:mrp_production.move_finished_ids","p":"target","o":"stock.move","f":0.95,"c":0.9} +{"s":"odoo:mrp_production.move_raw_ids","p":"inverse_name","o":"raw_material_production_id","f":0.95,"c":0.9} +{"s":"odoo:mrp_production.move_raw_ids","p":"target","o":"stock.move","f":0.95,"c":0.9} +{"s":"odoo:mrp_production.picking_ids","p":"target","o":"stock.picking","f":0.95,"c":0.9} +{"s":"odoo:mrp_production.picking_type_id","p":"target","o":"stock.picking.type","f":0.95,"c":0.9} +{"s":"odoo:mrp_production.product_id","p":"target","o":"product.product","f":0.95,"c":0.9} +{"s":"odoo:mrp_production.product_uom_id","p":"target","o":"uom.uom","f":0.95,"c":0.9} +{"s":"odoo:mrp_production.production_group_id","p":"target","o":"mrp.production.group","f":0.95,"c":0.9} +{"s":"odoo:mrp_production.production_location_id","p":"target","o":"stock.location","f":0.95,"c":0.9} +{"s":"odoo:mrp_production.reference_ids","p":"target","o":"stock.reference","f":0.95,"c":0.9} +{"s":"odoo:mrp_production.workorder_ids","p":"inverse_name","o":"production_id","f":0.95,"c":0.9} +{"s":"odoo:mrp_production.workorder_ids","p":"target","o":"mrp.workorder","f":0.95,"c":0.9} +{"s":"odoo:mrp_unbuild.bom_id","p":"target","o":"mrp.bom","f":0.95,"c":0.9} +{"s":"odoo:mrp_unbuild.location_dest_id","p":"target","o":"stock.location","f":0.95,"c":0.9} +{"s":"odoo:mrp_unbuild.location_id","p":"target","o":"stock.location","f":0.95,"c":0.9} +{"s":"odoo:mrp_unbuild.product_id","p":"target","o":"product.product","f":0.95,"c":0.9} +{"s":"odoo:mrp_unbuild.product_uom_id","p":"target","o":"uom.uom","f":0.95,"c":0.9} +{"s":"odoo:mrp_workcenter._compute_working_state","p":"reads_field","o":"odoo:mrp_workcenter_productivity.date_end","f":0.85,"c":0.75} +{"s":"odoo:mrp_workcenter._compute_working_state","p":"reads_field","o":"odoo:mrp_workcenter_productivity.loss_type","f":0.85,"c":0.75} +{"s":"odoo:mrp_workcenter._compute_workorder_count","p":"reads_field","o":"odoo:mrp_workorder.date_start","f":0.85,"c":0.75} +{"s":"odoo:mrp_workcenter._compute_workorder_count","p":"reads_field","o":"odoo:mrp_workorder.duration_expected","f":0.85,"c":0.75} +{"s":"odoo:mrp_workcenter._compute_workorder_count","p":"reads_field","o":"odoo:mrp_workorder.state","f":0.85,"c":0.75} +{"s":"odoo:mrp_workcenter._compute_workorder_count","p":"reads_field","o":"odoo:mrp_workorder.workcenter_id","f":0.85,"c":0.75} +{"s":"odoo:mrp_workcenter.costs_hour_account_ids","p":"target","o":"account.analytic.account","f":0.95,"c":0.9} +{"s":"odoo:mrp_workcenter.order_ids","p":"inverse_name","o":"workcenter_id","f":0.95,"c":0.9} +{"s":"odoo:mrp_workcenter.order_ids","p":"target","o":"mrp.workorder","f":0.95,"c":0.9} +{"s":"odoo:mrp_workcenter.time_ids","p":"inverse_name","o":"workcenter_id","f":0.95,"c":0.9} +{"s":"odoo:mrp_workcenter.time_ids","p":"target","o":"mrp.workcenter.productivity","f":0.95,"c":0.9} +{"s":"odoo:mrp_workorder._compute_barcode","p":"reads_field","o":"odoo:mrp_production.name","f":0.85,"c":0.75} +{"s":"odoo:mrp_workorder._compute_duration","p":"reads_field","o":"odoo:mrp_workcenter_productivity.duration","f":0.85,"c":0.75} +{"s":"odoo:mrp_workorder._compute_is_produced","p":"reads_field","o":"odoo:mrp_production.product_qty","f":0.85,"c":0.75} +{"s":"odoo:mrp_workorder._compute_is_produced","p":"reads_field","o":"odoo:mrp_production.product_uom_id","f":0.85,"c":0.75} +{"s":"odoo:mrp_workorder._compute_production_date","p":"reads_field","o":"odoo:mrp_production.date_start","f":0.85,"c":0.75} +{"s":"odoo:mrp_workorder._compute_qty_producing","p":"reads_field","o":"odoo:mrp_production.qty_producing","f":0.85,"c":0.75} +{"s":"odoo:mrp_workorder._compute_qty_ready","p":"reads_field","o":"odoo:mrp_workorder.qty_produced","f":0.85,"c":0.75} +{"s":"odoo:mrp_workorder._compute_qty_ready","p":"reads_field","o":"odoo:mrp_workorder.state","f":0.85,"c":0.75} +{"s":"odoo:mrp_workorder._compute_qty_remaining","p":"reads_field","o":"odoo:mrp_production.product_uom_id","f":0.85,"c":0.75} +{"s":"odoo:mrp_workorder.blocked_by_workorder_ids","p":"target","o":"mrp.workorder","f":0.95,"c":0.9} +{"s":"odoo:mrp_workorder.production_id","p":"target","o":"mrp.production","f":0.95,"c":0.9} +{"s":"odoo:mrp_workorder.time_ids","p":"inverse_name","o":"workorder_id","f":0.95,"c":0.9} +{"s":"odoo:mrp_workorder.time_ids","p":"target","o":"mrp.workcenter.productivity","f":0.95,"c":0.9} +{"s":"odoo:mrp_workorder.workcenter_id","p":"target","o":"mrp.workcenter","f":0.95,"c":0.9} +{"s":"odoo:onboarding_onboarding._compute_current_progress","p":"reads_field","o":"odoo:onboarding_progress.company_id","f":0.85,"c":0.75} +{"s":"odoo:onboarding_onboarding._compute_current_progress","p":"reads_field","o":"odoo:onboarding_progress.is_onboarding_closed","f":0.85,"c":0.75} +{"s":"odoo:onboarding_onboarding._compute_current_progress","p":"reads_field","o":"odoo:onboarding_progress.onboarding_state","f":0.85,"c":0.75} +{"s":"odoo:onboarding_onboarding._compute_is_per_company","p":"reads_field","o":"odoo:onboarding_onboarding_step.is_per_company","f":0.85,"c":0.75} +{"s":"odoo:onboarding_onboarding._compute_is_per_company","p":"reads_field","o":"odoo:onboarding_progress.company_id","f":0.85,"c":0.75} +{"s":"odoo:onboarding_onboarding.current_progress_id","p":"target","o":"onboarding.progress","f":0.95,"c":0.9} +{"s":"odoo:onboarding_onboarding.progress_ids","p":"inverse_name","o":"onboarding_id","f":0.95,"c":0.9} +{"s":"odoo:onboarding_onboarding.progress_ids","p":"target","o":"onboarding.progress","f":0.95,"c":0.9} +{"s":"odoo:onboarding_onboarding.step_ids","p":"target","o":"onboarding.onboarding.step","f":0.95,"c":0.9} +{"s":"odoo:onboarding_onboarding_step._compute_current_progress","p":"reads_field","o":"odoo:onboarding_progress_step.step_state","f":0.85,"c":0.75} +{"s":"odoo:onboarding_onboarding_step.current_progress_step_id","p":"target","o":"onboarding.progress.step","f":0.95,"c":0.9} +{"s":"odoo:onboarding_onboarding_step.progress_ids","p":"inverse_name","o":"step_id","f":0.95,"c":0.9} +{"s":"odoo:onboarding_onboarding_step.progress_ids","p":"target","o":"onboarding.progress.step","f":0.95,"c":0.9} +{"s":"odoo:onboarding_progress._compute_onboarding_state","p":"reads_field","o":"odoo:onboarding_onboarding.step_ids","f":0.85,"c":0.75} +{"s":"odoo:onboarding_progress._compute_onboarding_state","p":"reads_field","o":"odoo:onboarding_progress_step.step_state","f":0.85,"c":0.75} +{"s":"odoo:onboarding_progress.onboarding_id","p":"target","o":"onboarding.onboarding","f":0.95,"c":0.9} +{"s":"odoo:onboarding_progress.progress_step_ids","p":"target","o":"onboarding.progress.step","f":0.95,"c":0.9} +{"s":"odoo:payment_link_wizard.company_id","p":"target","o":"res.company","f":0.95,"c":0.9} +{"s":"odoo:payment_provider.available_currency_ids","p":"target","o":"res.currency","f":0.95,"c":0.9} +{"s":"odoo:pos_config._compute_currency","p":"reads_field","o":"odoo:account_journal.currency_id","f":0.85,"c":0.75} +{"s":"odoo:pos_config._compute_currency","p":"reads_field","o":"odoo:res_company.currency_id","f":0.85,"c":0.75} +{"s":"odoo:pos_config._compute_current_session","p":"reads_field","o":"odoo:pos_session.state","f":0.85,"c":0.75} +{"s":"odoo:pos_config._compute_l10n_vn_pos_symbol","p":"reads_field","o":"odoo:res_company.l10n_vn_pos_default_symbol","f":0.85,"c":0.75} +{"s":"odoo:pos_config.advanced_employee_ids","p":"target","o":"hr.employee","f":0.95,"c":0.9} +{"s":"odoo:pos_config.basic_employee_ids","p":"target","o":"hr.employee","f":0.95,"c":0.9} +{"s":"odoo:pos_config.company_id","p":"target","o":"res.company","f":0.95,"c":0.9} +{"s":"odoo:pos_config.currency_id","p":"target","o":"res.currency","f":0.95,"c":0.9} +{"s":"odoo:pos_config.current_session_id","p":"target","o":"pos.session","f":0.95,"c":0.9} +{"s":"odoo:pos_config.current_user_id","p":"target","o":"res.users","f":0.95,"c":0.9} +{"s":"odoo:pos_config.fast_payment_method_ids","p":"target","o":"pos.payment.method","f":0.95,"c":0.9} +{"s":"odoo:pos_config.journal_id","p":"target","o":"account.journal","f":0.95,"c":0.9} +{"s":"odoo:pos_config.minimal_employee_ids","p":"target","o":"hr.employee","f":0.95,"c":0.9} +{"s":"odoo:pos_config.session_ids","p":"inverse_name","o":"config_id","f":0.95,"c":0.9} +{"s":"odoo:pos_config.session_ids","p":"target","o":"pos.session","f":0.95,"c":0.9} +{"s":"odoo:pos_config.warehouse_id","p":"target","o":"stock.warehouse","f":0.95,"c":0.9} +{"s":"odoo:pos_order._compute_attendee_count","p":"reads_field","o":"odoo:pos_order_line.event_registration_ids","f":0.85,"c":0.75} +{"s":"odoo:pos_order._compute_currency_rate","p":"reads_field","o":"odoo:res_company.currency_id","f":0.85,"c":0.75} +{"s":"odoo:pos_order._compute_has_refundable_lines","p":"reads_field","o":"odoo:pos_order_line.qty","f":0.85,"c":0.75} +{"s":"odoo:pos_order._compute_has_refundable_lines","p":"reads_field","o":"odoo:pos_order_line.refunded_qty","f":0.85,"c":0.75} +{"s":"odoo:pos_order._compute_is_edited","p":"reads_field","o":"odoo:pos_order_line.is_edited","f":0.85,"c":0.75} +{"s":"odoo:pos_order._compute_is_total_cost_computed","p":"reads_field","o":"odoo:pos_order_line.is_total_cost_computed","f":0.85,"c":0.75} +{"s":"odoo:pos_order._compute_margin","p":"reads_field","o":"odoo:pos_order_line.margin","f":0.85,"c":0.75} +{"s":"odoo:pos_order._compute_online_payment_method_id","p":"reads_field","o":"odoo:pos_config.payment_method_ids","f":0.85,"c":0.75} +{"s":"odoo:pos_order._compute_online_payment_method_id","p":"reads_field","o":"odoo:pos_config.self_order_online_payment_method_id","f":0.85,"c":0.75} +{"s":"odoo:pos_order._compute_picking_count","p":"reads_field","o":"odoo:stock_picking.state","f":0.85,"c":0.75} +{"s":"odoo:pos_order._compute_refund_related_fields","p":"reads_field","o":"odoo:pos_order_line.refund_orderline_ids","f":0.85,"c":0.75} +{"s":"odoo:pos_order._compute_refund_related_fields","p":"reads_field","o":"odoo:pos_order_line.refunded_orderline_id","f":0.85,"c":0.75} +{"s":"odoo:pos_order._compute_sinvoice_has_pdf","p":"reads_field","o":"odoo:account_move.l10n_vn_edi_sinvoice_pdf_file","f":0.85,"c":0.75} +{"s":"odoo:pos_order._compute_use_self_order_online_payment","p":"reads_field","o":"odoo:pos_config.self_order_online_payment_method_id","f":0.85,"c":0.75} +{"s":"odoo:pos_order.account_move","p":"target","o":"account.move","f":0.95,"c":0.9} +{"s":"odoo:pos_order.company_id","p":"target","o":"res.company","f":0.95,"c":0.9} +{"s":"odoo:pos_order.config_id","p":"target","o":"pos.config","f":0.95,"c":0.9} +{"s":"odoo:pos_order.lines","p":"inverse_name","o":"order_id","f":0.95,"c":0.9} +{"s":"odoo:pos_order.lines","p":"target","o":"pos.order.line","f":0.95,"c":0.9} +{"s":"odoo:pos_order.picking_ids","p":"inverse_name","o":"pos_order_id","f":0.95,"c":0.9} +{"s":"odoo:pos_order.picking_ids","p":"target","o":"stock.picking","f":0.95,"c":0.9} +{"s":"odoo:pos_order.pricelist_id","p":"target","o":"product.pricelist","f":0.95,"c":0.9} +{"s":"odoo:pos_order.refunded_order_id","p":"target","o":"pos.order","f":0.95,"c":0.9} +{"s":"odoo:pos_payment_method._compute_l10n_jo_edi_pos_is_cash","p":"reads_field","o":"odoo:account_journal.type","f":0.85,"c":0.75} +{"s":"odoo:pos_payment_method.journal_id","p":"target","o":"account.journal","f":0.95,"c":0.9} +{"s":"odoo:pos_payment_method.open_session_ids","p":"target","o":"pos.session","f":0.95,"c":0.9} +{"s":"odoo:pos_payment_method.outstanding_account_id","p":"target","o":"account.account","f":0.95,"c":0.9} +{"s":"odoo:pos_session._compute_is_in_company_currency","p":"reads_field","o":"odoo:res_company.currency_id","f":0.85,"c":0.75} +{"s":"odoo:pos_session._compute_picking_count","p":"reads_field","o":"odoo:stock_picking.state","f":0.85,"c":0.75} +{"s":"odoo:pos_session._compute_total_payments_amount","p":"reads_field","o":"odoo:pos_payment.amount","f":0.85,"c":0.75} +{"s":"odoo:pos_session.cash_journal_id","p":"target","o":"account.journal","f":0.95,"c":0.9} +{"s":"odoo:pos_session.company_id","p":"target","o":"res.company","f":0.95,"c":0.9} +{"s":"odoo:pos_session.order_ids","p":"inverse_name","o":"session_id","f":0.95,"c":0.9} +{"s":"odoo:pos_session.order_ids","p":"target","o":"pos.order","f":0.95,"c":0.9} +{"s":"odoo:pos_session.picking_ids","p":"inverse_name","o":"pos_session_id","f":0.95,"c":0.9} +{"s":"odoo:pos_session.picking_ids","p":"target","o":"stock.picking","f":0.95,"c":0.9} +{"s":"odoo:product_attribute.attribute_line_ids","p":"inverse_name","o":"attribute_id","f":0.95,"c":0.9} +{"s":"odoo:product_attribute.attribute_line_ids","p":"target","o":"product.template.attribute.line","f":0.95,"c":0.9} +{"s":"odoo:product_attribute_custom_value._compute_name","p":"reads_field","o":"odoo:product_template_attribute_value.name","f":0.85,"c":0.75} +{"s":"odoo:product_attribute_custom_value.custom_product_template_attribute_value_id","p":"target","o":"product.template.attribute.value","f":0.95,"c":0.9} +{"s":"odoo:product_category._compute_complete_name","p":"reads_field","o":"odoo:product_category.complete_name","f":0.85,"c":0.75} +{"s":"odoo:product_category.parent_id","p":"target","o":"product.category","f":0.95,"c":0.9} +{"s":"odoo:product_combo.currency_id","p":"target","o":"res.currency","f":0.95,"c":0.9} +{"s":"odoo:product_feed.lang_id","p":"target","o":"res.lang","f":0.95,"c":0.9} +{"s":"odoo:product_pricelist_item._compute_company_id","p":"reads_field","o":"odoo:product_pricelist.company_id","f":0.85,"c":0.75} +{"s":"odoo:product_pricelist_item._compute_currency_id","p":"reads_field","o":"odoo:product_pricelist.currency_id","f":0.85,"c":0.75} +{"s":"odoo:product_pricelist_item.base_pricelist_id","p":"target","o":"product.pricelist","f":0.95,"c":0.9} +{"s":"odoo:product_pricelist_item.company_id","p":"target","o":"res.company","f":0.95,"c":0.9} +{"s":"odoo:product_pricelist_item.currency_id","p":"target","o":"res.currency","f":0.95,"c":0.9} +{"s":"odoo:product_pricelist_item.pricelist_id","p":"target","o":"product.pricelist","f":0.95,"c":0.9} +{"s":"odoo:product_pricelist_item.product_id","p":"target","o":"product.product","f":0.95,"c":0.9} +{"s":"odoo:product_pricelist_item.product_tmpl_id","p":"target","o":"product.template","f":0.95,"c":0.9} +{"s":"odoo:product_product._compute_pricelist_rule_ids","p":"reads_field","o":"odoo:product_template.pricelist_rule_ids","f":0.85,"c":0.75} +{"s":"odoo:product_product._compute_product_price_extra","p":"reads_field","o":"odoo:product_template_attribute_value.price_extra","f":0.85,"c":0.75} +{"s":"odoo:product_product._compute_product_website_url","p":"reads_field","o":"odoo:product_template.website_url","f":0.85,"c":0.75} +{"s":"odoo:product_product._compute_write_date","p":"reads_field","o":"odoo:product_template.write_date","f":0.85,"c":0.75} +{"s":"odoo:product_product.all_product_tag_ids","p":"target","o":"product.tag","f":0.95,"c":0.9} +{"s":"odoo:product_product.pricelist_rule_ids","p":"inverse_name","o":"product_id","f":0.95,"c":0.9} +{"s":"odoo:product_product.pricelist_rule_ids","p":"target","o":"product.pricelist.item","f":0.95,"c":0.9} +{"s":"odoo:product_product.product_template_attribute_value_ids","p":"target","o":"product.template.attribute.value","f":0.95,"c":0.9} +{"s":"odoo:product_product.product_tmpl_id","p":"target","o":"product.template","f":0.95,"c":0.9} +{"s":"odoo:product_public_category.parents_and_self","p":"target","o":"product.public.category","f":0.95,"c":0.9} +{"s":"odoo:product_supplierinfo.product_id","p":"target","o":"product.product","f":0.95,"c":0.9} +{"s":"odoo:product_supplierinfo.product_tmpl_id","p":"target","o":"product.template","f":0.95,"c":0.9} +{"s":"odoo:product_supplierinfo.product_uom_id","p":"target","o":"uom.uom","f":0.95,"c":0.9} +{"s":"odoo:product_tag.product_ids","p":"target","o":"product.product","f":0.95,"c":0.9} +{"s":"odoo:product_template._compute_base_unit_count","p":"reads_field","o":"odoo:product_product.base_unit_count","f":0.85,"c":0.75} +{"s":"odoo:product_template._compute_base_unit_id","p":"reads_field","o":"odoo:product_product.base_unit_count","f":0.85,"c":0.75} +{"s":"odoo:product_template._compute_base_unit_name","p":"reads_field","o":"odoo:website_base_unit.name","f":0.85,"c":0.75} +{"s":"odoo:product_template._compute_has_configurable_attributes","p":"reads_field","o":"odoo:product_attribute.create_variant","f":0.85,"c":0.75} +{"s":"odoo:product_template._compute_has_configurable_attributes","p":"reads_field","o":"odoo:product_attribute.display_type","f":0.85,"c":0.75} +{"s":"odoo:product_template._compute_has_configurable_attributes","p":"reads_field","o":"odoo:product_attribute_value.is_custom","f":0.85,"c":0.75} +{"s":"odoo:product_template._compute_has_configurable_attributes","p":"reads_field","o":"odoo:product_template_attribute_line.value_ids","f":0.85,"c":0.75} +{"s":"odoo:product_template._compute_is_dynamically_created","p":"reads_field","o":"odoo:product_template_attribute_line.attribute_id","f":0.85,"c":0.75} +{"s":"odoo:product_template._compute_l10n_eg_eta_code","p":"reads_field","o":"odoo:product_product.l10n_eg_eta_code","f":0.85,"c":0.75} +{"s":"odoo:product_template._compute_l10n_in_is_gst_registered_enabled","p":"reads_field","o":"odoo:res_company.l10n_in_is_gst_registered","f":0.85,"c":0.75} +{"s":"odoo:product_template._compute_product_variant_count","p":"reads_field","o":"odoo:product_product.product_tmpl_id","f":0.85,"c":0.75} +{"s":"odoo:product_template._compute_sales_count","p":"reads_field","o":"odoo:product_product.sales_count","f":0.85,"c":0.75} +{"s":"odoo:product_template._compute_valid_product_template_attribute_line_ids","p":"reads_field","o":"odoo:product_template_attribute_line.value_ids","f":0.85,"c":0.75} +{"s":"odoo:product_template._compute_variants_default_code","p":"reads_field","o":"odoo:product_product.default_code","f":0.85,"c":0.75} +{"s":"odoo:product_template.attribute_line_ids","p":"inverse_name","o":"product_tmpl_id","f":0.95,"c":0.9} +{"s":"odoo:product_template.attribute_line_ids","p":"target","o":"product.template.attribute.line","f":0.95,"c":0.9} +{"s":"odoo:product_template.base_unit_id","p":"target","o":"website.base.unit","f":0.95,"c":0.9} +{"s":"odoo:product_template.company_id","p":"target","o":"res.company","f":0.95,"c":0.9} +{"s":"odoo:product_template.cost_currency_id","p":"target","o":"res.currency","f":0.95,"c":0.9} +{"s":"odoo:product_template.currency_id","p":"target","o":"res.currency","f":0.95,"c":0.9} +{"s":"odoo:product_template.product_variant_id","p":"target","o":"product.product","f":0.95,"c":0.9} +{"s":"odoo:product_template.product_variant_ids","p":"inverse_name","o":"product_tmpl_id","f":0.95,"c":0.9} +{"s":"odoo:product_template.product_variant_ids","p":"target","o":"product.product","f":0.95,"c":0.9} +{"s":"odoo:product_template.uom_id","p":"target","o":"uom.uom","f":0.95,"c":0.9} +{"s":"odoo:product_template.valid_product_template_attribute_line_ids","p":"target","o":"product.template.attribute.line","f":0.95,"c":0.9} +{"s":"odoo:product_template_attribute_line.value_ids","p":"target","o":"product.attribute.value","f":0.95,"c":0.9} +{"s":"odoo:product_value.company_id","p":"target","o":"res.company","f":0.95,"c":0.9} +{"s":"odoo:project_milestone._compute_project_allow_milestones","p":"reads_field","o":"odoo:project_project.allow_milestones","f":0.85,"c":0.75} +{"s":"odoo:project_milestone.project_id","p":"target","o":"project.project","f":0.95,"c":0.9} +{"s":"odoo:project_milestone.task_ids","p":"inverse_name","o":"milestone_id","f":0.95,"c":0.9} +{"s":"odoo:project_milestone.task_ids","p":"target","o":"project.task","f":0.95,"c":0.9} +{"s":"odoo:project_project._compute_company_id","p":"reads_field","o":"odoo:account_analytic_account.company_id","f":0.85,"c":0.75} +{"s":"odoo:project_project._compute_company_id","p":"reads_field","o":"odoo:res_partner.company_id","f":0.85,"c":0.75} +{"s":"odoo:project_project._compute_is_milestone_exceeded","p":"reads_field","o":"odoo:project_milestone.deadline","f":0.85,"c":0.75} +{"s":"odoo:project_project._compute_is_milestone_exceeded","p":"reads_field","o":"odoo:project_milestone.is_reached","f":0.85,"c":0.75} +{"s":"odoo:project_project._compute_last_update_status","p":"reads_field","o":"odoo:project_update.status","f":0.85,"c":0.75} +{"s":"odoo:project_project._compute_milestone_reached_count","p":"reads_field","o":"odoo:project_milestone.is_reached","f":0.85,"c":0.75} +{"s":"odoo:project_project._compute_next_milestone_id","p":"reads_field","o":"odoo:project_milestone.deadline","f":0.85,"c":0.75} +{"s":"odoo:project_project._compute_next_milestone_id","p":"reads_field","o":"odoo:project_milestone.is_reached","f":0.85,"c":0.75} +{"s":"odoo:project_project._compute_partner_id","p":"reads_field","o":"odoo:res_partner.company_id","f":0.85,"c":0.75} +{"s":"odoo:project_project._compute_resource_calendar_id","p":"reads_field","o":"odoo:res_company.resource_calendar_id","f":0.85,"c":0.75} +{"s":"odoo:project_project._compute_sale_order_count","p":"reads_field","o":"odoo:project_task.sale_order_id","f":0.85,"c":0.75} +{"s":"odoo:project_project._compute_show_ratings","p":"reads_field","o":"odoo:project_task_type.rating_active","f":0.85,"c":0.75} +{"s":"odoo:project_project._compute_timesheet_encode_uom_id","p":"reads_field","o":"odoo:res_company.timesheet_encode_uom_id","f":0.85,"c":0.75} +{"s":"odoo:project_project.account_id","p":"target","o":"account.analytic.account","f":0.95,"c":0.9} +{"s":"odoo:project_project.company_id","p":"target","o":"res.company","f":0.95,"c":0.9} +{"s":"odoo:project_project.currency_id","p":"target","o":"res.currency","f":0.95,"c":0.9} +{"s":"odoo:project_project.last_update_id","p":"target","o":"project.update","f":0.95,"c":0.9} +{"s":"odoo:project_project.milestone_ids","p":"inverse_name","o":"project_id","f":0.95,"c":0.9} +{"s":"odoo:project_project.milestone_ids","p":"target","o":"project.milestone","f":0.95,"c":0.9} +{"s":"odoo:project_project.next_milestone_id","p":"target","o":"project.milestone","f":0.95,"c":0.9} +{"s":"odoo:project_project.partner_id","p":"target","o":"res.partner","f":0.95,"c":0.9} +{"s":"odoo:project_project.resource_calendar_id","p":"target","o":"resource.calendar","f":0.95,"c":0.9} +{"s":"odoo:project_project.stage_id","p":"target","o":"project.project.stage","f":0.95,"c":0.9} +{"s":"odoo:project_project.task_ids","p":"inverse_name","o":"project_id","f":0.95,"c":0.9} +{"s":"odoo:project_project.task_ids","p":"target","o":"project.task","f":0.95,"c":0.9} +{"s":"odoo:project_project.tasks","p":"inverse_name","o":"project_id","f":0.95,"c":0.9} +{"s":"odoo:project_project.tasks","p":"target","o":"project.task","f":0.95,"c":0.9} +{"s":"odoo:project_project.type_ids","p":"target","o":"project.task.type","f":0.95,"c":0.9} +{"s":"odoo:project_sale_line_employee_map._compute_cost","p":"reads_field","o":"odoo:hr_employee.hourly_cost","f":0.85,"c":0.75} +{"s":"odoo:project_sale_line_employee_map._compute_currency_id","p":"reads_field","o":"odoo:sale_order_line.price_unit","f":0.85,"c":0.75} +{"s":"odoo:project_sale_line_employee_map._compute_display_cost","p":"reads_field","o":"odoo:hr_employee.resource_calendar_id","f":0.85,"c":0.75} +{"s":"odoo:project_sale_line_employee_map._compute_price_unit","p":"reads_field","o":"odoo:sale_order_line.price_unit","f":0.85,"c":0.75} +{"s":"odoo:project_sale_line_employee_map.currency_id","p":"target","o":"res.currency","f":0.95,"c":0.9} +{"s":"odoo:project_sale_line_employee_map.employee_id","p":"target","o":"hr.employee","f":0.95,"c":0.9} +{"s":"odoo:project_sale_line_employee_map.existing_employee_ids","p":"target","o":"hr.employee","f":0.95,"c":0.9} +{"s":"odoo:project_sale_line_employee_map.project_id","p":"target","o":"project.project","f":0.95,"c":0.9} +{"s":"odoo:project_sale_line_employee_map.sale_line_id","p":"target","o":"sale.order.line","f":0.95,"c":0.9} +{"s":"odoo:project_task._compute_allow_timesheets","p":"reads_field","o":"odoo:project_project.allow_timesheets","f":0.85,"c":0.75} +{"s":"odoo:project_task._compute_company_id","p":"reads_field","o":"odoo:project_project.company_id","f":0.85,"c":0.75} +{"s":"odoo:project_task._compute_company_id","p":"reads_field","o":"odoo:project_task.company_id","f":0.85,"c":0.75} +{"s":"odoo:project_task._compute_has_template_ancestor","p":"reads_field","o":"odoo:project_task.has_template_ancestor","f":0.85,"c":0.75} +{"s":"odoo:project_task._compute_is_project_map_empty","p":"reads_field","o":"odoo:project_project.sale_line_employee_ids","f":0.85,"c":0.75} +{"s":"odoo:project_task._compute_partner_phone","p":"reads_field","o":"odoo:res_partner.phone","f":0.85,"c":0.75} +{"s":"odoo:project_task._compute_sale_line","p":"reads_field","o":"odoo:project_milestone.sale_line_id","f":0.85,"c":0.75} +{"s":"odoo:project_task._compute_sale_line","p":"reads_field","o":"odoo:project_project.sale_line_id","f":0.85,"c":0.75} +{"s":"odoo:project_task._compute_sale_line","p":"reads_field","o":"odoo:project_task.sale_line_id","f":0.85,"c":0.75} +{"s":"odoo:project_task._compute_sale_order_id","p":"reads_field","o":"odoo:project_project.reinvoiced_sale_order_id","f":0.85,"c":0.75} +{"s":"odoo:project_task._compute_subtask_allocated_hours","p":"reads_field","o":"odoo:project_task.allocated_hours","f":0.85,"c":0.75} +{"s":"odoo:project_task._compute_subtask_effective_hours","p":"reads_field","o":"odoo:project_task.effective_hours","f":0.85,"c":0.75} +{"s":"odoo:project_task._compute_subtask_effective_hours","p":"reads_field","o":"odoo:project_task.subtask_effective_hours","f":0.85,"c":0.75} +{"s":"odoo:project_task._onchange_partner_id","p":"reads_field","o":"odoo:project_project.reinvoiced_sale_order_id","f":0.85,"c":0.75} +{"s":"odoo:project_task.child_ids","p":"inverse_name","o":"parent_id","f":0.95,"c":0.9} +{"s":"odoo:project_task.child_ids","p":"target","o":"project.task","f":0.95,"c":0.9} +{"s":"odoo:project_task.company_id","p":"target","o":"res.company","f":0.95,"c":0.9} +{"s":"odoo:project_task.depend_on_ids","p":"target","o":"project.task","f":0.95,"c":0.9} +{"s":"odoo:project_task.milestone_id","p":"target","o":"project.milestone","f":0.95,"c":0.9} +{"s":"odoo:project_task.parent_id","p":"target","o":"project.task","f":0.95,"c":0.9} +{"s":"odoo:project_task.partner_id","p":"target","o":"res.partner","f":0.95,"c":0.9} +{"s":"odoo:project_task.personal_stage_id","p":"target","o":"project.task.stage.personal","f":0.95,"c":0.9} +{"s":"odoo:project_task.project_id","p":"target","o":"project.project","f":0.95,"c":0.9} +{"s":"odoo:project_task.stage_id","p":"target","o":"project.task.type","f":0.95,"c":0.9} +{"s":"odoo:project_task.user_ids","p":"target","o":"res.users","f":0.95,"c":0.9} +{"s":"odoo:project_task_type._compute_show_rating_active","p":"reads_field","o":"odoo:project_project.allow_billable","f":0.85,"c":0.75} +{"s":"odoo:project_task_type.project_ids","p":"target","o":"project.project","f":0.95,"c":0.9} +{"s":"odoo:purchase_bill_line_match._compute_product_uom_price","p":"reads_field","o":"odoo:account_move_line.price_unit","f":0.85,"c":0.75} +{"s":"odoo:purchase_bill_line_match._compute_product_uom_price","p":"reads_field","o":"odoo:purchase_order_line.price_unit","f":0.85,"c":0.75} +{"s":"odoo:purchase_bill_line_match.aml_id","p":"target","o":"account.move.line","f":0.95,"c":0.9} +{"s":"odoo:purchase_bill_line_match.pol_id","p":"target","o":"purchase.order.line","f":0.95,"c":0.9} +{"s":"odoo:purchase_order._amount_all","p":"reads_field","o":"odoo:purchase_order_line.price_subtotal","f":0.85,"c":0.75} +{"s":"odoo:purchase_order._compute_amount_total_cc","p":"reads_field","o":"odoo:purchase_order_line.price_subtotal","f":0.85,"c":0.75} +{"s":"odoo:purchase_order._compute_date_planned","p":"reads_field","o":"odoo:purchase_order_line.date_planned","f":0.85,"c":0.75} +{"s":"odoo:purchase_order._compute_invoice","p":"reads_field","o":"odoo:account_move_line.move_id","f":0.85,"c":0.75} +{"s":"odoo:purchase_order._compute_purchase_warning_text","p":"reads_field","o":"odoo:purchase_order_line.purchase_line_warn_msg","f":0.85,"c":0.75} +{"s":"odoo:purchase_order._compute_purchase_warning_text","p":"reads_field","o":"odoo:res_partner.name","f":0.85,"c":0.75} +{"s":"odoo:purchase_order._compute_purchase_warning_text","p":"reads_field","o":"odoo:res_partner.purchase_warn_msg","f":0.85,"c":0.75} +{"s":"odoo:purchase_order._compute_receipt_reminder_email","p":"reads_field","o":"odoo:res_partner.reminder_date_before_receipt","f":0.85,"c":0.75} +{"s":"odoo:purchase_order._compute_sale_order_count","p":"reads_field","o":"odoo:purchase_order_line.sale_order_id","f":0.85,"c":0.75} +{"s":"odoo:purchase_order._compute_show_comparison","p":"reads_field","o":"odoo:purchase_order_line.product_id","f":0.85,"c":0.75} +{"s":"odoo:purchase_order._compute_subcontracting_resupply_picking_count","p":"reads_field","o":"odoo:purchase_order_line.move_ids","f":0.85,"c":0.75} +{"s":"odoo:purchase_order._compute_tax_country_id","p":"reads_field","o":"odoo:account_fiscal_position.country_id","f":0.85,"c":0.75} +{"s":"odoo:purchase_order._compute_tax_country_id","p":"reads_field","o":"odoo:account_fiscal_position.foreign_vat","f":0.85,"c":0.75} +{"s":"odoo:purchase_order._compute_tax_country_id","p":"reads_field","o":"odoo:res_company.account_fiscal_country_id","f":0.85,"c":0.75} +{"s":"odoo:purchase_order._compute_tax_totals","p":"reads_field","o":"odoo:purchase_order_line.price_subtotal","f":0.85,"c":0.75} +{"s":"odoo:purchase_order._get_invoiced","p":"reads_field","o":"odoo:purchase_order_line.qty_to_invoice","f":0.85,"c":0.75} +{"s":"odoo:purchase_order.company_id","p":"target","o":"res.company","f":0.95,"c":0.9} +{"s":"odoo:purchase_order.currency_id","p":"target","o":"res.currency","f":0.95,"c":0.9} +{"s":"odoo:purchase_order.dest_address_id","p":"target","o":"res.partner","f":0.95,"c":0.9} +{"s":"odoo:purchase_order.duplicated_order_ids","p":"target","o":"purchase.order","f":0.95,"c":0.9} +{"s":"odoo:purchase_order.fiscal_position_id","p":"target","o":"account.fiscal.position","f":0.95,"c":0.9} +{"s":"odoo:purchase_order.invoice_ids","p":"target","o":"account.move","f":0.95,"c":0.9} +{"s":"odoo:purchase_order.order_line","p":"inverse_name","o":"order_id","f":0.95,"c":0.9} +{"s":"odoo:purchase_order.order_line","p":"target","o":"purchase.order.line","f":0.95,"c":0.9} +{"s":"odoo:purchase_order.partner_id","p":"target","o":"res.partner","f":0.95,"c":0.9} +{"s":"odoo:purchase_order.payment_term_id","p":"target","o":"account.payment.term","f":0.95,"c":0.9} +{"s":"odoo:purchase_order.tax_country_id","p":"target","o":"res.country","f":0.95,"c":0.9} +{"s":"odoo:purchase_order.user_id","p":"target","o":"res.users","f":0.95,"c":0.9} +{"s":"odoo:purchase_order_line._compute_allowed_uom_ids","p":"reads_field","o":"odoo:product_product.seller_ids","f":0.85,"c":0.75} +{"s":"odoo:purchase_order_line._compute_allowed_uom_ids","p":"reads_field","o":"odoo:product_product.uom_id","f":0.85,"c":0.75} +{"s":"odoo:purchase_order_line._compute_allowed_uom_ids","p":"reads_field","o":"odoo:product_product.uom_ids","f":0.85,"c":0.75} +{"s":"odoo:purchase_order_line._compute_analytic_distribution","p":"reads_field","o":"odoo:purchase_order.partner_id","f":0.85,"c":0.75} +{"s":"odoo:purchase_order_line._compute_analytic_distribution","p":"reads_field","o":"odoo:purchase_order.project_id","f":0.85,"c":0.75} +{"s":"odoo:purchase_order_line._compute_price_unit_and_date_planned_and_name","p":"reads_field","o":"odoo:purchase_order.partner_id","f":0.85,"c":0.75} +{"s":"odoo:purchase_order_line._compute_product_uom_qty","p":"reads_field","o":"odoo:product_product.uom_id","f":0.85,"c":0.75} +{"s":"odoo:purchase_order_line._compute_purchase_line_warn_msg","p":"reads_field","o":"odoo:product_product.purchase_line_warn_msg","f":0.85,"c":0.75} +{"s":"odoo:purchase_order_line._compute_qty_invoiced","p":"reads_field","o":"odoo:account_move.state","f":0.85,"c":0.75} +{"s":"odoo:purchase_order_line._compute_qty_invoiced","p":"reads_field","o":"odoo:account_move_line.quantity","f":0.85,"c":0.75} +{"s":"odoo:purchase_order_line._compute_qty_invoiced","p":"reads_field","o":"odoo:purchase_order.state","f":0.85,"c":0.75} +{"s":"odoo:purchase_order_line._compute_qty_received_method","p":"reads_field","o":"odoo:product_product.type","f":0.85,"c":0.75} +{"s":"odoo:purchase_order_line._compute_selected_seller_id","p":"reads_field","o":"odoo:product_product.seller_ids","f":0.85,"c":0.75} +{"s":"odoo:purchase_order_line._compute_selected_seller_id","p":"reads_field","o":"odoo:purchase_order.date_order","f":0.85,"c":0.75} +{"s":"odoo:purchase_order_line.allowed_uom_ids","p":"target","o":"uom.uom","f":0.95,"c":0.9} +{"s":"odoo:purchase_order_line.invoice_lines","p":"inverse_name","o":"purchase_line_id","f":0.95,"c":0.9} +{"s":"odoo:purchase_order_line.invoice_lines","p":"target","o":"account.move.line","f":0.95,"c":0.9} +{"s":"odoo:purchase_order_line.onchange_product_id","p":"reads_field","o":"odoo:purchase_order.partner_id","f":0.85,"c":0.75} +{"s":"odoo:purchase_order_line.order_id","p":"target","o":"purchase.order","f":0.95,"c":0.9} +{"s":"odoo:purchase_order_line.product_id","p":"target","o":"product.product","f":0.95,"c":0.9} +{"s":"odoo:purchase_order_line.selected_seller_id","p":"target","o":"product.supplierinfo","f":0.95,"c":0.9} +{"s":"odoo:purchase_requisition.currency_id","p":"target","o":"res.currency","f":0.95,"c":0.9} +{"s":"odoo:quotation_document.form_field_ids","p":"target","o":"sale.pdf.form.field","f":0.95,"c":0.9} +{"s":"odoo:rating_parent_mixin._compute_rating_percentage_satisfaction","p":"reads_field","o":"odoo:rating_rating.consumed","f":0.85,"c":0.75} +{"s":"odoo:rating_parent_mixin._compute_rating_percentage_satisfaction","p":"reads_field","o":"odoo:rating_rating.rating","f":0.85,"c":0.75} +{"s":"odoo:rating_parent_mixin.rating_ids","p":"inverse_name","o":"parent_res_id","f":0.95,"c":0.9} +{"s":"odoo:rating_parent_mixin.rating_ids","p":"target","o":"rating.rating","f":0.95,"c":0.9} +{"s":"odoo:repair_order.move_ids","p":"inverse_name","o":"repair_id","f":0.95,"c":0.9} +{"s":"odoo:repair_order.move_ids","p":"target","o":"stock.move","f":0.95,"c":0.9} +{"s":"odoo:res_partner.l10n_tr_nilvera_customer_alias_id","p":"target","o":"l10n_tr.nilvera.alias","f":0.95,"c":0.9} +{"s":"odoo:res_partner_bank.duplicate_bank_partner_ids","p":"target","o":"res.partner","f":0.95,"c":0.9} +{"s":"odoo:resource_calendar._compute_hours_per_day","p":"reads_field","o":"odoo:resource_calendar_attendance.hour_from","f":0.85,"c":0.75} +{"s":"odoo:resource_calendar._compute_hours_per_day","p":"reads_field","o":"odoo:resource_calendar_attendance.hour_to","f":0.85,"c":0.75} +{"s":"odoo:resource_calendar._compute_hours_per_week","p":"reads_field","o":"odoo:resource_calendar_attendance.hour_from","f":0.85,"c":0.75} +{"s":"odoo:resource_calendar._compute_hours_per_week","p":"reads_field","o":"odoo:resource_calendar_attendance.hour_to","f":0.85,"c":0.75} +{"s":"odoo:resource_calendar.attendance_ids","p":"inverse_name","o":"calendar_id","f":0.95,"c":0.9} +{"s":"odoo:resource_calendar.attendance_ids","p":"target","o":"resource.calendar.attendance","f":0.95,"c":0.9} +{"s":"odoo:resource_calendar.attendance_ids_1st_week","p":"inverse_name","o":"calendar_id","f":0.95,"c":0.9} +{"s":"odoo:resource_calendar.attendance_ids_1st_week","p":"target","o":"resource.calendar.attendance","f":0.95,"c":0.9} +{"s":"odoo:resource_calendar.attendance_ids_2nd_week","p":"inverse_name","o":"calendar_id","f":0.95,"c":0.9} +{"s":"odoo:resource_calendar.attendance_ids_2nd_week","p":"target","o":"resource.calendar.attendance","f":0.95,"c":0.9} +{"s":"odoo:resource_calendar.company_id","p":"target","o":"res.company","f":0.95,"c":0.9} +{"s":"odoo:resource_calendar_leaves._compute_calendar_id","p":"reads_field","o":"odoo:resource_resource.calendar_id","f":0.85,"c":0.75} +{"s":"odoo:resource_calendar_leaves.calendar_id","p":"target","o":"resource.calendar","f":0.95,"c":0.9} +{"s":"odoo:resource_calendar_leaves.company_id","p":"target","o":"res.company","f":0.95,"c":0.9} +{"s":"odoo:resource_calendar_leaves.resource_id","p":"target","o":"resource.resource","f":0.95,"c":0.9} +{"s":"odoo:resource_resource.calendar_id","p":"target","o":"resource.calendar","f":0.95,"c":0.9} +{"s":"odoo:sale_order._compute_amount_delivery","p":"reads_field","o":"odoo:sale_order_line.price_subtotal","f":0.85,"c":0.75} +{"s":"odoo:sale_order._compute_amount_delivery","p":"reads_field","o":"odoo:sale_order_line.price_total","f":0.85,"c":0.75} +{"s":"odoo:sale_order._compute_amount_invoiced","p":"reads_field","o":"odoo:sale_order_line.amount_invoiced","f":0.85,"c":0.75} +{"s":"odoo:sale_order._compute_amount_invoiced","p":"reads_field","o":"odoo:sale_order_line.pos_order_line_ids","f":0.85,"c":0.75} +{"s":"odoo:sale_order._compute_amount_to_invoice","p":"reads_field","o":"odoo:sale_order_line.amount_to_invoice","f":0.85,"c":0.75} +{"s":"odoo:sale_order._compute_amount_to_invoice","p":"reads_field","o":"odoo:sale_order_line.pos_order_line_ids","f":0.85,"c":0.75} +{"s":"odoo:sale_order._compute_amount_unpaid","p":"reads_field","o":"odoo:account_move_line.parent_state","f":0.85,"c":0.75} +{"s":"odoo:sale_order._compute_amount_unpaid","p":"reads_field","o":"odoo:account_move_line.price_total","f":0.85,"c":0.75} +{"s":"odoo:sale_order._compute_amount_unpaid","p":"reads_field","o":"odoo:payment_transaction.amount","f":0.85,"c":0.75} +{"s":"odoo:sale_order._compute_amount_unpaid","p":"reads_field","o":"odoo:payment_transaction.state","f":0.85,"c":0.75} +{"s":"odoo:sale_order._compute_amount_unpaid","p":"reads_field","o":"odoo:sale_order_line.pos_order_line_ids","f":0.85,"c":0.75} +{"s":"odoo:sale_order._compute_amounts","p":"reads_field","o":"odoo:sale_order_line.price_subtotal","f":0.85,"c":0.75} +{"s":"odoo:sale_order._compute_cart_info","p":"reads_field","o":"odoo:sale_order_line.product_id","f":0.85,"c":0.75} +{"s":"odoo:sale_order._compute_cart_info","p":"reads_field","o":"odoo:sale_order_line.product_uom_qty","f":0.85,"c":0.75} +{"s":"odoo:sale_order._compute_expected_date","p":"reads_field","o":"odoo:sale_order_line.customer_lead","f":0.85,"c":0.75} +{"s":"odoo:sale_order._compute_has_archived_products","p":"reads_field","o":"odoo:sale_order_line.product_id","f":0.85,"c":0.75} +{"s":"odoo:sale_order._compute_invoice_status","p":"reads_field","o":"odoo:sale_order_line.invoice_status","f":0.85,"c":0.75} +{"s":"odoo:sale_order._compute_is_pdf_quote_builder_available","p":"reads_field","o":"odoo:sale_order_line.available_product_document_ids","f":0.85,"c":0.75} +{"s":"odoo:sale_order._compute_l10n_it_edi_doi_id","p":"reads_field","o":"odoo:res_partner.commercial_partner_id","f":0.85,"c":0.75} +{"s":"odoo:sale_order._compute_l10n_it_edi_doi_not_yet_invoiced","p":"reads_field","o":"odoo:sale_order_line.qty_invoiced_posted","f":0.85,"c":0.75} +{"s":"odoo:sale_order._compute_margin","p":"reads_field","o":"odoo:sale_order_line.margin","f":0.85,"c":0.75} +{"s":"odoo:sale_order._compute_partnership","p":"reads_field","o":"odoo:sale_order_line.product_id","f":0.85,"c":0.75} +{"s":"odoo:sale_order._compute_project_ids","p":"reads_field","o":"odoo:sale_order_line.product_id","f":0.85,"c":0.75} +{"s":"odoo:sale_order._compute_project_ids","p":"reads_field","o":"odoo:sale_order_line.project_id","f":0.85,"c":0.75} +{"s":"odoo:sale_order._compute_sale_warning_text","p":"reads_field","o":"odoo:res_partner.name","f":0.85,"c":0.75} +{"s":"odoo:sale_order._compute_sale_warning_text","p":"reads_field","o":"odoo:res_partner.sale_warn_msg","f":0.85,"c":0.75} +{"s":"odoo:sale_order._compute_sale_warning_text","p":"reads_field","o":"odoo:sale_order_line.sale_line_warn_msg","f":0.85,"c":0.75} +{"s":"odoo:sale_order._compute_shipping_weight","p":"reads_field","o":"odoo:sale_order_line.product_uom_id","f":0.85,"c":0.75} +{"s":"odoo:sale_order._compute_shipping_weight","p":"reads_field","o":"odoo:sale_order_line.product_uom_qty","f":0.85,"c":0.75} +{"s":"odoo:sale_order._compute_tasks_ids","p":"reads_field","o":"odoo:product_product.project_id","f":0.85,"c":0.75} +{"s":"odoo:sale_order._compute_tax_totals","p":"reads_field","o":"odoo:sale_order_line.price_subtotal","f":0.85,"c":0.75} +{"s":"odoo:sale_order._compute_timesheet_total_duration","p":"reads_field","o":"odoo:res_company.project_time_mode_id","f":0.85,"c":0.75} +{"s":"odoo:sale_order._compute_timesheet_total_duration","p":"reads_field","o":"odoo:res_company.timesheet_encode_uom_id","f":0.85,"c":0.75} +{"s":"odoo:sale_order._compute_timesheet_total_duration","p":"reads_field","o":"odoo:sale_order_line.timesheet_ids","f":0.85,"c":0.75} +{"s":"odoo:sale_order._compute_visible_project","p":"reads_field","o":"odoo:product_product.service_tracking","f":0.85,"c":0.75} +{"s":"odoo:sale_order._get_invoiced","p":"reads_field","o":"odoo:sale_order_line.invoice_lines","f":0.85,"c":0.75} +{"s":"odoo:sale_order.authorized_transaction_ids","p":"target","o":"payment.transaction","f":0.95,"c":0.9} +{"s":"odoo:sale_order.company_id","p":"target","o":"res.company","f":0.95,"c":0.9} +{"s":"odoo:sale_order.currency_id","p":"target","o":"res.currency","f":0.95,"c":0.9} +{"s":"odoo:sale_order.duplicated_order_ids","p":"target","o":"sale.order","f":0.95,"c":0.9} +{"s":"odoo:sale_order.fiscal_position_id","p":"target","o":"account.fiscal.position","f":0.95,"c":0.9} +{"s":"odoo:sale_order.invoice_ids","p":"target","o":"account.move","f":0.95,"c":0.9} +{"s":"odoo:sale_order.journal_id","p":"target","o":"account.journal","f":0.95,"c":0.9} +{"s":"odoo:sale_order.order_line","p":"inverse_name","o":"order_id","f":0.95,"c":0.9} +{"s":"odoo:sale_order.order_line","p":"target","o":"sale.order.line","f":0.95,"c":0.9} +{"s":"odoo:sale_order.partner_id","p":"target","o":"res.partner","f":0.95,"c":0.9} +{"s":"odoo:sale_order.partner_invoice_id","p":"target","o":"res.partner","f":0.95,"c":0.9} +{"s":"odoo:sale_order.partner_shipping_id","p":"target","o":"res.partner","f":0.95,"c":0.9} +{"s":"odoo:sale_order.payment_term_id","p":"target","o":"account.payment.term","f":0.95,"c":0.9} +{"s":"odoo:sale_order.pos_order_line_ids","p":"inverse_name","o":"sale_order_origin_id","f":0.95,"c":0.9} +{"s":"odoo:sale_order.pos_order_line_ids","p":"target","o":"pos.order.line","f":0.95,"c":0.9} +{"s":"odoo:sale_order.preferred_payment_method_line_id","p":"target","o":"account.payment.method.line","f":0.95,"c":0.9} +{"s":"odoo:sale_order.pricelist_id","p":"target","o":"product.pricelist","f":0.95,"c":0.9} +{"s":"odoo:sale_order.tax_country_id","p":"target","o":"res.country","f":0.95,"c":0.9} +{"s":"odoo:sale_order.team_id","p":"target","o":"crm.team","f":0.95,"c":0.9} +{"s":"odoo:sale_order.transaction_ids","p":"target","o":"payment.transaction","f":0.95,"c":0.9} +{"s":"odoo:sale_order.user_id","p":"target","o":"res.users","f":0.95,"c":0.9} +{"s":"odoo:sale_order_line._compute_allowed_uom_ids","p":"reads_field","o":"odoo:product_product.uom_id","f":0.85,"c":0.75} +{"s":"odoo:sale_order_line._compute_allowed_uom_ids","p":"reads_field","o":"odoo:product_product.uom_ids","f":0.85,"c":0.75} +{"s":"odoo:sale_order_line._compute_amount_invoiced","p":"reads_field","o":"odoo:account_move.state","f":0.85,"c":0.75} +{"s":"odoo:sale_order_line._compute_amount_invoiced","p":"reads_field","o":"odoo:account_move_line.price_total","f":0.85,"c":0.75} +{"s":"odoo:sale_order_line._compute_analytic_distribution","p":"reads_field","o":"odoo:sale_order.partner_id","f":0.85,"c":0.75} +{"s":"odoo:sale_order_line._compute_analytic_distribution","p":"reads_field","o":"odoo:sale_order.project_id","f":0.85,"c":0.75} +{"s":"odoo:sale_order_line._compute_is_mto","p":"reads_field","o":"odoo:product_product.route_ids","f":0.85,"c":0.75} +{"s":"odoo:sale_order_line._compute_is_service","p":"reads_field","o":"odoo:product_product.type","f":0.85,"c":0.75} +{"s":"odoo:sale_order_line._compute_name_short","p":"reads_field","o":"odoo:product_product.display_name","f":0.85,"c":0.75} +{"s":"odoo:sale_order_line._compute_product_updatable","p":"reads_field","o":"odoo:product_product.type","f":0.85,"c":0.75} +{"s":"odoo:sale_order_line._compute_purchase_price","p":"reads_field","o":"odoo:account_analytic_line.amount","f":0.85,"c":0.75} +{"s":"odoo:sale_order_line._compute_qty_at_date","p":"reads_field","o":"odoo:sale_order.commitment_date","f":0.85,"c":0.75} +{"s":"odoo:sale_order_line._compute_qty_delivered","p":"reads_field","o":"odoo:account_analytic_line.product_uom_id","f":0.85,"c":0.75} +{"s":"odoo:sale_order_line._compute_qty_delivered","p":"reads_field","o":"odoo:account_analytic_line.so_line","f":0.85,"c":0.75} +{"s":"odoo:sale_order_line._compute_qty_delivered","p":"reads_field","o":"odoo:account_analytic_line.unit_amount","f":0.85,"c":0.75} +{"s":"odoo:sale_order_line._compute_qty_invoiced","p":"reads_field","o":"odoo:account_move.state","f":0.85,"c":0.75} +{"s":"odoo:sale_order_line._compute_qty_invoiced","p":"reads_field","o":"odoo:account_move_line.quantity","f":0.85,"c":0.75} +{"s":"odoo:sale_order_line._compute_qty_invoiced_posted","p":"reads_field","o":"odoo:account_move.state","f":0.85,"c":0.75} +{"s":"odoo:sale_order_line._compute_qty_invoiced_posted","p":"reads_field","o":"odoo:account_move_line.quantity","f":0.85,"c":0.75} +{"s":"odoo:sale_order_line._compute_remaining_hours_available","p":"reads_field","o":"odoo:product_product.service_policy","f":0.85,"c":0.75} +{"s":"odoo:sale_order_line._compute_sale_line_warn_msg","p":"reads_field","o":"odoo:product_product.sale_line_warn_msg","f":0.85,"c":0.75} +{"s":"odoo:sale_order_line._compute_untaxed_amount_invoiced","p":"reads_field","o":"odoo:account_move.move_type","f":0.85,"c":0.75} +{"s":"odoo:sale_order_line._compute_untaxed_amount_invoiced","p":"reads_field","o":"odoo:account_move.state","f":0.85,"c":0.75} +{"s":"odoo:sale_order_line._compute_untaxed_amount_invoiced","p":"reads_field","o":"odoo:account_move_line.price_total","f":0.85,"c":0.75} +{"s":"odoo:sale_order_line._compute_warehouse_id","p":"reads_field","o":"odoo:sale_order.warehouse_id","f":0.85,"c":0.75} +{"s":"odoo:sale_order_line.allowed_uom_ids","p":"target","o":"uom.uom","f":0.95,"c":0.9} +{"s":"odoo:sale_order_line.analytic_line_ids","p":"inverse_name","o":"so_line","f":0.95,"c":0.9} +{"s":"odoo:sale_order_line.analytic_line_ids","p":"target","o":"account.analytic.line","f":0.95,"c":0.9} +{"s":"odoo:sale_order_line.invoice_lines","p":"target","o":"account.move.line","f":0.95,"c":0.9} +{"s":"odoo:sale_order_line.order_id","p":"target","o":"sale.order","f":0.95,"c":0.9} +{"s":"odoo:sale_order_line.pricelist_item_id","p":"target","o":"product.pricelist.item","f":0.95,"c":0.9} +{"s":"odoo:sale_order_line.product_custom_attribute_value_ids","p":"inverse_name","o":"sale_order_line_id","f":0.95,"c":0.9} +{"s":"odoo:sale_order_line.product_custom_attribute_value_ids","p":"target","o":"product.attribute.custom.value","f":0.95,"c":0.9} +{"s":"odoo:sale_order_line.product_id","p":"target","o":"product.product","f":0.95,"c":0.9} +{"s":"odoo:sale_order_line.product_no_variant_attribute_value_ids","p":"target","o":"product.template.attribute.value","f":0.95,"c":0.9} +{"s":"odoo:sale_order_line.product_template_id","p":"target","o":"product.template","f":0.95,"c":0.9} +{"s":"odoo:sale_order_line.product_uom_id","p":"target","o":"uom.uom","f":0.95,"c":0.9} +{"s":"odoo:sale_order_line.tax_ids","p":"target","o":"account.tax","f":0.95,"c":0.9} +{"s":"odoo:sale_order_template_line._compute_allowed_uom_ids","p":"reads_field","o":"odoo:product_product.uom_id","f":0.85,"c":0.75} +{"s":"odoo:sale_order_template_line._compute_allowed_uom_ids","p":"reads_field","o":"odoo:product_product.uom_ids","f":0.85,"c":0.75} +{"s":"odoo:sale_order_template_line.allowed_uom_ids","p":"target","o":"uom.uom","f":0.95,"c":0.9} +{"s":"odoo:sale_order_template_line.product_id","p":"target","o":"product.product","f":0.95,"c":0.9} +{"s":"odoo:sale_order_template_line.product_uom_id","p":"target","o":"uom.uom","f":0.95,"c":0.9} +{"s":"odoo:slide_channel._compute_category_and_slide_ids","p":"reads_field","o":"odoo:slide_slide.is_category","f":0.85,"c":0.75} +{"s":"odoo:slide_channel._compute_members_counts","p":"reads_field","o":"odoo:slide_channel_partner.channel_id","f":0.85,"c":0.75} +{"s":"odoo:slide_channel._compute_members_counts","p":"reads_field","o":"odoo:slide_channel_partner.member_status","f":0.85,"c":0.75} +{"s":"odoo:slide_channel._compute_membership_values","p":"reads_field","o":"odoo:slide_channel_partner.active","f":0.85,"c":0.75} +{"s":"odoo:slide_channel._compute_membership_values","p":"reads_field","o":"odoo:slide_channel_partner.member_status","f":0.85,"c":0.75} +{"s":"odoo:slide_channel._compute_membership_values","p":"reads_field","o":"odoo:slide_channel_partner.partner_id","f":0.85,"c":0.75} +{"s":"odoo:slide_channel._compute_partners","p":"reads_field","o":"odoo:slide_channel_partner.active","f":0.85,"c":0.75} +{"s":"odoo:slide_channel._compute_partners","p":"reads_field","o":"odoo:slide_channel_partner.member_status","f":0.85,"c":0.75} +{"s":"odoo:slide_channel._compute_prerequisite_user_has_completed","p":"reads_field","o":"odoo:slide_channel_partner.member_status","f":0.85,"c":0.75} +{"s":"odoo:slide_channel._compute_slide_last_update","p":"reads_field","o":"odoo:slide_slide.is_published","f":0.85,"c":0.75} +{"s":"odoo:slide_channel._compute_user_statistics","p":"reads_field","o":"odoo:slide_slide_partner.completed","f":0.85,"c":0.75} +{"s":"odoo:slide_channel.channel_partner_all_ids","p":"inverse_name","o":"channel_id","f":0.95,"c":0.9} +{"s":"odoo:slide_channel.channel_partner_all_ids","p":"target","o":"slide.channel.partner","f":0.95,"c":0.9} +{"s":"odoo:slide_channel.channel_partner_ids","p":"inverse_name","o":"channel_id","f":0.95,"c":0.9} +{"s":"odoo:slide_channel.channel_partner_ids","p":"target","o":"slide.channel.partner","f":0.95,"c":0.9} +{"s":"odoo:slide_channel.partner_ids","p":"target","o":"res.partner","f":0.95,"c":0.9} +{"s":"odoo:slide_channel.slide_category_ids","p":"target","o":"slide.slide","f":0.95,"c":0.9} +{"s":"odoo:slide_channel.slide_content_ids","p":"target","o":"slide.slide","f":0.95,"c":0.9} +{"s":"odoo:slide_channel.slide_ids","p":"inverse_name","o":"channel_id","f":0.95,"c":0.9} +{"s":"odoo:slide_channel.slide_ids","p":"target","o":"slide.slide","f":0.95,"c":0.9} +{"s":"odoo:slide_channel.slide_partner_ids","p":"inverse_name","o":"channel_id","f":0.95,"c":0.9} +{"s":"odoo:slide_channel.slide_partner_ids","p":"target","o":"slide.slide.partner","f":0.95,"c":0.9} +{"s":"odoo:slide_question._compute_answers_validation_error","p":"reads_field","o":"odoo:slide_answer.is_correct","f":0.85,"c":0.75} +{"s":"odoo:slide_question.answer_ids","p":"inverse_name","o":"question_id","f":0.95,"c":0.9} +{"s":"odoo:slide_question.answer_ids","p":"target","o":"slide.answer","f":0.95,"c":0.9} +{"s":"odoo:slide_slide._compute_can_publish","p":"reads_field","o":"odoo:slide_channel.can_publish","f":0.85,"c":0.75} +{"s":"odoo:slide_slide._compute_category_completed","p":"reads_field","o":"odoo:slide_slide.slide_ids","f":0.85,"c":0.75} +{"s":"odoo:slide_slide._compute_category_completed","p":"reads_field","o":"odoo:slide_slide.user_has_completed","f":0.85,"c":0.75} +{"s":"odoo:slide_slide._compute_category_id","p":"reads_field","o":"odoo:slide_slide.is_category","f":0.85,"c":0.75} +{"s":"odoo:slide_slide._compute_category_id","p":"reads_field","o":"odoo:slide_slide.sequence","f":0.85,"c":0.75} +{"s":"odoo:slide_slide._compute_category_id","p":"reads_field","o":"odoo:slide_slide.slide_ids","f":0.85,"c":0.75} +{"s":"odoo:slide_slide._compute_embed_counts","p":"reads_field","o":"odoo:slide_embed.slide_id","f":0.85,"c":0.75} +{"s":"odoo:slide_slide._compute_like_info","p":"reads_field","o":"odoo:slide_slide_partner.vote","f":0.85,"c":0.75} +{"s":"odoo:slide_slide._compute_mark_complete_actions","p":"reads_field","o":"odoo:slide_channel.is_member","f":0.85,"c":0.75} +{"s":"odoo:slide_slide._compute_slide_views","p":"reads_field","o":"odoo:slide_slide_partner.slide_id","f":0.85,"c":0.75} +{"s":"odoo:slide_slide._compute_user_membership_id","p":"reads_field","o":"odoo:slide_slide_partner.completed","f":0.85,"c":0.75} +{"s":"odoo:slide_slide._compute_user_membership_id","p":"reads_field","o":"odoo:slide_slide_partner.partner_id","f":0.85,"c":0.75} +{"s":"odoo:slide_slide._compute_user_membership_id","p":"reads_field","o":"odoo:slide_slide_partner.vote","f":0.85,"c":0.75} +{"s":"odoo:slide_slide._on_change_document_binary_content","p":"reads_field","o":"odoo:slide_slide.active","f":0.85,"c":0.75} +{"s":"odoo:slide_slide._on_change_document_binary_content","p":"reads_field","o":"odoo:slide_slide.is_category","f":0.85,"c":0.75} +{"s":"odoo:slide_slide._on_change_document_binary_content","p":"reads_field","o":"odoo:slide_slide.is_published","f":0.85,"c":0.75} +{"s":"odoo:slide_slide._on_change_document_binary_content","p":"reads_field","o":"odoo:slide_slide.sequence","f":0.85,"c":0.75} +{"s":"odoo:slide_slide.category_id","p":"target","o":"slide.slide","f":0.95,"c":0.9} +{"s":"odoo:slide_slide.channel_id","p":"target","o":"slide.channel","f":0.95,"c":0.9} +{"s":"odoo:slide_slide.embed_ids","p":"inverse_name","o":"slide_id","f":0.95,"c":0.9} +{"s":"odoo:slide_slide.embed_ids","p":"target","o":"slide.embed","f":0.95,"c":0.9} +{"s":"odoo:slide_slide.slide_ids","p":"inverse_name","o":"category_id","f":0.95,"c":0.9} +{"s":"odoo:slide_slide.slide_ids","p":"target","o":"slide.slide","f":0.95,"c":0.9} +{"s":"odoo:slide_slide.slide_partner_ids","p":"inverse_name","o":"slide_id","f":0.95,"c":0.9} +{"s":"odoo:slide_slide.slide_partner_ids","p":"target","o":"slide.slide.partner","f":0.95,"c":0.9} +{"s":"odoo:slide_slide.user_membership_id","p":"target","o":"slide.slide.partner","f":0.95,"c":0.9} +{"s":"odoo:sms_sms.sms_tracker_id","p":"target","o":"sms.tracker","f":0.95,"c":0.9} +{"s":"odoo:stock_landed_cost._compute_total_amount","p":"reads_field","o":"odoo:stock_landed_cost_lines.price_unit","f":0.85,"c":0.75} +{"s":"odoo:stock_landed_cost.cost_lines","p":"inverse_name","o":"cost_id","f":0.95,"c":0.9} +{"s":"odoo:stock_landed_cost.cost_lines","p":"target","o":"stock.landed.cost.lines","f":0.95,"c":0.9} +{"s":"odoo:stock_landed_cost.picking_ids","p":"target","o":"stock.picking","f":0.95,"c":0.9} +{"s":"odoo:stock_location._compute_child_internal_location_ids","p":"reads_field","o":"odoo:stock_location.child_internal_location_ids","f":0.85,"c":0.75} +{"s":"odoo:stock_location._compute_child_internal_location_ids","p":"reads_field","o":"odoo:stock_location.usage","f":0.85,"c":0.75} +{"s":"odoo:stock_location._compute_complete_name","p":"reads_field","o":"odoo:stock_location.complete_name","f":0.85,"c":0.75} +{"s":"odoo:stock_location._compute_display_name","p":"reads_field","o":"odoo:stock_location.complete_name","f":0.85,"c":0.75} +{"s":"odoo:stock_location._compute_weight","p":"reads_field","o":"odoo:product_product.weight","f":0.85,"c":0.75} +{"s":"odoo:stock_location._compute_weight","p":"reads_field","o":"odoo:stock_move_line.quantity_product_uom","f":0.85,"c":0.75} +{"s":"odoo:stock_location._compute_weight","p":"reads_field","o":"odoo:stock_move_line.state","f":0.85,"c":0.75} +{"s":"odoo:stock_location._compute_weight","p":"reads_field","o":"odoo:stock_quant.quantity","f":0.85,"c":0.75} +{"s":"odoo:stock_location.child_ids","p":"inverse_name","o":"location_id","f":0.95,"c":0.9} +{"s":"odoo:stock_location.child_ids","p":"target","o":"stock.location","f":0.95,"c":0.9} +{"s":"odoo:stock_location.child_internal_location_ids","p":"target","o":"stock.location","f":0.95,"c":0.9} +{"s":"odoo:stock_location.incoming_move_line_ids","p":"inverse_name","o":"location_dest_id","f":0.95,"c":0.9} +{"s":"odoo:stock_location.incoming_move_line_ids","p":"target","o":"stock.move.line","f":0.95,"c":0.9} +{"s":"odoo:stock_location.location_id","p":"target","o":"stock.location","f":0.95,"c":0.9} +{"s":"odoo:stock_location.outgoing_move_line_ids","p":"inverse_name","o":"location_id","f":0.95,"c":0.9} +{"s":"odoo:stock_location.outgoing_move_line_ids","p":"target","o":"stock.move.line","f":0.95,"c":0.9} +{"s":"odoo:stock_location.quant_ids","p":"inverse_name","o":"location_id","f":0.95,"c":0.9} +{"s":"odoo:stock_location.quant_ids","p":"target","o":"stock.quant","f":0.95,"c":0.9} +{"s":"odoo:stock_location.warehouse_id","p":"target","o":"stock.warehouse","f":0.95,"c":0.9} +{"s":"odoo:stock_lot._compute_company_id","p":"reads_field","o":"odoo:product_product.company_id","f":0.85,"c":0.75} +{"s":"odoo:stock_lot._compute_single_location","p":"reads_field","o":"odoo:stock_quant.quantity","f":0.85,"c":0.75} +{"s":"odoo:stock_lot._compute_value","p":"reads_field","o":"odoo:product_product.lot_valuated","f":0.85,"c":0.75} +{"s":"odoo:stock_lot._compute_value","p":"reads_field","o":"odoo:product_template.lot_valuated","f":0.85,"c":0.75} +{"s":"odoo:stock_lot._product_qty","p":"reads_field","o":"odoo:stock_quant.quantity","f":0.85,"c":0.75} +{"s":"odoo:stock_lot.company_id","p":"target","o":"res.company","f":0.95,"c":0.9} +{"s":"odoo:stock_lot.location_id","p":"target","o":"stock.location","f":0.95,"c":0.9} +{"s":"odoo:stock_lot.product_id","p":"target","o":"product.product","f":0.95,"c":0.9} +{"s":"odoo:stock_lot.quant_ids","p":"inverse_name","o":"lot_id","f":0.95,"c":0.9} +{"s":"odoo:stock_lot.quant_ids","p":"target","o":"stock.quant","f":0.95,"c":0.9} +{"s":"odoo:stock_move._compute_allowed_uom_ids","p":"reads_field","o":"odoo:product_product.bom_ids","f":0.85,"c":0.75} +{"s":"odoo:stock_move._compute_allowed_uom_ids","p":"reads_field","o":"odoo:product_product.seller_ids","f":0.85,"c":0.75} +{"s":"odoo:stock_move._compute_allowed_uom_ids","p":"reads_field","o":"odoo:product_product.uom_id","f":0.85,"c":0.75} +{"s":"odoo:stock_move._compute_allowed_uom_ids","p":"reads_field","o":"odoo:product_product.uom_ids","f":0.85,"c":0.75} +{"s":"odoo:stock_move._compute_delay_alert_date","p":"reads_field","o":"odoo:stock_move.date","f":0.85,"c":0.75} +{"s":"odoo:stock_move._compute_delay_alert_date","p":"reads_field","o":"odoo:stock_move.state","f":0.85,"c":0.75} +{"s":"odoo:stock_move._compute_display_assign_serial","p":"reads_field","o":"odoo:stock_picking_type.use_create_components_lots","f":0.85,"c":0.75} +{"s":"odoo:stock_move._compute_display_assign_serial","p":"reads_field","o":"odoo:stock_picking_type.use_create_lots","f":0.85,"c":0.75} +{"s":"odoo:stock_move._compute_display_assign_serial","p":"reads_field","o":"odoo:stock_picking_type.use_existing_lots","f":0.85,"c":0.75} +{"s":"odoo:stock_move._compute_has_lines_without_result_package","p":"reads_field","o":"odoo:stock_move_line.result_package_id","f":0.85,"c":0.75} +{"s":"odoo:stock_move._compute_is_initial_demand_editable","p":"reads_field","o":"odoo:stock_picking.is_locked","f":0.85,"c":0.75} +{"s":"odoo:stock_move._compute_is_locked","p":"reads_field","o":"odoo:stock_picking.is_locked","f":0.85,"c":0.75} +{"s":"odoo:stock_move._compute_location_dest_id","p":"reads_field","o":"odoo:stock_picking.location_dest_id","f":0.85,"c":0.75} +{"s":"odoo:stock_move._compute_location_id","p":"reads_field","o":"odoo:stock_picking.location_id","f":0.85,"c":0.75} +{"s":"odoo:stock_move._compute_lot_ids","p":"reads_field","o":"odoo:stock_move_line.lot_id","f":0.85,"c":0.75} +{"s":"odoo:stock_move._compute_lot_ids","p":"reads_field","o":"odoo:stock_move_line.quantity","f":0.85,"c":0.75} +{"s":"odoo:stock_move._compute_package_ids","p":"reads_field","o":"odoo:stock_move_line.result_package_id","f":0.85,"c":0.75} +{"s":"odoo:stock_move._compute_package_ids","p":"reads_field","o":"odoo:stock_package.outermost_package_id","f":0.85,"c":0.75} +{"s":"odoo:stock_move._compute_partner_id","p":"reads_field","o":"odoo:stock_picking.partner_id","f":0.85,"c":0.75} +{"s":"odoo:stock_move._compute_picking_type_id","p":"reads_field","o":"odoo:stock_picking.picking_type_id","f":0.85,"c":0.75} +{"s":"odoo:stock_move._compute_priority","p":"reads_field","o":"odoo:stock_picking.priority","f":0.85,"c":0.75} +{"s":"odoo:stock_move._compute_reference","p":"reads_field","o":"odoo:stock_picking.name","f":0.85,"c":0.75} +{"s":"odoo:stock_move._compute_reference","p":"reads_field","o":"odoo:stock_scrap.name","f":0.85,"c":0.75} +{"s":"odoo:stock_move._compute_show_info","p":"reads_field","o":"odoo:product_product.type","f":0.85,"c":0.75} +{"s":"odoo:stock_move._compute_show_info","p":"reads_field","o":"odoo:stock_picking_type.use_create_lots","f":0.85,"c":0.75} +{"s":"odoo:stock_move._compute_show_info","p":"reads_field","o":"odoo:stock_picking_type.use_existing_lots","f":0.85,"c":0.75} +{"s":"odoo:stock_move._compute_standard_price","p":"reads_field","o":"odoo:product_product.standard_price","f":0.85,"c":0.75} +{"s":"odoo:stock_move._onchange_product_uom_qty","p":"reads_field","o":"odoo:stock_move_line.product_uom_id","f":0.85,"c":0.75} +{"s":"odoo:stock_move._onchange_product_uom_qty","p":"reads_field","o":"odoo:stock_move_line.quantity","f":0.85,"c":0.75} +{"s":"odoo:stock_move._onchange_quantity","p":"reads_field","o":"odoo:stock_move_line.picked","f":0.85,"c":0.75} +{"s":"odoo:stock_move.allowed_uom_ids","p":"target","o":"uom.uom","f":0.95,"c":0.9} +{"s":"odoo:stock_move.location_dest_id","p":"target","o":"stock.location","f":0.95,"c":0.9} +{"s":"odoo:stock_move.location_id","p":"target","o":"stock.location","f":0.95,"c":0.9} +{"s":"odoo:stock_move.lot_ids","p":"target","o":"stock.lot","f":0.95,"c":0.9} +{"s":"odoo:stock_move.move_line_ids","p":"inverse_name","o":"move_id","f":0.95,"c":0.9} +{"s":"odoo:stock_move.move_line_ids","p":"target","o":"stock.move.line","f":0.95,"c":0.9} +{"s":"odoo:stock_move.move_orig_ids","p":"target","o":"stock.move","f":0.95,"c":0.9} +{"s":"odoo:stock_move.package_ids","p":"target","o":"stock.package","f":0.95,"c":0.9} +{"s":"odoo:stock_move.packaging_uom_id","p":"target","o":"uom.uom","f":0.95,"c":0.9} +{"s":"odoo:stock_move.partner_id","p":"target","o":"res.partner","f":0.95,"c":0.9} +{"s":"odoo:stock_move.picking_id","p":"target","o":"stock.picking","f":0.95,"c":0.9} +{"s":"odoo:stock_move.picking_type_id","p":"target","o":"stock.picking.type","f":0.95,"c":0.9} +{"s":"odoo:stock_move.product_id","p":"target","o":"product.product","f":0.95,"c":0.9} +{"s":"odoo:stock_move.product_uom","p":"target","o":"uom.uom","f":0.95,"c":0.9} +{"s":"odoo:stock_move.scrap_id","p":"target","o":"stock.scrap","f":0.95,"c":0.9} +{"s":"odoo:stock_move_line._compute_allowed_uom_ids","p":"reads_field","o":"odoo:product_product.seller_ids","f":0.85,"c":0.75} +{"s":"odoo:stock_move_line._compute_allowed_uom_ids","p":"reads_field","o":"odoo:product_product.uom_id","f":0.85,"c":0.75} +{"s":"odoo:stock_move_line._compute_allowed_uom_ids","p":"reads_field","o":"odoo:product_product.uom_ids","f":0.85,"c":0.75} +{"s":"odoo:stock_move_line._compute_expiration_date","p":"reads_field","o":"odoo:stock_lot.expiration_date","f":0.85,"c":0.75} +{"s":"odoo:stock_move_line._compute_expiration_date","p":"reads_field","o":"odoo:stock_picking.scheduled_date","f":0.85,"c":0.75} +{"s":"odoo:stock_move_line._compute_product_uom_id","p":"reads_field","o":"odoo:product_product.uom_id","f":0.85,"c":0.75} +{"s":"odoo:stock_move_line._compute_product_uom_id","p":"reads_field","o":"odoo:stock_move.product_uom","f":0.85,"c":0.75} +{"s":"odoo:stock_move_line._compute_removal_date","p":"reads_field","o":"odoo:stock_lot.removal_date","f":0.85,"c":0.75} +{"s":"odoo:stock_move_line._onchange_product_id","p":"reads_field","o":"odoo:product_product.tracking","f":0.85,"c":0.75} +{"s":"odoo:stock_move_line._onchange_product_id","p":"reads_field","o":"odoo:stock_picking.picking_type_id","f":0.85,"c":0.75} +{"s":"odoo:stock_move_line._onchange_putaway_location","p":"reads_field","o":"odoo:stock_move.location_dest_id","f":0.85,"c":0.75} +{"s":"odoo:stock_move_line._onchange_putaway_location","p":"reads_field","o":"odoo:stock_move.location_id","f":0.85,"c":0.75} +{"s":"odoo:stock_move_line._onchange_serial_number","p":"reads_field","o":"odoo:stock_move.location_dest_id","f":0.85,"c":0.75} +{"s":"odoo:stock_move_line._onchange_serial_number","p":"reads_field","o":"odoo:stock_move.location_id","f":0.85,"c":0.75} +{"s":"odoo:stock_move_line.allowed_uom_ids","p":"target","o":"uom.uom","f":0.95,"c":0.9} +{"s":"odoo:stock_move_line.location_dest_id","p":"target","o":"stock.location","f":0.95,"c":0.9} +{"s":"odoo:stock_move_line.location_id","p":"target","o":"stock.location","f":0.95,"c":0.9} +{"s":"odoo:stock_move_line.lot_id","p":"target","o":"stock.lot","f":0.95,"c":0.9} +{"s":"odoo:stock_move_line.move_id","p":"target","o":"stock.move","f":0.95,"c":0.9} +{"s":"odoo:stock_move_line.picking_id","p":"target","o":"stock.picking","f":0.95,"c":0.9} +{"s":"odoo:stock_move_line.picking_type_id","p":"target","o":"stock.picking.type","f":0.95,"c":0.9} +{"s":"odoo:stock_move_line.product_id","p":"target","o":"product.product","f":0.95,"c":0.9} +{"s":"odoo:stock_move_line.product_uom_id","p":"target","o":"uom.uom","f":0.95,"c":0.9} +{"s":"odoo:stock_package._compute_all_children_package_ids","p":"reads_field","o":"odoo:stock_package.parent_path","f":0.85,"c":0.75} +{"s":"odoo:stock_package._compute_complete_name","p":"reads_field","o":"odoo:stock_package.complete_name","f":0.85,"c":0.75} +{"s":"odoo:stock_package._compute_contained_quant_ids","p":"reads_field","o":"odoo:stock_package.quant_ids","f":0.85,"c":0.75} +{"s":"odoo:stock_package._compute_dest_complete_name","p":"reads_field","o":"odoo:stock_package.dest_complete_name","f":0.85,"c":0.75} +{"s":"odoo:stock_package._compute_display_name","p":"reads_field","o":"odoo:stock_package_type.height","f":0.85,"c":0.75} +{"s":"odoo:stock_package._compute_display_name","p":"reads_field","o":"odoo:stock_package_type.packaging_length","f":0.85,"c":0.75} +{"s":"odoo:stock_package._compute_display_name","p":"reads_field","o":"odoo:stock_package_type.width","f":0.85,"c":0.75} +{"s":"odoo:stock_package._compute_outermost_package_id","p":"reads_field","o":"odoo:stock_package.outermost_package_id","f":0.85,"c":0.75} +{"s":"odoo:stock_package._compute_owner_id","p":"reads_field","o":"odoo:stock_quant.owner_id","f":0.85,"c":0.75} +{"s":"odoo:stock_package._compute_package_info","p":"reads_field","o":"odoo:stock_package.location_id","f":0.85,"c":0.75} +{"s":"odoo:stock_package.all_children_package_ids","p":"target","o":"stock.package","f":0.95,"c":0.9} +{"s":"odoo:stock_package.child_package_ids","p":"inverse_name","o":"parent_package_id","f":0.95,"c":0.9} +{"s":"odoo:stock_package.child_package_ids","p":"target","o":"stock.package","f":0.95,"c":0.9} +{"s":"odoo:stock_package.company_id","p":"target","o":"res.company","f":0.95,"c":0.9} +{"s":"odoo:stock_package.contained_quant_ids","p":"target","o":"stock.quant","f":0.95,"c":0.9} +{"s":"odoo:stock_package.location_dest_id","p":"target","o":"stock.location","f":0.95,"c":0.9} +{"s":"odoo:stock_package.location_id","p":"target","o":"stock.location","f":0.95,"c":0.9} +{"s":"odoo:stock_package.move_line_ids","p":"target","o":"stock.move.line","f":0.95,"c":0.9} +{"s":"odoo:stock_package.outermost_package_id","p":"target","o":"stock.package","f":0.95,"c":0.9} +{"s":"odoo:stock_package.owner_id","p":"target","o":"res.partner","f":0.95,"c":0.9} +{"s":"odoo:stock_package.package_dest_id","p":"target","o":"stock.package","f":0.95,"c":0.9} +{"s":"odoo:stock_package.package_type_id","p":"target","o":"stock.package.type","f":0.95,"c":0.9} +{"s":"odoo:stock_package.parent_package_id","p":"target","o":"stock.package","f":0.95,"c":0.9} +{"s":"odoo:stock_package.picking_ids","p":"target","o":"stock.picking","f":0.95,"c":0.9} +{"s":"odoo:stock_package.quant_ids","p":"inverse_name","o":"package_id","f":0.95,"c":0.9} +{"s":"odoo:stock_package.quant_ids","p":"target","o":"stock.quant","f":0.95,"c":0.9} +{"s":"odoo:stock_picking._cal_weight","p":"reads_field","o":"odoo:stock_move.weight","f":0.85,"c":0.75} +{"s":"odoo:stock_picking._compute_allowed_carrier_ids","p":"reads_field","o":"odoo:product_product.product_tag_ids","f":0.85,"c":0.75} +{"s":"odoo:stock_picking._compute_allowed_carrier_ids","p":"reads_field","o":"odoo:product_product.volume","f":0.85,"c":0.75} +{"s":"odoo:stock_picking._compute_allowed_carrier_ids","p":"reads_field","o":"odoo:product_product.weight","f":0.85,"c":0.75} +{"s":"odoo:stock_picking._compute_bulk_weight","p":"reads_field","o":"odoo:stock_move_line.product_uom_id","f":0.85,"c":0.75} +{"s":"odoo:stock_picking._compute_bulk_weight","p":"reads_field","o":"odoo:stock_move_line.quantity","f":0.85,"c":0.75} +{"s":"odoo:stock_picking._compute_bulk_weight","p":"reads_field","o":"odoo:stock_move_line.result_package_id","f":0.85,"c":0.75} +{"s":"odoo:stock_picking._compute_date_deadline","p":"reads_field","o":"odoo:stock_move.date_deadline","f":0.85,"c":0.75} +{"s":"odoo:stock_picking._compute_delay_alert_date","p":"reads_field","o":"odoo:stock_move.delay_alert_date","f":0.85,"c":0.75} +{"s":"odoo:stock_picking._compute_l10n_ar_delivery_guide_flags","p":"reads_field","o":"odoo:stock_picking_type.l10n_ar_document_type_id","f":0.85,"c":0.75} +{"s":"odoo:stock_picking._compute_l10n_ro_edi_stock_current_document_state","p":"reads_field","o":"odoo:res_country.code","f":0.85,"c":0.75} +{"s":"odoo:stock_picking._compute_l10n_ro_edi_stock_current_document_uit","p":"reads_field","o":"odoo:res_country.code","f":0.85,"c":0.75} +{"s":"odoo:stock_picking._compute_l10n_ro_edi_stock_enable","p":"reads_field","o":"odoo:res_country.code","f":0.85,"c":0.75} +{"s":"odoo:stock_picking._compute_picking_warning_text","p":"reads_field","o":"odoo:res_partner.name","f":0.85,"c":0.75} +{"s":"odoo:stock_picking._compute_production_ids","p":"reads_field","o":"odoo:stock_reference.production_ids","f":0.85,"c":0.75} +{"s":"odoo:stock_picking._compute_products_availability","p":"reads_field","o":"odoo:stock_move.forecast_availability","f":0.85,"c":0.75} +{"s":"odoo:stock_picking._compute_products_availability","p":"reads_field","o":"odoo:stock_move.forecast_expected_date","f":0.85,"c":0.75} +{"s":"odoo:stock_picking._compute_scheduled_date","p":"reads_field","o":"odoo:stock_move.date","f":0.85,"c":0.75} +{"s":"odoo:stock_picking._compute_scheduled_date","p":"reads_field","o":"odoo:stock_move.state","f":0.85,"c":0.75} +{"s":"odoo:stock_picking._compute_shipping_weight","p":"reads_field","o":"odoo:stock_move_line.result_package_id","f":0.85,"c":0.75} +{"s":"odoo:stock_picking._compute_shipping_weight","p":"reads_field","o":"odoo:stock_package.outermost_package_id","f":0.85,"c":0.75} +{"s":"odoo:stock_picking._compute_shipping_weight","p":"reads_field","o":"odoo:stock_package.package_type_id","f":0.85,"c":0.75} +{"s":"odoo:stock_picking._compute_shipping_weight","p":"reads_field","o":"odoo:stock_package.shipping_weight","f":0.85,"c":0.75} +{"s":"odoo:stock_picking._compute_show_check_availability","p":"reads_field","o":"odoo:stock_move.product_uom_qty","f":0.85,"c":0.75} +{"s":"odoo:stock_picking._compute_show_lots_text","p":"reads_field","o":"odoo:stock_move.has_tracking","f":0.85,"c":0.75} +{"s":"odoo:stock_picking._compute_show_lots_text","p":"reads_field","o":"odoo:stock_move.is_subcontract","f":0.85,"c":0.75} +{"s":"odoo:stock_picking._compute_show_lots_text","p":"reads_field","o":"odoo:stock_picking_type.use_create_lots","f":0.85,"c":0.75} +{"s":"odoo:stock_picking._compute_show_lots_text","p":"reads_field","o":"odoo:stock_picking_type.use_existing_lots","f":0.85,"c":0.75} +{"s":"odoo:stock_picking._compute_show_next_pickings","p":"reads_field","o":"odoo:stock_move.move_dest_ids","f":0.85,"c":0.75} +{"s":"odoo:stock_picking._compute_show_subcontracting_details_visible","p":"reads_field","o":"odoo:stock_move.show_subcontracting_details_visible","f":0.85,"c":0.75} +{"s":"odoo:stock_picking._compute_state","p":"reads_field","o":"odoo:stock_move.picking_id","f":0.85,"c":0.75} +{"s":"odoo:stock_picking._compute_state","p":"reads_field","o":"odoo:stock_move.state","f":0.85,"c":0.75} +{"s":"odoo:stock_picking._compute_subcontracting_source_purchase_count","p":"reads_field","o":"odoo:stock_move.raw_material_production_id","f":0.85,"c":0.75} +{"s":"odoo:stock_picking._l10n_ro_edi_stock_reset_variable_selection_fields","p":"reads_field","o":"odoo:res_country.code","f":0.85,"c":0.75} +{"s":"odoo:stock_picking.company_id","p":"target","o":"res.company","f":0.95,"c":0.9} +{"s":"odoo:stock_picking.location_dest_id","p":"target","o":"stock.location","f":0.95,"c":0.9} +{"s":"odoo:stock_picking.location_id","p":"target","o":"stock.location","f":0.95,"c":0.9} +{"s":"odoo:stock_picking.move_ids","p":"inverse_name","o":"picking_id","f":0.95,"c":0.9} +{"s":"odoo:stock_picking.move_ids","p":"target","o":"stock.move","f":0.95,"c":0.9} +{"s":"odoo:stock_picking.move_line_ids","p":"inverse_name","o":"picking_id","f":0.95,"c":0.9} +{"s":"odoo:stock_picking.move_line_ids","p":"target","o":"stock.move.line","f":0.95,"c":0.9} +{"s":"odoo:stock_picking.partner_id","p":"target","o":"res.partner","f":0.95,"c":0.9} +{"s":"odoo:stock_picking.picking_type_id","p":"target","o":"stock.picking.type","f":0.95,"c":0.9} +{"s":"odoo:stock_picking.reference_ids","p":"target","o":"stock.reference","f":0.95,"c":0.9} +{"s":"odoo:stock_picking_batch._compute_dock_id","p":"reads_field","o":"odoo:stock_picking.location_dest_id","f":0.85,"c":0.75} +{"s":"odoo:stock_picking_batch._compute_dock_id","p":"reads_field","o":"odoo:stock_picking.location_id","f":0.85,"c":0.75} +{"s":"odoo:stock_picking_batch._compute_l10n_ro_edi_stock_current_document_state","p":"reads_field","o":"odoo:res_country.code","f":0.85,"c":0.75} +{"s":"odoo:stock_picking_batch._compute_l10n_ro_edi_stock_current_document_uit","p":"reads_field","o":"odoo:res_country.code","f":0.85,"c":0.75} +{"s":"odoo:stock_picking_batch._compute_l10n_ro_edi_stock_enable","p":"reads_field","o":"odoo:res_country.code","f":0.85,"c":0.75} +{"s":"odoo:stock_picking_batch._compute_move_ids","p":"reads_field","o":"odoo:stock_move.state","f":0.85,"c":0.75} +{"s":"odoo:stock_picking_batch._compute_move_ids","p":"reads_field","o":"odoo:stock_picking.move_ids","f":0.85,"c":0.75} +{"s":"odoo:stock_picking_batch._compute_move_ids","p":"reads_field","o":"odoo:stock_picking.move_line_ids","f":0.85,"c":0.75} +{"s":"odoo:stock_picking_batch._compute_move_line_ids","p":"reads_field","o":"odoo:stock_picking.move_line_ids","f":0.85,"c":0.75} +{"s":"odoo:stock_picking_batch._compute_scheduled_date","p":"reads_field","o":"odoo:stock_picking.scheduled_date","f":0.85,"c":0.75} +{"s":"odoo:stock_picking_batch._compute_state","p":"reads_field","o":"odoo:stock_picking.state","f":0.85,"c":0.75} +{"s":"odoo:stock_picking_batch._l10n_ro_edi_stock_reset_variable_selection_fields","p":"reads_field","o":"odoo:res_country.code","f":0.85,"c":0.75} +{"s":"odoo:stock_picking_batch.allowed_picking_ids","p":"target","o":"stock.picking","f":0.95,"c":0.9} +{"s":"odoo:stock_picking_batch.company_id","p":"target","o":"res.company","f":0.95,"c":0.9} +{"s":"odoo:stock_picking_batch.move_ids","p":"target","o":"stock.move","f":0.95,"c":0.9} +{"s":"odoo:stock_picking_batch.move_line_ids","p":"target","o":"stock.move.line","f":0.95,"c":0.9} +{"s":"odoo:stock_picking_batch.picking_ids","p":"inverse_name","o":"batch_id","f":0.95,"c":0.9} +{"s":"odoo:stock_picking_batch.picking_ids","p":"target","o":"stock.picking","f":0.95,"c":0.9} +{"s":"odoo:stock_quant.location_id","p":"target","o":"stock.location","f":0.95,"c":0.9} +{"s":"odoo:stock_replenish_mixin.allowed_route_ids","p":"target","o":"stock.route","f":0.95,"c":0.9} +{"s":"odoo:stock_rule.company_id","p":"target","o":"res.company","f":0.95,"c":0.9} +{"s":"odoo:stock_rule.location_dest_id","p":"target","o":"stock.location","f":0.95,"c":0.9} +{"s":"odoo:stock_rule.location_src_id","p":"target","o":"stock.location","f":0.95,"c":0.9} +{"s":"odoo:stock_rule.picking_type_id","p":"target","o":"stock.picking.type","f":0.95,"c":0.9} +{"s":"odoo:stock_scrap._compute_allowed_uom_ids","p":"reads_field","o":"odoo:product_product.seller_ids","f":0.85,"c":0.75} +{"s":"odoo:stock_scrap._compute_allowed_uom_ids","p":"reads_field","o":"odoo:product_product.uom_id","f":0.85,"c":0.75} +{"s":"odoo:stock_scrap._compute_allowed_uom_ids","p":"reads_field","o":"odoo:product_product.uom_ids","f":0.85,"c":0.75} +{"s":"odoo:stock_scrap._compute_scrap_qty","p":"reads_field","o":"odoo:stock_move_line.quantity","f":0.85,"c":0.75} +{"s":"odoo:stock_scrap.allowed_uom_ids","p":"target","o":"uom.uom","f":0.95,"c":0.9} +{"s":"odoo:stock_scrap.location_id","p":"target","o":"stock.location","f":0.95,"c":0.9} +{"s":"odoo:stock_scrap.move_ids","p":"inverse_name","o":"scrap_id","f":0.95,"c":0.9} +{"s":"odoo:stock_scrap.move_ids","p":"target","o":"stock.move","f":0.95,"c":0.9} +{"s":"odoo:stock_scrap.product_id","p":"target","o":"product.product","f":0.95,"c":0.9} +{"s":"odoo:stock_scrap.product_uom_id","p":"target","o":"uom.uom","f":0.95,"c":0.9} +{"s":"odoo:stock_scrap.scrap_location_id","p":"target","o":"stock.location","f":0.95,"c":0.9} +{"s":"odoo:stock_storage_category.package_capacity_ids","p":"target","o":"stock.storage.category.capacity","f":0.95,"c":0.9} +{"s":"odoo:stock_storage_category.product_capacity_ids","p":"target","o":"stock.storage.category.capacity","f":0.95,"c":0.9} +{"s":"odoo:survey_question._compute_allowed_triggering_question_ids","p":"reads_field","o":"odoo:survey_survey.question_ids","f":0.85,"c":0.75} +{"s":"odoo:survey_question._compute_background_image_url","p":"reads_field","o":"odoo:survey_survey.access_token","f":0.85,"c":0.75} +{"s":"odoo:survey_question._compute_background_image_url","p":"reads_field","o":"odoo:survey_survey.background_image_url","f":0.85,"c":0.75} +{"s":"odoo:survey_question._compute_has_image_only_suggested_answer","p":"reads_field","o":"odoo:survey_question_answer.value","f":0.85,"c":0.75} +{"s":"odoo:survey_question._compute_is_scored_question","p":"reads_field","o":"odoo:survey_question_answer.is_correct","f":0.85,"c":0.75} +{"s":"odoo:survey_question._compute_page_id","p":"reads_field","o":"odoo:survey_question.is_page","f":0.85,"c":0.75} +{"s":"odoo:survey_question._compute_page_id","p":"reads_field","o":"odoo:survey_question.sequence","f":0.85,"c":0.75} +{"s":"odoo:survey_question._compute_question_ids","p":"reads_field","o":"odoo:survey_question.is_page","f":0.85,"c":0.75} +{"s":"odoo:survey_question._compute_question_ids","p":"reads_field","o":"odoo:survey_question.sequence","f":0.85,"c":0.75} +{"s":"odoo:survey_question.allowed_triggering_question_ids","p":"target","o":"survey.question","f":0.95,"c":0.9} +{"s":"odoo:survey_question.page_id","p":"target","o":"survey.question","f":0.95,"c":0.9} +{"s":"odoo:survey_question.question_ids","p":"target","o":"survey.question","f":0.95,"c":0.9} +{"s":"odoo:survey_question.suggested_answer_ids","p":"inverse_name","o":"question_id","f":0.95,"c":0.9} +{"s":"odoo:survey_question.suggested_answer_ids","p":"target","o":"survey.question.answer","f":0.95,"c":0.9} +{"s":"odoo:survey_question.survey_id","p":"target","o":"survey.survey","f":0.95,"c":0.9} +{"s":"odoo:survey_question.triggering_question_ids","p":"target","o":"survey.question","f":0.95,"c":0.9} +{"s":"odoo:survey_survey._compute_answer_duration_avg","p":"reads_field","o":"odoo:survey_user_input.end_datetime","f":0.85,"c":0.75} +{"s":"odoo:survey_survey._compute_answer_duration_avg","p":"reads_field","o":"odoo:survey_user_input.start_datetime","f":0.85,"c":0.75} +{"s":"odoo:survey_survey._compute_answer_duration_avg","p":"reads_field","o":"odoo:survey_user_input.survey_id","f":0.85,"c":0.75} +{"s":"odoo:survey_survey._compute_has_conditional_questions","p":"reads_field","o":"odoo:survey_question.triggering_answer_ids","f":0.85,"c":0.75} +{"s":"odoo:survey_survey._compute_is_attempts_limited","p":"reads_field","o":"odoo:survey_question.triggering_answer_ids","f":0.85,"c":0.75} +{"s":"odoo:survey_survey._compute_scoring_max_obtainable","p":"reads_field","o":"odoo:survey_question.suggested_answer_ids","f":0.85,"c":0.75} +{"s":"odoo:survey_survey._compute_scoring_max_obtainable","p":"reads_field","o":"odoo:survey_question_answer.answer_score","f":0.85,"c":0.75} +{"s":"odoo:survey_survey._compute_session_question_answer_count","p":"reads_field","o":"odoo:survey_user_input.user_input_line_ids","f":0.85,"c":0.75} +{"s":"odoo:survey_survey._compute_session_show_leaderboard","p":"reads_field","o":"odoo:survey_question.save_as_nickname","f":0.85,"c":0.75} +{"s":"odoo:survey_survey.page_ids","p":"target","o":"survey.question","f":0.95,"c":0.9} +{"s":"odoo:survey_survey.question_and_page_ids","p":"inverse_name","o":"survey_id","f":0.95,"c":0.9} +{"s":"odoo:survey_survey.question_and_page_ids","p":"target","o":"survey.question","f":0.95,"c":0.9} +{"s":"odoo:survey_survey.question_ids","p":"target","o":"survey.question","f":0.95,"c":0.9} +{"s":"odoo:survey_survey.restrict_user_ids","p":"target","o":"res.users","f":0.95,"c":0.9} +{"s":"odoo:survey_survey.user_input_ids","p":"inverse_name","o":"survey_id","f":0.95,"c":0.9} +{"s":"odoo:survey_survey.user_input_ids","p":"target","o":"survey.user_input","f":0.95,"c":0.9} +{"s":"odoo:survey_user_input._compute_attempts_info","p":"reads_field","o":"odoo:survey_survey.is_attempts_limited","f":0.85,"c":0.75} +{"s":"odoo:survey_user_input._compute_question_time_limit_reached","p":"reads_field","o":"odoo:survey_question.is_time_limited","f":0.85,"c":0.75} +{"s":"odoo:survey_user_input._compute_question_time_limit_reached","p":"reads_field","o":"odoo:survey_question.time_limit","f":0.85,"c":0.75} +{"s":"odoo:survey_user_input._compute_question_time_limit_reached","p":"reads_field","o":"odoo:survey_survey.session_question_start_time","f":0.85,"c":0.75} +{"s":"odoo:survey_user_input._compute_scoring_values","p":"reads_field","o":"odoo:survey_question.answer_score","f":0.85,"c":0.75} +{"s":"odoo:survey_user_input._compute_scoring_values","p":"reads_field","o":"odoo:survey_user_input_line.answer_score","f":0.85,"c":0.75} +{"s":"odoo:survey_user_input._compute_scoring_values","p":"reads_field","o":"odoo:survey_user_input_line.question_id","f":0.85,"c":0.75} +{"s":"odoo:survey_user_input._compute_survey_time_limit_reached","p":"reads_field","o":"odoo:survey_survey.is_time_limited","f":0.85,"c":0.75} +{"s":"odoo:survey_user_input._compute_survey_time_limit_reached","p":"reads_field","o":"odoo:survey_survey.time_limit","f":0.85,"c":0.75} +{"s":"odoo:survey_user_input.predefined_question_ids","p":"target","o":"survey.question","f":0.95,"c":0.9} +{"s":"odoo:survey_user_input.survey_id","p":"target","o":"survey.survey","f":0.95,"c":0.9} +{"s":"odoo:survey_user_input.user_input_line_ids","p":"inverse_name","o":"user_input_id","f":0.95,"c":0.9} +{"s":"odoo:survey_user_input.user_input_line_ids","p":"target","o":"survey.user_input.line","f":0.95,"c":0.9} +{"s":"odoo:uom_uom._compute_factor","p":"reads_field","o":"odoo:uom_uom.factor","f":0.85,"c":0.75} +{"s":"odoo:uom_uom.relative_uom_id","p":"target","o":"uom.uom","f":0.95,"c":0.9} +{"s":"odoo:website._compute_show_line_subtotals_tax_selection","p":"reads_field","o":"odoo:res_company.account_fiscal_country_id","f":0.85,"c":0.75} +{"s":"odoo:website.company_id","p":"target","o":"res.company","f":0.95,"c":0.9} +{"s":"odoo:website.default_lang_id","p":"target","o":"res.lang","f":0.95,"c":0.9} +{"s":"odoo:website_visitor._compute_email_phone","p":"reads_field","o":"odoo:res_partner.email_normalized","f":0.85,"c":0.75} +{"s":"odoo:website_visitor._compute_email_phone","p":"reads_field","o":"odoo:res_partner.phone","f":0.85,"c":0.75} +{"s":"odoo:website_visitor._compute_last_visited_page_id","p":"reads_field","o":"odoo:website_track.page_id","f":0.85,"c":0.75} +{"s":"odoo:website_visitor.last_visited_page_id","p":"target","o":"website.page","f":0.95,"c":0.9} +{"s":"odoo:website_visitor.partner_id","p":"target","o":"res.partner","f":0.95,"c":0.9} +{"s":"odoo:website_visitor.website_track_ids","p":"inverse_name","o":"visitor_id","f":0.95,"c":0.9} +{"s":"odoo:website_visitor.website_track_ids","p":"target","o":"website.track","f":0.95,"c":0.9} diff --git a/tools/odoo-blueprint-extractor/odoo_blueprint_extractor/spo_enrich.py b/tools/odoo-blueprint-extractor/odoo_blueprint_extractor/spo_enrich.py new file mode 100644 index 000000000..c45f35e2c --- /dev/null +++ b/tools/odoo-blueprint-extractor/odoo_blueprint_extractor/spo_enrich.py @@ -0,0 +1,432 @@ +"""SPO corpus enrichment — FK target/inverse_name (P1) + deep reads_field (P0). + +Stdlib-only Python 3. Reads the Odoo ORM source (the same addons tree the +ORM extractor parses) to build a relation-target map, then enriches an +existing SPO ndjson corpus with two additive predicate families: + + * **P1 — `target` / `inverse_name`** (UPSTREAM_WISHLIST P1, ruff#18 shape): + for every relational field (Many2one / One2many / Many2many / Reference) + that is a `ogit:Property` node in the corpus and whose comodel resolves + from source, emit a sibling triple keyed by the field IRI:: + + (odoo:account_move.line_ids, target, "account.move.line") + (odoo:account_move.line_ids, inverse_name, "move_id") + + The object is the *raw* Odoo dotted model name / inverse string, matching + the ratified cross-language shape in + `AdaWorldAPI/ruff#18` — `(WorkPackage.owner, class_name, "User")`. + + * **P0 — deep `reads_field`** (UPSTREAM_WISHLIST P0, narrowed ask): for each + existing `depends_on` triple whose object is a dotted relation-traversal + path (`odoo:..<...>.`, ≥ 2 path segments), resolve each + relational hop via the target map and emit a deep read on the field that + the dependent field is *emitted by*:: + + @api.depends('line_ids.amount_residual') on amount_total + (emitted by _compute_amount) + ⇒ (odoo:account_move._compute_amount, reads_field, + odoo:account_move_line.amount_residual) + + This is *in addition* to the existing shallow relation read + `(_compute_amount, reads_field, odoo:account_move.line_ids)`. The deep + read makes the cross-model recompute-ordering edge visible to + `od_ontology::RecomputeDag` (which today sees only the relation read, + leaving the line→move dependency structurally invisible). + +# Why a separate enrichment pass (not the ORM extractor) + +The ORM extractor (`parsers/`, `emitters/`) emits typed Rust `OdooEntity` +consts into `lance-graph-ontology`. The SPO ndjson corpus is a *separate* +artifact (the body-write / `@api.depends` graph). The corpus's original +generator (`emit_ontology2.py` over a `methods.parquet`, per the +`odoo_ontology.rs` module doc) is **not present in the tree** — only its +output is. This pass is the additive, idempotent enrichment step that runs +over the shipped corpus + the Odoo source, both of which ARE present. + +Determinism: the same source + corpus always produce the same triples +(sorted, de-duplicated against existing keys). Re-running over an +already-enriched corpus is a no-op for the new predicates (they are +de-duplicated by `(s, p, o)`). + +# Self-loop / dedup semantics + + * A deep read equal to its own emitter `(method, reads_field, )` + is never emitted (matches `RecomputeDag`'s self-loop drop). + * `(s, p, o)` triples already present in the corpus are not re-emitted. +""" + +import argparse +import ast +import glob +import json +import os +import sys +from typing import Dict, List, Optional, Set, Tuple + +# Relational ORM field kinds that carry a comodel + (sometimes) an inverse name. +RELATIONAL_KINDS = {"Many2one", "One2many", "Many2many", "Reference"} + +# NARS truth values mirror the corpus conventions in odoo_ontology.rs: +# authoritative (decorator / declared comodel) edges → (0.95, 0.90) +# body-inferred edges → (0.85, 0.75) +TARGET_TRUTH = (0.95, 0.90) +INVERSE_TRUTH = (0.95, 0.90) +DEEP_READ_TRUTH = (0.85, 0.75) + + +def model_to_underscore(dotted: str) -> str: + """`account.move.line` → `account_move_line` (corpus IRI convention).""" + return dotted.replace(".", "_") + + +# --------------------------------------------------------------------------- +# Relation map — (model_underscore, field) → (comodel_dotted, inverse_or_None) +# --------------------------------------------------------------------------- + + +def _const_str(node: Optional[ast.expr]) -> Optional[str]: + if isinstance(node, ast.Constant) and isinstance(node.value, str): + return node.value + return None + + +def _scan_file(path: str, relmap: Dict[Tuple[str, str], Tuple[str, Optional[str]]]) -> None: + """Parse one .py file; record every relational field on every named model. + + A model is keyed by its `_name`. Relational fields capture comodel + (kw `comodel_name` or positional arg 0) and inverse name (One2many's + positional arg 1 / kw `inverse_name`; Many2one has no inverse here). + """ + try: + with open(path, encoding="utf-8") as fh: + tree = ast.parse(fh.read()) + except (OSError, SyntaxError, ValueError): + # Vendored Odoo occasionally carries py2 remnants / encoding quirks; + # a file we cannot parse contributes nothing and is skipped. + return + + for node in ast.walk(tree): + if not isinstance(node, ast.ClassDef): + continue + + model_name: Optional[str] = None + local_fields: Dict[str, Tuple[str, Optional[str]]] = {} + + for stmt in node.body: + if not ( + isinstance(stmt, ast.Assign) + and len(stmt.targets) == 1 + and isinstance(stmt.targets[0], ast.Name) + ): + continue + target_name = stmt.targets[0].id + + # _name = 'account.move.line' + if target_name == "_name": + s = _const_str(stmt.value) + if s is not None: + model_name = s + continue + + # field = fields.X(...) + if not ( + isinstance(stmt.value, ast.Call) + and isinstance(stmt.value.func, ast.Attribute) + and isinstance(stmt.value.func.value, ast.Name) + and stmt.value.func.value.id == "fields" + ): + continue + field_type = stmt.value.func.attr + if field_type not in RELATIONAL_KINDS: + continue + + call = stmt.value + comodel: Optional[str] = None + inverse: Optional[str] = None + + # comodel_name kw, else positional arg 0 + for kw in call.keywords: + if kw.arg == "comodel_name": + comodel = _const_str(kw.value) + elif kw.arg == "inverse_name": + inverse = _const_str(kw.value) + if comodel is None and call.args: + comodel = _const_str(call.args[0]) + # One2many inverse is positional arg 1 when not given as kw + if ( + field_type == "One2many" + and inverse is None + and len(call.args) >= 2 + ): + inverse = _const_str(call.args[1]) + + if comodel is not None: + local_fields[target_name] = (comodel, inverse) + + if model_name is not None: + mu = model_to_underscore(model_name) + for field_name, (comodel, inverse) in local_fields.items(): + # Last write wins across _inherit reopenings of the same model; + # comodel for a given (model, field) is stable in practice. + relmap[(mu, field_name)] = (comodel, inverse) + + +def build_relation_map(addons_root: str) -> Dict[Tuple[str, str], Tuple[str, Optional[str]]]: + """Scan every .py under `addons_root`; return (model_us, field) → (comodel, inverse).""" + relmap: Dict[Tuple[str, str], Tuple[str, Optional[str]]] = {} + pattern = os.path.join(addons_root, "**", "*.py") + for path in glob.iglob(pattern, recursive=True): + _scan_file(path, relmap) + return relmap + + +# --------------------------------------------------------------------------- +# Corpus IO +# --------------------------------------------------------------------------- + + +def load_corpus(path: str) -> List[dict]: + triples: List[dict] = [] + with open(path, encoding="utf-8") as fh: + for line in fh: + line = line.strip() + if line: + triples.append(json.loads(line)) + return triples + + +def triple_line(s: str, p: str, o: str, f: float, c: float) -> str: + """One ndjson line matching the corpus byte shape (no spaces, key order s/p/o/f/c).""" + return json.dumps({"s": s, "p": p, "o": o, "f": f, "c": c}, separators=(",", ":")) + + +# --------------------------------------------------------------------------- +# Enrichment +# --------------------------------------------------------------------------- + + +def resolve_path( + start_model_us: str, + segments: List[str], + relmap: Dict[Tuple[str, str], Tuple[str, Optional[str]]], +) -> Optional[Tuple[str, str]]: + """Walk relational hops `seg[0..n-1]`; leaf = `seg[n-1]`. + + Returns `(final_model_underscore, leaf)` or `None` if any non-leaf hop + is not a known relational field (target unknown → skip the lift). + """ + cur = start_model_us + for hop in segments[:-1]: + entry = relmap.get((cur, hop)) + if entry is None: + return None + cur = model_to_underscore(entry[0]) + return (cur, segments[-1]) + + +def enrich( + triples: List[dict], + relmap: Dict[Tuple[str, str], Tuple[str, Optional[str]]], +) -> Tuple[List[str], dict]: + """Compute the additive enrichment lines + a stats dict. + + Returns `(new_lines_sorted, stats)`. `new_lines_sorted` are ndjson lines + NOT already present in `triples` (de-duplicated by `(s, p, o)`). + """ + existing_spo: Set[Tuple[str, str, str]] = { + (t["s"], t["p"], t["o"]) for t in triples + } + + # ObjectType (model) IRIs declared in the corpus — the additive boundary: + # P1 target/inverse_name is only ever emitted for a field whose MODEL the + # corpus already declares. Never invents a relation on an unknown model. + object_type_models: Set[str] = { + t["s"][len("odoo:") :] + for t in triples + if t["p"] == "rdf:type" + and t["o"] == "ogit:ObjectType" + and t["s"].startswith("odoo:") + } + + # Candidate relational-field IRIs to consider for target/inverse_name. + # Two sources, both scoped to corpus-declared models: + # (a) declared Property nodes (e.g. `invoice_line_ids`, `partner_id`) + # (b) the first relation segment of every dotted depends_on / reads_field + # object (e.g. `line_ids` in `account_move.line_ids.amount_residual`) + # — these relations are *used* by the corpus but often not declared + # as standalone Property nodes, yet `RelationMap::from_corpus` needs + # their target to resolve the very paths that reference them. + candidate_field_iris: Set[str] = set() + for t in triples: + if t["p"] == "rdf:type" and t["o"] == "ogit:Property" and t["s"].startswith( + "odoo:" + ): + body = t["s"][len("odoo:") :] + if "." in body and body.split(".", 1)[0] in object_type_models: + candidate_field_iris.add(t["s"]) + if t["p"] in ("depends_on", "reads_field") and t["o"].startswith("odoo:"): + parts = t["o"][len("odoo:") :].split(".") + # model.rel.<...> — the first segment after the model is a relation + if len(parts) >= 3 and parts[0] in object_type_models: + candidate_field_iris.add(f"odoo:{parts[0]}.{parts[1]}") + + # field IRI → emitting method IRI (for the deep-read lift target) + field_emitter: Dict[str, str] = { + t["s"]: t["o"] for t in triples if t["p"] == "emitted_by" + } + + new_lines: List[str] = [] + stats = { + "target": 0, + "inverse_name": 0, + "deep_reads_field": 0, + "deep_skip_unknown_hop": 0, + "deep_skip_self_loop": 0, + "deep_skip_no_emitter": 0, + } + + # ── P1: target / inverse_name ───────────────────────────────────────── + for iri in sorted(candidate_field_iris): + # iri = "odoo:." (split on FIRST dot after the namespace) + if not iri.startswith("odoo:"): + continue + body = iri[len("odoo:") :] + if "." not in body: + continue + model_us, field_name = body.split(".", 1) + # A field name itself never contains a dot in the corpus Property nodes, + # but split(maxsplit=1) keeps the field intact even if it did. + entry = relmap.get((model_us, field_name)) + if entry is None: + continue + comodel, inverse = entry + spo = (iri, "target", comodel) + if spo not in existing_spo: + new_lines.append(triple_line(iri, "target", comodel, *TARGET_TRUTH)) + existing_spo.add(spo) + stats["target"] += 1 + if inverse: + spo_inv = (iri, "inverse_name", inverse) + if spo_inv not in existing_spo: + new_lines.append( + triple_line(iri, "inverse_name", inverse, *INVERSE_TRUTH) + ) + existing_spo.add(spo_inv) + stats["inverse_name"] += 1 + + # ── P0: deep reads_field ────────────────────────────────────────────── + # For each depends_on triple (field, depends_on, odoo:.), if the + # dependent FIELD is emitted by a method, lift the resolved deep read onto + # that method. + for t in triples: + if t["p"] != "depends_on": + continue + dep_field = t["s"] + method = field_emitter.get(dep_field) + if method is None: + stats["deep_skip_no_emitter"] += 1 + continue + obj = t["o"] + if not obj.startswith("odoo:"): + continue + obj_body = obj[len("odoo:") :] + parts = obj_body.split(".") + # parts[0] = model, parts[1:] = traversal path. Need ≥ 2 path + # segments (rel + leaf) for a deep lift; a single segment is the + # same-model field read already covered by depends_on. + path = parts[1:] + if len(path) < 2: + continue + resolved = resolve_path(parts[0], path, relmap) + if resolved is None: + stats["deep_skip_unknown_hop"] += 1 + continue + final_model_us, leaf = resolved + deep_obj = f"odoo:{final_model_us}.{leaf}" + if deep_obj == method: + stats["deep_skip_self_loop"] += 1 + continue + spo = (method, "reads_field", deep_obj) + if spo in existing_spo: + continue + new_lines.append( + triple_line(method, "reads_field", deep_obj, *DEEP_READ_TRUTH) + ) + existing_spo.add(spo) + stats["deep_reads_field"] += 1 + + new_lines.sort() + return new_lines, stats + + +def run(corpus_path: str, addons_root: str, out_path: str) -> dict: + """Enrich `corpus_path` using `addons_root`, write to `out_path`. Returns stats.""" + triples = load_corpus(corpus_path) + relmap = build_relation_map(addons_root) + new_lines, stats = enrich(triples, relmap) + stats["corpus_triples_in"] = len(triples) + stats["relmap_entries"] = len(relmap) + stats["new_triples"] = len(new_lines) + + # Preserve the original corpus lines verbatim, then append the sorted new + # triples. Additive: never rewrites or reorders the existing corpus. + with open(corpus_path, encoding="utf-8") as fh: + original = [ln.rstrip("\n") for ln in fh if ln.strip()] + all_lines = original + new_lines + with open(out_path, "w", encoding="utf-8") as fh: + fh.write("\n".join(all_lines)) + fh.write("\n") + stats["corpus_triples_out"] = len(all_lines) + return stats + + +def build_arg_parser() -> argparse.ArgumentParser: + p = argparse.ArgumentParser( + prog="python -m odoo_blueprint_extractor.spo_enrich", + description=( + "Enrich an SPO ndjson corpus with FK target/inverse_name (P1) and " + "deep reads_field (P0) triples, read from the Odoo ORM source." + ), + ) + p.add_argument( + "--corpus", + required=True, + metavar="NDJSON", + help="Path to the SPO corpus ndjson to enrich (read).", + ) + p.add_argument( + "--addons", + default="/home/user/odoo/addons", + metavar="DIR", + help="Odoo addons root (default: /home/user/odoo/addons).", + ) + p.add_argument( + "--out", + metavar="NDJSON", + help="Output path (default: in place over --corpus).", + ) + return p + + +def main(argv: Optional[List[str]] = None) -> None: + args = build_arg_parser().parse_args(argv) + out_path = args.out or args.corpus + if not os.path.isdir(args.addons): + sys.exit(f"ERROR: addons root not found: {args.addons}") + if not os.path.isfile(args.corpus): + sys.exit(f"ERROR: corpus not found: {args.corpus}") + stats = run(args.corpus, args.addons, out_path) + print( + "# spo_enrich: " + f"in={stats['corpus_triples_in']} relmap={stats['relmap_entries']} " + f"target={stats['target']} inverse_name={stats['inverse_name']} " + f"deep_reads_field={stats['deep_reads_field']} " + f"(skips: unknown_hop={stats['deep_skip_unknown_hop']} " + f"self_loop={stats['deep_skip_self_loop']}) " + f"out={stats['corpus_triples_out']}", + file=sys.stderr, + ) + + +if __name__ == "__main__": + main() diff --git a/tools/odoo-blueprint-extractor/tests/test_spo_enrich.py b/tools/odoo-blueprint-extractor/tests/test_spo_enrich.py new file mode 100644 index 000000000..b3d22ef60 --- /dev/null +++ b/tools/odoo-blueprint-extractor/tests/test_spo_enrich.py @@ -0,0 +1,232 @@ +"""Unit tests for spo_enrich — FK target/inverse_name (P1) + deep reads_field (P0). + +Run with: + python tests/test_spo_enrich.py +or: + python -m unittest tests.test_spo_enrich + +Core logic (path resolution, P1/P0 emission, dedup, self-loop drop) is tested +against synthetic in-memory triples + a synthetic relation map, so the suite is +hermetic (no dependency on the Odoo source tree being present). +""" + +import json +import os +import sys +import unittest + +_HERE = os.path.dirname(os.path.abspath(__file__)) +_PKG_ROOT = os.path.dirname(_HERE) +if _PKG_ROOT not in sys.path: + sys.path.insert(0, _PKG_ROOT) + +from odoo_blueprint_extractor.spo_enrich import ( # noqa: E402 + enrich, + model_to_underscore, + resolve_path, +) + + +def t(s, p, o, f=1.0, c=1.0): + return {"s": s, "p": p, "o": o, "f": f, "c": c} + + +# A tiny relation map: (model_us, field) -> (comodel_dotted, inverse_or_None). +RELMAP = { + ("account_move", "line_ids"): ("account.move.line", "move_id"), + ("account_move", "partner_id"): ("res.partner", None), + ("account_move_line", "move_id"): ("account.move", None), +} + + +class TestModelNormalization(unittest.TestCase): + def test_dotted_to_underscore(self): + self.assertEqual(model_to_underscore("account.move.line"), "account_move_line") + self.assertEqual(model_to_underscore("res.partner"), "res_partner") + self.assertEqual(model_to_underscore("uom"), "uom") + + +class TestResolvePath(unittest.TestCase): + def test_two_segment_relation_leaf(self): + # line_ids.balance starting at account_move → (account_move_line, balance) + self.assertEqual( + resolve_path("account_move", ["line_ids", "balance"], RELMAP), + ("account_move_line", "balance"), + ) + + def test_unknown_hop_returns_none(self): + # `mystery` is not a known relation on account_move. + self.assertIsNone( + resolve_path("account_move", ["mystery", "leaf"], RELMAP) + ) + + def test_single_segment_is_leaf_on_start_model(self): + # A single segment has no relational hop; leaf on the start model. + self.assertEqual( + resolve_path("account_move", ["amount_total"], RELMAP), + ("account_move", "amount_total"), + ) + + +class TestP1TargetInverse(unittest.TestCase): + def test_target_and_inverse_emitted_for_declared_relation(self): + triples = [ + t("odoo:account_move", "rdf:type", "ogit:ObjectType"), + t("odoo:account_move.line_ids", "rdf:type", "ogit:Property"), + ] + lines, stats = enrich(triples, RELMAP) + joined = "\n".join(lines) + self.assertIn( + '{"s":"odoo:account_move.line_ids","p":"target","o":"account.move.line"', + joined, + ) + self.assertIn( + '{"s":"odoo:account_move.line_ids","p":"inverse_name","o":"move_id"', + joined, + ) + self.assertEqual(stats["target"], 1) + self.assertEqual(stats["inverse_name"], 1) + + def test_many2one_emits_target_but_no_inverse(self): + triples = [ + t("odoo:account_move", "rdf:type", "ogit:ObjectType"), + t("odoo:account_move.partner_id", "rdf:type", "ogit:Property"), + ] + lines, stats = enrich(triples, RELMAP) + self.assertEqual(stats["target"], 1) + self.assertEqual(stats["inverse_name"], 0) + self.assertTrue(any('"o":"res.partner"' in ln for ln in lines)) + + def test_relation_referenced_only_in_dotted_path_gets_target(self): + # account_move.line_ids is NOT declared as a Property here, but it is + # the first relation segment of a depends_on path on a known model. + triples = [ + t("odoo:account_move", "rdf:type", "ogit:ObjectType"), + t("odoo:account_move.amount_total", "rdf:type", "ogit:Property"), + t( + "odoo:account_move.amount_total", + "depends_on", + "odoo:account_move.line_ids.balance", + ), + ] + lines, stats = enrich(triples, RELMAP) + self.assertEqual(stats["target"], 1) + self.assertTrue( + any( + '"s":"odoo:account_move.line_ids","p":"target"' in ln + for ln in lines + ) + ) + + def test_unknown_model_never_gets_target(self): + # `mystery_model` is not a corpus ObjectType → no target invented. + triples = [ + t("odoo:mystery_model.rel", "rdf:type", "ogit:Property"), + ] + lines, stats = enrich(triples, {("mystery_model", "rel"): ("x.y", None)}) + self.assertEqual(stats["target"], 0) + self.assertEqual(lines, []) + + +class TestP0DeepReadsField(unittest.TestCase): + def test_deep_read_lifted_onto_emitter(self): + triples = [ + t("odoo:account_move", "rdf:type", "ogit:ObjectType"), + t("odoo:account_move.amount_total", "rdf:type", "ogit:Property"), + # amount_total is emitted_by _compute_amount + t( + "odoo:account_move.amount_total", + "emitted_by", + "odoo:account_move._compute_amount", + ), + # @api.depends('line_ids.balance') + t( + "odoo:account_move.amount_total", + "depends_on", + "odoo:account_move.line_ids.balance", + ), + ] + lines, stats = enrich(triples, RELMAP) + self.assertEqual(stats["deep_reads_field"], 1) + self.assertTrue( + any( + '"s":"odoo:account_move._compute_amount","p":"reads_field",' + '"o":"odoo:account_move_line.balance"' in ln + for ln in lines + ) + ) + + def test_single_segment_depends_is_not_deep_lifted(self): + triples = [ + t("odoo:account_move", "rdf:type", "ogit:ObjectType"), + t("odoo:account_move.amount_total", "rdf:type", "ogit:Property"), + t( + "odoo:account_move.amount_total", + "emitted_by", + "odoo:account_move._compute_amount", + ), + # same-model field dep — no relation hop, no deep lift. + t( + "odoo:account_move.amount_total", + "depends_on", + "odoo:account_move.state", + ), + ] + _, stats = enrich(triples, RELMAP) + self.assertEqual(stats["deep_reads_field"], 0) + + def test_unknown_hop_is_skipped_and_counted(self): + triples = [ + t("odoo:account_move", "rdf:type", "ogit:ObjectType"), + t("odoo:account_move.amount_total", "emitted_by", "odoo:account_move._c"), + t( + "odoo:account_move.amount_total", + "depends_on", + "odoo:account_move.mystery.leaf", + ), + ] + _, stats = enrich(triples, RELMAP) + self.assertEqual(stats["deep_reads_field"], 0) + self.assertEqual(stats["deep_skip_unknown_hop"], 1) + + def test_self_loop_deep_read_is_dropped(self): + # A deep read whose object equals the emitting method is never emitted. + relmap = {("m", "rel"): ("m", None)} + triples = [ + t("odoo:m", "rdf:type", "ogit:ObjectType"), + # field `f` emitted_by method whose IRI equals the resolved deep obj + t("odoo:m.f", "emitted_by", "odoo:m._compute_x"), + t("odoo:m.f", "depends_on", "odoo:m.rel._compute_x"), + ] + _, stats = enrich(triples, relmap) + self.assertEqual(stats["deep_skip_self_loop"], 1) + self.assertEqual(stats["deep_reads_field"], 0) + + +class TestIdempotenceAndDedup(unittest.TestCase): + def test_existing_spo_not_re_emitted(self): + triples = [ + t("odoo:account_move", "rdf:type", "ogit:ObjectType"), + t("odoo:account_move.line_ids", "rdf:type", "ogit:Property"), + # target already present → must not duplicate + t("odoo:account_move.line_ids", "target", "account.move.line"), + ] + lines, stats = enrich(triples, RELMAP) + self.assertEqual(stats["target"], 0) + self.assertFalse(any('"p":"target"' in ln for ln in lines)) + + def test_output_lines_are_valid_json_and_sorted(self): + triples = [ + t("odoo:account_move", "rdf:type", "ogit:ObjectType"), + t("odoo:account_move.line_ids", "rdf:type", "ogit:Property"), + t("odoo:account_move.partner_id", "rdf:type", "ogit:Property"), + ] + lines, _ = enrich(triples, RELMAP) + for ln in lines: + obj = json.loads(ln) # raises if malformed + self.assertEqual(set(obj.keys()), {"s", "p", "o", "f", "c"}) + self.assertEqual(lines, sorted(lines), "new triples must be sorted") + + +if __name__ == "__main__": + unittest.main(verbosity=2)