changes
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,651 @@
|
||||
# Native Plating Job Model — Design
|
||||
|
||||
**Date:** 2026-04-25
|
||||
**Module scope:** All modules in `fusion_plating/` that touch `mrp.production` or
|
||||
`mrp.workorder` (~12 modules). Net effect: replace Odoo MRP integration with a
|
||||
native plating job model.
|
||||
**Status:** Design approved 2026-04-25. All §10 decisions locked per recommendations
|
||||
(see §10 footer). Implementation plan written: `docs/superpowers/plans/2026-04-25-fp-native-job-model.md`.
|
||||
**Owner:** Nexa Systems
|
||||
**Predecessor:** entech is currently in production on the MRP-bridged model
|
||||
(`fusion_plating_bridge_mrp`). This spec replaces that model.
|
||||
|
||||
---
|
||||
|
||||
## 1. Why we're doing this
|
||||
|
||||
Plating is **not assembly**. Odoo MRP is built around BoM consumption, multi-level
|
||||
assembly, and material-driven scheduling. Plating is process: parts in → baths →
|
||||
parts out. The "BoM" is bath chemistry (already its own model), not stock items.
|
||||
Steelhead, ProShop, PROPLATE, JobBOSS — none of them model plating as MRP. They
|
||||
all use a job/router model because plating IS different.
|
||||
|
||||
We bridged into Odoo MRP three months ago to get free machinery (kanban, work-centre
|
||||
cost, MRP menus). The cost has been:
|
||||
|
||||
- Operators see **N work orders for one job** (8 WOs for a typical recipe).
|
||||
- Three different views to understand one job (MO form, WO form, Plant Overview).
|
||||
- 5,000+ LOC in `fusion_plating_bridge_mrp` whose only job is keeping MRP and our
|
||||
plating models in sync.
|
||||
- Recipe overrides, work-centre mapping fallbacks, WO state syncing — most of our
|
||||
hardest bugs come from this sync.
|
||||
- Future features (operator mobile app, AI step suggestions, IoT auto-actions) get
|
||||
more expensive every time we add coupling.
|
||||
|
||||
**With the user's "I don't care about MRP dependencies" call, the trade-off flips.**
|
||||
Native model is simpler today, simpler tomorrow, and the data model finally matches
|
||||
the domain.
|
||||
|
||||
## 2. Goal
|
||||
|
||||
Replace `mrp.production` and `mrp.workorder` (in the plating context) with a
|
||||
native job model:
|
||||
|
||||
- **`fp.job`** — one record per plating job. Replaces `mrp.production`.
|
||||
- **`fp.job.step`** — one record per operation within the job. Replaces `mrp.workorder`.
|
||||
- The recipe template (`fusion.plating.process.node`) is **unchanged** — it's
|
||||
already domain-correct. `fp.job.step` instantiates from it via `recipe_node_id`.
|
||||
|
||||
Operator UX target: scan a sticker → land on the job page → see the process tree →
|
||||
tap an operation → start/finish/hold. **One screen, one mental model.**
|
||||
|
||||
Manager UX target: list of jobs (kanban or tree), drill into a job, see the same
|
||||
process tree with cost/time aggregates.
|
||||
|
||||
## 3. In scope
|
||||
|
||||
1. **New models:** `fp.job`, `fp.job.step`. Field schema in §4.
|
||||
2. **SO → job hook:** `sale.order.action_confirm()` creates `fp.job` directly
|
||||
(replaces the current SO → MO bridge in `fusion_plating_bridge_mrp/models/sale_order.py`).
|
||||
3. **Recipe → steps generator:** `fp.job._generate_steps_from_recipe()` walks the
|
||||
recipe tree and creates `fp.job.step` rows (replaces `_generate_workorders_from_recipe`).
|
||||
4. **Refactor 12 modules** to use `fp.job` / `fp.job.step` instead of
|
||||
`mrp.production` / `mrp.workorder`. Module-by-module plan in §6.
|
||||
5. **Migrate live data** from entech: every `mrp.production` row becomes an
|
||||
`fp.job` row; every `mrp.workorder` row becomes an `fp.job.step`. Migration
|
||||
spec in §7.
|
||||
6. **New views:** Job form (with embedded process tree), job kanban, step form
|
||||
(manager-only), redesigned tablet station and plant overview.
|
||||
7. **Reports** rewritten against new model: WO sticker, job traveller, WO margin,
|
||||
bill of lading, packing slip.
|
||||
8. **Cert generation, notifications, deliveries, invoicing, batches, holds** —
|
||||
all rebound to `fp.job` / `fp.job.step`.
|
||||
9. **Drop** `sale_mrp` and `mrp` dependencies from the `fusion_plating_*` chain
|
||||
except where genuinely needed (TBD per §10).
|
||||
|
||||
## 4. Out of scope
|
||||
|
||||
- Recipe template model (`fusion.plating.process.node`) stays as-is. No schema
|
||||
changes, no migration needed for it.
|
||||
- The customer portal (`fusion_plating_portal`) UI — only its model link
|
||||
(`x_fc_production_id` → `x_fc_job_id`).
|
||||
- Bath chemistry model (`fusion.plating.bath.log`) and IoT data ingestion — they
|
||||
link to baths/tanks, not to MOs/WOs.
|
||||
- KPI definitions (`fusion.plating.kpi`) — only the rollup queries.
|
||||
- Customer-facing terminology — operators still say "WO #00033". The label format
|
||||
is preserved; only the underlying model changes.
|
||||
- Removing `mrp` module entirely from Odoo. We just stop depending on it from
|
||||
our modules. If managers still want the standard Manufacturing menu for any
|
||||
reason, they can — but our flow doesn't use it.
|
||||
|
||||
---
|
||||
|
||||
## 5. Data Model
|
||||
|
||||
### 5.1 `fp.job`
|
||||
|
||||
Replaces `mrp.production` for plating jobs. One record per shop-floor job.
|
||||
|
||||
| Field | Type | Notes |
|
||||
|---|---|---|
|
||||
| `name` | Char | Sequence: `WH/JOB/00033`. The legacy "WH/MO/00033" labels stay only on migrated records (see §7). |
|
||||
| `state` | Selection | `draft`, `confirmed`, `in_progress`, `done`, `cancelled`, `on_hold` |
|
||||
| `partner_id` | Many2one(res.partner) | Customer; copied from SO |
|
||||
| `product_id` | Many2one(product.product) | Reference part product (for inventory only) |
|
||||
| `part_catalog_id` | Many2one(fp.part.catalog) | The actual part being plated; primary identifier |
|
||||
| `qty` | Float | Quantity to plate |
|
||||
| `qty_done` | Float | Quantity completed |
|
||||
| `qty_scrapped` | Float | Quantity scrapped (rolled up from holds) |
|
||||
| `date_deadline` | Datetime | Promised completion date |
|
||||
| `date_planned_start` | Datetime | Planned start |
|
||||
| `date_started` | Datetime | Actual start (first step start) |
|
||||
| `date_finished` | Datetime | Actual completion |
|
||||
| `origin` | Char | SO name for traceability |
|
||||
| `sale_order_id` | Many2one(sale.order) | Source SO |
|
||||
| `sale_order_line_ids` | Many2many(sale.order.line) | Lines that fed this job (group_tag collapse) |
|
||||
| `recipe_id` | Many2one(fusion.plating.process.node) | The recipe template used |
|
||||
| `step_ids` | One2many(fp.job.step, job_id) | The operations |
|
||||
| `step_count` | Integer | Computed |
|
||||
| `step_done_count` | Integer | Computed |
|
||||
| `step_progress_pct` | Float | Computed: `step_done_count / step_count * 100` |
|
||||
| `current_step_id` | Many2one(fp.job.step) | The operation currently in progress (or next ready) |
|
||||
| `coating_config_id` | Many2one(fp.coating.config) | The coating spec |
|
||||
| `facility_id` | Many2one(fp.facility) | Hard gate at confirm |
|
||||
| `manager_id` | Many2one(res.users) | Plating manager |
|
||||
| `priority` | Selection | `low`, `normal`, `high`, `rush` (operator-relevant ordering) |
|
||||
| `customer_spec_id` | Many2one(fp.customer.spec) | Optional spec |
|
||||
| `portal_job_id` | Many2one(fp.portal.job) | Customer portal binding (renamed from `x_fc_portal_job_id`) |
|
||||
| `delivery_id` | Many2one(fp.delivery) | The shipment |
|
||||
| `invoice_ids` | Many2many(account.move) | Linked invoices |
|
||||
| `certificate_ids` | One2many(fp.certificate, job_id) | Certs generated |
|
||||
| `batch_ids` | One2many(fp.batch, job_id) | Batches that ran through |
|
||||
| `quality_hold_ids` | One2many(fp.quality.hold, job_id) | Holds raised |
|
||||
| `consumption_ids` | One2many(fp.job.consumption, job_id) | Consumables |
|
||||
| `qc_check_id` | Many2one(fp.quality.check) | Active QC check |
|
||||
| `quoted_revenue` | Monetary | From SO |
|
||||
| `actual_cost` | Monetary | Computed from steps + consumables |
|
||||
| `margin` | Monetary | Computed |
|
||||
| `margin_pct` | Float | Computed |
|
||||
| `start_at_node_id` | Many2one(fusion.plating.process.node) | Rework: start at this recipe node |
|
||||
| `override_ids` | One2many(fp.job.node.override, job_id) | Per-job opt-in/out |
|
||||
| `current_location` | Char | Computed: "Queued: Bath 3" / "In progress: Oven A" / "Ready to ship" |
|
||||
| `mail.thread, mail.activity.mixin` | Inherits | Chatter |
|
||||
|
||||
**State machine:**
|
||||
```
|
||||
draft → confirmed → in_progress → done
|
||||
↓ ↑
|
||||
cancelled (can revert to confirmed if rework)
|
||||
|
||||
on_hold can be entered from confirmed/in_progress
|
||||
```
|
||||
|
||||
### 5.2 `fp.job.step`
|
||||
|
||||
Replaces `mrp.workorder`. One record per operation node from the recipe.
|
||||
|
||||
| Field | Type | Notes |
|
||||
|---|---|---|
|
||||
| `name` | Char | Operation name (from recipe node) |
|
||||
| `job_id` | Many2one(fp.job, ondelete=cascade) | Parent job |
|
||||
| `sequence` | Integer | Order (10, 20, 30...) |
|
||||
| `recipe_node_id` | Many2one(fusion.plating.process.node) | Source recipe operation |
|
||||
| `state` | Selection | `pending`, `ready`, `in_progress`, `paused`, `done`, `skipped`, `cancelled` |
|
||||
| `kind` | Selection | `wet`, `bake`, `mask`, `rack`, `inspect`, `other` (computed from equipment/name; today on WO as `x_fc_kind`) |
|
||||
| `work_centre_id` | Many2one(fp.work.centre) | New native model — see §5.3 |
|
||||
| `bath_id, tank_id, rack_id, oven_id` | Many2one | Equipment — same as today |
|
||||
| `masking_material_id` | Many2one | Mask kind |
|
||||
| `assigned_user_id` | Many2one(res.users) | Operator assignment |
|
||||
| `started_by_user_id` | Many2one(res.users) | Audit |
|
||||
| `finished_by_user_id` | Many2one(res.users) | Audit |
|
||||
| `signoff_user_id` | Many2one(res.users) | Audit (sign-off gates) |
|
||||
| `date_started` | Datetime | First start (timer) |
|
||||
| `date_finished` | Datetime | Last finish |
|
||||
| `duration_expected` | Float | Minutes |
|
||||
| `duration_actual` | Float | Minutes (sum of intervals) |
|
||||
| `time_log_ids` | One2many(fp.job.step.timelog) | Start/stop intervals — gives us the granularity Odoo had |
|
||||
| `instructions` | Html | Step-level instructions (formatted from child `step` nodes of the recipe) |
|
||||
| `thickness_target` | Float | For plating WOs |
|
||||
| `thickness_uom` | Selection | µm/mil/in |
|
||||
| `dwell_time_minutes` | Float | Recipe-spec'd dwell |
|
||||
| `bake_setpoint_temp` | Float | Bake WOs only |
|
||||
| `bake_actual_duration` | Float | Bake WOs only |
|
||||
| `bake_chart_recorder_ref` | Char | Nadcap audit |
|
||||
| `requires_signoff` | Boolean | Related from recipe_node_id |
|
||||
| `auto_complete` | Boolean | Related from recipe_node_id |
|
||||
| `is_manual` | Boolean | Related from recipe_node_id |
|
||||
| `customer_visible` | Boolean | Related from recipe_node_id |
|
||||
| `contract_review_user_ids` | Many2many(res.users) | For contract review approver gate |
|
||||
| `work_role_id` | Many2one(fp.work.role) | Required role for assignee |
|
||||
| `cost_per_hour` | Monetary | From work centre (or operator) |
|
||||
| `cost_total` | Monetary | Computed: duration × rate |
|
||||
| `quality_hold_ids` | One2many(fp.quality.hold, step_id) | Holds raised at this step |
|
||||
| `is_release_ready` | Boolean | Computed: required fields filled per kind |
|
||||
|
||||
**State machine:**
|
||||
```
|
||||
pending → ready → in_progress → done
|
||||
↓ ↓ ↑
|
||||
skipped paused
|
||||
↓
|
||||
cancelled
|
||||
```
|
||||
- `pending` = step exists but earlier siblings not done
|
||||
- `ready` = predecessors done (or first step of job)
|
||||
- `in_progress` = operator started timer
|
||||
- `paused` = operator stopped timer without finishing (intentional break, end of shift)
|
||||
- `done` = operator finished + sign-off (if required) recorded
|
||||
- `skipped` = opt-in step that wasn't activated for this job, OR start-at-node skipped this step
|
||||
- `cancelled` = job cancelled or rework removed this step
|
||||
|
||||
### 5.3 `fp.work.centre` (new model)
|
||||
|
||||
We replace `mrp.workcenter` with our own model since work centres for plating are
|
||||
domain-specific (a tank line, a bake oven, a rack station — not assembly cells).
|
||||
|
||||
| Field | Type | Notes |
|
||||
|---|---|---|
|
||||
| `name` | Char | "Bath Line 1", "Oven A", "Rack Station" |
|
||||
| `code` | Char | Short code |
|
||||
| `facility_id` | Many2one(fp.facility) | Which facility |
|
||||
| `kind` | Selection | `wet_line`, `bake`, `mask`, `rack`, `inspect`, `other` |
|
||||
| `cost_per_hour` | Monetary | For margin calculations |
|
||||
| `default_bath_id, default_tank_id, default_oven_id` | Many2one | Single-line shop convenience |
|
||||
| `active` | Boolean | |
|
||||
|
||||
This replaces `x_fc_mrp_workcenter_id` mapping that the recipe operations have today.
|
||||
|
||||
### 5.4 `fp.job.step.timelog`
|
||||
|
||||
Granular start/stop tracking. Each timer pause creates a record.
|
||||
|
||||
| Field | Type | Notes |
|
||||
|---|---|---|
|
||||
| `step_id` | Many2one(fp.job.step) | |
|
||||
| `user_id` | Many2one(res.users) | |
|
||||
| `date_started` | Datetime | |
|
||||
| `date_finished` | Datetime | NULL while running |
|
||||
| `duration_minutes` | Float | Computed |
|
||||
|
||||
### 5.5 What stays unchanged
|
||||
|
||||
- `fusion.plating.process.node` (recipe template) — unchanged
|
||||
- `fusion.plating.process.node.input` (operator inputs) — unchanged
|
||||
- `fp.batch`, `fp.certificate`, `fp.thickness.reading` — only their backlink fields rename
|
||||
- `fp.portal.job` — only its `x_fc_production_id` field renames to `job_id`
|
||||
- `fp.delivery` — only its job-back-reference rebinds
|
||||
- `fp.quality.hold`, `fp.ncr`, `fp.capa` — only backlinks rebind
|
||||
- `fp.notification.template`, `fp.notification.log` — trigger event names update
|
||||
- IoT (`fusion_plating_iot`), bath chemistry (`fusion.plating.bath.log`),
|
||||
KPIs (`fusion.plating.kpi`) — none touch jobs/steps directly, no changes
|
||||
|
||||
---
|
||||
|
||||
## 6. Module-by-module refactor plan
|
||||
|
||||
Listed in dependency order — refactor can/should happen along this gradient.
|
||||
|
||||
### 6.1 `fusion_plating` (core)
|
||||
**Effort: 3 days**
|
||||
|
||||
- Define `fp.job`, `fp.job.step`, `fp.job.step.timelog`, `fp.work.centre` models.
|
||||
- Sequences (`ir.sequence` records for `fp.job`, `fp.job.step`).
|
||||
- Security (groups already exist: Operator/Supervisor/Manager/Admin; ACLs added).
|
||||
- Move `fusion.plating.job.node.override` from `bridge_mrp` into core, rebind to `fp.job`.
|
||||
|
||||
### 6.2 `fusion_plating_bridge_mrp` → `fusion_plating_jobs` (rename + gut)
|
||||
**Effort: 5 days**
|
||||
|
||||
The current bridge module becomes the home of SO→job hooks, recipe→steps generator,
|
||||
and computed rollups. Most of its weight (the WO sync logic) goes away.
|
||||
|
||||
- Rename module dir to `fusion_plating_jobs`.
|
||||
- Migrate `_fp_auto_create_mo` → `_fp_auto_create_job` on `sale.order`.
|
||||
- Migrate `_generate_workorders_from_recipe` → `fp.job._generate_steps_from_recipe`.
|
||||
Simpler: no MRP work-centre mapping fallback, no `mrp.workorder.create` quirks.
|
||||
- Move all `x_fc_*` fields that currently sit on `mrp.production` to `fp.job` natively.
|
||||
- Move all `x_fc_*` fields on `mrp.workorder` to `fp.job.step` natively.
|
||||
- Drop `sale_mrp` from `__manifest__.py` depends. Drop `mrp` if confirmed (§10 Q3).
|
||||
- Quality check, racking inspection, cert generator, delivery hooks — all rebind.
|
||||
|
||||
### 6.3 `fusion_plating_batch`
|
||||
**Effort: 0.5 day**
|
||||
|
||||
- `workorder_id` → `step_id` (Many2one fp.job.step)
|
||||
- `production_id` (related) → `job_id` (related from step_id.job_id)
|
||||
- Views and access rules trivial rename.
|
||||
|
||||
### 6.4 `fusion_plating_quality`
|
||||
**Effort: 1 day**
|
||||
|
||||
- `fp.quality.hold` adds `job_id`, `step_id` fields (replaces production_id, workorder_id from bridge).
|
||||
- NCR and CAPA reference holds via current relations — no schema change.
|
||||
- Views: hold form refers to job/step instead of MO/WO.
|
||||
|
||||
### 6.5 `fusion_plating_certificates`
|
||||
**Effort: 0.5 day**
|
||||
|
||||
- `fp.certificate.production_id` → `fp.certificate.job_id`
|
||||
- `fp.thickness.reading.production_id` → `fp.thickness.reading.job_id`
|
||||
- Cert auto-creation hook moves from MO done to `fp.job.button_mark_done`.
|
||||
|
||||
### 6.6 `fusion_plating_invoicing`
|
||||
**Effort: 0.5 day**
|
||||
|
||||
- Invoice → portal job linkage stays; just walks via job instead of MO.
|
||||
- Account hold gating (on SO confirm, invoice post, delivery) stays — same partner-level field.
|
||||
|
||||
### 6.7 `fusion_plating_logistics`
|
||||
**Effort: 0.5 day**
|
||||
|
||||
- `fp.delivery.job_ref` resolution rebinds: from MO.name to fp.job.name (same string format if we use `WH/JOB/00033`).
|
||||
- Delivery auto-creation hook on `fp.job.button_mark_done`.
|
||||
|
||||
### 6.8 `fusion_plating_portal`
|
||||
**Effort: 0.5 day**
|
||||
|
||||
- `fp.portal.job.x_fc_production_id` → `job_id` (Many2one fp.job).
|
||||
- Portal templates: same — they read MO.name; if we keep `WH/JOB/...` format, no UI change.
|
||||
- Auto-create on `fp.job.action_confirm()`.
|
||||
|
||||
### 6.9 `fusion_plating_configurator`
|
||||
**Effort: 1 day**
|
||||
|
||||
- Configurator wizard already creates SO lines; no direct MO touch.
|
||||
- The `action_view_mrp_production` button on SO becomes `action_view_jobs`.
|
||||
- Recipe assignment paths stay (part catalog → coating config → job).
|
||||
|
||||
### 6.10 `fusion_plating_notifications`
|
||||
**Effort: 1 day**
|
||||
|
||||
- Trigger event names: `mo_confirmed` → `job_confirmed`, `mo_complete` → `job_complete`, `wo_started` → `step_started`, etc.
|
||||
- Existing customer-facing template content unchanged (uses partner/SO/cert vars).
|
||||
- Hook from `fp.job.button_mark_done` and `fp.job.step.button_finish`.
|
||||
|
||||
### 6.11 `fusion_plating_shopfloor`
|
||||
**Effort: 6 days** ← biggest single chunk
|
||||
|
||||
This is where operators live. Full rewrite of the operator UI.
|
||||
|
||||
- **Plant Overview** (kanban): one card per `fp.job.step` in `ready` or `in_progress`,
|
||||
grouped by `fp.work.centre`. Drag-drop changes work centre on the step.
|
||||
- **Tablet Station**: scan job sticker → land on job page. Job page shows:
|
||||
process tree (the IS-the-job tree) + ready/in-progress steps highlighted +
|
||||
start/finish/hold/sign-off buttons.
|
||||
- **Process Tree client action**: now the *primary* job view (not a separate
|
||||
drill-down). Renders `fp.job.step` records as cards with state colours,
|
||||
hierarchy from `recipe_node_id.parent_id` chain.
|
||||
- **Manager Dashboard**: list of jobs with progress %, current step location,
|
||||
manager actions (assign worker, take over, raise hold).
|
||||
- All RPC routes (`/fp/shopfloor/start_wo` etc.) renamed and rebound.
|
||||
|
||||
### 6.12 `fusion_plating_reports`
|
||||
**Effort: 3 days**
|
||||
|
||||
- WO Box Sticker — already mostly model-agnostic; rebind the inner template's
|
||||
`_mo` resolution. Print URL `/fp/job/<id>` instead of `/fp/wo/<id>`.
|
||||
- Job Traveller — loops over `fp.job.step_ids` instead of `mrp.production.workorder_ids`.
|
||||
- WO Margin Report — same rollup, different model.
|
||||
- BoL, Packing Slip, Invoice — all read from sale_order anyway, only the
|
||||
cross-ref to job needs updating.
|
||||
- Hide-default-reports XML: drop the `mrp.production` / `mrp.workorder` hides
|
||||
(they're no longer in our app).
|
||||
|
||||
### 6.13 `fusion_plating_kpi`
|
||||
**Effort: 0.5 day**
|
||||
|
||||
- KPI rollup queries: `mrp.production` → `fp.job`, `mrp.workorder` → `fp.job.step`.
|
||||
- KPI definitions stay; SQL/ORM domain rewrites.
|
||||
|
||||
### 6.14 `fusion_plating_receiving`
|
||||
**Effort: 0.5 day**
|
||||
|
||||
- Soft gate hook on `fp.job.action_confirm` (currently on MO confirm).
|
||||
- `fp.racking.inspection.production_id` → `job_id`.
|
||||
|
||||
### 6.15 Other modules with MRP touchpoints
|
||||
|
||||
- `fusion_plating_aerospace`, `fusion_plating_nuclear`, `fusion_plating_cgp`,
|
||||
`fusion_plating_safety`: minimal — none reference MO/WO directly per the audit.
|
||||
Verify in §7 testing.
|
||||
- `fusion_plating_compliance` and bridge_quality, bridge_documents,
|
||||
bridge_maintenance, bridge_sign: light touch — rebind any MO/WO refs to job/step.
|
||||
|
||||
### 6.16 Data scripts / tests
|
||||
**Effort: 2 days**
|
||||
|
||||
- 10+ scripts in `scripts/` and `docs/superpowers/tests/` query `mrp.production`/`mrp.workorder`. Rewrite to query `fp.job`/`fp.job.step`.
|
||||
|
||||
### Total effort estimate
|
||||
|
||||
| Phase | Days |
|
||||
|---|---|
|
||||
| Core models + sequences + security | 3 |
|
||||
| `fusion_plating_jobs` (gut + rebuild) | 5 |
|
||||
| Modules 6.3–6.10 (8 modules, light) | 5.5 |
|
||||
| Configurator | 1 |
|
||||
| Notifications | 1 |
|
||||
| Shopfloor (full rewrite) | 6 |
|
||||
| Reports | 3 |
|
||||
| KPI + Receiving + other | 1.5 |
|
||||
| Scripts + tests rewrite | 2 |
|
||||
| Migration script (§7) | 3 |
|
||||
| Test on entech-clone | 5 |
|
||||
| Cutover + burn-in | 3 |
|
||||
| **Total** | **39 working days ≈ 8 weeks** |
|
||||
|
||||
Calendar time with iteration: **9–11 weeks**.
|
||||
|
||||
---
|
||||
|
||||
## 7. Migration strategy
|
||||
|
||||
entech is in production. Migration must be reversible until we're confident, and
|
||||
must preserve every link operators / accounting depend on.
|
||||
|
||||
### 7.1 Approach: Big-bang with scripted migration + 2-week shadow period
|
||||
|
||||
1. Build new models alongside existing ones in a feature branch. Both coexist
|
||||
in the codebase.
|
||||
2. Run migration script on a **clone** of entech (not entech itself). Validate
|
||||
E2E: every report renders, every cert PDF reproduces, every link resolves.
|
||||
3. Cutover weekend on entech: ~4 hour window. Steps in §7.4.
|
||||
4. **Shadow period (weeks 1–2 post-cutover):** keep `mrp.production` /
|
||||
`mrp.workorder` tables as read-only snapshots. If anything goes wrong, we can
|
||||
revert to the snapshot via a reverse migration script.
|
||||
5. After 2 weeks of stable operation, drop the MRP tables.
|
||||
|
||||
### 7.2 Migration script
|
||||
|
||||
Location: `fusion_plating_jobs/migrations/19.0.8.0.0/post-migration.py`
|
||||
|
||||
For each `mrp.production` row:
|
||||
1. Create `fp.job` with same id (use `fp_job_id_seq` aligned to MRP id space, or
|
||||
keep separate sequence and store the legacy id in `legacy_mrp_production_id` for
|
||||
audit).
|
||||
2. Copy fields: name, partner_id, product_id, product_qty → qty, dates, origin,
|
||||
state (mapping in §7.3), all `x_fc_*` extension fields.
|
||||
3. For each child `mrp.workorder`, create `fp.job.step` with all `x_fc_*` fields.
|
||||
4. Migrate `mrp.workorder.time_ids` (if present) to `fp.job.step.timelog`.
|
||||
5. Rebind every cross-reference: cert.production_id, batch.production_id,
|
||||
delivery.job_ref, portal_job.x_fc_production_id, etc.
|
||||
6. Preserve chatter: copy `mail.message` records from MO/WO to corresponding
|
||||
job/step (Odoo's `res_id` + `model` rebinding).
|
||||
7. Audit log: write `fp_migration.log` with row counts, mismatches, warnings.
|
||||
|
||||
### 7.3 State mapping
|
||||
|
||||
| MRP state | fp.job state |
|
||||
|---|---|
|
||||
| `draft` | `draft` |
|
||||
| `confirmed` | `confirmed` |
|
||||
| `progress` | `in_progress` |
|
||||
| `to_close` | `in_progress` (will be `done` after final ops) |
|
||||
| `done` | `done` |
|
||||
| `cancel` | `cancelled` |
|
||||
|
||||
| MRP WO state | fp.job.step state |
|
||||
|---|---|
|
||||
| `pending` | `pending` |
|
||||
| `waiting` | `pending` |
|
||||
| `ready` | `ready` |
|
||||
| `progress` | `in_progress` |
|
||||
| `done` | `done` |
|
||||
| `cancel` | `cancelled` |
|
||||
|
||||
### 7.4 Cutover plan (single weekend window)
|
||||
|
||||
**Friday 6pm:** Stop operators. Final MOs of the week wrapped up.
|
||||
**Friday 8pm:** Backup full database. Tag as `pre_fp_job_migration`.
|
||||
**Friday 9pm:** Deploy new module bundle to entech. Run migration script. Estimated 30 min.
|
||||
**Friday 10pm:** Smoke test — open a recent job, print sticker, scan, render CoC,
|
||||
generate margin report. If anything fails, restore from 8pm backup; abort.
|
||||
**Saturday/Sunday:** Live shop is offline anyway (weekend). Time to fix anything
|
||||
that surfaced.
|
||||
**Monday 7am:** Operators come in. Manager + tech on site for the first 2 hours.
|
||||
**Following 2 weeks:** Daily check-ins. Active monitoring of error logs. MRP
|
||||
tables still present (read-only).
|
||||
|
||||
### 7.5 Rollback plan
|
||||
|
||||
If the cutover fails or unrecoverable issues surface within 7 days:
|
||||
1. Stop operators.
|
||||
2. Restore Friday 8pm DB backup.
|
||||
3. Revert deploy to previous module bundle.
|
||||
4. Reopen as previous-MRP system.
|
||||
|
||||
After 7 days, rollback becomes "forward fix only" — too much new shop activity to
|
||||
restore.
|
||||
|
||||
### 7.6 Data preservation guarantees
|
||||
|
||||
- **Every** historical job remains queryable. Old MOs become old `fp.job` records.
|
||||
- **Every** chatter message preserved (Odoo's `mail.message.res_id` rebinding).
|
||||
- **Every** PDF attachment preserved (`ir.attachment.res_id` rebinding).
|
||||
- **Every** cert, thickness reading, batch, hold preserved with intact links.
|
||||
- **Audit-trail integrity for Nadcap / aerospace customers** is critical; the
|
||||
migration script must verify zero loss before commit. We'll add a pre-migration
|
||||
audit script that snapshots counts and a post-migration audit that re-validates.
|
||||
|
||||
---
|
||||
|
||||
## 8. Test strategy
|
||||
|
||||
### 8.1 Unit tests
|
||||
- `fp.job` state machine transitions
|
||||
- `fp.job.step` state machine transitions
|
||||
- `_generate_steps_from_recipe` with: simple recipe, nested sub_processes,
|
||||
opt-in/out overrides, start-at-node rework, missing work-centre mapping
|
||||
- Migration script: round-trip a snapshot of entech data through migrate, verify
|
||||
every row's fields match expectation
|
||||
|
||||
### 8.2 Integration tests (end-to-end on a fresh DB)
|
||||
- Quote → SO → confirm → job created → recipe assigned → steps generated → start
|
||||
step → log time → finish step → all steps done → job done → portal job
|
||||
ready_to_ship → delivery created → CoC generated → invoice posted → portal job
|
||||
complete
|
||||
- Quality hold raised mid-job → blocks finish → released → job continues
|
||||
- Rework (start-at-node) job → only later steps generated
|
||||
- Cancel a confirmed job → all steps cancelled → portal job cancelled → no cert
|
||||
|
||||
### 8.3 E2E on entech-clone
|
||||
- Restore entech production DB to a staging container.
|
||||
- Run migration script.
|
||||
- Replay last 30 days of operator actions through the new UI.
|
||||
- Run every report, every cert, every notification trigger.
|
||||
- Diff against pre-migration snapshot: identify any data drift.
|
||||
|
||||
### 8.4 Performance baseline
|
||||
- Plant Overview load time with 1000 active steps: target < 1.5s
|
||||
- Job form open with 50-step recipe: target < 800ms
|
||||
- Report rendering (CoC, traveller, sticker): target < 3s
|
||||
|
||||
---
|
||||
|
||||
## 9. Risk register
|
||||
|
||||
| Risk | Likelihood | Impact | Mitigation |
|
||||
|---|---|---|---|
|
||||
| Migration script silently drops chatter on a record | Medium | Medium | Pre/post-migration audit scripts compare message counts |
|
||||
| A module we forgot still references mrp.workorder, fails at runtime | Medium | Medium | CI grep in pre-deploy that fails on `mrp.workorder` / `mrp.production` references in our code |
|
||||
| Cert PDF differs vs current (audit/Nadcap impact) | Low | High | Render 100 sample CoCs pre-migration, render same post-migration, byte-diff |
|
||||
| Operators confused by new UI | High | Medium | Beta with 2 operators 1 week before cutover; live training Monday morning |
|
||||
| Plant Overview slower than current | Medium | Low | Performance baseline test in §8.4; index `fp_job_step.state`, `work_centre_id` |
|
||||
| Account hold gate breaks → invoices post that shouldn't | Low | High | Unit tests + integration test for held-customer invoice attempt |
|
||||
| Rollback needed >7 days post-cutover | Low | High | Forward-fix only after day 7; treat the new model as canonical |
|
||||
| `mrp` Odoo module updates break our coexistence | Low | Low | We're un-depending; if mrp updates, we don't care |
|
||||
| Missed dependency causes module install failure | Medium | Low | Test install on fresh DB before cutover |
|
||||
|
||||
---
|
||||
|
||||
## 10. Open decisions (sign-off needed)
|
||||
|
||||
These need a yes/no from you before I write the implementation plan:
|
||||
|
||||
### Q1. Naming: `fp.job` vs `fp.work.order`?
|
||||
Operators currently say "WO #00033". The label format is independent of the model
|
||||
name — we can call the model `fp.job` and still print "WO #00033" on the sticker.
|
||||
|
||||
**Recommendation:** `fp.job`. Cleaner, doesn't pretend to be Odoo MRP, "work order"
|
||||
is a UI label not a model name.
|
||||
|
||||
**Your call:** ___ `fp.job` ___ `fp.work.order` ___ other:______
|
||||
|
||||
### Q2. Sticker/sequence label format: keep `WH/MO/00033` or switch to `WH/JOB/00033`?
|
||||
Existing labels printed on real boxes around the shop say `WH/MO/00033`. Reprinting
|
||||
all of them is a real cost.
|
||||
|
||||
**Recommendation:** Keep `WH/MO/...` for migrated records (preserve the label that's
|
||||
on the box). Use `WH/JOB/...` for new records going forward. Both formats render
|
||||
identically on the sticker as "WO #...".
|
||||
|
||||
**Your call:** ___ keep `WH/MO/...` for everything ___ switch new ones to `WH/JOB/...` ___ switch all (re-label boxes) ___ other:______
|
||||
|
||||
### Q3. Drop `mrp` module dependency entirely, or keep it installed but unused?
|
||||
Removing `mrp` removes the standard Manufacturing app from the menu — managers
|
||||
who occasionally peek at standard MRP views lose them. Keeping it installed means
|
||||
~150MB of unused tables in the DB.
|
||||
|
||||
**Recommendation:** Keep `mrp` *installed* (low cost) but drop it from our
|
||||
modules' `depends`. We don't use it; it sits idle. We can revisit removing later.
|
||||
|
||||
**Your call:** ___ keep installed ___ uninstall fully ___ other:______
|
||||
|
||||
### Q4. `fp.work.centre` — new model, or extend `mrp.workcenter`?
|
||||
We could keep `mrp.workcenter` as the work-centre table even though we drop the rest
|
||||
of MRP. Saves us 1 model worth of refactor.
|
||||
|
||||
**Recommendation:** New `fp.work.centre`. Plating work centres are different from
|
||||
assembly work centres (kind = wet_line / bake / mask / rack), and we already have
|
||||
`x_fc_facility_id`, `x_fc_fp_work_center_id` extensions on `mrp.workcenter`. Cleaner
|
||||
to start fresh.
|
||||
|
||||
**Your call:** ___ new `fp.work.centre` ___ keep `mrp.workcenter` ___ other:______
|
||||
|
||||
### Q5. Step model granularity — operations only, or full recipe tree?
|
||||
**Option A:** `fp.job.step` = operations only (matches current MRP WO behaviour).
|
||||
Container nodes (recipe / sub_process) and step nodes (instructions) are pulled
|
||||
from the recipe template at render time.
|
||||
**Option B:** `fp.job.step` mirrors the full recipe tree (operations + containers + steps).
|
||||
|
||||
**Recommendation:** Option A. Simpler model, current working pattern, render
|
||||
hierarchy via JOIN at view time. Steelhead's UX achievable without DB-level tree.
|
||||
|
||||
**Your call:** ___ A (ops only) ___ B (full tree) ___ other:______
|
||||
|
||||
### Q6. Migration approach — big-bang weekend cutover, or parallel-run?
|
||||
Parallel-run = both systems live for 2 weeks, jobs created in both, comparing
|
||||
output. More robust but more complex.
|
||||
|
||||
**Recommendation:** Big-bang with shadow period (§7.1). Simpler, lower error
|
||||
surface. Cutover is ~4 hours on a weekend.
|
||||
|
||||
**Your call:** ___ big-bang ___ parallel-run ___ other:______
|
||||
|
||||
### Q7. Implementation pace — single sprint or phased?
|
||||
- Single sprint: 8–10 weeks one engineer, full cutover at end.
|
||||
- Phased: ship `fp.job`/`fp.job.step` models first (week 4); migrate one module
|
||||
per week thereafter; cutover at the end (week 12+). More UI churn for operators
|
||||
during the transition.
|
||||
|
||||
**Recommendation:** Single sprint. Operators only switch UI once.
|
||||
|
||||
**Your call:** ___ single sprint ___ phased ___ other:______
|
||||
|
||||
---
|
||||
|
||||
### Decisions locked (2026-04-25)
|
||||
|
||||
| # | Decision | Locked answer |
|
||||
|---|---|---|
|
||||
| Q1 | Model name | **`fp.job`** |
|
||||
| Q2 | Sticker label format | **Keep `WH/MO/...` for migrated records; new records use `WH/JOB/...`. Both render as "WO #..." on the sticker.** |
|
||||
| Q3 | `mrp` Odoo module | **Keep installed but drop from our `depends`** |
|
||||
| Q4 | Work centre model | **New `fp.work.centre`** |
|
||||
| Q5 | Step model granularity | **Option A — operations only (flat list, hierarchy via JOIN at view time)** |
|
||||
| Q6 | Migration approach | **Big-bang weekend cutover with 2-week shadow period** |
|
||||
| Q7 | Implementation pace | **Single sprint, ~8 weeks engineering** |
|
||||
|
||||
## 11. Next steps
|
||||
|
||||
After you sign off on §10:
|
||||
|
||||
1. I write the **implementation plan** (`docs/superpowers/plans/...`) — concrete
|
||||
per-day task breakdown, branch strategy, commit cadence.
|
||||
2. We create a feature branch: `feat/fp-native-job-model`.
|
||||
3. We start with §6.1 (core models) and follow the dependency order through §6.16.
|
||||
4. End-of-week demos to you against an entech-clone.
|
||||
5. Cutover weekend scheduled with 4 weeks notice to give the shop time to plan.
|
||||
|
||||
If something in §10 or anywhere else is wrong / unclear / debatable, flag it now —
|
||||
fixing the spec is cheap; fixing committed code is not.
|
||||
Binary file not shown.
Binary file not shown.
@@ -5,7 +5,7 @@
|
||||
|
||||
{
|
||||
"name": "Fusion Plating — MRP Bridge",
|
||||
'version': '19.0.12.0.0',
|
||||
'version': '19.0.12.2.0',
|
||||
'category': 'Manufacturing/Plating',
|
||||
'summary': 'Bridge Fusion Plating facilities, baths and tanks to Odoo MRP work orders.',
|
||||
'description': """
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -14,19 +14,19 @@
|
||||
<field name="model">sale.order</field>
|
||||
<field name="inherit_id" ref="sale.view_order_form"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//div[@name='button_box']" position="inside">
|
||||
<!-- Manufacturing: right after Transfers (from configurator). -->
|
||||
<xpath expr="//button[@name='action_view_pickings']" position="after">
|
||||
<button name="action_view_productions" type="object"
|
||||
class="oe_stat_button" icon="fa-industry"
|
||||
invisible="x_fc_production_count == 0">
|
||||
<field name="x_fc_production_count" widget="statinfo"
|
||||
string="Manufacturing"/>
|
||||
</button>
|
||||
<button name="action_view_workorders" type="object"
|
||||
class="oe_stat_button" icon="fa-cogs"
|
||||
invisible="x_fc_workorder_count == 0">
|
||||
<field name="x_fc_workorder_count" widget="statinfo"
|
||||
string="Work Orders"/>
|
||||
</button>
|
||||
</xpath>
|
||||
|
||||
<!-- Production-lifecycle extras: after NCRs, before BOM Items / By WO
|
||||
so the primary buttons stay leftmost and BOM / By WO overflow last. -->
|
||||
<xpath expr="//button[@name='action_view_ncrs']" position="after">
|
||||
<button name="action_view_portal_jobs" type="object"
|
||||
class="oe_stat_button" icon="fa-globe"
|
||||
invisible="x_fc_portal_job_count == 0">
|
||||
|
||||
Binary file not shown.
@@ -5,7 +5,7 @@
|
||||
|
||||
{
|
||||
'name': 'Fusion Plating — Configurator',
|
||||
'version': '19.0.14.0.0',
|
||||
'version': '19.0.14.2.0',
|
||||
'category': 'Manufacturing/Plating',
|
||||
'summary': 'Quotation configurator with part catalog, coating configs, and formula-based pricing engine.',
|
||||
'description': """
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -347,40 +347,20 @@ class SaleOrder(models.Model):
|
||||
}
|
||||
|
||||
# ---- Quick-nav counts for smart buttons (Phase D9 / D14) ----
|
||||
x_fc_invoice_count = fields.Integer(
|
||||
string='Invoices', compute='_compute_nav_counts',
|
||||
)
|
||||
x_fc_ncr_count = fields.Integer(
|
||||
string='NCRs', compute='_compute_nav_counts',
|
||||
)
|
||||
x_fc_picking_count = fields.Integer(
|
||||
string='Pickings', compute='_compute_nav_counts',
|
||||
)
|
||||
x_fc_attachment_count = fields.Integer(
|
||||
string='Files', compute='_compute_nav_counts',
|
||||
string='Transfer Count', compute='_compute_nav_counts',
|
||||
)
|
||||
|
||||
@api.depends('invoice_ids', 'picking_ids')
|
||||
@api.depends('picking_ids')
|
||||
def _compute_nav_counts(self):
|
||||
# Invoice + picking counts are cheap (related collections).
|
||||
for rec in self:
|
||||
rec.x_fc_invoice_count = len(rec.invoice_ids)
|
||||
rec.x_fc_picking_count = len(rec.picking_ids)
|
||||
|
||||
# Attachment counts — batched read_group.
|
||||
ids = self.ids
|
||||
att_counts = {}
|
||||
if ids:
|
||||
rows = self.env['ir.attachment'].sudo().read_group(
|
||||
[('res_model', '=', 'sale.order'),
|
||||
('res_id', 'in', ids)],
|
||||
['res_id'], ['res_id'], lazy=False,
|
||||
)
|
||||
att_counts = {r['res_id']: r['__count'] for r in rows}
|
||||
for rec in self:
|
||||
rec.x_fc_attachment_count = att_counts.get(rec.id, 0)
|
||||
|
||||
# NCR counts — only if the module is installed.
|
||||
ids = self.ids
|
||||
NCR = self.env.get('fusion.plating.ncr')
|
||||
ncr_counts = {}
|
||||
if ids and NCR is not None and 'sale_order_id' in NCR._fields:
|
||||
@@ -396,21 +376,11 @@ class SaleOrder(models.Model):
|
||||
for rec in self:
|
||||
rec.x_fc_ncr_count = ncr_counts.get(rec.id, 0)
|
||||
|
||||
def action_view_invoices(self):
|
||||
self.ensure_one()
|
||||
return {
|
||||
'type': 'ir.actions.act_window',
|
||||
'name': 'Invoices',
|
||||
'res_model': 'account.move',
|
||||
'view_mode': 'list,form',
|
||||
'domain': [('id', 'in', self.invoice_ids.ids)],
|
||||
}
|
||||
|
||||
def action_view_pickings(self):
|
||||
self.ensure_one()
|
||||
return {
|
||||
'type': 'ir.actions.act_window',
|
||||
'name': 'Deliveries / Pickings',
|
||||
'name': 'Transfers',
|
||||
'res_model': 'stock.picking',
|
||||
'view_mode': 'list,form',
|
||||
'domain': [('id', 'in', self.picking_ids.ids)],
|
||||
@@ -426,22 +396,6 @@ class SaleOrder(models.Model):
|
||||
'domain': [('sale_order_id', '=', self.id)],
|
||||
}
|
||||
|
||||
def action_view_files(self):
|
||||
self.ensure_one()
|
||||
return {
|
||||
'type': 'ir.actions.act_window',
|
||||
'name': 'Files',
|
||||
'res_model': 'ir.attachment',
|
||||
'view_mode': 'kanban,list,form',
|
||||
'domain': [
|
||||
('res_model', '=', 'sale.order'),
|
||||
('res_id', '=', self.id),
|
||||
],
|
||||
'context': {
|
||||
'default_res_model': 'sale.order',
|
||||
'default_res_id': self.id,
|
||||
},
|
||||
}
|
||||
|
||||
def action_view_bom_items(self):
|
||||
"""Open SO lines grouped by part catalog (Phase D2)."""
|
||||
|
||||
@@ -12,17 +12,16 @@
|
||||
<field name="model">sale.order</field>
|
||||
<field name="inherit_id" ref="sale.view_order_form"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//div[hasclass('oe_button_box')]" position="inside">
|
||||
<button name="action_view_rfq"
|
||||
type="object"
|
||||
class="oe_stat_button"
|
||||
icon="fa-envelope-o"
|
||||
invisible="not x_fc_rfq_attachment_id">
|
||||
<div class="o_stat_info">
|
||||
<span class="o_stat_value">1</span>
|
||||
<span class="o_stat_text">RFQ</span>
|
||||
</div>
|
||||
</button>
|
||||
<!-- Hide standard Delivery button: our Transfers button (below) shows
|
||||
all stock.picking records - inbound receipts AND outbound deliveries -
|
||||
which matches the plating workflow better than outbound-only. -->
|
||||
<xpath expr="//button[@name='action_view_delivery']" position="attributes">
|
||||
<attribute name="invisible">1</attribute>
|
||||
</xpath>
|
||||
|
||||
<!-- Insert before standard Invoices: PO, then RFQ (multiple position="before"
|
||||
stack so last-inserted ends up closest to anchor; order here is PO, RFQ). -->
|
||||
<xpath expr="//button[@name='action_view_invoice']" position="before">
|
||||
<button name="action_view_po"
|
||||
type="object"
|
||||
class="oe_stat_button"
|
||||
@@ -33,6 +32,33 @@
|
||||
<span class="o_stat_text">PO</span>
|
||||
</div>
|
||||
</button>
|
||||
<button name="action_view_rfq"
|
||||
type="object"
|
||||
class="oe_stat_button"
|
||||
icon="fa-envelope-o"
|
||||
invisible="not x_fc_rfq_attachment_id">
|
||||
<div class="o_stat_info">
|
||||
<span class="o_stat_value">1</span>
|
||||
<span class="o_stat_text">RFQ</span>
|
||||
</div>
|
||||
</button>
|
||||
</xpath>
|
||||
|
||||
<!-- After standard Invoices: Transfers (all stock.picking for this SO). -->
|
||||
<xpath expr="//button[@name='action_view_invoice']" position="after">
|
||||
<button name="action_view_pickings"
|
||||
type="object"
|
||||
class="oe_stat_button"
|
||||
icon="fa-truck"
|
||||
invisible="x_fc_picking_count == 0">
|
||||
<field name="x_fc_picking_count" widget="statinfo"
|
||||
string="Transfers"/>
|
||||
</button>
|
||||
</xpath>
|
||||
|
||||
<!-- After standard Manufacturing: Active WOs, NCRs, Files, BOM Items, By WO.
|
||||
BOM Items and By WO are last so Odoo's button box overflows them into More. -->
|
||||
<xpath expr="//button[@name='action_view_mrp_production']" position="after">
|
||||
<button name="action_view_workorders"
|
||||
type="object"
|
||||
class="oe_stat_button"
|
||||
@@ -41,22 +67,6 @@
|
||||
<field name="x_fc_workorder_count" widget="statinfo"
|
||||
string="Active WOs"/>
|
||||
</button>
|
||||
<button name="action_view_invoices"
|
||||
type="object"
|
||||
class="oe_stat_button"
|
||||
icon="fa-file-text-o"
|
||||
invisible="x_fc_invoice_count == 0">
|
||||
<field name="x_fc_invoice_count" widget="statinfo"
|
||||
string="Invoices"/>
|
||||
</button>
|
||||
<button name="action_view_pickings"
|
||||
type="object"
|
||||
class="oe_stat_button"
|
||||
icon="fa-truck"
|
||||
invisible="x_fc_picking_count == 0">
|
||||
<field name="x_fc_picking_count" widget="statinfo"
|
||||
string="Pickings"/>
|
||||
</button>
|
||||
<button name="action_view_ncrs"
|
||||
type="object"
|
||||
class="oe_stat_button"
|
||||
@@ -65,14 +75,6 @@
|
||||
<field name="x_fc_ncr_count" widget="statinfo"
|
||||
string="NCRs"/>
|
||||
</button>
|
||||
<button name="action_view_files"
|
||||
type="object"
|
||||
class="oe_stat_button"
|
||||
icon="fa-paperclip"
|
||||
invisible="x_fc_attachment_count == 0">
|
||||
<field name="x_fc_attachment_count" widget="statinfo"
|
||||
string="Files"/>
|
||||
</button>
|
||||
<button name="action_view_bom_items"
|
||||
type="object"
|
||||
class="oe_stat_button"
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -5,7 +5,7 @@
|
||||
|
||||
{
|
||||
'name': 'Fusion Plating — Receiving & Inspection',
|
||||
'version': '19.0.3.0.0',
|
||||
'version': '19.0.3.1.0',
|
||||
'category': 'Manufacturing/Plating',
|
||||
'summary': 'Parts receiving, inspection, damage logging, and manufacturing gate.',
|
||||
'description': """
|
||||
|
||||
Binary file not shown.
Binary file not shown.
@@ -12,7 +12,9 @@
|
||||
<field name="model">sale.order</field>
|
||||
<field name="inherit_id" ref="sale.view_order_form"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//div[@name='button_box']" position="inside">
|
||||
<!-- Anchor Receiving right after Transfers so it clusters with the
|
||||
logistics buttons instead of getting appended to the end. -->
|
||||
<xpath expr="//button[@name='action_view_pickings']" position="after">
|
||||
<button name="action_view_receiving" type="object"
|
||||
class="oe_stat_button" icon="fa-truck"
|
||||
invisible="x_fc_receiving_count == 0">
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
# License OPL-1 (Odoo Proprietary License v1.0)
|
||||
{
|
||||
'name': 'Fusion Plating — Reports',
|
||||
'version': '19.0.7.2.0',
|
||||
'version': '19.0.7.14.0',
|
||||
'category': 'Manufacturing/Plating',
|
||||
'summary': 'PDF reports for Fusion Plating: quote, SO, WO, packing, BoL, CoC, invoice, receipt, quality + compliance.',
|
||||
'depends': [
|
||||
|
||||
Binary file not shown.
@@ -19,6 +19,8 @@ Two changes:
|
||||
|
||||
Lower sequence = appears higher in the Print dropdown.
|
||||
"""
|
||||
import base64
|
||||
|
||||
from odoo import api, fields, models
|
||||
from odoo.tools import frozendict
|
||||
|
||||
@@ -33,6 +35,20 @@ class IrActionsReport(models.Model):
|
||||
'for both higher and lower priorities.',
|
||||
)
|
||||
|
||||
@api.model
|
||||
def barcode_data_uri(self, barcode_type, value, width=300, height=300):
|
||||
"""Return a data:image/png;base64 URI for a barcode/QR.
|
||||
|
||||
wkhtmltopdf can't always fetch /report/barcode/ over the network
|
||||
during PDF rendering (sandbox/DNS/base-url pitfalls), so reports
|
||||
that embed QR codes on labels inline them as base64 instead.
|
||||
"""
|
||||
png = self.barcode(
|
||||
barcode_type, value,
|
||||
width=width, height=height, humanreadable=0,
|
||||
) or b''
|
||||
return 'data:image/png;base64,' + base64.b64encode(png).decode('ascii')
|
||||
|
||||
|
||||
class IrActionsActions(models.Model):
|
||||
_inherit = 'ir.actions.actions'
|
||||
|
||||
@@ -320,16 +320,21 @@
|
||||
<!-- Prints an ENTECH-style sticker with a QR code that -->
|
||||
<!-- warehouse staff scan to jump straight to the WO form. -->
|
||||
<!-- ============================================================= -->
|
||||
<!-- 102x76mm = 4x3" physical label. Orientation MUST be Portrait: a
|
||||
"custom" wkhtmltopdf page already takes page_width/page_height
|
||||
as literal dimensions, and adding a Landscape orientation flag on
|
||||
top of that swaps the dims AND rotates content, producing a
|
||||
stretched 76x102 portrait page (not what we want). -->
|
||||
<record id="paperformat_fp_wo_sticker" model="report.paperformat">
|
||||
<field name="name">FP WO Sticker (4x3")</field>
|
||||
<field name="name">FP WO Sticker (6x4")</field>
|
||||
<field name="format">custom</field>
|
||||
<field name="page_width">102</field>
|
||||
<field name="page_height">76</field>
|
||||
<field name="orientation">Landscape</field>
|
||||
<field name="margin_top">3</field>
|
||||
<field name="margin_bottom">3</field>
|
||||
<field name="margin_left">3</field>
|
||||
<field name="margin_right">3</field>
|
||||
<field name="page_width">152</field>
|
||||
<field name="page_height">102</field>
|
||||
<field name="orientation">Portrait</field>
|
||||
<field name="margin_top">0</field>
|
||||
<field name="margin_bottom">0</field>
|
||||
<field name="margin_left">0</field>
|
||||
<field name="margin_right">0</field>
|
||||
<field name="header_line" eval="False"/>
|
||||
<field name="header_spacing">0</field>
|
||||
<field name="disable_shrinking" eval="True"/>
|
||||
|
||||
@@ -16,19 +16,12 @@
|
||||
* _coating — fp.coating.config
|
||||
* _process — the resolved fusion.plating.process.node tree
|
||||
* _scan_url — base_url + /fp/wo/<id> (encoded into the QR)
|
||||
|
||||
The sticker works identically whether triggered from the MO form
|
||||
or from any of its child WOs.
|
||||
-->
|
||||
<odoo>
|
||||
|
||||
<!-- ========== Shared inner template ========== -->
|
||||
<template id="report_fp_wo_sticker_inner">
|
||||
<t t-set="_base_url" t-value="env['ir.config_parameter'].sudo().get_param('web.base.url', '')"/>
|
||||
<!-- _scan_id is always a numeric database id (mo.id or wo.id)
|
||||
so the scan endpoint can resolve it cleanly. _order_id is
|
||||
what gets printed next to "WO #" and can be a friendly
|
||||
Odoo name like "WH/MO/00067". -->
|
||||
<t t-set="_scan_url" t-value="_base_url + '/fp/wo/' + str(_scan_id)"/>
|
||||
<t t-set="_so" t-value="_mo and env['sale.order'].sudo().search(
|
||||
[('name', '=', _mo.origin)], limit=1) or False"/>
|
||||
@@ -44,191 +37,277 @@
|
||||
<t t-set="_due" t-value="(_mo and (_mo.date_deadline or _mo.date_finished))
|
||||
or (_line and _line.x_fc_part_deadline)
|
||||
or False"/>
|
||||
<!-- Inline the QR as base64 data URI so wkhtmltopdf doesn't need
|
||||
to fetch /report/barcode/ over the network during rendering. -->
|
||||
<t t-set="_qr_src" t-value="env['ir.actions.report'].barcode_data_uri(
|
||||
'QR', _scan_url, width=300, height=300)"/>
|
||||
|
||||
<style>
|
||||
@page { margin: 0; size: 152mm 102mm; }
|
||||
html, body {
|
||||
margin: 0 !important;
|
||||
padding: 0 !important;
|
||||
width: 100% !important;
|
||||
height: 100% !important;
|
||||
}
|
||||
/* Boxy professional layout: thick outer border, horizontal row
|
||||
borders, vertical label/value divider. Absolute positioning +
|
||||
% row heights force the content to fill the full page in
|
||||
wkhtmltopdf (which ignores vh/vw/flex). ------------------- */
|
||||
.fp-sticker {
|
||||
font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
|
||||
color: #111;
|
||||
color: #000;
|
||||
position: absolute;
|
||||
top: 6px; left: 6px; right: 6px; bottom: 6px;
|
||||
padding: 0;
|
||||
box-sizing: border-box;
|
||||
border: 2px solid #000;
|
||||
page-break-after: always;
|
||||
page-break-inside: avoid;
|
||||
}
|
||||
/* ---- HEADER band — grew to 40% to fit 2x WO# + logo + bigger QR. */
|
||||
.fp-sticker-head-wrap {
|
||||
position: absolute;
|
||||
left: 0; right: 0; top: 0;
|
||||
height: 40%;
|
||||
border-bottom: 2px solid #000;
|
||||
box-sizing: border-box;
|
||||
padding: 0;
|
||||
}
|
||||
table.fp-sticker-head {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
padding: 3mm 4mm;
|
||||
box-sizing: border-box;
|
||||
border: 0.5mm solid #000;
|
||||
border-radius: 1.5mm;
|
||||
}
|
||||
.fp-sticker-header {
|
||||
display: table;
|
||||
width: 100%;
|
||||
border-bottom: 0.3mm solid #000;
|
||||
padding-bottom: 2mm;
|
||||
margin-bottom: 2mm;
|
||||
}
|
||||
.fp-sticker-header-left {
|
||||
display: table-cell;
|
||||
vertical-align: middle;
|
||||
width: 66%;
|
||||
padding-right: 2mm;
|
||||
}
|
||||
.fp-sticker-header-right {
|
||||
display: table-cell;
|
||||
vertical-align: middle;
|
||||
width: 34%;
|
||||
text-align: right;
|
||||
}
|
||||
.fp-sticker-logo {
|
||||
max-height: 11mm;
|
||||
max-width: 100%;
|
||||
}
|
||||
.fp-sticker-wo {
|
||||
font-size: 15pt;
|
||||
font-weight: 700;
|
||||
letter-spacing: 0.3mm;
|
||||
margin-top: 1.5mm;
|
||||
}
|
||||
.fp-sticker-qr {
|
||||
width: 22mm;
|
||||
height: 22mm;
|
||||
display: block;
|
||||
margin-left: auto;
|
||||
margin-right: 0;
|
||||
}
|
||||
.fp-sticker-qr-caption {
|
||||
font-size: 6pt;
|
||||
color: #666;
|
||||
text-align: right;
|
||||
margin-top: 0.3mm;
|
||||
letter-spacing: 0.1mm;
|
||||
text-transform: uppercase;
|
||||
}
|
||||
.fp-sticker-grid {
|
||||
display: table;
|
||||
width: 100%;
|
||||
font-size: 8.5pt;
|
||||
table-layout: fixed;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
.fp-sticker-row { display: table-row; }
|
||||
.fp-sticker-row-alt .fp-sticker-label,
|
||||
.fp-sticker-row-alt .fp-sticker-value {
|
||||
background-color: #f4f5f7;
|
||||
table.fp-sticker-head td { padding: 0; vertical-align: middle; }
|
||||
col.fp-col-head-left { width: 66%; }
|
||||
col.fp-col-head-right { width: 34%; }
|
||||
td.fp-sticker-head-left {
|
||||
overflow: hidden;
|
||||
border-right: 2px solid #000;
|
||||
}
|
||||
.fp-sticker-label {
|
||||
display: table-cell;
|
||||
width: 28%;
|
||||
vertical-align: top;
|
||||
padding: 1mm 2mm 1mm 2mm;
|
||||
td.fp-sticker-head-right {
|
||||
text-align: center;
|
||||
vertical-align: middle;
|
||||
overflow: hidden;
|
||||
}
|
||||
/* Left column nested 2-row table: logo on top, WO# below.
|
||||
Horizontal divider between rows mirrors body row borders. */
|
||||
table.fp-sticker-head-left-stack {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
table-layout: fixed;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
table.fp-sticker-head-left-stack tr.fp-row-logo { height: 50%; }
|
||||
table.fp-sticker-head-left-stack tr.fp-row-wo { height: 50%; }
|
||||
table.fp-sticker-head-left-stack td {
|
||||
padding: 0 14px;
|
||||
vertical-align: middle;
|
||||
}
|
||||
/* Logo cell + WO# cell each get explicit vertical-align so the
|
||||
content sits in the middle of its half of the header band. */
|
||||
table.fp-sticker-head-left-stack tr.fp-row-logo td,
|
||||
table.fp-sticker-head-left-stack tr.fp-row-wo td {
|
||||
vertical-align: middle;
|
||||
}
|
||||
table.fp-sticker-head-left-stack tr + tr td {
|
||||
border-top: 1px solid #000;
|
||||
}
|
||||
.fp-sticker-logo {
|
||||
/* Logo bumped 40% (116 → 162px height, 520 → 728px width). */
|
||||
max-height: 162px;
|
||||
max-width: 728px;
|
||||
display: block;
|
||||
}
|
||||
.fp-sticker-wo {
|
||||
font-size: 72pt;
|
||||
font-weight: 900;
|
||||
letter-spacing: 0.2mm;
|
||||
line-height: 1;
|
||||
white-space: nowrap;
|
||||
margin: 0;
|
||||
}
|
||||
/* QR wrapper crops the white quiet-zone around the QR pattern
|
||||
so it doesn't visually float on a white square inside the
|
||||
cell. The PNG from Odoo's barcode generator carries a
|
||||
~12% border (4 modules of quiet-zone) on each side; we
|
||||
render the image larger than the wrapper and offset it so
|
||||
the wrapper clips that border out. ---------------------- */
|
||||
.fp-sticker-qr-wrap {
|
||||
width: 380px;
|
||||
height: 380px;
|
||||
display: inline-block;
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
}
|
||||
.fp-sticker-qr {
|
||||
width: 510px;
|
||||
height: 510px;
|
||||
position: absolute;
|
||||
top: -65px;
|
||||
left: -65px;
|
||||
margin: 0;
|
||||
display: block;
|
||||
}
|
||||
/* ---- BODY band (7 rows, each 14.28% of the band) ---- */
|
||||
.fp-sticker-body-wrap {
|
||||
position: absolute;
|
||||
left: 0; right: 0;
|
||||
top: 40%; bottom: 0;
|
||||
}
|
||||
table.fp-sticker-body {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
table-layout: fixed;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
table.fp-sticker-body tr { height: 14.28%; }
|
||||
table.fp-sticker-body tr + tr td { border-top: 1px solid #000; }
|
||||
col.fp-col-label { width: 32%; }
|
||||
col.fp-col-value { width: 68%; }
|
||||
table.fp-sticker-body td {
|
||||
vertical-align: middle;
|
||||
padding: 0 14px;
|
||||
font-size: 38pt;
|
||||
line-height: 1.1;
|
||||
}
|
||||
td.fp-sticker-label {
|
||||
font-weight: 700;
|
||||
letter-spacing: 0.15mm;
|
||||
text-transform: uppercase;
|
||||
font-size: 7.5pt;
|
||||
color: #333;
|
||||
border-right: 0.3mm solid #000;
|
||||
white-space: nowrap;
|
||||
border-right: 2px solid #000;
|
||||
background-color: #f1f2f4;
|
||||
}
|
||||
.fp-sticker-value {
|
||||
display: table-cell;
|
||||
vertical-align: top;
|
||||
padding: 1mm 2mm 1mm 2.5mm;
|
||||
}
|
||||
.fp-sticker-strong {
|
||||
font-weight: 700;
|
||||
font-size: 9.5pt;
|
||||
td.fp-sticker-value {
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
}
|
||||
.fp-sticker-strong { font-weight: 700; }
|
||||
.fp-sticker-muted { color: #555; font-size: 28pt; }
|
||||
</style>
|
||||
|
||||
<div class="fp-sticker">
|
||||
<!-- Header — logo + WO number + QR -->
|
||||
<div class="fp-sticker-header">
|
||||
<div class="fp-sticker-header-left">
|
||||
<img t-if="env.company.logo"
|
||||
class="fp-sticker-logo"
|
||||
t-att-src="image_data_uri(env.company.logo)"/>
|
||||
<div class="fp-sticker-wo">
|
||||
WO #<span t-esc="_order_id"/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="fp-sticker-header-right">
|
||||
<!-- _scan_url is always base_url + '/fp/wo/<int>' —
|
||||
no characters that need URL encoding, so we can
|
||||
drop the quote() call (which isn't in the QWeb
|
||||
render context on every ir_actions_report path). -->
|
||||
<img class="fp-sticker-qr"
|
||||
t-att-src="'/report/barcode/?barcode_type=QR&value=' + _scan_url + '&width=300&height=300'"/>
|
||||
<div class="fp-sticker-qr-caption">scan to open</div>
|
||||
</div>
|
||||
<div class="fp-sticker-head-wrap">
|
||||
<table class="fp-sticker-head">
|
||||
<colgroup>
|
||||
<col class="fp-col-head-left"/>
|
||||
<col class="fp-col-head-right"/>
|
||||
</colgroup>
|
||||
<tr>
|
||||
<td class="fp-sticker-head-left">
|
||||
<!-- env.company.logo is often blank while logo_web
|
||||
is populated from the company partner's image.
|
||||
Fall back across both + partner.image_1920. -->
|
||||
<t t-set="_logo" t-value="env.company.logo
|
||||
or env.company.logo_web
|
||||
or env.company.partner_id.image_1920
|
||||
or False"/>
|
||||
<table class="fp-sticker-head-left-stack">
|
||||
<tr class="fp-row-logo">
|
||||
<td>
|
||||
<img t-if="_logo"
|
||||
class="fp-sticker-logo"
|
||||
t-att-src="image_data_uri(_logo)"/>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="fp-row-wo">
|
||||
<td>
|
||||
<div class="fp-sticker-wo">
|
||||
WO #<span t-esc="_order_id"/>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
<td class="fp-sticker-head-right">
|
||||
<div class="fp-sticker-qr-wrap" t-if="_qr_src">
|
||||
<img class="fp-sticker-qr"
|
||||
t-att-src="_qr_src"/>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<!-- Data grid -->
|
||||
<div class="fp-sticker-grid">
|
||||
<div class="fp-sticker-row">
|
||||
<div class="fp-sticker-label">PO (RO)</div>
|
||||
<div class="fp-sticker-value">
|
||||
<div class="fp-sticker-body-wrap">
|
||||
<table class="fp-sticker-body">
|
||||
<colgroup>
|
||||
<col class="fp-col-label"/>
|
||||
<col class="fp-col-value"/>
|
||||
</colgroup>
|
||||
<tr>
|
||||
<td class="fp-sticker-label">PO (RO):</td>
|
||||
<td class="fp-sticker-value">
|
||||
<span class="fp-sticker-strong"
|
||||
t-esc="(_so and _so.x_fc_po_number) or '—'"/>
|
||||
t-esc="(_so and _so.x_fc_po_number) or '-'"/>
|
||||
<t t-if="_mo">
|
||||
<span style="color:#666;">
|
||||
<span class="fp-sticker-muted">
|
||||
(<span t-esc="_mo.name"/>)
|
||||
</span>
|
||||
</t>
|
||||
</div>
|
||||
</div>
|
||||
<div class="fp-sticker-row fp-sticker-row-alt">
|
||||
<div class="fp-sticker-label">Customer</div>
|
||||
<div class="fp-sticker-value">
|
||||
<span t-esc="(_so and _so.partner_id.name) or '—'"/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="fp-sticker-row">
|
||||
<div class="fp-sticker-label">Process</div>
|
||||
<div class="fp-sticker-value">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="fp-sticker-label">Customer:</td>
|
||||
<td class="fp-sticker-value">
|
||||
<span t-esc="(_so and _so.partner_id.name) or '-'"/>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="fp-sticker-label">Process:</td>
|
||||
<td class="fp-sticker-value">
|
||||
<t t-if="_process">
|
||||
<span t-esc="_process.name"/>
|
||||
</t>
|
||||
<t t-elif="_coating">
|
||||
<span t-esc="_coating.name"/>
|
||||
</t>
|
||||
<t t-else="">—</t>
|
||||
</div>
|
||||
</div>
|
||||
<div class="fp-sticker-row fp-sticker-row-alt">
|
||||
<div class="fp-sticker-label">Part Number</div>
|
||||
<div class="fp-sticker-value">
|
||||
<t t-else="">-</t>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="fp-sticker-label">Part Number:</td>
|
||||
<td class="fp-sticker-value">
|
||||
<t t-if="_part">
|
||||
<span class="fp-sticker-strong"
|
||||
t-esc="_part.part_number"/>
|
||||
<t t-if="_part.revision">
|
||||
<span style="color:#666;">
|
||||
<span class="fp-sticker-muted">
|
||||
Rev <span t-esc="_part.revision"/>
|
||||
</span>
|
||||
</t>
|
||||
</t>
|
||||
<t t-else="">—</t>
|
||||
</div>
|
||||
</div>
|
||||
<div class="fp-sticker-row">
|
||||
<div class="fp-sticker-label">Due Date</div>
|
||||
<div class="fp-sticker-value">
|
||||
<t t-else="">-</t>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="fp-sticker-label">Due Date:</td>
|
||||
<td class="fp-sticker-value">
|
||||
<t t-if="_due">
|
||||
<span t-esc="_due.strftime('%b %d, %Y')"/>
|
||||
</t>
|
||||
<t t-else="">—</t>
|
||||
</div>
|
||||
</div>
|
||||
<div class="fp-sticker-row fp-sticker-row-alt">
|
||||
<div class="fp-sticker-label">Qty</div>
|
||||
<div class="fp-sticker-value">
|
||||
<t t-else="">-</t>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="fp-sticker-label">Qty:</td>
|
||||
<td class="fp-sticker-value">
|
||||
<span class="fp-sticker-strong">
|
||||
<t t-set="_qty" t-value="_mo and _mo.product_qty or 0"/>
|
||||
<span t-esc="int(_qty) if _qty == int(_qty) else _qty"/>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="fp-sticker-row">
|
||||
<div class="fp-sticker-label">Notes</div>
|
||||
<div class="fp-sticker-value"
|
||||
style="font-size: 7.5pt; color: #333;">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="fp-sticker-label">Notes:</td>
|
||||
<td class="fp-sticker-value">
|
||||
<t t-esc="(_so and _so.x_fc_internal_note
|
||||
and _so.x_fc_internal_note.striptags()[:140]) or '—'"/>
|
||||
</div>
|
||||
</div>
|
||||
and _so.x_fc_internal_note.striptags()[:100]) or '-'"/>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
@@ -237,13 +316,10 @@
|
||||
<template id="report_fp_wo_sticker">
|
||||
<t t-call="web.html_container">
|
||||
<t t-foreach="docs" t-as="doc">
|
||||
<div class="page"
|
||||
style="padding:0; margin:0; width:100%; height:100%;">
|
||||
<t t-set="_order_id" t-value="doc.id"/>
|
||||
<t t-set="_scan_id" t-value="doc.id"/>
|
||||
<t t-set="_mo" t-value="doc.production_id"/>
|
||||
<t t-call="fusion_plating_reports.report_fp_wo_sticker_inner"/>
|
||||
</div>
|
||||
<t t-set="_order_id" t-value="doc.id"/>
|
||||
<t t-set="_scan_id" t-value="doc.id"/>
|
||||
<t t-set="_mo" t-value="doc.production_id"/>
|
||||
<t t-call="fusion_plating_reports.report_fp_wo_sticker_inner"/>
|
||||
</t>
|
||||
</t>
|
||||
</template>
|
||||
@@ -252,18 +328,13 @@
|
||||
<template id="report_fp_mo_sticker">
|
||||
<t t-call="web.html_container">
|
||||
<t t-foreach="docs" t-as="doc">
|
||||
<div class="page"
|
||||
style="padding:0; margin:0; width:100%; height:100%;">
|
||||
<!-- Print the MO's friendly name after "WO #" because
|
||||
the shop floor terminology is "WO" for the top-
|
||||
level order, regardless of Odoo's MO/WO split.
|
||||
The QR still encodes the numeric id so scanning
|
||||
resolves cleanly. -->
|
||||
<t t-set="_order_id" t-value="doc.name or doc.id"/>
|
||||
<t t-set="_scan_id" t-value="doc.id"/>
|
||||
<t t-set="_mo" t-value="doc"/>
|
||||
<t t-call="fusion_plating_reports.report_fp_wo_sticker_inner"/>
|
||||
</div>
|
||||
<!-- Shop floor talks in "WO #" regardless of Odoo's MO/WO
|
||||
split. QR always encodes the numeric id so scans
|
||||
resolve cleanly via /fp/wo/<id>. -->
|
||||
<t t-set="_order_id" t-value="doc.name or doc.id"/>
|
||||
<t t-set="_scan_id" t-value="doc.id"/>
|
||||
<t t-set="_mo" t-value="doc"/>
|
||||
<t t-call="fusion_plating_reports.report_fp_wo_sticker_inner"/>
|
||||
</t>
|
||||
</t>
|
||||
</template>
|
||||
|
||||
2062
fusion_plating/graphify-out/GRAPH_REPORT.md
Normal file
2062
fusion_plating/graphify-out/GRAPH_REPORT.md
Normal file
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_compliance_on_init_py", "label": "__init__.py", "file_type": "code", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_compliance_on/__init__.py", "source_location": "L1"}], "edges": [], "raw_calls": []}
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_safety_models_fp_incident_py", "label": "fp_incident.py", "file_type": "code", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_safety/models/fp_incident.py", "source_location": "L1"}, {"id": "fp_incident_fpincident", "label": "FpIncident", "file_type": "code", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_safety/models/fp_incident.py", "source_location": "L9"}, {"id": "fp_incident_default_name", "label": "_default_name()", "file_type": "code", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_safety/models/fp_incident.py", "source_location": "L128"}, {"id": "fp_incident_fpincident_action_start_investigation", "label": ".action_start_investigation()", "file_type": "code", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_safety/models/fp_incident.py", "source_location": "L135"}, {"id": "fp_incident_fpincident_action_close", "label": ".action_close()", "file_type": "code", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_safety/models/fp_incident.py", "source_location": "L138"}, {"id": "fp_incident_fpincident_action_reopen", "label": ".action_reopen()", "file_type": "code", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_safety/models/fp_incident.py", "source_location": "L141"}, {"id": "fp_incident_rationale_10", "label": "A safety incident, near-miss, or environmental event. The incident register", "file_type": "rationale", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_safety/models/fp_incident.py", "source_location": "L10"}], "edges": [{"source": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_safety_models_fp_incident_py", "target": "odoo", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_safety/models/fp_incident.py", "source_location": "L6", "weight": 1.0}, {"source": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_safety_models_fp_incident_py", "target": "fp_incident_fpincident", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_safety/models/fp_incident.py", "source_location": "L9", "weight": 1.0}, {"source": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_safety_models_fp_incident_py", "target": "fp_incident_default_name", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_safety/models/fp_incident.py", "source_location": "L128", "weight": 1.0}, {"source": "fp_incident_fpincident", "target": "fp_incident_fpincident_action_start_investigation", "relation": "method", "confidence": "EXTRACTED", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_safety/models/fp_incident.py", "source_location": "L135", "weight": 1.0}, {"source": "fp_incident_fpincident", "target": "fp_incident_fpincident_action_close", "relation": "method", "confidence": "EXTRACTED", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_safety/models/fp_incident.py", "source_location": "L138", "weight": 1.0}, {"source": "fp_incident_fpincident", "target": "fp_incident_fpincident_action_reopen", "relation": "method", "confidence": "EXTRACTED", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_safety/models/fp_incident.py", "source_location": "L141", "weight": 1.0}, {"source": "fp_incident_rationale_10", "target": "fp_incident_fpincident", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_safety/models/fp_incident.py", "source_location": "L10", "weight": 1.0}], "raw_calls": [{"caller_nid": "fp_incident_default_name", "callee": "next_by_code", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_safety/models/fp_incident.py", "source_location": "L129"}, {"caller_nid": "fp_incident_fpincident_action_start_investigation", "callee": "write", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_safety/models/fp_incident.py", "source_location": "L136"}, {"caller_nid": "fp_incident_fpincident_action_close", "callee": "write", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_safety/models/fp_incident.py", "source_location": "L139"}, {"caller_nid": "fp_incident_fpincident_action_reopen", "callee": "write", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_safety/models/fp_incident.py", "source_location": "L142"}]}
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_cgp_models_res_company_py", "label": "res_company.py", "file_type": "code", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_cgp/models/res_company.py", "source_location": "L1"}, {"id": "res_company_rescompany", "label": "ResCompany", "file_type": "code", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_cgp/models/res_company.py", "source_location": "L9"}, {"id": "res_company_compute_x_fc_cgp_registered", "label": "_compute_x_fc_cgp_registered()", "file_type": "code", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_cgp/models/res_company.py", "source_location": "L30"}, {"id": "res_company_rationale_10", "label": "Extend res.company with a link to the current CGP registration.", "file_type": "rationale", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_cgp/models/res_company.py", "source_location": "L10"}], "edges": [{"source": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_cgp_models_res_company_py", "target": "odoo", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_cgp/models/res_company.py", "source_location": "L6", "weight": 1.0}, {"source": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_cgp_models_res_company_py", "target": "res_company_rescompany", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_cgp/models/res_company.py", "source_location": "L9", "weight": 1.0}, {"source": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_cgp_models_res_company_py", "target": "res_company_compute_x_fc_cgp_registered", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_cgp/models/res_company.py", "source_location": "L30", "weight": 1.0}, {"source": "res_company_rationale_10", "target": "res_company_rescompany", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_cgp/models/res_company.py", "source_location": "L10", "weight": 1.0}], "raw_calls": [{"caller_nid": "res_company_compute_x_fc_cgp_registered", "callee": "bool", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_cgp/models/res_company.py", "source_location": "L33"}]}
|
||||
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_bridge_maintenance_models_fp_maintenance_node_py", "label": "fp_maintenance_node.py", "file_type": "code", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_bridge_maintenance/models/fp_maintenance_node.py", "source_location": "L1"}, {"id": "fp_maintenance_node_fpmaintenancenode", "label": "FpMaintenanceNode", "file_type": "code", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_bridge_maintenance/models/fp_maintenance_node.py", "source_location": "L8"}, {"id": "fp_maintenance_node_create", "label": "create()", "file_type": "code", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_bridge_maintenance/models/fp_maintenance_node.py", "source_location": "L40"}, {"id": "fp_maintenance_node_rationale_9", "label": "Maintenance checklist item. Individual task or check within a maintenance p", "file_type": "rationale", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_bridge_maintenance/models/fp_maintenance_node.py", "source_location": "L9"}], "edges": [{"source": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_bridge_maintenance_models_fp_maintenance_node_py", "target": "odoo", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_bridge_maintenance/models/fp_maintenance_node.py", "source_location": "L5", "weight": 1.0}, {"source": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_bridge_maintenance_models_fp_maintenance_node_py", "target": "fp_maintenance_node_fpmaintenancenode", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_bridge_maintenance/models/fp_maintenance_node.py", "source_location": "L8", "weight": 1.0}, {"source": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_bridge_maintenance_models_fp_maintenance_node_py", "target": "fp_maintenance_node_create", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_bridge_maintenance/models/fp_maintenance_node.py", "source_location": "L40", "weight": 1.0}, {"source": "fp_maintenance_node_rationale_9", "target": "fp_maintenance_node_fpmaintenancenode", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_bridge_maintenance/models/fp_maintenance_node.py", "source_location": "L9", "weight": 1.0}], "raw_calls": [{"caller_nid": "fp_maintenance_node_create", "callee": "get", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_bridge_maintenance/models/fp_maintenance_node.py", "source_location": "L42"}, {"caller_nid": "fp_maintenance_node_create", "callee": "search", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_bridge_maintenance/models/fp_maintenance_node.py", "source_location": "L43"}, {"caller_nid": "fp_maintenance_node_create", "callee": "sudo", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_bridge_maintenance/models/fp_maintenance_node.py", "source_location": "L43"}, {"caller_nid": "fp_maintenance_node_create", "callee": "super", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_bridge_maintenance/models/fp_maintenance_node.py", "source_location": "L45"}]}
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_certificates_models_init_py", "label": "__init__.py", "file_type": "code", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_certificates/models/__init__.py", "source_location": "L1"}], "edges": [{"source": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_certificates_models_init_py", "target": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_certificates_models_init_py", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_certificates/models/__init__.py", "source_location": "L6", "weight": 1.0}, {"source": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_certificates_models_init_py", "target": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_certificates_models_init_py", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_certificates/models/__init__.py", "source_location": "L7", "weight": 1.0}, {"source": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_certificates_models_init_py", "target": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_certificates_models_init_py", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_certificates/models/__init__.py", "source_location": "L8", "weight": 1.0}, {"source": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_certificates_models_init_py", "target": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_certificates_models_init_py", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_certificates/models/__init__.py", "source_location": "L9", "weight": 1.0}], "raw_calls": []}
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_logistics_models_fp_chain_of_custody_py", "label": "fp_chain_of_custody.py", "file_type": "code", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_logistics/models/fp_chain_of_custody.py", "source_location": "L1"}, {"id": "fp_chain_of_custody_fpchainofcustody", "label": "FpChainOfCustody", "file_type": "code", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_logistics/models/fp_chain_of_custody.py", "source_location": "L9"}, {"id": "fp_chain_of_custody_compute_display_name", "label": "_compute_display_name()", "file_type": "code", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_logistics/models/fp_chain_of_custody.py", "source_location": "L86"}, {"id": "fp_chain_of_custody_rationale_10", "label": "A single custody event \u2014 the audit trail for parts in transit. A chain of c", "file_type": "rationale", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_logistics/models/fp_chain_of_custody.py", "source_location": "L10"}], "edges": [{"source": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_logistics_models_fp_chain_of_custody_py", "target": "odoo", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_logistics/models/fp_chain_of_custody.py", "source_location": "L6", "weight": 1.0}, {"source": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_logistics_models_fp_chain_of_custody_py", "target": "fp_chain_of_custody_fpchainofcustody", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_logistics/models/fp_chain_of_custody.py", "source_location": "L9", "weight": 1.0}, {"source": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_logistics_models_fp_chain_of_custody_py", "target": "fp_chain_of_custody_compute_display_name", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_logistics/models/fp_chain_of_custody.py", "source_location": "L86", "weight": 1.0}, {"source": "fp_chain_of_custody_rationale_10", "target": "fp_chain_of_custody_fpchainofcustody", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_logistics/models/fp_chain_of_custody.py", "source_location": "L10", "weight": 1.0}], "raw_calls": [{"caller_nid": "fp_chain_of_custody_compute_display_name", "callee": "dict", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_logistics/models/fp_chain_of_custody.py", "source_location": "L87"}, {"caller_nid": "fp_chain_of_custody_compute_display_name", "callee": "_description_selection", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_logistics/models/fp_chain_of_custody.py", "source_location": "L87"}, {"caller_nid": "fp_chain_of_custody_compute_display_name", "callee": "get", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_logistics/models/fp_chain_of_custody.py", "source_location": "L89"}, {"caller_nid": "fp_chain_of_custody_compute_display_name", "callee": "to_string", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_logistics/models/fp_chain_of_custody.py", "source_location": "L90"}]}
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_bridge_mrp_models_mrp_workcenter_py", "label": "mrp_workcenter.py", "file_type": "code", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_bridge_mrp/models/mrp_workcenter.py", "source_location": "L1"}, {"id": "mrp_workcenter_mrpworkcenter", "label": "MrpWorkcenter", "file_type": "code", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_bridge_mrp/models/mrp_workcenter.py", "source_location": "L9"}, {"id": "mrp_workcenter_rationale_10", "label": "Extend MRP work centre with Fusion Plating facility and work centre.", "file_type": "rationale", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_bridge_mrp/models/mrp_workcenter.py", "source_location": "L10"}], "edges": [{"source": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_bridge_mrp_models_mrp_workcenter_py", "target": "odoo", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_bridge_mrp/models/mrp_workcenter.py", "source_location": "L6", "weight": 1.0}, {"source": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_bridge_mrp_models_mrp_workcenter_py", "target": "mrp_workcenter_mrpworkcenter", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_bridge_mrp/models/mrp_workcenter.py", "source_location": "L9", "weight": 1.0}, {"source": "mrp_workcenter_rationale_10", "target": "mrp_workcenter_mrpworkcenter", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_bridge_mrp/models/mrp_workcenter.py", "source_location": "L10", "weight": 1.0}], "raw_calls": []}
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_portal_init_py", "label": "__init__.py", "file_type": "code", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_portal/__init__.py", "source_location": "L1"}], "edges": [{"source": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_portal_init_py", "target": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_portal_init_py", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_portal/__init__.py", "source_location": "L6", "weight": 1.0}, {"source": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_portal_init_py", "target": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_portal_init_py", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_portal/__init__.py", "source_location": "L7", "weight": 1.0}], "raw_calls": []}
|
||||
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_models_res_company_py", "label": "res_company.py", "file_type": "code", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating/models/res_company.py", "source_location": "L1"}, {"id": "res_company_fp_tz_get", "label": "_fp_tz_get()", "file_type": "code", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating/models/res_company.py", "source_location": "L9"}, {"id": "res_company_rescompany", "label": "ResCompany", "file_type": "code", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating/models/res_company.py", "source_location": "L15"}, {"id": "res_company_rescompany_compute_x_fc_facility_count", "label": "._compute_x_fc_facility_count()", "file_type": "code", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating/models/res_company.py", "source_location": "L126"}, {"id": "res_company_rationale_10", "label": "Same selection list Odoo uses on res.partner.tz.", "file_type": "rationale", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating/models/res_company.py", "source_location": "L10"}], "edges": [{"source": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_models_res_company_py", "target": "odoo", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating/models/res_company.py", "source_location": "L6", "weight": 1.0}, {"source": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_models_res_company_py", "target": "res_company_fp_tz_get", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating/models/res_company.py", "source_location": "L9", "weight": 1.0}, {"source": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_models_res_company_py", "target": "res_company_rescompany", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating/models/res_company.py", "source_location": "L15", "weight": 1.0}, {"source": "res_company_rescompany", "target": "res_company_rescompany_compute_x_fc_facility_count", "relation": "method", "confidence": "EXTRACTED", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating/models/res_company.py", "source_location": "L126", "weight": 1.0}, {"source": "res_company_rationale_10", "target": "res_company_fp_tz_get", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating/models/res_company.py", "source_location": "L10", "weight": 1.0}], "raw_calls": [{"caller_nid": "res_company_rescompany_compute_x_fc_facility_count", "callee": "len", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating/models/res_company.py", "source_location": "L128"}]}
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_process_en_manifest_py", "label": "__manifest__.py", "file_type": "code", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_process_en/__manifest__.py", "source_location": "L1"}], "edges": [], "raw_calls": []}
|
||||
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_cgp_manifest_py", "label": "__manifest__.py", "file_type": "code", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_cgp/__manifest__.py", "source_location": "L1"}], "edges": [], "raw_calls": []}
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_process_black_oxide_init_py", "label": "__init__.py", "file_type": "code", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_process_black_oxide/__init__.py", "source_location": "L1"}], "edges": [], "raw_calls": []}
|
||||
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_logistics_models_hr_employee_py", "label": "hr_employee.py", "file_type": "code", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_logistics/models/hr_employee.py", "source_location": "L1"}, {"id": "hr_employee_hremployee", "label": "HrEmployee", "file_type": "code", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_logistics/models/hr_employee.py", "source_location": "L9"}, {"id": "hr_employee_hremployee_compute_logistics_counts", "label": "._compute_logistics_counts()", "file_type": "code", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_logistics/models/hr_employee.py", "source_location": "L58"}, {"id": "hr_employee_rationale_10", "label": "Extend hr.employee with driver fields. Drivers are just employees with the", "file_type": "rationale", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_logistics/models/hr_employee.py", "source_location": "L10"}], "edges": [{"source": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_logistics_models_hr_employee_py", "target": "odoo", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_logistics/models/hr_employee.py", "source_location": "L6", "weight": 1.0}, {"source": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_logistics_models_hr_employee_py", "target": "hr_employee_hremployee", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_logistics/models/hr_employee.py", "source_location": "L9", "weight": 1.0}, {"source": "hr_employee_hremployee", "target": "hr_employee_hremployee_compute_logistics_counts", "relation": "method", "confidence": "EXTRACTED", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_logistics/models/hr_employee.py", "source_location": "L58", "weight": 1.0}, {"source": "hr_employee_rationale_10", "target": "hr_employee_hremployee", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_logistics/models/hr_employee.py", "source_location": "L10", "weight": 1.0}], "raw_calls": [{"caller_nid": "hr_employee_hremployee_compute_logistics_counts", "callee": "len", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_logistics/models/hr_employee.py", "source_location": "L60"}, {"caller_nid": "hr_employee_hremployee_compute_logistics_counts", "callee": "len", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_logistics/models/hr_employee.py", "source_location": "L61"}]}
|
||||
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_portal_models_fp_quote_request_line_py", "label": "fp_quote_request_line.py", "file_type": "code", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_portal/models/fp_quote_request_line.py", "source_location": "L1"}, {"id": "fp_quote_request_line_fpquoterequestline", "label": "FpQuoteRequestLine", "file_type": "code", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_portal/models/fp_quote_request_line.py", "source_location": "L9"}, {"id": "fp_quote_request_line_rationale_10", "label": "Individual part line on a customer-submitted RFQ. A quote request can conta", "file_type": "rationale", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_portal/models/fp_quote_request_line.py", "source_location": "L10"}], "edges": [{"source": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_portal_models_fp_quote_request_line_py", "target": "odoo", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_portal/models/fp_quote_request_line.py", "source_location": "L6", "weight": 1.0}, {"source": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_portal_models_fp_quote_request_line_py", "target": "fp_quote_request_line_fpquoterequestline", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_portal/models/fp_quote_request_line.py", "source_location": "L9", "weight": 1.0}, {"source": "fp_quote_request_line_rationale_10", "target": "fp_quote_request_line_fpquoterequestline", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_portal/models/fp_quote_request_line.py", "source_location": "L10", "weight": 1.0}], "raw_calls": []}
|
||||
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_bridge_mrp_models_fp_portal_job_py", "label": "fp_portal_job.py", "file_type": "code", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_bridge_mrp/models/fp_portal_job.py", "source_location": "L1"}, {"id": "fp_portal_job_fpportaljob", "label": "FpPortalJob", "file_type": "code", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_bridge_mrp/models/fp_portal_job.py", "source_location": "L9"}, {"id": "fp_portal_job_rationale_10", "label": "Extend portal job with a link to its manufacturing order.", "file_type": "rationale", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_bridge_mrp/models/fp_portal_job.py", "source_location": "L10"}], "edges": [{"source": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_bridge_mrp_models_fp_portal_job_py", "target": "odoo", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_bridge_mrp/models/fp_portal_job.py", "source_location": "L6", "weight": 1.0}, {"source": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_bridge_mrp_models_fp_portal_job_py", "target": "fp_portal_job_fpportaljob", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_bridge_mrp/models/fp_portal_job.py", "source_location": "L9", "weight": 1.0}, {"source": "fp_portal_job_rationale_10", "target": "fp_portal_job_fpportaljob", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_bridge_mrp/models/fp_portal_job.py", "source_location": "L10", "weight": 1.0}], "raw_calls": []}
|
||||
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_logistics_init_py", "label": "__init__.py", "file_type": "code", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_logistics/__init__.py", "source_location": "L1"}], "edges": [{"source": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_logistics_init_py", "target": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_logistics_init_py", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_logistics/__init__.py", "source_location": "L6", "weight": 1.0}], "raw_calls": []}
|
||||
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_process_black_oxide_manifest_py", "label": "__manifest__.py", "file_type": "code", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_process_black_oxide/__manifest__.py", "source_location": "L1"}], "edges": [], "raw_calls": []}
|
||||
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_invoicing_init_py", "label": "__init__.py", "file_type": "code", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_invoicing/__init__.py", "source_location": "L1"}], "edges": [{"source": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_invoicing_init_py", "target": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_invoicing_init_py", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_invoicing/__init__.py", "source_location": "L6", "weight": 1.0}], "raw_calls": []}
|
||||
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_bridge_documents_manifest_py", "label": "__manifest__.py", "file_type": "code", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_bridge_documents/__manifest__.py", "source_location": "L1"}], "edges": [], "raw_calls": []}
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_manifest_py", "label": "__manifest__.py", "file_type": "code", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating/__manifest__.py", "source_location": "L1"}], "edges": [], "raw_calls": []}
|
||||
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_bridge_mrp_controllers_init_py", "label": "__init__.py", "file_type": "code", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_bridge_mrp/controllers/__init__.py", "source_location": "L1"}], "edges": [{"source": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_bridge_mrp_controllers_init_py", "target": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_bridge_mrp_controllers_init_py", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_bridge_mrp/controllers/__init__.py", "source_location": "L5", "weight": 1.0}], "raw_calls": []}
|
||||
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_safety_models_fp_training_type_py", "label": "fp_training_type.py", "file_type": "code", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_safety/models/fp_training_type.py", "source_location": "L1"}, {"id": "fp_training_type_fptrainingtype", "label": "FpTrainingType", "file_type": "code", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_safety/models/fp_training_type.py", "source_location": "L9"}, {"id": "fp_training_type_rationale_10", "label": "Master catalogue of training courses required in the shop. A training type", "file_type": "rationale", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_safety/models/fp_training_type.py", "source_location": "L10"}], "edges": [{"source": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_safety_models_fp_training_type_py", "target": "odoo", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_safety/models/fp_training_type.py", "source_location": "L6", "weight": 1.0}, {"source": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_safety_models_fp_training_type_py", "target": "fp_training_type_fptrainingtype", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_safety/models/fp_training_type.py", "source_location": "L9", "weight": 1.0}, {"source": "fp_training_type_rationale_10", "target": "fp_training_type_fptrainingtype", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_safety/models/fp_training_type.py", "source_location": "L10", "weight": 1.0}], "raw_calls": []}
|
||||
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_aerospace_models_fp_config_item_py", "label": "fp_config_item.py", "file_type": "code", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_aerospace/models/fp_config_item.py", "source_location": "L1"}, {"id": "fp_config_item_fpconfigitem", "label": "FpConfigItem", "file_type": "code", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_aerospace/models/fp_config_item.py", "source_location": "L9"}, {"id": "fp_config_item_rationale_10", "label": "Configuration management baseline item. Tracks a configuration item (produc", "file_type": "rationale", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_aerospace/models/fp_config_item.py", "source_location": "L10"}], "edges": [{"source": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_aerospace_models_fp_config_item_py", "target": "odoo", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_aerospace/models/fp_config_item.py", "source_location": "L6", "weight": 1.0}, {"source": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_aerospace_models_fp_config_item_py", "target": "fp_config_item_fpconfigitem", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_aerospace/models/fp_config_item.py", "source_location": "L9", "weight": 1.0}, {"source": "fp_config_item_rationale_10", "target": "fp_config_item_fpconfigitem", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_aerospace/models/fp_config_item.py", "source_location": "L10", "weight": 1.0}], "raw_calls": []}
|
||||
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_receiving_init_py", "label": "__init__.py", "file_type": "code", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_receiving/__init__.py", "source_location": "L1"}], "edges": [{"source": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_receiving_init_py", "target": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_receiving_init_py", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_receiving/__init__.py", "source_location": "L6", "weight": 1.0}], "raw_calls": []}
|
||||
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_notifications_models_fp_receiving_py", "label": "fp_receiving.py", "file_type": "code", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_notifications/models/fp_receiving.py", "source_location": "L1"}, {"id": "fp_receiving_fpreceiving", "label": "FpReceiving", "file_type": "code", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_notifications/models/fp_receiving.py", "source_location": "L9"}, {"id": "fp_receiving_fpreceiving_action_accept", "label": ".action_accept()", "file_type": "code", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_notifications/models/fp_receiving.py", "source_location": "L12"}], "edges": [{"source": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_notifications_models_fp_receiving_py", "target": "odoo", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_notifications/models/fp_receiving.py", "source_location": "L6", "weight": 1.0}, {"source": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_notifications_models_fp_receiving_py", "target": "fp_receiving_fpreceiving", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_notifications/models/fp_receiving.py", "source_location": "L9", "weight": 1.0}, {"source": "fp_receiving_fpreceiving", "target": "fp_receiving_fpreceiving_action_accept", "relation": "method", "confidence": "EXTRACTED", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_notifications/models/fp_receiving.py", "source_location": "L12", "weight": 1.0}], "raw_calls": [{"caller_nid": "fp_receiving_fpreceiving_action_accept", "callee": "super", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_notifications/models/fp_receiving.py", "source_location": "L13"}, {"caller_nid": "fp_receiving_fpreceiving_action_accept", "callee": "_dispatch", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_notifications/models/fp_receiving.py", "source_location": "L16"}]}
|
||||
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_logistics_manifest_py", "label": "__manifest__.py", "file_type": "code", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_logistics/__manifest__.py", "source_location": "L1"}], "edges": [], "raw_calls": []}
|
||||
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_models_fp_process_category_py", "label": "fp_process_category.py", "file_type": "code", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating/models/fp_process_category.py", "source_location": "L1"}, {"id": "fp_process_category_fpprocesscategory", "label": "FpProcessCategory", "file_type": "code", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating/models/fp_process_category.py", "source_location": "L9"}, {"id": "fp_process_category_fpprocesscategory_compute_process_type_count", "label": "._compute_process_type_count()", "file_type": "code", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating/models/fp_process_category.py", "source_location": "L60"}, {"id": "fp_process_category_rationale_10", "label": "High-level grouping of finishing process types. Ships with a seed set (Plat", "file_type": "rationale", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating/models/fp_process_category.py", "source_location": "L10"}], "edges": [{"source": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_models_fp_process_category_py", "target": "odoo", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating/models/fp_process_category.py", "source_location": "L6", "weight": 1.0}, {"source": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_models_fp_process_category_py", "target": "fp_process_category_fpprocesscategory", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating/models/fp_process_category.py", "source_location": "L9", "weight": 1.0}, {"source": "fp_process_category_fpprocesscategory", "target": "fp_process_category_fpprocesscategory_compute_process_type_count", "relation": "method", "confidence": "EXTRACTED", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating/models/fp_process_category.py", "source_location": "L60", "weight": 1.0}, {"source": "fp_process_category_rationale_10", "target": "fp_process_category_fpprocesscategory", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating/models/fp_process_category.py", "source_location": "L10", "weight": 1.0}], "raw_calls": [{"caller_nid": "fp_process_category_fpprocesscategory_compute_process_type_count", "callee": "len", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating/models/fp_process_category.py", "source_location": "L62"}]}
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_gurpreet_github_odoo_modules_fusion_plating_scripts_fp_bol_repro_py", "label": "fp_bol_repro.py", "file_type": "code", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/scripts/fp_bol_repro.py", "source_location": "L1"}], "edges": [{"source": "users_gurpreet_github_odoo_modules_fusion_plating_scripts_fp_bol_repro_py", "target": "traceback", "relation": "imports", "confidence": "EXTRACTED", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/scripts/fp_bol_repro.py", "source_location": "L2", "weight": 1.0}], "raw_calls": []}
|
||||
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_notifications_models_mrp_production_py", "label": "mrp_production.py", "file_type": "code", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_notifications/models/mrp_production.py", "source_location": "L1"}, {"id": "mrp_production_mrpproduction", "label": "MrpProduction", "file_type": "code", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_notifications/models/mrp_production.py", "source_location": "L9"}, {"id": "mrp_production_mrpproduction_button_mark_done", "label": ".button_mark_done()", "file_type": "code", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_notifications/models/mrp_production.py", "source_location": "L12"}], "edges": [{"source": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_notifications_models_mrp_production_py", "target": "odoo", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_notifications/models/mrp_production.py", "source_location": "L6", "weight": 1.0}, {"source": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_notifications_models_mrp_production_py", "target": "mrp_production_mrpproduction", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_notifications/models/mrp_production.py", "source_location": "L9", "weight": 1.0}, {"source": "mrp_production_mrpproduction", "target": "mrp_production_mrpproduction_button_mark_done", "relation": "method", "confidence": "EXTRACTED", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_notifications/models/mrp_production.py", "source_location": "L12", "weight": 1.0}], "raw_calls": [{"caller_nid": "mrp_production_mrpproduction_button_mark_done", "callee": "super", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_notifications/models/mrp_production.py", "source_location": "L13"}, {"caller_nid": "mrp_production_mrpproduction_button_mark_done", "callee": "search", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_notifications/models/mrp_production.py", "source_location": "L21"}, {"caller_nid": "mrp_production_mrpproduction_button_mark_done", "callee": "_dispatch", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_notifications/models/mrp_production.py", "source_location": "L28"}]}
|
||||
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_init_py", "label": "__init__.py", "file_type": "code", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating/__init__.py", "source_location": "L1"}, {"id": "init_post_init_hook", "label": "post_init_hook()", "file_type": "code", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating/__init__.py", "source_location": "L14"}, {"id": "init_rationale_15", "label": "Auto-detect a sensible default timezone on first install. Sets ``res.compan", "file_type": "rationale", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating/__init__.py", "source_location": "L15"}], "edges": [{"source": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_init_py", "target": "logging", "relation": "imports", "confidence": "EXTRACTED", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating/__init__.py", "source_location": "L6", "weight": 1.0}, {"source": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_init_py", "target": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_init_py", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating/__init__.py", "source_location": "L8", "weight": 1.0}, {"source": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_init_py", "target": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_init_py", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating/__init__.py", "source_location": "L9", "weight": 1.0}, {"source": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_init_py", "target": "init_post_init_hook", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating/__init__.py", "source_location": "L14", "weight": 1.0}, {"source": "init_rationale_15", "target": "init_post_init_hook", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating/__init__.py", "source_location": "L15", "weight": 1.0}], "raw_calls": [{"caller_nid": "init_post_init_hook", "callee": "detect_default_tz", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating/__init__.py", "source_location": "L25"}, {"caller_nid": "init_post_init_hook", "callee": "search", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating/__init__.py", "source_location": "L26"}, {"caller_nid": "init_post_init_hook", "callee": "sudo", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating/__init__.py", "source_location": "L26"}, {"caller_nid": "init_post_init_hook", "callee": "info", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating/__init__.py", "source_location": "L29"}]}
|
||||
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_configurator_controllers_init_py", "label": "__init__.py", "file_type": "code", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_configurator/controllers/__init__.py", "source_location": "L1"}], "edges": [{"source": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_configurator_controllers_init_py", "target": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_configurator_controllers_init_py", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_configurator/controllers/__init__.py", "source_location": "L2", "weight": 1.0}, {"source": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_configurator_controllers_init_py", "target": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_configurator_controllers_init_py", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_configurator/controllers/__init__.py", "source_location": "L3", "weight": 1.0}], "raw_calls": []}
|
||||
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_shopfloor_models_fp_tank_py", "label": "fp_tank.py", "file_type": "code", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_shopfloor/models/fp_tank.py", "source_location": "L1"}, {"id": "fp_tank_fptank", "label": "FpTank", "file_type": "code", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_shopfloor/models/fp_tank.py", "source_location": "L9"}, {"id": "fp_tank_fptank_compute_shopfloor_queue_size", "label": "._compute_shopfloor_queue_size()", "file_type": "code", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_shopfloor/models/fp_tank.py", "source_location": "L24"}, {"id": "fp_tank_fptank_action_open_tablet_view", "label": ".action_open_tablet_view()", "file_type": "code", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_shopfloor/models/fp_tank.py", "source_location": "L42"}, {"id": "fp_tank_rationale_10", "label": "Extend the core tank with shop-floor helpers. Adds a queue-size badge so th", "file_type": "rationale", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_shopfloor/models/fp_tank.py", "source_location": "L10"}, {"id": "fp_tank_rationale_43", "label": "Open the tablet client action focused on this tank.", "file_type": "rationale", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_shopfloor/models/fp_tank.py", "source_location": "L43"}], "edges": [{"source": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_shopfloor_models_fp_tank_py", "target": "odoo", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_shopfloor/models/fp_tank.py", "source_location": "L6", "weight": 1.0}, {"source": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_shopfloor_models_fp_tank_py", "target": "fp_tank_fptank", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_shopfloor/models/fp_tank.py", "source_location": "L9", "weight": 1.0}, {"source": "fp_tank_fptank", "target": "fp_tank_fptank_compute_shopfloor_queue_size", "relation": "method", "confidence": "EXTRACTED", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_shopfloor/models/fp_tank.py", "source_location": "L24", "weight": 1.0}, {"source": "fp_tank_fptank", "target": "fp_tank_fptank_action_open_tablet_view", "relation": "method", "confidence": "EXTRACTED", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_shopfloor/models/fp_tank.py", "source_location": "L42", "weight": 1.0}, {"source": "fp_tank_rationale_10", "target": "fp_tank_fptank", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_shopfloor/models/fp_tank.py", "source_location": "L10", "weight": 1.0}, {"source": "fp_tank_rationale_43", "target": "fp_tank_fptank_action_open_tablet_view", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_shopfloor/models/fp_tank.py", "source_location": "L43", "weight": 1.0}], "raw_calls": [{"caller_nid": "fp_tank_fptank_compute_shopfloor_queue_size", "callee": "search_count", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_shopfloor/models/fp_tank.py", "source_location": "L32"}, {"caller_nid": "fp_tank_fptank_compute_shopfloor_queue_size", "callee": "search_count", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_shopfloor/models/fp_tank.py", "source_location": "L36"}, {"caller_nid": "fp_tank_fptank_action_open_tablet_view", "callee": "ensure_one", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_shopfloor/models/fp_tank.py", "source_location": "L44"}]}
|
||||
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_process_chrome_init_py", "label": "__init__.py", "file_type": "code", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_process_chrome/__init__.py", "source_location": "L1"}], "edges": [], "raw_calls": []}
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_gurpreet_github_odoo_modules_fusion_plating_scripts_fp_bol_portrait_save_py", "label": "fp_bol_portrait_save.py", "file_type": "code", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/scripts/fp_bol_portrait_save.py", "source_location": "L1"}], "edges": [], "raw_calls": []}
|
||||
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_bridge_sign_models_init_py", "label": "__init__.py", "file_type": "code", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_bridge_sign/models/__init__.py", "source_location": "L1"}], "edges": [{"source": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_bridge_sign_models_init_py", "target": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_bridge_sign_models_init_py", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_bridge_sign/models/__init__.py", "source_location": "L6", "weight": 1.0}], "raw_calls": []}
|
||||
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_bridge_mrp_models_fp_work_center_py", "label": "fp_work_center.py", "file_type": "code", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_bridge_mrp/models/fp_work_center.py", "source_location": "L1"}, {"id": "fp_work_center_fpworkcenter", "label": "FpWorkCenter", "file_type": "code", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_bridge_mrp/models/fp_work_center.py", "source_location": "L13"}, {"id": "fp_work_center_fpworkcenter_action_sync_to_mrp", "label": ".action_sync_to_mrp()", "file_type": "code", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_bridge_mrp/models/fp_work_center.py", "source_location": "L24"}, {"id": "fp_work_center_rationale_14", "label": "Extend FP work centre with a link to its mirrored MRP work centre.", "file_type": "rationale", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_bridge_mrp/models/fp_work_center.py", "source_location": "L14"}, {"id": "fp_work_center_rationale_25", "label": "Create or update the mirrored mrp.workcenter record. If the FP work cen", "file_type": "rationale", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_bridge_mrp/models/fp_work_center.py", "source_location": "L25"}], "edges": [{"source": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_bridge_mrp_models_fp_work_center_py", "target": "logging", "relation": "imports", "confidence": "EXTRACTED", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_bridge_mrp/models/fp_work_center.py", "source_location": "L6", "weight": 1.0}, {"source": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_bridge_mrp_models_fp_work_center_py", "target": "odoo", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_bridge_mrp/models/fp_work_center.py", "source_location": "L8", "weight": 1.0}, {"source": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_bridge_mrp_models_fp_work_center_py", "target": "fp_work_center_fpworkcenter", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_bridge_mrp/models/fp_work_center.py", "source_location": "L13", "weight": 1.0}, {"source": "fp_work_center_fpworkcenter", "target": "fp_work_center_fpworkcenter_action_sync_to_mrp", "relation": "method", "confidence": "EXTRACTED", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_bridge_mrp/models/fp_work_center.py", "source_location": "L24", "weight": 1.0}, {"source": "fp_work_center_rationale_14", "target": "fp_work_center_fpworkcenter", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_bridge_mrp/models/fp_work_center.py", "source_location": "L14", "weight": 1.0}, {"source": "fp_work_center_rationale_25", "target": "fp_work_center_fpworkcenter_action_sync_to_mrp", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_bridge_mrp/models/fp_work_center.py", "source_location": "L25", "weight": 1.0}], "raw_calls": [{"caller_nid": "fp_work_center_fpworkcenter_action_sync_to_mrp", "callee": "write", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_bridge_mrp/models/fp_work_center.py", "source_location": "L41"}, {"caller_nid": "fp_work_center_fpworkcenter_action_sync_to_mrp", "callee": "info", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_bridge_mrp/models/fp_work_center.py", "source_location": "L42"}, {"caller_nid": "fp_work_center_fpworkcenter_action_sync_to_mrp", "callee": "create", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_bridge_mrp/models/fp_work_center.py", "source_location": "L48"}, {"caller_nid": "fp_work_center_fpworkcenter_action_sync_to_mrp", "callee": "info", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_bridge_mrp/models/fp_work_center.py", "source_location": "L50"}]}
|
||||
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_compliance_models_fp_pollutant_inventory_py", "label": "fp_pollutant_inventory.py", "file_type": "code", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_compliance/models/fp_pollutant_inventory.py", "source_location": "L1"}, {"id": "fp_pollutant_inventory_fppollutantinventory", "label": "FpPollutantInventory", "file_type": "code", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_compliance/models/fp_pollutant_inventory.py", "source_location": "L7"}, {"id": "fp_pollutant_inventory_compute_name", "label": "_compute_name()", "file_type": "code", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_compliance/models/fp_pollutant_inventory.py", "source_location": "L33"}, {"id": "fp_pollutant_inventory_compute_threshold_exceeded", "label": "_compute_threshold_exceeded()", "file_type": "code", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_compliance/models/fp_pollutant_inventory.py", "source_location": "L45"}], "edges": [{"source": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_compliance_models_fp_pollutant_inventory_py", "target": "odoo", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_compliance/models/fp_pollutant_inventory.py", "source_location": "L4", "weight": 1.0}, {"source": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_compliance_models_fp_pollutant_inventory_py", "target": "fp_pollutant_inventory_fppollutantinventory", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_compliance/models/fp_pollutant_inventory.py", "source_location": "L7", "weight": 1.0}, {"source": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_compliance_models_fp_pollutant_inventory_py", "target": "fp_pollutant_inventory_compute_name", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_compliance/models/fp_pollutant_inventory.py", "source_location": "L33", "weight": 1.0}, {"source": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_compliance_models_fp_pollutant_inventory_py", "target": "fp_pollutant_inventory_compute_threshold_exceeded", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_compliance/models/fp_pollutant_inventory.py", "source_location": "L45", "weight": 1.0}], "raw_calls": [{"caller_nid": "fp_pollutant_inventory_compute_name", "callee": "append", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_compliance/models/fp_pollutant_inventory.py", "source_location": "L37"}, {"caller_nid": "fp_pollutant_inventory_compute_name", "callee": "str", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_compliance/models/fp_pollutant_inventory.py", "source_location": "L37"}, {"caller_nid": "fp_pollutant_inventory_compute_name", "callee": "append", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_compliance/models/fp_pollutant_inventory.py", "source_location": "L39"}, {"caller_nid": "fp_pollutant_inventory_compute_name", "callee": "append", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_compliance/models/fp_pollutant_inventory.py", "source_location": "L41"}, {"caller_nid": "fp_pollutant_inventory_compute_name", "callee": "join", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_compliance/models/fp_pollutant_inventory.py", "source_location": "L42"}]}
|
||||
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_quality_models_res_config_settings_py", "label": "res_config_settings.py", "file_type": "code", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_quality/models/res_config_settings.py", "source_location": "L1"}, {"id": "res_config_settings_resconfigsettings", "label": "ResConfigSettings", "file_type": "code", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_quality/models/res_config_settings.py", "source_location": "L9"}], "edges": [{"source": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_quality_models_res_config_settings_py", "target": "odoo", "relation": "imports_from", "confidence": "EXTRACTED", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_quality/models/res_config_settings.py", "source_location": "L6", "weight": 1.0}, {"source": "users_gurpreet_github_odoo_modules_fusion_plating_fusion_plating_quality_models_res_config_settings_py", "target": "res_config_settings_resconfigsettings", "relation": "contains", "confidence": "EXTRACTED", "source_file": "/Users/gurpreet/Github/Odoo-Modules/fusion_plating/fusion_plating_quality/models/res_config_settings.py", "source_location": "L9", "weight": 1.0}], "raw_calls": []}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user