This commit is contained in:
gsinghpal
2026-04-24 21:04:38 -04:00
parent 0eab4b4efb
commit 41d0908ade
4083 changed files with 1230780 additions and 287 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -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.36.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: **911 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 12 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: 810 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.

View File

@@ -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': """

View File

@@ -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">

View File

@@ -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': """

View File

@@ -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)."""

View File

@@ -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"

View File

@@ -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': """

View File

@@ -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">

View File

@@ -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': [

View File

@@ -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'

View File

@@ -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"/>

View File

@@ -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&amp;value=' + _scan_url + '&amp;width=300&amp;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>

File diff suppressed because it is too large Load Diff

View File

@@ -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

View File

@@ -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

View File

@@ -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"}]}

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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": []}

View File

@@ -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

View File

@@ -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": []}

View File

@@ -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

View File

@@ -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": []}

View File

@@ -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"}]}

View File

@@ -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": []}

View File

@@ -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": []}

View File

@@ -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": []}

View File

@@ -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": []}

View File

@@ -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": []}

View File

@@ -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

View File

@@ -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": []}

View File

@@ -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": []}

View File

@@ -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": []}

View File

@@ -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": []}

View File

@@ -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": []}

View File

@@ -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"}]}

View File

@@ -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": []}

View File

@@ -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

View File

@@ -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": []}

View File

@@ -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"}]}

View File

@@ -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"}]}

View File

@@ -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": []}

View File

@@ -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"}]}

View File

@@ -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

View File

@@ -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": []}

View File

@@ -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": []}

View File

@@ -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"}]}

View File

@@ -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"}]}

View File

@@ -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