|
|
|
@@ -0,0 +1,147 @@ |
|
|
|
{ |
|
|
|
"pageTitle": "Stock Ledger Fix", |
|
|
|
"inventory10Title": "1.0 Inventory (Plan A)", |
|
|
|
"inventory10Description": "Keeps existing IDs. Adds UOMs that exist on lots but not in inventory. onHand = Σ(in−out) by item+UOM. Rows with no lots become 0. When an item has multiple old rows, only one stock-UOM bucket is kept; the rest are marked deleted=1. Run this while inbound/outbound is paused, then Fix day by day.", |
|
|
|
"inventory10LoadError": "Could not load inventory 1.0 preview (ADMIN / TESTING required)", |
|
|
|
"inventory10Preview": "Existing inventory: {{rows}} rows; lot item+UOM pairs: {{lotPairs}}; missing: {{missing}}; stockUomId still NULL: {{nullUom}} rows.", |
|
|
|
"inventory10Running": "Recalculating…", |
|
|
|
"inventory10Run": "Run inventory 1.0 (A)", |
|
|
|
"inventory10Confirm": "Plan A: keep existing inventory.id; backfill stockUomId from lots (if the old uomId is stock, revert it to base); insert missing (itemId, stockUomId) rows; recalculate onHand/unavailable from lot in−out. Does not write onHoldQty or change inventory_lot_line. Continue?", |
|
|
|
"inventory10Done": "Inventory 1.0 complete: patched stockUomId {{patched}} rows, inserted {{inserted}}, orphans deleted {{orphans}}, recalculated {{updated}}, still missing UOM {{missingAfter}}, still NULL stockUomId {{nullAfter}}", |
|
|
|
"inventory10Fail": "Inventory 1.0 failed", |
|
|
|
"adjTitle": "2.7 ADJ: set over-issue remain to 0, then align ledger", |
|
|
|
"adjDescription": "Choose an ADJ date, then preview. Default is yesterday. For a freeze-dump night you can pick today (e.g. write 31/8 23:17 ADJ onto 31/8). First handle over-issue (line in < out): raise that lot’s inQty to equal outQty (remain=0; trigger recalculates inventory). Then handle miss: if line and ledger differ, write ADJ against the existing lot’s inbound/outbound lines (lot quantities are not changed). One Apply shares one inbound document and one outbound document, with multiple lines under them. Running again on the same ADJ date reuses those two documents. Detail shows at most 20 rows.", |
|
|
|
"adjDateLabel": "ADJ date", |
|
|
|
"adjDateRequired": "Please enter an ADJ date", |
|
|
|
"adjDateFuture": "ADJ date cannot be in the future", |
|
|
|
"adjDateAndPreviewRequired": "Please enter an ADJ date and preview first", |
|
|
|
"adjTodayFreeze": "Today (freeze night)", |
|
|
|
"adjYesterday": "Yesterday", |
|
|
|
"adjLoadError": "Could not load ADJ preview (ADMIN / TESTING required)", |
|
|
|
"adjPreviewSummary": "ADJ date {{date}}; {{lotCount}} lots can be processed (over-issue remain→0: {{overIssueCount}}, total {{sumOverIssue}}; miss in {{adjInCount}}, out {{adjOutCount}}); missing in total {{sumMissIn}}, missing out total {{sumMissOut}}; SKU net {{skuNet}}{{skuNetNote}}{{revNote}}. Table shows at most 20 rows (over-issue first).", |
|
|
|
"adjSkuNetNote": " (non-zero means missing in has no matching missing out)", |
|
|
|
"adjRevNote": "; includes reverse ADJ {{count}} lots (ledger over-recorded)", |
|
|
|
"adjColLotLineId": "lotLineId", |
|
|
|
"adjColItemCode": "itemCode", |
|
|
|
"adjColLineInOut": "line in/out", |
|
|
|
"adjColLedgerInOut": "ledger in/out", |
|
|
|
"adjColMissIn": "Missing in", |
|
|
|
"adjColMissOut": "Missing out", |
|
|
|
"adjColOverIssue": "Over-issue", |
|
|
|
"adjPreviewing": "Previewing…", |
|
|
|
"adjPreviewAgain": "Refresh preview", |
|
|
|
"adjPreview": "Preview", |
|
|
|
"adjApplying": "Writing ADJ…", |
|
|
|
"adjApply": "Apply ADJ", |
|
|
|
"adjConfirm": "On {{date}}, first patch over-issue remain→0 ({{overIssueCount}} lots, total {{sumOverIssue}}; this changes lot inQty). Then fill miss ADJ: inbound {{adjInCount}}, outbound {{adjOutCount}}. All inbound lines share one inbound document; all outbound lines share one outbound document (miss does not change lot qty). Missing in total {{sumMissIn}}, missing out total {{sumMissOut}}. Continue?", |
|
|
|
"adjDone": "ADJ {{date}}: over-issue remain→0 {{overIssuePatched}}, in {{insertedIn}}, out {{insertedOut}}, lotQty {{filledLotQty}}, balance {{filledBalance}}, day close {{dayRowsWritten}}", |
|
|
|
"adjFail": "ADJ align failed", |
|
|
|
"tabCalendar": "Calendar", |
|
|
|
"tabInventory": "Inventory", |
|
|
|
"tabLot": "Lot line", |
|
|
|
"calendarHint": "Click the title at the top-left to pick year, then month.\nChanging month does not load data; click a day to inspect that day.\nToday can be fixed (freeze-dump night).", |
|
|
|
"selectDate": "Select a date", |
|
|
|
"dayLoadError": "Could not load the day’s check", |
|
|
|
"dayLedgerCount": "{{cnt}} ledger rows that day", |
|
|
|
"cannotFixFuture": "Cannot fix a future date", |
|
|
|
"cannotFixFutureRange": "Cannot fix a future date (today is allowed for freeze-dump night)", |
|
|
|
"pickAtLeastOneStep": "Select at least one step (default runs all of 2.1–2.6)", |
|
|
|
"allSteps216": "all 2.1–2.6", |
|
|
|
"confirmPartialSteps": "Run only {{steps}} ({{date}}). Unchecked steps will not be recalculated. Continue?", |
|
|
|
"fixDayDone": "Fixed {{date}} ({{steps}}): lot {{lot}}, uom {{uom}}, inventory {{inventory}}, lotQty {{lotQty}}, balance {{balance}}, day close {{dayRows}}", |
|
|
|
"fixFailed": "Fix failed", |
|
|
|
"fixing": "Fixing…", |
|
|
|
"fixThisDay": "Fix this day", |
|
|
|
"stepsTitle": "Steps (all selected by default)", |
|
|
|
"stepsHint": "After applying SQL, if you only need to change inventoryId, tick 2.3 only. Unchecked steps are not recalculated.", |
|
|
|
"selectAll": "Select all", |
|
|
|
"step21": "2.1 lot", |
|
|
|
"step22": "2.2 uom", |
|
|
|
"step23": "2.3 inventoryId", |
|
|
|
"step24": "2.4 lotQty", |
|
|
|
"step25": "2.5 balance", |
|
|
|
"step26": "2.6 day close", |
|
|
|
"rangeTitle": "Range fix (2.1–2.6 in one run)", |
|
|
|
"rangeHint": "Uses the steps ticked above. One API call, but runs day by day (same SQL as a single-day fix, commit per day). Today is allowed (freeze-dump night). Frontend timeout is about 20 minutes; for a large range, export SQL instead.", |
|
|
|
"rangeFromRequired": "Please fill range from / to", |
|
|
|
"toMustBeGteFrom": "to must be ≥ from", |
|
|
|
"fromTooEarly": "from cannot be earlier than {{date}}", |
|
|
|
"rangeConfirm": "Fix {{from}} → {{to}} (steps: {{steps}}). Runs day by day (commit each day). Days already finished are kept if it fails mid-way. Continue?", |
|
|
|
"rangeProgress": "Range fix {{from}} → {{to}} ({{steps}}) in progress…", |
|
|
|
"rangeDone": "Range fix complete {{date}} ({{steps}}): lot {{lot}}, uom {{uom}}, inventory {{inventory}}, lotQty {{lotQty}}, balance {{balance}}, day close {{dayRows}}", |
|
|
|
"rangeFail": "Range fix failed", |
|
|
|
"rangeRunning": "Range fix in progress…", |
|
|
|
"rangeRun": "Range fix", |
|
|
|
"from": "from", |
|
|
|
"to": "to", |
|
|
|
"exportTitle": "Export patched SQL (for the new database)", |
|
|
|
"exportHint": "Tick the sections to export (same as day-fix steps). Apply order: 1.0 → ledger (±2.3) → 2.7 inbound/outbound documents + ADJ INSERT → 2.6. A full file (1.0 + 2.3) can skip production 1.0/2.3 when production is frozen and IDs match. Default exports only ledger + day close (legacy behaviour).", |
|
|
|
"exportPickAtLeastOne": "Select at least one export section", |
|
|
|
"export23Without10": "2.3 inventoryId is ticked but 1.0 inventory is not: if production is missing the new IDs, UPDATE will point at empty rows. Tick 1.0 as well (full file). Export anyway?", |
|
|
|
"exportFail": "Export failed", |
|
|
|
"exporting": "Exporting…", |
|
|
|
"exportSql": "Export .sql", |
|
|
|
"exportDefault": "Default", |
|
|
|
"exportFull": "Full file", |
|
|
|
"exportFromToRequired": "Please fill from / to", |
|
|
|
"export10": "1.0 inventory", |
|
|
|
"export23": "2.3 inventoryId", |
|
|
|
"exportLedger": "ledger lot/uom/lotQty/balance", |
|
|
|
"export26": "2.6 day close", |
|
|
|
"export27": "2.7 ADJ + inbound/outbound documents", |
|
|
|
"invTabHint": "Search by itemCode or inventoryId. Fix recalculates lotQty, day close, and balance for this item’s ledger up to today — no need to click the calendar day by day. If the warehouse is still writing this item during the day, new ledger rows after the fix are still handled by the live writer.", |
|
|
|
"invSearchLabel": "itemCode / inventoryId", |
|
|
|
"searching": "Searching…", |
|
|
|
"search": "Search", |
|
|
|
"searchFailed": "Search failed", |
|
|
|
"colInventoryId": "inventoryId", |
|
|
|
"colItemCode": "itemCode", |
|
|
|
"colUomId": "uomId", |
|
|
|
"colLedgerRows": "ledger rows", |
|
|
|
"invLoadError": "Could not load inventory", |
|
|
|
"invScopeSummary": "{{itemCode}} / inventory {{id}} / uom {{uomId}}; {{firstDate}} → {{lastDate}}; {{cnt}} rows; last balance {{lastBalance}}", |
|
|
|
"invFixConfirm": "This will recalculate lotQty and day close for all ledger rows of this inventory up to today, plus this item’s balance. Continue?", |
|
|
|
"invFixDone": "Fixed inventory {{id}}: lot {{lot}}, uom {{uom}}, inventory {{inventory}}, lotQty {{lotQty}}, balance {{balance}}, day close {{dayRows}}", |
|
|
|
"fixThisInventory": "Fix this inventory", |
|
|
|
"lotTabHint": "Search by lotNo or inventoryLotLineId. Fix only recalculates this lot’s lotQty and day close; it does not change balance.", |
|
|
|
"lotSearchLabel": "lotNo / lot line id", |
|
|
|
"colLotLineId": "lot line id", |
|
|
|
"colLotNo": "lotNo", |
|
|
|
"lotLoadError": "Could not load lot", |
|
|
|
"lotScopeSummary": "{{lotNo}} / lot {{id}} / {{itemCode}}; {{firstDate}} → {{lastDate}}; {{cnt}} rows; last lotQtyAfter {{lastLotQtyAfter}}", |
|
|
|
"lotFixConfirm": "This only fixes this lot’s lotQty and day close; it will not change the item’s balance. Continue?", |
|
|
|
"lotFixDone": "Fixed lot {{id}}: lot {{lot}}, uom {{uom}}, inventory {{inventory}}, lotQty {{lotQty}}, day close {{dayRows}}", |
|
|
|
"fixThisLot": "Fix this lot", |
|
|
|
"checkItem": "Item", |
|
|
|
"checkStatus": "Status", |
|
|
|
"checkCorrect": "Correct", |
|
|
|
"checkMiss": "Missing", |
|
|
|
"checkIncorrect": "Incorrect", |
|
|
|
"checkReason": "Reason", |
|
|
|
"checkRows": "Rows", |
|
|
|
"checkDash": "—", |
|
|
|
"canAutoFix": "Can auto-fix (handled by Fix)", |
|
|
|
"cannotAutoFix": "Cannot auto-fix (Fix will not clear these: old TKE new lots / true over-issue / no lot source)", |
|
|
|
"verdictCorrect": "correct", |
|
|
|
"verdictMiss": "miss", |
|
|
|
"verdictOverIssue": "over-issue", |
|
|
|
"verdictCanFix": "can fix", |
|
|
|
"verdictCannotFix": "cannot fix", |
|
|
|
"verdictIncorrect": "incorrect", |
|
|
|
"part": { |
|
|
|
"lot": "inventoryLotLineId", |
|
|
|
"uom": "uomId", |
|
|
|
"inventory": "inventoryId", |
|
|
|
"lotQty": "lotQtyBefore/After (lot already exists)", |
|
|
|
"overIssue": "over-issue (lotQty < 0)", |
|
|
|
"balance": "balance", |
|
|
|
"dayTable": "stock_lot_day", |
|
|
|
"fixable21a": "Can fix 2.1a: SIL/SOL already has a lot line", |
|
|
|
"fixable21b": "Can fix 2.1b: inventoryLotId has only one line", |
|
|
|
"fixableLotQty": "Can fix: lot exists but lotQty is missing", |
|
|
|
"cannotNoSource": "Cannot fix: no SIL/SOL lot source", |
|
|
|
"cannotMultiLine": "Cannot fix: same lot has multiple warehouse lines", |
|
|
|
"earlyTke": "Cannot fix: old TKE opened a new lot (sibling surplus)", |
|
|
|
"realOver": "Cannot fix: over-issue is not old TKE (true over-issue / ledger mismatch)" |
|
|
|
} |
|
|
|
} |