{"cardTitle":{"heading":"Rename card","rename":"Rename “{{title}}”","defaultIs":"Default: {{title}}","fieldEn":"English title","fieldVi":"Vietnamese title","placeholderOther":"Default title","blankHint":"Leave a language blank to keep its default title.","applyToEveryone":"Apply to everyone","applyToEveryoneHint":"Sets the company default. People who renamed this card for themselves keep their title.","save":"Save","cancel":"Cancel","reset":"Reset","resetMine":"Reset to default","resetCompany":"Reset company title","resetCompanyTitle":"Reset the title for everyone?","resetCompanyBody":"Everyone without their own title will see the default “{{title}}” again.","saved":"Card renamed for you.","savedCompany":"Card renamed for everyone.","saveFailed":"Couldn't rename the card. Try again.","resetDone":"Card title reset.","resetDoneCompany":"Company title reset to the default.","resetFailed":"Couldn't reset the card title. Try again."},"scheduling":{"title":"Scheduling","subtitle":"finite-capacity line simulation · drag orders / change priority to level the load · live warnings","tab":{"monthly":"Monthly plan","timeline":"Timeline","calendar":"Daily calendar"},"status":{"overtime_one":"{{count}} overtime point","overtime_other":"{{count}} overtime points","material_one":"{{count}} material risk","material_other":"{{count}} material risks","late":"{{n}} late"},"weeks":{"label":"Week {{n}} · {{from}}–{{to}}","short":"Week {{n}}","labelRange":"Week {{n}} · {{range}}"},"monthly":{"title":"Monthly plan","dragHint":"DRAG a card to another week column to reschedule · impact check appears before the change is final","resort":"Re-sort plan","weekUnitsOrders_one":"{{units}} pcs · {{count}} order","weekUnitsOrders_other":"{{units}} pcs · {{count}} orders","cont":"{{n}} cont","etd":"ETD {{date}}","safeBy":"safe by {{date}}","badgeNotDone":"NOT DONE","badgeLate":"LATE {{n}}d","badgeNotSafe":"not safe","badgeSafe":"safe","colProduct":"Product (model)","colQty":"Order quantity","colCbm":"CBM m³","colPrice":"Unit price","colAmount":"Amount","footer":"Order qty: {{u}} pcs · {{cbm}} m³ · Progress: {{progress}}","shipping":"Shipping {{week}}","value":"Value","shipUnits":"{{units}} pcs · {{cont}} cont","viewOnly":"View only. Moving orders needs the schedule edit permission.","cardDragHint":"Drag to another week column to reschedule","progress":"{{done}}/{{total}} ({{pct}}%)","pcsLeft":"{{n}} pcs left","carried":"+{{n}} carried from last week","shortToday":"SHORT as of today","shortTodayValue":"{{n}} pcs → carries to next week","neededInclCarry":"Total NEEDED (incl. carry-in)","neededValue":"{{n}} pcs","contEstimated":"Estimated container count"},"reorder":{"title":"Re-sort plan — this month","intro":"Drag rows to change priority — top = priority 1 (made first). The plan & calendar behind update the moment you drop. Click Cancel to undo.","colCurrent":"Current","colNew":"New","colPI":"PI code","colCustomer":"Customer","colETD":"ETD","validMoved_one":"↕ {{count}} PI moved — see warnings below","validMoved_other":"↕ {{count}} PIs moved — see warnings below","validNone":"No changes yet — drag a row to start","warnLate":"Late: {{n}} PI","warnNotSafe":"Near deadline (not safe): {{n}} PI","warnMatShort":"Material short: {{n}} PI","warnOvertime":"Overtime needed: {{n}} bottleneck(s)","warnNone":"No warnings — new order is fine, everything still finishes safely.","original":"Original order","cancel":"Cancel","apply":"Apply & re-run","applied":"New order applied — Monthly plan & Timeline re-ran"},"modal":{"title":"Confirm schedule change — review impact first","starts":"Starts {{start}} · finishes {{finish}} · ETD {{etd}} →","afterMonth":"after {{date}}","notDoneMonth":"NOT DONE in month","lateNd":"LATE {{n}}d","safe":"safe","notSafe":"not safe","matShort":"Materials SHORT:","matOk":"Materials OK — arrive before start","otNeed":"Overtime: {{n}} bottleneck point(s) (see Overtime panel)","otNone":"Overtime: not needed","affected":"{{n}} other PI(s) affected (line re-flowed):","affectedLine":"{{id}} ({{cust}}): finishes {{old}} → {{new}}","affectedLate":"(late!)","affectedNone":"No other PIs affected.","cancelKeep":"Cancel (keep old schedule)","confirm":"Confirm change","matUnknown":"Materials: unknown for this PI (no BOM, BOM lines without a material, or units that don't convert).","matChecking":"Materials: checking…"},"toast":{"rescheduled":"{{id}} rescheduled","reorderApplied":"New order applied — Monthly plan & Timeline re-ran","saveFailed":"Couldn’t save the schedule change — kept locally.","beforeToday":"{{id}} can’t start before today ({{date}}), so it can’t move to an earlier week.","clampedToday":"{{id}} can’t start before today, so it moved as early as possible (starts {{date}})."},"side":{"changeImpact":"Change impact","overtime":"Overtime — bottlenecks","overtimeCount_one":"{{count}} point","overtimeCount_other":"{{count}} points","overtimeHead":"{{date}} — bottleneck, overtime needed:","overtimeLine":"{{stage}}: full at {{cap}}, {{ex}} pcs waiting ≈ +{{hours}}h","overtimeNone":"Line is not congested. No overtime needed.","materials":"Materials","materialsCount_one":"{{count}} item","materialsCount_other":"{{count}} items","materialsHead":"{{id}} — starts {{date}}, but:","materialsAdvice":"→ Push the start later / expedite the supplier / substitute the material.","materialsNone":"Materials arrive in time. No risk.","defects":"Defects — pending","defectsCount_one":"{{count}} batch","defectsCount_other":"{{count}} batches","defectsLine":"{{pi}} · {{stage}} → {{qty}} pcs {{state}} ({{day}})","defectsNone":"No defects pending.","delivery":"Delivery — safe = 1 week before ETD","deliveryLine":"{{id}} P{{prio}}{{lock}}: finishes {{finish}} · ETD {{etd}} →","notDoneWithin":"NOT DONE within the month","lateNd":"LATE {{n}}d","safeSlack":"safe ({{n}}d slack)","notSafeFinish":"not safe — finish before {{date}}","materialsUnknown":"Some PIs' materials can't be checked (no BOM, BOM lines without a material, or units that don't convert).","materialsUnknownList":"Not checked: {{list}}","materialsChecking":"Checking materials…","materialsUnavailable":"The material plan couldn't be read, so material readiness is unknown.","defectsReason":"Reason: {{reason}}"},"defectState":{"pending":"Waiting","scrap":"Cancel"},"pi":{"higher":"Higher priority","lower":"Lower priority","mustNotSlip":"Must not slip","close":"Close","currentStage":"Planned stage today","stageOf":"{{stage}} · stage {{k}} of 10","waitingAfter":"Waiting after {{stage}}","notStarted":"Not started","status":"Status","orderQty":"Order qty","orderQtyVal":"{{u}} pcs · {{cbm}} m³ · {{cont}} cont","etd":"ETD","etdVal":"{{date}} · safe by {{safe}}","route":"Route","progress":"Progress","colModel":"Model","colQty":"Quantity","colUnit":"Unit","colAmount":"Amount","progressNone":"Not recorded yet","materials":"Materials","matReady":"Ready — all from stock","matWaiting":"Waiting — last arrival {{date}}","matWaitingUnset":"Waiting — arrival date not set","matShort_one":"Short — {{count}} item","matShort_other":"Short — {{count}} items","matUnknown":"Unknown — {{reasons}}","matUnavailable":"Unknown — the material plan couldn't be read","matChecking":"Checking…","matSummary":"Materials: {{n}} · from stock: {{stock}} · on incoming orders: {{incoming}}","matRequests":"Includes approved purchase requests not ordered yet.","matDraftBom":"Estimated from a BOM that is not approved yet.","matColMaterial":"Material","matColNeed":"For production","matColIncoming":"Incoming","matColToBuy":"To buy","matTipToBuy":"What purchasing orders: production × buying allowance ({{allowance}}).","matAllowancePerSpecies":"per wood species","matColBuy":"Short","matArrives":"arrives {{date}}","matDateUnset":"date not set","matLateBy":"{{n}}d after the start","matPendingNote":"PO awaiting approval","matPending":"Includes POs awaiting approval (not approved supply yet).","matShortNote":"Short is this PI's shortfall before pack / MOQ rounding. The Forecast rounds the buy up, so its to-buy can be higher.","matExpandAll":"Expand all","matCollapseAll":"Collapse all","matShowLines":"Show product lines for {{material}}","matHideLines":"Hide product lines for {{material}}","matColOnHand":"On hand","matColHeld":"Held for other PIs","matColFree":"Free surplus","matColUsed":"Used for this PI","matTipMaterial":"The material's code and name. Open a row's arrow for its share per product line.","matTipNeed":"What the floor uses: finished size × rough factor.","matTipOnHand":"Stock in the whole warehouse, all locations, before reservations.","matTipHeld":"Stock already given to other PIs that need it earlier, plus stock reserved (picks, samples, holds).","matTipFree":"Stock left after every PI in the pipeline took its share. Never below 0.","matTipUsed":"Stock this PI gets, after the PIs that need it earlier.","matTipIncoming":"Open POs, approved purchase requests and POs awaiting approval given to this PI, with the last arrival date.","matTipBuy":"This PI's shortfall before pack / MOQ rounding.","matReserved":"incl. {{qty}} reserved","matGroupTotal":"total","matShortOnly":"Short only","matNoneShort":"Nothing is short for this PI.","matCantCheck":"Can't check: stock is in {{stock}} but the BOM uses {{bom}} — add the conversion in Inventory › Materials › {{sku}}","matUnlinkedTitle":"Unlinked BOM lines ({{n}})","matUnlinkedWhy":"These parts have no material, so they are not counted in the materials below.","matUnlinkedLink":"Link them in the BOM › Wood parts","progressVal":"{{done}}/{{total}} pcs ({{pct}}%)","runOrder":"Run order here","runOrderVal":"#{{n}} of {{m}}","flowTitle":"Flow through the line","flowRange":"{{from}} – {{to}}"},"plan":{"title":"Weekly Production Plan","subtitle":"Production plan · {{month}}","week":"Week {{n}}","traceHint":"Hover a PI to trace it through the line · circled number = run order at that stage · click a bar to keep it in focus · drag a bar sideways to move the PI's start","stageCol":"Stage","caption":"{{code}} · {{span}}d · ETD {{etd}} · {{slack}}","slackDays":"{{n}}d slack","lateDays":"{{n}}d late","total":"Total: {{value}}","pis_one":"{{count}} PI · {{qty}} pcs","pis_other":"{{count}} PIs · {{qty}} pcs","details":"details","viewOnly":"View only: click a bar to keep its PI in focus and see its route.","trace":"— {{cust}} · {{n}} of {{total}} stages this week · {{value}} ·","traceNoValue":"— {{cust}} · {{n}} of {{total}} stages this week ·","unpin":"Clear focus","prevWeek":"Previous week","nextWeek":"Next week","pcs":"{{n}} pcs","barAria":"{{id}} at {{stage}}: {{pcs}} pcs this week","emptyWeek":"No production planned in this week.","barMat":"materials {{state}}","traceMat":"materials {{state}} ·","subtitleCompany":"Production plan · {{company}} · {{month}}","inFocus":"◉ in focus","clearFocus":"clear ✕","barProgress":"{{done}}/{{qty}}","barProgressNone":"none done yet","barProgressTip":"at least {{done}} of {{qty}} done (finished pieces have passed every stage)","keepHint":"click a bar to keep it in focus"},"daily":{"title":"Daily production schedule","subtitle":"Per-stage daily counts from the master plan · {{batches}} · {{stages}}","batchCount_one":"{{count}} batch","batchCount_other":"{{count}} batches","stageCount_one":"{{count}} stage","stageCount_other":"{{count}} stages","prevDay":"Previous day","nextDay":"Next day","prevWeek":"Previous week","nextWeek":"Next week","doneAria":"Done quantity · {{stage}} · {{pi}}","pendAria":"Waiting quantity · {{stage}} · {{pi}}","scrapAria":"Cancelled quantity · {{stage}} · {{pi}}","reasonAria":"Reason · {{stage}} · {{pi}}","day":"Day","week":"Week","month":"Month","stageCol":"Stage","todo":"To do","doneCol":"Done","left":"Left","batchesToday":"Batches in this stage today","batchesWeek":"Batches through stage · this week","batchesMonth":"Batches through stage · whole month","dayClose_one":"DAY CLOSE & NOTES — {{date}} · total done {{done}}/{{need}} · {{count}} stage under plan","dayClose_other":"DAY CLOSE & NOTES — {{date}} · total done {{done}}/{{need}} · {{count}} stages under plan","underPlan":"short {{n}}","reasonMiss":"Reason for miss (explanation)","onPlan":"on plan ✓","doneInput":"Done","pendInput":"Waiting","scrapInput":"Cancel","footerNote":"Daily to-do counts come from the MASTER PLAN (change schedule/priority → auto-recalculated). At day end, enter the actual \"Done\" per PI + a reason if under. Next-morning review: below plan needs an explanation, over is OK. Waiting/Cancel counts feed the Defects warning.","emptyDay":"No production this day.","emptyWeek":"No production this week.","emptyMonth":"No production this month.","capPerDay":"{{cap}} pcs/day","capAssumed":"assumed","noLots":"No lots at this operation","autoSave":"Entries save automatically. Today and the last working day before it stay open (on Monday, Saturday); older days are closed.","conflictRestored":"This row was changed after you typed these figures, so they were not saved. Check the saved figures, then choose Save mine or Use saved figures.","conflictStatus":"Not saved: changed by someone else","saveMine":"Save mine","useSaved":"Use saved figures","reasonRequired":"Reason (required for waiting / cancel)","planQty":"plan {{n}}","saving":"Saving…","saved":"Saved","saveFailed":"Not saved: {{message}}","needReason":"Add a reason to save","draft":"Not saved yet","lastSaved":"Saved by {{name}} · {{time}}","locked":"This day is closed. Ask a production manager to change it; they must give a reason.","editWithReason":"Edit with reason","overrideLabel":"Reason for changing a closed day","overrideNote":"Your change and this reason are logged.","overrideNeeded":"Enter the reason first; the fields open once it is filled.","viewOnly":"View only: entering the day close needs the Scheduling — Edit right. Ask an administrator.","loading":"Loading the day close…","loadError":"Could not load the day close. The fields stay closed until it loads.","retry":"Retry"},"plStages":{"rawMaterial":"Raw material","shaping1":"Shaping 1","shaping2":"Shaping 2","roughSanding":"Rough sanding","colourWiping":"Colour wiping","assembly":"Assembly","primer":"Primer","fineSanding":"Fine sanding","topCoat":"Top coat","packing":"Packing"},"month":{"prev":"Previous month","next":"Next month","thisMonth":"This month"},"notes":{"pastEtd":"Past ETD, no production: {{count}} PI(s)","pastEtdHint":"Confirmed PIs whose ETDs have all passed and that have no work order stay off the board. Close or ship them from Sales.","undated":"No ETD: {{count}} PI(s)","undatedHint":"Confirmed PIs without a line ETD or target delivery date cannot be scheduled. Add an ETD on the PI.","capacity":"Capacity: assumed","capacityHint":"Stages without a work centre run on placeholder capacity, so overtime and late flags are indicative only.","capacityPartial":"Capacity: assumed for {{count}} of {{total}} stages","capacityReal":"Capacity: work centres","capacityRealHint":"Capacity per day = capacity per hour × shift hours × efficiency, from the active work centres.","matUnknown_one":"Materials unknown: {{count}} PI","matUnknown_other":"Materials unknown: {{count}} PIs","matUnknownHint":"These PIs' materials can't be checked: a product has no BOM, BOM lines have no material linked, or units don't convert."},"states":{"loading":"Loading confirmed PIs…","error":"Couldn’t load the orders for this month.","retry":"Retry"},"empty":{"title":"No confirmed PIs due in {{month}}","body":"Only confirmed PIs with an ETD in this month appear here. Use the arrows to see another month."},"capacity":{"bannerTitle":"{{count}} of {{total}} stages run on assumed capacity","bannerBody":"No active work centre feeds {{stages}}. Their figures are placeholders, so overtime and late flags are indicative only.","bannerFix":"To use real capacity, add a work centre whose code is the stage code, or the stage code followed by a dash (for example {{code}} or {{code}}-01).","stageCode":"{{stage}} ({{code}})"},"mat":{"group":{"wood":"Wood","paint":"Paint","fabric":"Fabric","hardware":"Hardware","other":"Other"},"state":{"ready":"in stock","waiting":"arriving","short":"short","unknown":"unknown","checking":"checking…","none":"not used"},"dotTitle":"{{group}}: {{state}}","dotsAria":"Materials: {{list}}","unknownDot":"Materials unknown","checkingDot":"Checking materials…","cardBanner_one":"Materials not ready ({{count}} item) — do not release a production order yet","cardBanner_other":"Materials not ready ({{count}} items) — do not release a production order yet","bannerTitle_one":"{{count}} PI starts before its materials are ready","bannerTitle_other":"{{count}} PIs start before their materials are ready","bannerBody":"{{list}}. Open a PI to see which materials and how much.","lineBuy":"{{mat}}: {{qty}} {{uom}} short","lineLate":"{{mat}} arrives {{date}}, {{n}}d after the start","reason":{"notInPlan":"not in the material plan","noBom":"a product has no BOM","unlinkedLines":"BOM lines without a linked material","unitMismatch":"a material's units don't convert","noMaterials":"the BOM lists no materials","noMaterialsFor":"the BOM of {{skus}} lists no materials"}},"rev":{"chip":"Rev {{n}}","chipHint":"View revision history","bannerTitle":"REVISION UPDATE — Rev {{n}}","bannerBody":"confirmed {{revised}}, after this PI was scheduled ({{scheduled}}) · order qty now {{qty}}. Check the plan and any work orders already sent.","historyTitle":"PI revision history · Rev {{n}}","none":"No revisions yet.","colDate":"Date","colProduct":"Product","colType":"Type","colChange":"Change","colReason":"Reason","colBy":"Confirmed by","versionChange":"Version {{from}} → {{to}}","footnote":"The PI number sent to the customer ({{pi}}) stays the same.","qtyLabel":"Qty changes:","qtyChange":"{{product}} {{before}} → {{after}}","qtyMore":"+{{count}} more","ack":"Acknowledge","ackHint":"Mark this revision as seen for every planner","ackDone":"Revision of {{pi}} acknowledged","ackFailed":"Could not acknowledge the revision","ackStale":"{{pi}} was revised again. The banner now shows the latest revision.","newQtyLine":"New qty {{qty}} · made {{made}} · need {{need}}"},"bom":{"bannerTitle":"BOM CHANGED","line":"{{model}}: version {{from}} → {{to}} since the PI was confirmed","notApproved":"new version not approved yet","more_one":"+{{count}} more model","more_other":"+{{count}} more models"},"bomUpdate":{"button":"Update version","buttonHint":"Move the PI lines on version {{from}} to version {{to}}","title":"⇧ Update version — {{model}}: {{from}} → {{to}}","warning_one":"{{count}} PI line on the board still uses version {{from}} of \"{{model}}\". Move it to version {{to}}?","warning_other":"{{count}} PI lines on the board still use version {{from}} of \"{{model}}\". Move them to version {{to}}?","colUpdate":"Update","colPi":"PI number","colCustomer":"Customer","colQty":"Quantity","tickAria":"Update {{pi}}","reasonLabel":"Reason (saved in the PI's revision log)","defaultReason":"Sync BOM version {{from}} → {{to}}","flowNote":"Each PI is reopened, the line is revised as a material / BOM change and the PI is confirmed again (Rev + 1). The PI number sent to the customer does not change.","cancel":"Cancel","confirm":"✓ Confirm update to version {{to}}","updating":"Updating…","noneSelected":"No PI lines selected","reasonRequired":"Enter a reason","done_one":"Updated {{count}} PI line to version {{to}}","done_other":"Updated {{count}} PI lines to version {{to}}","failed_one":"{{count}} PI could not be updated","failed_other":"{{count}} PIs could not be updated","empty":"No PI lines on the board use this version any more."},"guide":{"whatToDo":"what to do?","badgeHint":"See what to do to stay on time","toneLate":"⚠ LATE ETD","toneNotSafe":"⚠ Not safe","toneSafe":"✓ Safe","info":"Customer {{cust}} · ETD {{etd}} · safe if started before {{safe}} · expected finish {{finish}}","noFinish":"not this month","why":"Why: {{reasons}}","actions":"Suggested actions","whyMat_one":"materials short ({{count}} item)","whyMat_other":"materials short ({{count}} items)","whyMatUnknown":"materials not confirmed","whyLate":"late {{n}} day(s) vs ETD","whyUndone":"does not finish this month","whyNotSafe":"starts after the safe-start date","whyBom":"BOM changed since the PI was confirmed","whyRev":"revised to Rev {{n}} after scheduling","whyCap":"capacity assumed for {{stages}}","matTitle_one":"Materials: {{count}} item not ready","matTitle_other":"Materials: {{count}} items not ready","matBody":"Ask Purchasing to expedite or buy what is missing, or start this PI later.","matUnknownTitle":"Materials not confirmed","matUnknownBody":"The material plan cannot vouch for this PI yet (for example a product has no BOM). Open the PI details to see why.","lateTitle":"Overtime / extra shift","lateBody":"Expected finish {{date}} — late {{n}} day(s). Add overtime to pull it in, move the ETD, or re-prioritise this order.","undoneBody":"It does not finish this month. Add overtime, move the ETD, or re-prioritise this order.","earlierTitle":"Start production earlier","earlierBody":"Should start before {{safe}} to be safe. Currently planned to start {{start}}. Consider re-prioritising or overtime.","bomTitle":"BOM changed","bomBody":"Ask Engineering which BOM version this PI is built to before sending it to production.","revTitle":"PI revised (Rev {{n}})","revBody":"Confirmed {{date}}, after it was scheduled. Re-check the plan and any work orders already sent.","capTitle":"Capacity assumed","capBody":"No work centre feeds {{stages}}, so the finish date uses a placeholder capacity. Set up the work centres for a real date.","noneTitle":"✓ No action needed","noneBody":"Materials complete, schedule safe vs ETD.","openPi":"Open PI details","close":"Close"},"merge":{"link":"merge {{n}}","linkHint":"This model is on several PI lines this month","title":"Merge production by model — {{model}}","help":"PI lines this month with this model. Only lines on the same BOM version (an identical BOM) can be produced as one batch; other versions are locked. Tick the lines to run together, then Create batch & produce.","colPi":"PI number","colCustomer":"Customer","colEtd":"ETD","colQty":"Quantity","colVersion":"Version","colSent":"In production","version":"v{{v}}","noBom":"No BOM","total":"Same version: {{qty}} pcs · {{count}} PI lines in all","note":"One work order is created for the whole batch. Each PI line keeps its own share, and the board counts the work order on every PI it covers.","colMerge":"Merge","colToSend":"To send","lockOtherVersion":"other version — cannot merge","lockBomChanged":"BOM changed since the PI was confirmed — update the version first","lockNothingLeft":"nothing left to send","lockNotLinked":"not a PI line — cannot be sent","tickAria":"Merge {{pi}}","qtyAria":"Quantity to send for {{pi}}","start":"Planned start","end":"Planned end","selected_one":"{{count}} PI line selected · {{qty}} pcs","selected_other":"{{count}} PI lines selected · {{qty}} pcs","create":"Create batch & produce","creating":"Creating…","cancel":"Cancel","needPermission":"You need permission to create work orders.","pickLines":"Tick the PI lines to run as one batch.","qtyInvalid":"Each quantity must be more than 0 and no more than what may still be sent.","datesInvalid":"The planned end is before the planned start.","confirmTitle_one":"Create one work order for {{count}} PI line?","confirmTitle_other":"Create one work order for {{count}} PI lines?","confirmBody":"{{model}} · BOM {{version}} · {{qty}} pcs · {{start}} → {{end}}. Each PI line keeps its own share.","created_one":"Batch {{wo}} created for {{count}} PI line · {{qty}} pcs","created_other":"Batch {{wo}} created for {{count}} PI lines · {{qty}} pcs","failed":"The batch could not be created.","lockMaterials":"materials not ready — clear them first","allowanceNote":"Over-production allowance {{pct}}%: up to {{pct}}% above the ordered quantity can be sent.","nowVersion":"→ now v{{v}}"},"send":{"toggle":"Proceed with production","modeHint":"Pick product lines to send to production.","selected_one":"Selected {{count}} line","selected_other":"Selected {{count}} lines","models":"models: {{list}}","totals":"Ordered {{ordered}} · Already sent {{sent}} · To send {{toSend}}","ready":"{{count}} ready","blocked":"{{count}} blocked","clear":"Clear","go":"Send to production","sending":"Sending…","hint":"Tick product lines on the cards. Lines of the same model on other PIs are marked.","colModel":"Model","colPi":"PI","colCustomer":"Customer","colOrdered":"Ordered","colSent":"Already sent","colToSend":"To send","colReady":"Ready for production?","isReady":"Ready","notReady":"Not ready","blockMatShort":"materials short","blockMatUnconfirmed":"materials not confirmed","blockBom":"BOM changed since the PI was confirmed","blockNothingLeft":"nothing left to send","pickLine":"Select {{model}} on {{pi}}","noneSelected":"No products selected","noneReady":"Nothing can be sent yet: every picked line is held back (see the Ready column). Clear the blocking issue on each line — confirm materials or update the BOM version — then send again.","sent_one":"Sent {{count}} work order to production","sent_other":"Sent {{count}} work orders to production","sentHeld_one":"Sent {{count}} work order to production — {{held}} not-ready held back","sentHeld_other":"Sent {{count}} work orders to production — {{held}} not-ready held back","failed_one":"{{count}} work order could not be created","failed_other":"{{count}} work orders could not be created","exit":"Exit selection","sameCanMerge":"SAME MODEL ✓ can merge","sameOtherVersion":"SAME MODEL · OTHER VERSION","colProduced":"Produced","mergeN":"Merge {{count}} PIs","groupAllReady":"All ready","groupNotReady_one":"{{count}} PI not ready","groupNotReady_other":"{{count}} PIs not ready","removeRow":"Remove from list","removeGroup":"Remove the whole group","refusal":{"permission":"You can't send to production: your role lacks the permission \"Create production orders\" (production.orders.create). Ask an administrator to grant it, then try again.","materialsShort":"{{model}} was not sent: materials are short for one of its PIs (still to buy, or arriving after the planned start). Clear the shortage or move the start, then send again.","materialsUnconfirmed":"{{model}} was not sent: materials are not confirmed for one of its PIs (no BOM, unlinked lines or a unit mismatch). Confirm the materials, then send again.","bomChanged":"{{model}} was not sent: its PI lines are on different BOM versions, or the BOM changed after the PI was confirmed. Use \"Update version\" on the card, then send again.","alreadySent":"{{model}} was not sent: part or all of that quantity is already on a work order. Reload the board to see what is left, then pick again.","piNotConfirmed":"{{model}} was not sent: its PI is not confirmed yet. Confirm the PI in Sales, then send again.","lineGone":"{{model}} was not sent: a PI line was removed or listed twice since the board loaded. Reload the board and pick again.","mixed":"{{model}} was not sent: one work order can only hold one product. Reload the board and pick again.","generic":"{{model}} could not be sent to production. Reload the board and try again; if it keeps failing, contact support."}},"kpi":{"containers":"Total containers","amount":"Total amount","produced":"Produced / ordered","pis":"PIs this month","contValue":"{{n}} cont","producedValue":"{{done}} / {{total}} ({{pct}}%)","piValue":"{{n}} PI","notRecorded":"Not recorded yet"},"notices":{"details":"Details"},"drag":{"roleDescription":"draggable card","keyboardHint":"Enter opens the PI. Space picks the card up, ← → choose a week, Enter moves it, Esc cancels.","picked":"{{id}} picked up, in {{week}}. Choose a week with the arrow keys, Enter to move, Escape to cancel.","over":"Move to {{week}}","cancelled":"Move cancelled."},"overview":{"viewing":"● VIEWING","clickToView":"click to view ›","prod":{"title":"🏭 Production · customer PIs","thisMonth":"(this month)","pis":"PIs","cont":"Cont","value":"Value","pcs":"Qty pcs","produced":"Produced {{pct}}%","producedUnknown":"Produced — (not recorded yet)"},"sample":{"title":"🎨 Sample · current samples","open":"Open Sample requests ›","total":"Total samples","overdue":"Overdue","top":"Highest priority","noTop":"No open sample requests.","noAccess":"You don’t have access to sample requests.","loading":"Loading sample requests…","error":"Couldn’t load sample requests."},"dash":{"title":"📊 Monthly dashboard","sub":"Customer summary · ABC share of the month"},"tabsLabel":"Plan views"},"samplePlan":{"title":"🎨 Sample plan: by week and priority","count_one":"{{count}} open sample","count_other":"{{count}} open samples","week":"Week of {{date}}","noDeadline":"No deadline","weekTotals_one":"{{units}} pcs · {{count}} sample","weekTotals_other":"{{units}} pcs · {{count}} samples","needBy":"Needed by","overdue":"OVERDUE","colProduct":"Product (model)","colQty":"Quantity","noCustomer":"(no customer)","emptyTitle":"No open sample requests","emptyBody":"Delivered and cancelled requests are not planned here."},"customers":{"title":"📋 Customer summary (month)","colCustomer":"Customer","colGroup":"Group","colCont":"Container","colQty":"Quantity (pieces)","colValue":"Value","colShare":"Share","total":"TOTAL","summary_one":"{{count}} customer · {{units}} pcs · {{value}}","summary_other":"{{count}} customers · {{units}} pcs · {{value}}","summaryNoValue_one":"{{count}} customer · {{units}} pcs","summaryNoValue_other":"{{count}} customers · {{units}} pcs","empty":"No confirmed PIs in this month.","abcThresholds":"ABC thresholds (% share/customer):","abcA":"A≥","abcB":"B≥","abcRange":"Use whole numbers from 1 to 100. Thresholds were not changed.","abcOrder":"B must be lower than A. Thresholds were not changed.","filter":"Filter","sort":"Sort","filterAll":"All","filterA":"A","filterB":"B","filterC":"C","sortValue":"Value","sortQty":"Quantity","sortCont":"Containers","sortName":"Name","asc":"Ascending","desc":"Descending","noMatch":"No customer is in group {{group}} with these thresholds.","shown_one":"Showing {{shown}} of {{count}} customer","shown_other":"Showing {{shown}} of {{count}} customers","shownTotal":"Shown total","monthTotal":"Month total","sortDir":"Sort direction","paretoTitle":"Revenue share by customer (ABC) — % of month","paretoNote":"Bars: customer value · line: cumulative % · dashed: A and B thresholds.","paretoCur":"The month has several currencies, so only {{cur}} is charted; currencies are never added together.","paretoAlt":"Pareto chart of {{count}} customers in {{cur}}. {{top}}","paretoAltTop":"Largest: {{cust}} at {{pct}}% of the month.","guideA":"A ≥ {{pct}}%","guideB":"B ≥ {{pct}}%","cumulative":"Cumulative %","valueAxis":"Value ({{cur}})","paretoEmpty":"No customer value to chart this month."},"plStageNames":{"vi":{"rawMaterial":"Nguyên liệu thô","shaping1":"Tạo hình 1","shaping2":"Tạo hình 2","roughSanding":"Chà nhám thô","colourWiping":"Lau màu","assembly":"Lắp ráp","primer":"Sơn lót","fineSanding":"Chà nhám mịn","topCoat":"Sơn phủ","packing":"Đóng gói"},"en":{"rawMaterial":"Raw material","shaping1":"Shaping 1","shaping2":"Shaping 2","roughSanding":"Rough sanding","colourWiping":"Colour wiping","assembly":"Assembly","primer":"Primer","fineSanding":"Fine sanding","topCoat":"Top coat","packing":"Packing"}},"drying":{"title":"Drying wait between stages","hint":"Hours the pieces of a stage must dry before the next stage starts. The plan leaves this gap. Set on each stage's work centre.","none":"No drying wait set: each stage's next stage can start the next day.","edit":"Edit in Work Centre List","hours":"{{n}} h","barMark":"{{n}}h","barTip":"Then {{n}} h drying ({{days}} d on the plan) before {{next}}"}},"common":{"importFile":{"legacyXls":"Old Excel files (.xls) can't be imported. Open the file in Excel, choose Save As › Excel Workbook (.xlsx), then upload it again.","wrongType":"This import takes {{types}} files."},"andMore":"and {{count}} more","theme":{"toggle":"Toggle theme","light":"Light mode","dark":"Dark mode","system":"System preference"},"networkError":"Network error. Check your connection and try again.","cannotConnect":"Cannot connect to the server. Check your connection and try again.","appName":"KeenERP","accessDenied":{"title":"You don't have access to this","description":"To request access, ask your manager or the person you report to."},"combobox":{"placeholder":"Search…","searching":"Searching…","noResults":"No matches","showingNofM":"Showing {{n}} of {{m}}","loadError":"Couldn't load. Retry.","clear":"Clear"},"loading":"Loading...","sessionEnded":"Your session has ended. Sign in again.","error":"An error occurred","save":"Save","cancel":"Cancel","delete":"Delete","edit":"Edit","create":"Create","search":"Search","filter":"Filter","export":"Export","import":"Import","back":"Back","backTo":"Back to {{label}}","next":"Next","previous":"Previous","confirm":"Confirm","close":"Close","dismiss":"Dismiss","searchPlaceholder":"Search...","yes":"Yes","no":"No","all":"All","none":"None","status":"Status","actions":"Actions","columns":"Columns","details":"Details","settings":"Settings","help":"Help","logout":"Logout","phone":{"countryCode":"Country code","placeholder":"Phone number"},"prefix":"Title","prefixes":{"mr":"Mr.","ms":"Ms.","mrs":"Mrs.","dr":"Dr."},"form":{"orderDetails":"Order Details","quotationDetails":"Quotation Details","bomDetails":"BOM Details","workOrderDetails":"Work Order Details","lineItems":"Line Items","product":"Product","quantity":"Quantity","unitPrice":"Unit Price","unit":"Unit","notes":"Notes","creating":"Creating...","addItem":"Add Item","cancel":"Cancel","version":"Version","component":"Component","components":"Components","addComponent":"Add Component","deliveryDate":"Delivery Date","expectedDelivery":"Expected Delivery","validUntil":"Valid Until","selectCustomer":"Select customer...","selectVendor":"Select vendor...","selectProduct":"Select product...","selectFinishedProduct":"Select finished product...","selectComponent":"Select component...","selectWorkCenter":"Select work center...","orderNotes":"Order notes...","warehouse":"Warehouse","selectWarehouse":"Select warehouse...","warehouseHint":"Where the order is fulfilled from.","deliveryDateHint":"Optional — when the customer expects delivery.","errorRequired":"This field is required.","save":"Save","removeItem":"Remove item","discardTitle":"Discard changes?","discardBody":"You have unsaved changes. If you leave now, your changes will be lost.","keepEditing":"Keep editing","discard":"Discard","saveChanges":"Save changes","saving":"Saving…","unsavedChanges":"Unsaved changes","quotationTerms":"Quotation terms...","bomNotes":"BOM notes...","workOrderInstructions":"Work order instructions...","currency":"Currency","selectCurrency":"Select currency...","quoteDate":"Quote Date","linesOptionalHint":"Lines are optional now — you can add or refine them after saving.","invalidQuantity":"Quantity must be greater than zero.","bomName":"BOM name","clientCode":"Client code","piReference":"PI reference","monthPlan":"Month plan","reference":"Reference","category":"Category","bomCategory":{"wood":"Wood","sheet_stock":"Sheet stock","packaging":"Packaging","paint":"Paint","paint_calc":"Paint formula","other":"Other"},"linePickProduct":"Pick a product for each line item, or clear the row.","lineInvalidNumbers":"Line quantities must be greater than zero and prices cannot be negative."},"errors":{"loadFailed":"Failed to load data","saveFailed":"Failed to save changes","createFailed":"Failed to create record","updateFailed":"Failed to update record","deleteFailed":"Failed to delete record","activateFailed":"Failed to activate","sendFailed":"Failed to send","somethingWrong":"Something went wrong","anErrorOccurred":"An error occurred","fillAllFields":"Please fill all fields","notAuthenticated":"Not authenticated","loadProduct":"Failed to load product","loadProducts":"Failed to load products","activateProduct":"Failed to activate product","createProduct":"Failed to create product","updateProduct":"Failed to update product","loadBOM":"Failed to load BOM","loadBOMs":"Failed to load BOMs","activateBOM":"Failed to activate BOM","explodeBOM":"Failed to explode BOM","loadCategories":"Failed to load categories","saveCategory":"Failed to save category","deleteCategory":"Failed to delete category","loadBilling":"Failed to load billing data","loadSettings":"Failed to load settings","saveSettings":"Failed to save settings","loadTeam":"Failed to load team data","sendInvitation":"Failed to send invitation","loadStaff":"Failed to load staff","create":"Failed to create","revoke":"Failed to revoke","saveProfile":"Failed to save profile","updateRole":"Failed to update role","deactivateUser":"Failed to deactivate user"},"confirmDialog":{"deleteTitle":"Confirm Delete","deleteWarehouse":"Are you sure you want to delete this warehouse? This action cannot be undone.","deleteVendor":"Are you sure you want to delete this vendor? This action cannot be undone.","deleteCustomer":"Are you sure you want to delete this customer? This action cannot be undone.","processing":"Processing..."},"allStatuses":"All Statuses","showingOf":"Showing {{count}} of {{total}}","active":"Active","inactive":"Inactive","saving":"Saving...","update":"Update","retry":"Retry","tryAgain":"Try Again","notFound":"Not Found","noneTopLevel":"None (Top Level)","failedToAdd":"Failed to add","failedToCreate":"Failed to create","failedToDelete":"Failed to delete","failedToGrantAccess":"Failed to grant access","failedToSave":"Failed to save","failedToUpdate":"Failed to update","confirmDeleteDepartment":"Are you sure you want to delete this department? This action cannot be undone.","confirmDeletePosition":"Are you sure you want to delete this position? This action cannot be undone.","confirmDeleteRecord":"Are you sure you want to delete this record? This action cannot be undone.","confirmDeleteShift":"Are you sure you want to delete this shift? This action cannot be undone.","placeholders":{"optionalDescription":"Optional description..."},"backToSource":"Back to source","clearFilters":"Clear filters","copied":"Copied","fromLocation":"From location","admin":"Administration","quality":"Quality","inventory":"Inventory","movementHistory":"Movement history","noActionsAvailable":"No further actions available.","noMovements":"No movements recorded for this lot.","notes":"Notes","optional":"Optional","postedBy":"Posted by","product":"Product","quantity":"Quantity","reference":"Reference","saveError":"Failed to save","toLocation":"To location","toasts":{"comingSoon":"Coming soon","comingSoonDesc":"This feature is coming soon."},"totalCost":"Total cost","unitCost":"Unit cost","view":"View","table":{"noData":"No data found","rowIndex":"#","searchPlaceholder":"Search all columns","showingRange":"Showing {{from}} to {{to}} of {{total}}","copyCell":"Copy cell","copyRow":"Copy row","copySelection":"Copy selection","cellMenu":"Cell actions","opensRecord":"Opens the record","copied":"Copied","copyFailed":"Couldn't copy — your browser blocked clipboard access. Select the text and press Ctrl+C instead."},"grid":{"noData":"No data found","noResults":"No matching rows","loading":"Loading…","compact":"Compact rows","comfortable":"Comfortable rows","selected":"{{n}} selected","search":"Search","clearSearch":"Clear search","filters":"Filters","filter":"Filter","filterNumeric":"e.g. >5, <=10 or 5..10","filterDate":"e.g. 22/09/2026 or 09/2026","filterSearch":"Type to search…","filterNoMatches":"No matches","filterMatchCount":"Matches: {{count}}","filterShowingOf":"Showing {{shown}} of {{count}}. Keep typing to narrow.","columns":"Columns","showAll":"Show all columns","resetColumns":"Reset columns","clear":"Clear","actions":"Row actions","rowsPerPage":"Rows per page","pageOf":"Page {{page}} of {{count}}","firstPage":"First page","lastPage":"Last page","toggleDetail":"Toggle detail"},"modal":{"close":"Close modal","dialog":"Dialog","processing":"Processing..."},"columnManager":{"reset":"Reset","resetToDefault":"Reset to default","moveUp":"Move up","moveDown":"Move down"},"updateFailed":"Update failed","manufacturing":"Manufacturing","purchasing":"Purchasing","sales":"Sales","logistics":"Logistics","products":"Products","hr":"HR","showPassword":"Show password","hidePassword":"Hide password","drawer":{"expand":"Expand to full width","restore":"Restore width"},"permissionNeeded":"Permission needed: {{label}}","sequence":"Row number"},"errors":{"BAD_REQUEST":"The request could not be processed.","SAMPLE_WAREHOUSE_MISSING":"There is no sample warehouse, so sample stock cannot be reserved. Set a warehouse's type to Sample in Settings › Locations › Warehouses (or give it the code SAMPLE), then try again.","SAMPLE_LINE_NO_BOM":"This product has no BOM yet — open the BOM first, then accept it.","STORAGE_UNAVAILABLE":"File storage is unavailable — try again shortly.","APPROVED_PRICE_NOTE_REQUIRED":"A reason is required when the approved price is at or below the calculated FOB.","WORKSHEET_NO_APPROVED_PRICE":"Version v{{version}} has no approved price, so it can’t be approved — PI and quote lines take the approved price only. Set the approved price on this version first (the “Approved price / unit” box), then approve.","PI_NUMBER_TAKEN":"This PI number is already used by another proforma invoice.","PI_CONFIRM_NO_COMPANY_FX_RATE":"PI {{pi}} cannot be confirmed: the Reference FX rate for {{currency}} in Admin › Company Settings › Localization is empty, and confirming freezes that rate on the PI. Ask an administrator to enter it there (VND per 1 {{currency}}), then confirm the PI again.","PI_CONFIRM_NO_EXCHANGE_RATE":"PI {{pi}} cannot be confirmed: Settings › Currencies has no exchange rate for {{currency}}, and confirming freezes that rate on the PI. Ask an Admin › Company Settings admin to enter the VND rate for 1 {{currency}} in Settings › Currencies, then confirm the PI again.","SEAL_IMAGE_INVALID":"The seal must be an image file (PNG, JPG, …).","SEAL_IMAGE_TOO_LARGE":"The seal image is larger than the 2MB limit.","SIGNATURE_IMAGE_INVALID":"The signature must be an image file (PNG, JPG, …).","SIGNATURE_IMAGE_TOO_LARGE":"The signature image is larger than the 2MB limit.","WORK_CENTER_CODE_EXISTS":"A work centre with code {{code}} already exists.","WORK_CENTER_CODE_DELETED":"Code {{code}} belongs to a deleted work centre; choose another code.","WORK_CENTER_IN_USE":"This work centre can't be deleted: {{count}} open work order(s) still have operations here ({{orders}}). Complete, cancel or move them to another work centre first.","SFM_STATION_CODE_EXISTS":"Tablet code {{code}} is already used. Codes must be unique, including removed tablets. Pick a different code.","SFM_STATION_NOT_FOUND":"This tablet no longer exists, so the change wasn't saved. Reload the list and try again.","SFM_WORK_CENTER_NOT_FOUND":"That work centre can't be used because it was deleted or set inactive. Pick an active work centre.","SFM_OPERATOR_NOT_FOUND":"This person can't get a PIN because their account is missing or deactivated. Reactivate them in Users, then try again.","SFM_STATION_NAME_REQUIRED":"Enter a tablet name. A name of only spaces can't be saved.","SFM_PAIRING_CODE_INVALID":"This pairing code was already used or expired — ask an admin to show a new one in Settings › Shop-floor tablets.","SFM_OPERATOR_AMBIGUOUS":"More than one user signs in as {{short_id}}, so the tablet can't tell them apart. Ask an admin to give each operator a unique login ID, then try again.","FORECAST_BUY_POS_LOCKED":"POs have been issued from {{id}}, so they can't be cleared or removed.","FORECAST_BUY_STALE":"{{id}} was just changed by a colleague. Their latest version has been loaded.","UNAUTHORIZED":"Please sign in to continue.","FORBIDDEN":"You don't have permission for this. Ask your administrator to give your role access.","NOT_FOUND":"Not found.","CONFLICT":"This conflicts with existing data.","VALIDATION_ERROR":"Please check the highlighted fields.","RATE_LIMITED":"Too many requests. Please try again shortly.","SERVICE_UNAVAILABLE":"The service is temporarily unavailable. Please try again.","HTTP_ERROR":"The request failed.","INTERNAL_ERROR":"Something went wrong on our side. Please try again.","EXPORT_DOC_SET_NOT_FOUND":"Export document set not found.","EXPORT_DOC_SET_EXISTS":"This order already has an export document set.","EXPORT_DOC_ORDER_NOT_FOUND":"Sales order not found.","EXPORT_DOC_CONTAINER_NOT_FOUND":"Container not found.","EXPORT_DOC_LAST_CONTAINER":"The last container cannot be removed.","EXPORT_DOC_CARTON_NOT_FOUND":"Carton row not found.","EXPORT_DOC_SIGNER_NOT_FOUND":"That signer no longer exists or was deleted. Pick another signer from the list.","EXPORT_DOC_INVALID_LANG":"Unsupported contract language.","EXPORT_DOC_SET_LOCKED":"This export document set is locked (issued or void), so it cannot be changed, combined or split. Create a new set from a live PI.","EXPORT_DOC_ORDER_ALREADY_COMBINED":"One of these PIs or orders is already combined into another export document set.","EXPORT_DOC_COMBINE_INVALID":"Pick two or more different PIs or orders to combine.","EXPORT_DOC_SET_MERGED":"This order's documents are combined into another export document set — edit the combined set instead.","EXPORT_DOC_COMBINE_MIXED_CURRENCY":"These PIs or orders use different currencies, so they cannot share one document set.","EXPORT_DOC_COMBINE_NEEDS_ACK":"These PIs or orders have a different customer or incoterm, or a currency that is not set. Confirm to combine them anyway.","EXPORT_DOC_COMBINE_CANCELLED":"A cancelled PI or order cannot be combined.","EXPORT_DOC_COMBINE_NO_LINES":"One of these PIs or orders has no lines to combine.","EXPORT_DOC_COMBINE_SHIPPED":"An invoice of this order has shipped, so its documents cannot be combined with another order.","EXPORT_DOC_PRECHECK_ERRORS":"The pre-issue check found errors. Fix them in step 4, then issue.","EXPORT_DOC_PRECHECK_NEEDS_ACK":"The documents changed since you read the warnings. Read them again, then issue.","SHIPMENT_NOT_FOUND":"Shipment not found.","SHIPMENT_CUSTOMER_NOT_FOUND":"Customer not found.","SHIPMENT_DISPATCH_NOT_FOUND":"Dispatch not found.","SHIPMENT_DISPATCH_REQUIRED":"Select at least one dispatch.","SHIPMENT_DISPATCH_NOT_READY":"A selected dispatch is not ready to ship.","SHIPMENT_DISPATCH_OTHER_CUSTOMER":"A selected dispatch belongs to another customer.","SHIPMENT_ALREADY_DELIVERED":"This shipment is already delivered.","SHIPMENT_DOC_NOT_FOUND":"Document template not found.","PICK_INVALID_STAGE":"This action isn't available at the ticket's current stage.","PICK_SOURCE_ALREADY_ADDED":"This source document is already on the ticket.","PICK_LINE_ALREADY_EXISTS":"This material is already on the ticket.","PICK_TICKET_NUMBER_CONFLICT":"The ticket number is already taken — please try again.","PICK_OUTSTANDING_REMAINING":"Outstanding quantity remains — post or short every line before closing.","PICK_INSUFFICIENT_STOCK":"Not enough available stock to reserve.","DISPATCH_INSUFFICIENT_SELLABLE_STOCK":"Not enough sellable stock for {{product}}: {{needed}} needed, {{available}} available. Receive the stock or move it to a sellable bin in this warehouse, then click Pick stock again. To ship less, cancel this dispatch and create a new one with the quantity on hand.","PICK_SHORT_REASON_REQUIRED":"A reason is required when picking short.","PICK_INVALID_QTY":"The quantity is invalid.","PICK_INVALID_POST_MODE":"The selected post mode is invalid.","PICK_UNSUPPORTED_SOURCE_TYPE":"This source document type isn't supported.","PICK_NOTHING_PLANNED":"Nothing to release — no line has a planned pick quantity yet.","PICK_NOT_EXTRA_LINE":"Only manually added materials can be removed.","PICK_PICKER_NOT_FOUND":"The selected picker was not found.","PICK_PROFORMA_NOT_CONFIRMED":"The proforma invoice must be confirmed before releasing this ticket.","PICK_NO_SHORT_LINES":"There are no short lines on this ticket.","DOC_FORMAT_NEEDS_SEQ":"This document format can't be saved: it needs exactly one sequence number. Add a sequence segment (and remove extras), then save again.","DOC_FORMAT_NEEDS_CUSTOMER_CODE":"This document format can't be saved: it needs the customer code so numbers stay unique per customer. Add the customer code slot, then save again.","DOC_FORMAT_UNSUPPORTED_SEGMENT":"This document format can't be saved: document numbers only support text, separator, date, sequence and legend parts. Remove the other parts, then save again.","PICK_LINE_NOT_SHORT":"This line isn't short.","RETURN_LINES_REQUIRED":"Add at least one return line.","RETURN_QTY_INVALID":"Return quantity must be greater than zero.","RETURN_QTY_EXCEEDS_ISSUED":"Return quantity exceeds what was issued minus what was used.","RETURN_NOT_DRAFT":"Only draft returns can be edited or submitted.","RETURN_NOT_SUBMITTED":"Only submitted returns can be confirmed or rejected.","RETURN_LINE_BIN_REQUIRED":"Pick a destination bin for every returned batch.","RETURN_NOT_FOUND":"The referenced record was not found.","BTP_LOT_NOT_FOUND":"We can't find that semi-finished lot — it may have been deleted or the code is wrong. Refresh the list and try again.","BTP_LOT_NOT_AWAITING":"This lot has already been received or rejected, so it can't be received again. Refresh the list to see its current status.","BTP_QTY_INVALID":"The quantity must be greater than zero. Enter how many pieces you actually counted.","BTP_QTY_EXCEEDS_CAPTURED":"You can't receive more than QC captured. Enter the quantity on the pallet (at most what QC recorded), or ask QC to correct the capture.","BTP_LOT_NOT_AVAILABLE":"This lot isn't available for reuse — it may not be in stock yet, may be held or expired, or has a visual defect. Pick another lot or check its status in the stock list.","BTP_LOT_NOT_RESERVED":"This lot isn't reserved for a work order, so it can't be issued yet. Confirm the reuse on the Reuse match tab first.","BTP_LOT_RESERVED_OTHER_WO":"This lot is reserved for another work order. Release that reservation or choose a different lot.","BTP_NO_STOCK":"There is no stock on hand for this lot, so nothing can be issued. Check the lot's location and quantity.","BTP_QC_NOT_FOUND":"We can't find that QC inspection. Check the inspection number and try again.","BTP_LINES_REQUIRED":"Nothing to save yet. Add at least one surplus line with a quantity, then save again.","BTP_COLOR_REQUIRED":"Colour / finish is required — it decides which orders can reuse the lot. Enter it and save again.","BTP_WO_NOT_FOUND":"We can't find that work order. Pick it again from the list.","BTP_WO_NO_BOM":"This work order has no bill of materials, so there is nothing to match against. Add a BOM to the order, then try again.","BTP_PHOTO_NOT_FOUND":"That photo no longer exists. Refresh the lot and try again.","BTP_PHOTO_MIME_UNSUPPORTED":"This photo format isn't supported. Use a JPEG, PNG or WebP image.","SUBSCRIPTION_NOT_FOUND":"Subscription not found.","SUBSCRIPTION_CANCELLED_IMMUTABLE":"A cancelled subscription cannot be changed.","SUBSCRIPTION_ALREADY_CANCELLED":"This subscription is already cancelled.","SUBSCRIPTION_CANCELLATION_ALREADY_SCHEDULED":"Cancellation is already scheduled for this subscription.","SUBSCRIPTION_NOT_SUSPENDABLE":"A {{status}} subscription cannot be suspended.","SHIP_TO_ACTIVE_NEEDS_ADDRESS":"An active ship-to needs a full address — customs reads it. Save it as Draft instead if the address is not confirmed.","SHIP_TO_IN_USE":"This ship-to account is the consignee on {{count}} order(s): {{names}}. It can't be deleted while they reference it.","CODE_SLOT_MISSING":"The vendor code format needs a vendor category ({{slot}}) — pick one or enter a code.","ORDER_SHIP_TO_INVALID":"That ship-to account is not available for this customer.","ORDER_RECEIVING_CONTACT_INVALID":"The receiving contact does not belong to the selected consignee.","ORDER_NOTIFY_PARTY_INVALID":"Notify party \"Customer\" is not available on a direct order — the customer is already the consignee.","ORDER_CONSIGNEE_NEEDS_ADDRESS":"{{name}} has no address on file — add it in Contacts before this order can ship","ORDER_LC_NUMBER_REQUIRED":"Enter the L/C number, or leave the term as T/T until the credit is opened","PAYMENT_TERM_DUPLICATE":"That term is already on the list","PAYMENT_TERM_IN_USE":"This payment term is used by {{names}} (on live orders or as their default term) — retire it instead of deleting.","ORDER_DOC_ORDER_NOT_FOUND":"Sales order not found for this document hub","ORDER_DOC_SLOT_NOT_FOUND":"Order document not found","ORDER_DOC_ILLEGAL_TRANSITION":"That status change is not allowed for this document","ORDER_DOC_TOKEN_NOT_MINTED":"The portal link has not been created yet — send the document first","ORDER_DOC_NOT_SENT":"The document has not been sent to the customer yet","ORDER_DOC_REFRESH_DECIDED":"The customer already accepted, signed or rejected this PI copy, so it can no longer be refreshed from the proforma","ORDER_DOC_PI_DRIFT":"The proforma changed since its PI copy in Order documents. Refresh the copy there, or keep it, before sending","ORDER_DOC_ATTACHMENT_NOT_FOUND":"Attachment not found","ORDER_PLAN_NOT_FOUND":"Order plan not found","ORDER_PLAN_EXISTS":"This order is already in planning","ORDER_PLAN_ORDER_NOT_FOUND":"Sales order not found for this plan","ORDER_PLAN_NOT_REVIEWER":"Only an assigned reviewer with a pending request can act on this review","ORDER_PLAN_ILLEGAL_TRANSITION":"That planning status change is not allowed","ORDER_PLAN_COMMENT_REQUIRED":"A comment is required to reject or request changes","ORDER_PLAN_PRODUCTS_UNCONFIRMED":"Confirm every product's documents before requesting approval","ORDER_PLAN_LINE_NOT_FOUND":"That purchase-plan line was not found","ORDER_PLAN_LINE_EXISTS":"That material and vendor are already in the purchase plan","ORDER_PLAN_NOT_APPROVED":"Approve the plan for production before sourcing vendors","ORDER_PLAN_VENDOR_NO_LINES":"That vendor has no lines in the purchase plan","ORDER_PLAN_VENDORS_UNAPPROVED":"Approve every vendor before handing off to Purchasing","ORDER_PLAN_PROFORMA_NOT_FOUND":"Proforma invoice (PI) not found for this plan","ORDER_PLAN_PROFORMA_NOT_PLANNABLE":"Only a confirmed PI can enter planning. Confirm the PI first.","PLANNING_CHECKLIST_INCOMPLETE":"Confirm all 11 checklist items before starting to buy materials","PLANNING_ILLEGAL_TRANSITION":"This order is already buying materials or in production","PLANNING_PI_CLOSED":"Planning is closed for this PI because the PI is closed. If work must continue, reopen the PI first; otherwise plan from a confirmed PI.","MATERIAL_PURGE_OWNER_ONLY":"Only the account owner can purge materials. Ask the account owner to run it.","MATERIAL_PURGE_CONFIRM_MISMATCH":"To delete these materials for good, type {{phrase}} exactly.","MATERIAL_PURGE_UNKNOWN_CATEGORY":"No material category matches {{category}}.","MATERIAL_RECODE_NOT_MATERIAL":"Only raw-material codes can be changed.","MATERIAL_RECODE_SYSTEM_SKU":"{{sku}} is a system-generated code and can’t be used or changed here.","MATERIAL_RECODE_INVALID_SKU":"A code must be 1–{{max}} characters with no spaces.","MATERIAL_RECODE_SAME_SKU":"The new code is the same as the current one.","MATERIAL_RECODE_NO_CATEGORY":"Set a material category before generating a code.","MATERIAL_RECODE_IN_USE":"{{sku}} is already in use, so its code can’t be changed.","MATERIAL_RECODE_SKU_TAKEN":"Code {{sku}} already exists (including deleted items).","MATERIAL_RECODE_SKU_REFERENCED":"Code {{sku}} already appears on other records (BOM designs, worksheets, e-invoices or paint formulas). Pick another code.","PRODUCT_SKU_BOM_NOT_EDITABLE":"The SKU variant can only change while the product’s BOM is a draft. Start a new version first.","PRODUCT_SKU_NOT_REGENERABLE":"SKU {{sku}} wasn’t built by the product SKU format in Settings, so its variant can’t be changed here.","PRODUCT_SKU_VARIANT_INVALID":"The variant must be 1–{{max}} letters (A–Z).","PRODUCT_SKU_VERSION_INVALID":"The version must be {{digits}} digits and not 0.","PRODUCT_SKU_TAKEN":"SKU {{sku}} already exists (including deleted items).","PRODUCT_SKU_REFERENCED":"SKU {{sku}} already appears on other records. Pick another variant or version.","PRODUCT_SKU_INVOICED":"{{sku}} is on an e-invoice, so its SKU can’t be changed.","PRODUCT_SKU_TOO_LONG":"The new SKU would be longer than {{max}} characters. Use a shorter variant.","PRODUCT_CUSTOMER_ITEM_NO_INVALID":"The customer item no. must be text of at most {{max}} characters. Shorten it in the Customer item no. field and save again.","PRODUCT_SAMPLE_RULE_OFF":"No sample letter is set in Settings › SKU Standards, so there is no sample code to promote.","PRODUCT_NOT_SAMPLE":"{{sku}} isn’t coded with the sample letter {{letter}}, so there is nothing to promote.","PRODUCT_SKU_FAMILY_OTHER_CUSTOMER":"{{sku}} belongs to another customer. A variant must be of the same customer's model.","PRODUCT_SKU_FAMILY_BASE_INVALID":"{{sku}} can't be the base model. Pick another product whose SKU was built by the product SKU format.","PRODUCT_SKU_FAMILY_ALREADY_MEMBER":"{{sku}} is already a variant of this model.","PRODUCT_VARIANT_GROUP_SELF":"{{sku}} can't be a variant of itself. Pick another base.","PRODUCT_VARIANT_GROUP_NOT_FINISHED_GOOD":"{{sku}} is not a finished good. Only finished goods can be grouped as variants.","PRODUCT_VARIANT_GROUP_HAS_VARIANTS":"{{sku}} is the base of other variants. Select its variants too, or pick it as the base.","PRODUCT_VARIANT_GROUP_BASE_IS_VARIANT":"{{sku}} is a variant of {{base_sku}}. Pick {{base_sku}} as the base, or ungroup {{sku}} first.","PRODUCT_VARIANT_SPLIT_NOT_VARIANT":"{{sku}} is not a variant, so there is nothing to split out.","PRODUCT_VARIANT_SPLIT_HAS_VARIANTS":"{{sku}} is the base of other variants. Split out or ungroup its variants first.","PRODUCT_VARIANT_SPLIT_SHARES_BOM":"{{sku}} uses its base's BOM. Choose \"Use its own BOM\" on its BOM first, then split it out.","PRODUCT_VARIANT_SPLIT_NO_FREE_NUMBER":"No free number could be found for {{sku}}. Check the product SKU sequence in Settings.","BOM_NEW_VERSION_NOT_APPROVED":"A new version can only be opened from an approved BOM — this one is {{status}}.","PRODUCT_BOM_DETAILS_NOT_EDITABLE":"Product details can only change here while the product’s BOM is a draft — this one is {{status}}. Start a new version first.","PR_APPROVER_NOT_ELIGIBLE":"That person cannot approve purchase requests — pick an approver who can.","PR_NEXT_APPROVER_REQUIRED":"Choose who signs next before approving.","PR_DEPT_UNKNOWN":"{{department}} is not a purchase request department. Reload the page and try again.","PR_DEPT_HEAD_INELIGIBLE":"The head chosen for {{department}} cannot approve purchase requests — pick someone else.","BOM_ALT_NEEDS_MATERIAL":"Line {{line}}: pick the line's material before adding an alternative.","BOM_ALT_NOT_SIBLING":"Line {{line}}: the alternative must be a different grade of the same material type and size.","BOM_ALT_MOVED_TO_FORECAST":"Line {{line}}: alternatives are now chosen in Purchasing › Forecast when ordering. Remove the new alternative from this line and save again; the buyer picks it when the PO is created.","BOM_UNLINKED_MATERIAL_INVALID":"That material is no longer in the catalogue. Search again and pick another.","MATERIAL_RENAME_STALE":"Nothing was renamed: {{sku}} was renamed to “{{current}}” since you downloaded the sheet. Download it again and redo the rename.","MATERIAL_RENAME_MATERIAL_GONE":"Nothing was renamed: material {{sku}} is archived, deleted or no longer a material. Untick its rename, or restore it on the Materials page first.","MATERIAL_RENAME_INVALID":"Nothing was renamed: a new material name is blank, or one material is listed twice. Fix the name in the sheet and upload it again.","BOM_LINE_KEY_DUPLICATE":"Line {{line}} has the same identity as another line. Reload the BOM and try again.","BOM_VARIANT_KEY_DUPLICATE":"Variant {{name}} has the same identity as another variant. Reload the BOM and try again.","BOM_PART_CODE_INVALID":"Line {{line}}: {{code}} doesn’t fit this part. A sub-assembly takes C1, C2…, its parts that C-number + CT01…, a loose part CT01….","BOM_PART_CODE_TAKEN":"Line {{line}}: {{code}} is held by another part or was used before. A part code is never reused.","BOM_PART_CODE_LOCKED":"Line {{line}}: this part code is locked — the BOM has been approved, or another BOM of the model shows the same code. Reload the BOM and try again.","BOM_EXPORT_DUPLICATE_NAMES":"Products share a name — export them separately: {{names}}","BOM_PRODUCT_IS_FINISH":"This product shares {{base_sku}}'s BOM — edit it there.","BOM_FAMILY_UNLINKED_LINES":"Link every part to a material before submitting or approving. Parts without one ({{count}}): {{grouped}}. Open Unlinked materials to link them.","BOM_PUBLISHED_FROM_DESIGN":"This BOM was published from a design BOM ({{version}}) — edit the design BOM instead.","BOM_PUBLISH_NO_UNIT":"Can't publish the approved BOM to production: add a {{unit}} unit of measure first.","BOM_PUBLISH_UNIT_MISMATCH":"Can't publish the approved BOM to production: material {{sku}} is not stocked in {{unit}}.","BOM_DESIGN_EMPTY":"Can't approve: {{names}} would publish a production BOM with no materials. Add their parts or labels first — the current production BOM stays in use.","CONSUMPTION_FORMULA_ERROR":"Line {{line}}: the consumption formula can't work out a quantity from what was entered. Check the cut size, pieces and board thickness on that line — every size must be greater than 0 — then save again.","CONSUMPTION_CHECK_BLOCKED":"Can't send this BOM on: {{count}} line(s) fail the consumption checks ({{lines}}). Open the Consumption checks panel on the BOM, fix each red item (cut size, roll width or waste factor), then try again.","BOM_DELETE_CONCURRENT":"Another change is touching these BOMs right now. Nothing was deleted from this batch; try again.","PRODUCT_BULK_DELETE_BUSY":"Another change is touching these products right now, or the check took too long. Nothing was changed in this batch; try again.","PRODUCT_BULK_DELETE_BATCH_TOO_LARGE":"This batch is too large. Only one model family (a base with its finishes) may exceed 500 products.","BULK_DELETE_PREFLIGHT_TIMEOUT":"Selection too large to check at once. Nothing was changed; select fewer rows or try again.","BOM_VARIANT_LINKED_TO_PRODUCT":"Finish {{name}} is linked to product {{sku}}, so it can't be removed here.","BOM_ATTACH_SAME_PRODUCT":"A product can't share its own BOM. Pick another product of the model.","BOM_ATTACH_OTHER_CUSTOMER":"Can't share {{sku}}'s BOM: it belongs to another customer.","BOM_ATTACH_NOT_IN_FAMILY":"Can't share {{sku}}'s BOM: it isn't in this model's SKU family. Add it to the family first.","BOM_ATTACH_BASE_NO_BOM":"Can't share {{sku}}'s BOM: it has no BOM yet. Build its BOM first.","BOM_ATTACH_BASE_IS_FINISH":"{{sku}} itself shares {{base_sku}}'s BOM. Share {{base_sku}}'s BOM instead.","BOM_ATTACH_ALREADY_FINISH":"This product already shares {{base_sku}}'s BOM. Use its own BOM first to change that.","BOM_ATTACH_HAS_FINISHES":"{{count}} finishes share this product's BOM, so it can't share another one. Give them their own BOM first.","BOM_ATTACH_NOT_EDITABLE":"{{sku}}'s BOM isn't a draft or in revision. Start a new version, then try again.","BOM_ATTACH_MISMATCH":"Can't share {{base_sku}}'s BOM: {{count}} parts differ in more than wood, grade, paint or material ({{parts}}).","BOM_NOT_A_FINISH":"This product doesn't share another product's BOM.","BOM_FAMILY_NOT_EDITABLE":"The model's BOM isn't a draft or in revision, so its finishes can't change. Start a new version first.","BOM_OVERRIDE_NOT_ALLOWED":"Line {{line}}: a finish can't change {{field}} — only wood, grade and paint.","BOM_OVERRIDE_LINE_UNKNOWN":"A line of this finish is no longer on the base BOM. Reload the BOM and try again.","BOM_PAINT_CODE_UNKNOWN":"Paint code {{code}} isn't in the paint library.","BOM_FABRIC_NOT_FOUND":"The new fabric isn't an active material in the catalogue. Pick a material from the list, or reactivate or add it under Materials first.","BOM_FABRIC_SAME":"{{material}} is already the fabric on this BOM. Pick a different fabric for the new variant.","BOM_FABRIC_NO_LINES":"No part on the saved Cushion tab uses {{material}}. Save the BOM, then reopen Add variant and pick the fabric again.","BOM_FABRIC_PICK_CURRENT":"This BOM already has cushion lines. Pick the fabric on this BOM that the new one replaces, then save the variant again.","BOM_FABRIC_NO_BOM":"This product has no saved BOM to add a fabric to. Save its BOM first, then add the variant again.","BOM_ZERO_QUANTITY_LINES":"Enter the quantity for: {{parts}} on the Cushion, Hardware or Packaging tab, then submit again.","BOM_VARIANT_SKU_OTHER_MODEL":"A variant keeps the base SKU {{base}}; only the variant code changes. {{sku}} is another model's number: change only the variant code.","BOM_VARIANT_SKU_VERSION":"A new variant starts at version 01. Use {{sku}}.","BOM_VARIANT_LETTER_TAKEN":"Variant letter {{letter}} is already used in this family (as {{held}}). Pick the next free letter: {{next_letter}}.","BOM_VARIANT_LETTER_SAMPLE":"Variant letter {{letter}} is kept for sample codes. Pick the next free letter: {{next_letter}}.","BOM_FAMILY_WORKSHEET_MISSING":"{{sku}} has no active pricing worksheet. Price every finish before marking the BOM final.","BOM_DOCUMENTS_NEED_PRODUCT":"This BOM has no product, so it has no documents. Open the BOM from its product.","BOM_DOCUMENT_FILE_IN_USE":"This file is part of BOM {{names}}, which is approved or under review, so it can't be deleted. Upload a new version instead.","BOM_DOCUMENT_REPLACE_TARGET_GONE":"The file you were replacing was removed from this document in the meantime, so nothing was uploaded. Remove it from the list and add the file again as a new file.","PRODUCT_PHOTO_TYPE_NOT_ALLOWED":"\"{{name}}\" isn't a JPG, PNG or WebP photo, so it wasn't added. Save it as one of those types and add it again.","PRODUCT_PHOTO_TOO_LARGE":"\"{{name}}\" is larger than 5 MB, so it wasn't added. Make the photo smaller (resize or compress it) and add it again.","PRODUCT_PHOTO_EMPTY":"\"{{name}}\" is empty (0 bytes), so it wasn't added. Check that the file opens on your computer, then add it again.","PRODUCT_DELETE_HAS_FINISHES":"{{count}} finishes share this product's BOM. Give them their own BOM before deleting it.","PRODUCT_DELETE_IS_FINISH":"This product shares {{base_sku}}'s BOM. Give it its own BOM first, then delete it.","PRODUCT_DELETE_IN_USE":"This material can't be deleted yet: {{reasons}}.","PRODUCT_DELETE_HAS_STOCK":"This product still has {{quantity}} on hand. Move, issue or write off the stock before deleting it.","EMPLOYEE_GROUP_IN_USE":"Employees still in this group ({{count}}): {{names}}. Move them to another group first.","PRODUCT_TYPE_IN_USE":"Products still of this type ({{count}}): {{names}}. Change their type first.","VARIANT_CHAR_IN_USE":"Products still using this variant character ({{count}}): {{names}}. Change it on them first.","VENDOR_CATEGORY_IN_USE":"Vendors still in this industry ({{count}}): {{names}}. Move them to another industry first.","SAMPLE_REQUEST_ACCEPTED":"{{number}} was already accepted, so it can't be deleted. Cancel it instead.","SAMPLE_REQUEST_IN_USE":"This sample request is used by {{names}}, so it can't be deleted. Cancel it instead.","WORKSHEET_NOT_DELETABLE":"Worksheet v{{version}} has been activated, so it can't be deleted. Start a new version from it instead.","WORKSHEET_IN_USE":"This worksheet version is used by {{names}}, so it can't be deleted.","SAMPLE_PART_NOT_ON_BOM":"That part is not on the product’s current BOM — reopen the product and pick its parts again.","SAMPLE_LINES_COMMITTED":"This request’s lines are locked — stock was reserved when it was accepted. Cancel and recreate the request to change them.","WORK_ORDER_PART_NO_RECEIPT":"Work order {{number}} makes the sample part {{part}}, not the finished product, so it takes no finished-goods receipt. Complete the work order instead.","SAMPLE_NOTHING_PENDING":"Nothing left to finish — the pending steps need a permission you don’t have, or someone already finished them.","SAMPLE_PENDING_NOT_PERMITTED":"You can’t finish these steps — reserving parts and materials needs warehouse reservation permission, and drafting the purchase request needs purchasing permission.","WO_OVER_SEND":"{{pi}} · {{sku}}: only {{remaining}} left to send, {{qty}} asked. Reload the board and try again.","WO_BATCH_LINE_NOT_FOUND":"Some PI lines no longer exist ({{count}}). Reload the board and try again.","WO_BATCH_DUPLICATE_LINE":"The same PI line is listed twice.","WO_BATCH_MIXED_PRODUCTS":"A batch can only hold one product.","WO_BATCH_BOM_VERSION_MISMATCH":"These PI lines are on different BOM versions ({{versions}}). Only lines on the same version can be produced as one batch.","WO_PI_NOT_CONFIRMED":"Only confirmed PIs can be produced: {{pis}} is not confirmed.","WO_MATERIALS_SHORT":"Materials are short for {{pis}}: still to buy, or arriving after the planned start. Clear the shortage or move the start.","WO_MATERIALS_UNCONFIRMED":"Materials are not confirmed for {{pis}} (no BOM, unlinked lines or a unit mismatch). Confirm them before sending to production.","DOC_TEMPLATE_VERSION_CONFLICT":"This template was changed by someone else (now version {{current_version}}). Reload it and try again.","DOC_TEMPLATE_VERSION_REQUIRED":"Reload the template before saving it.","DOC_TEMPLATE_DEFAULT_LOCKED":"The default template cannot be deleted.","DOC_TEMPLATE_RESET_DEFAULT_ONLY":"Only the default template can be reset. To change this template, edit it, or delete it and make a new one.","DOC_TEMPLATE_IN_USE":"This template is still in use (templates built on it: {{children}}, assignments: {{assignments}}). Move or clear them first.","DOC_TEMPLATE_TYPE_UNSUPPORTED":"Templates for this document type ({{doc_type}}) are coming soon.","DOC_TEMPLATE_INVALID":"This layout breaks the template rules, so it was not saved.","DOC_TEMPLATE_PARENT_INVALID":"That template cannot be used as the base here.","DOC_TEMPLATE_PARTY_INVALID":"That customer or vendor cannot be given this template.","DOC_TEMPLATE_INTERNAL_DEFAULT_ONLY":"Every production estimate prints the default template. Edit the default instead of adding a template.","CARD_TITLE_UNKNOWN_CARD":"This card can't be renamed.","CARD_TITLE_EMPTY":"Enter a title in at least one language, or reset the card to its default.","PO_PAY_MILESTONES_EXCEED_TOTAL":"The milestones would add up to {{sum}}, more than the PO total of {{total}}.","PO_PAY_MILESTONE_BELOW_PAID":"This milestone already has {{paid}} paid against it. Its amount cannot be lower.","PO_PAY_MILESTONE_HAS_PAYMENTS":"Payments are recorded against this milestone, so it cannot be removed.","PO_PAY_SCHEDULE_EXISTS":"This PO already has a payment schedule.","PO_PAY_PO_CANCELLED":"This PO is cancelled. Its payment schedule and signed copy can no longer change.","PO_PAY_NOT_SENT":"This PO has not been sent to the supplier yet, so it cannot be confirmed.","PAYMENT_PO_MISMATCH":"That PO or milestone does not belong to this supplier.","PAYMENT_VENDOR_INVALID":"That supplier was not found.","PAYMENT_BILL_MISMATCH":"That invoice does not belong to this supplier or PO, or is in another currency.","PAYMENT_PO_NOT_PAYABLE":"This PO is {{status}} and cannot take payments yet.","PAYMENT_EXCEEDS_MILESTONE":"Only {{remaining}} is left to pay on this milestone.","PAYMENT_REQUEST_MISMATCH":"That payment request line does not belong to this supplier, or the payment is not in the base currency.","PAYMENT_REQUEST_CLOSED":"This payment request is already closed (paid in full or cancelled).","PAYMENT_EXCEEDS_REQUEST":"Only {{remaining}} is left to pay on this request line.","VENDOR_NOTE_NOT_OWNER":"Only the person who wrote a note can delete it.","CUSTOMER_CODE_LOCKED":"The customer code {{code}} is locked: it cannot be changed after the customer is created.","CUSTOMER_CODE_TAKEN":"The customer code {{code}} is already in use, or its number was used before. Customer numbers are never reused.","CUSTOMER_CODE_FORMAT_INVALID":"The customer code {{code}} does not match the format set in Settings › SKU Standards (for example {{example}}).","CUSTOMER_ABBREV_INVALID":"The abbreviation must be exactly {{len}} letters (A–Z).","CUSTOMER_ABBREV_TAKEN":"The abbreviation {{abbrev}} is already used by customer {{code}}. Choose a different abbreviation.","CUSTOMER_INCOMPLETE":"{{customer}} is incomplete — complete it before using it on a new document. Missing: {{missing}}.","CUSTOMER_LOCKED":"{{customer}} is locked (view only), so nothing new can be created or changed for it. Locked by {{locked_by}} on {{locked_on}}: {{reason}}. Ask an admin to unlock it.","VENDOR_ADDRESS_EDIT_FORBIDDEN":"Only people who can edit vendors can change a vendor's addresses. Ask an admin for vendor edit rights.","CUSTOMER_LOCK_REASON_REQUIRED":"Enter a reason to lock this customer. Use the Lock button on the customer record — the status cannot be set to Blocked directly.","CUSTOMER_CODE_NOT_PERMITTED":"Only Sales can issue customer codes. Leave the code and abbreviation as suggested and the code is assigned automatically.","PRODUCT_CODE_NOT_PERMITTED":"Only Technical can issue or change product codes. Leave the code blank and it is assigned automatically.","PRODUCT_UNIT_INVALID":"Choose an active unit from the list.","PRODUCT_UNIT_IN_USE":"The unit can't change: this product is already used by {{uses}}. Create a new product with the right unit instead.","BOM_PAINT_IN_USE":"{{count}} part(s) still use {{codes}}. Reassign them on the Painting tab first, then remove it from the list.","QUOTE_BOM_NOT_FINAL":"{{sku}} · {{name}} can't be quoted yet — BOM status: {{status}}. A product's BOM must be Final before it can be quoted.","IDEMPOTENCY_KEY_INVALID":"The request key is too long (at most {{max}} characters). Reload the page and try again.","IDEMPOTENCY_KEY_REUSED":"This request key was already used for a different request. Reload the page and try again.","PROFORMA_NOT_DELETABLE":"Only a draft or cancelled PI can be deleted — cancel {{number}} instead.","PROFORMA_IN_USE":"{{number}} is used by {{names}}, so it can't be deleted. Cancel it instead.","PROFORMA_PRODUCTION_REQUESTED":"{{number}} has a production request in progress, so it can't be deleted. Cancel it instead.","SIGNER_USER_NOT_FOUND":"That user does not exist or is inactive.","SIGNER_USER_TAKEN":"That user is already linked to the signer {{name}}.","SIGNER_NAME_REQUIRED":"Enter the signer's name.","SIGNER_ROLE_EN_REQUIRED":"Enter the signer's title in English.","SIGNER_ROLE_VI_REQUIRED":"Enter the signer's title in Vietnamese.","SIGNER_USER_TAKEN_CONCURRENT":"That user was just linked to another signer by someone else. Reload the list and pick a different user.","SIGNER_IN_USE_BY_TEMPLATE":"This signer can't be deleted because signature templates still print it. Change the signer on these signature templates first: {{templates}} (Settings › Document Templates › Signatures).","SIGNATURE_TEMPLATE_INVALID":"The signature blocks are not valid. Check every block has both labels and a signer.","SIGNATURE_TEMPLATE_STALE":"Someone saved these signature blocks after you opened them. Reload and try again.","SIGNATURE_SUBJECT_NOT_FOUND":"Document not found.","SIGNATURE_REQUEST_NOT_FOUND":"Signature request not found.","SIGNATURE_ARTIFACT_NOT_FOUND":"Signed file not found.","SIGNATURE_REQUEST_OPEN":"This document already has an open signature request.","SIGNATURE_REQUEST_STATE":"The signature request cannot do that in its current state.","SIGNATURE_SLOT_STATE":"This signature block is not awaiting a signature.","SIGNATURE_ARTIFACT_SUPERSEDED":"This signed file has already been replaced.","SIGNATURE_NOT_ALLOWED":"You cannot sign this block.","SIGNATURE_CONTENT_CHANGED":"The document changed after it was sent for signature, so the request was voided.","SIGNATURE_REASON_REQUIRED":"Enter a reason.","SIGNATURE_ASSIGNEE_INVALID":"That signer cannot sign this block. Choose an active user of your company, or a name for the other party.","SIGNATURE_FILE_REJECTED":"This file can’t be used as a signed copy. Upload a PDF, JPG or PNG (up to 50 MB) whose contents match its type.","SIGNATURE_STORAGE_FAILED":"The file could not be stored. Try again in a moment.","SIGNATURE_DOCUMENT_CANCELLED":"This document is cancelled, so it takes no signed copy.","DOCUMENT_LINK_UNKNOWN":"This link is not valid. Check that you opened the whole link from the email, or ask the sender for a new one.","DOCUMENT_LINK_EXPIRED":"This link has expired. Ask {{company}} to send you a new link.","DOCUMENT_LINK_REVOKED":"This link was withdrawn by {{company}}. Use the newest email they sent you, or ask them for a new link.","DOCUMENT_LINK_NOT_FOUND":"This link no longer exists on the document. Refresh the activity panel and try again.","DOCUMENT_LINK_NOT_ACTIVE":"A withdrawn link cannot be extended. Copy a new link instead.","DOCUMENT_LINK_EXTEND_INVALID":"A link can stay open at most one year from when it was created (until {{max_date}}). Choose fewer days, or copy a new link.","DOCUMENT_LINK_NO_RECIPIENT":"This document has no supplier or customer to send a link to. Set the party on the document first.","PUBLIC_RATE_LIMITED":"Too many attempts in a short time. Wait a minute, then try again.","PUBLIC_WRITE_UNAVAILABLE":"We cannot accept your answer right now. Nothing was saved. Try again in a minute.","RFQ_NOT_ACCEPTING_QUOTES":"This request for quotation is no longer taking answers (status: {{state}}). Contact the buyer if you still want to quote.","RFQ_DEADLINE_PASSED":"The response deadline ({{deadline}}) has passed, so the quote can no longer be changed. Contact the buyer to ask for more time.","RFQ_QUOTE_LINE_INVALID":"One of the quoted lines is not on this request, or appears twice. Reload the page and enter each line once.","RFQ_QUOTE_NO_CURRENCY":"This request has no currency set, so a quote cannot be recorded. Ask the buyer to set the currency.","PO_RESPONSE_NOT_ALLOWED":"This purchase order cannot take that answer now (current: {{status}}). Contact the buyer if something needs to change.","PO_RESPONSE_NOTE_REQUIRED":"Please say what needs to change, or why you cannot accept this order, before sending.","PO_RESPONSE_LINE_INVALID":"A proposed change refers to a line that is not on this order. Reload the page and try again.","PO_RESPONSE_LINE_DUPLICATE":"A change is proposed twice for the same order line, or for more lines than the order has ({{max}}). Keep one change per line, then send again.","PO_RESPONSE_REVISED":"The buyer is revising this order. Wait for the updated order email, then answer from the new link.","WORKSHEET_PAINT_LINES_UNIDENTIFIED":"This worksheet's paint lines were created before paint marking. Resync all BOM lines to switch the paint mode.","FORECAST_LINE_HELD":"{{materials}} is held (do not purchase for now). Buy it again first.","RFQ_CANCELLED_NOT_SENT":"RFQ {{no}} is cancelled, so it can't be marked as sent.","RFQ_EMAIL_VENDOR_REQUIRED":"This RFQ was sent to several suppliers. Pick which supplier this email is for, then send again.","RFQ_EMAIL_VENDOR_NOT_INVITED":"This supplier was not invited to this RFQ, so the email can't be sent to them. Pick one of the invited suppliers, then send again.","FORECAST_HOLD_TOO_MANY":"That's {{count}} material × PI pairs; one change can hold at most {{max}}. Narrow it down with the PI filter.","EXPORT_DOC_PROFORMA_NOT_FOUND":"Proforma invoice not found.","EXPORT_INVOICE_NO_SHORT_CODE":"This customer has no short code, so the invoice cannot be numbered. Add a short code to the customer first.","EXPORT_INVOICE_NOT_FOUND":"Invoice not found.","EXPORT_INVOICE_RESERVED_CONFLICT":"Some of these invoice numbers are already used by invoices in the app. Enter a lower number.","EXPORT_INVOICE_SHIFT_SHIPPED":"An invoice that already shipped keeps its number. Use the next free numbers instead.","EXPORT_INVOICE_SERIES_CHANGED":"Invoice numbers of this customer changed while you were looking. Check the new plan and confirm again.","EXPORT_INVOICE_SPLIT_INVALID":"This invoice cannot be split or merged this way. Every container must go on exactly one invoice, and the invoice needs a number.","PRODUCT_SKU_VERSION_MANAGED":"The version of {{sku}} follows its BOM versions and can’t be typed.","PRODUCT_SKU_LETTER_LOCKED":"{{sku}} has been approved. For a different letter, use + Add variant.","BOM_VERSION_NEEDS_NEW_VARIANT":"{{sku}}: the paint colour, wood or fabric changed. Keep them as approved and use + Add variant instead.","BOM_VERSION_LIMIT":"{{sku}} has used its last version number ({{max}}).","BOM_VERSION_EXISTS":"Version {{version}} already exists for this product — pick another label.","BOM_VERSION_EXISTS_DELETED":"Version {{version}} is held by a BOM that was deleted, so it can't be reused. Pick another label.","BOM_VERSION_TOO_LONG":"The version label can have at most {{max}} characters. Shorten it and try again.","SKU_NEW_VERSION_RETIRED":"Versions now change automatically when the new BOM version is approved.","BOM_PRICING_NO_CUSTOMER":"{{sku}} has no customer. Pricing is per customer — set the product's customer, then add pricing.","BOM_APPROVER_NOT_ELIGIBLE":"{{name}} can't approve BOMs, so they can't be picked. Pick someone from the list. To add people, ask an admin to give them the 'Approve BOMs' right (Admin > Roles & Permissions).","BOM_APPROVE_RIGHT_REQUIRED":"You can't act on this approval step because you don't have the 'Approve BOMs' right. Ask an admin to give it to your role (Admin > Roles & Permissions), or ask the person picked for this step.","BOM_APPROVER_REQUIRED":"Submit is blocked because at least one approval step has no approver, so nobody is asked to review it. Pick who approves each step, then submit.","BOM_APPROVAL_ASSIGNED_TO_OTHER":"This step is assigned to {{name}}, so only they can approve it or send it back. To hand it to someone else, ask the person who submitted the BOM or an admin to change the approver.","BOM_APPROVER_CHANGE_FORBIDDEN":"Only the person who submitted this BOM ({{name}}) or an admin can change its approvers. Ask one of them.","BOM_APPROVER_NOT_IN_REVIEW":"Approvers can be changed only while the BOM is in review. Submit the BOM to choose its approvers.","BOM_APPROVER_STEP_DONE":"This step is already done, so its approver can't be changed.","BOM_PRICING_INCOMPLETE":"Price every part before adding pricing. Parts without a price ({{count}}): {{parts}}. Wood needs a wood price-book price; hardware, packaging, cushion and finishing need a unit cost or a linked material with a price.","ORDER_DOC_SUPERSEDED":"This document was superseded and is read only. Re-issue it once the PI is confirmed again","ORDER_DOC_REISSUE_NOT_READY":"Re-issue is available after the PI is confirmed again","ORDER_DOC_NOT_SUPERSEDED":"This document is not superseded, so there is nothing to re-issue","ORDER_DOC_SUPERSEDE_REASON_REQUIRED":"This PI has issued documents. Enter the reason shown on the superseded documents","QUOTE_PI_CURRENCY_NOT_USD":"Quotes from a PI are priced from USD worksheets, but this PI's currency is {{currency}}. Set the PI currency to USD first.","COMPANY_VAT_DEFAULT_OUT_OF_RANGE":"A VAT default of {{value}}% cannot be saved: a VAT rate must be between 0 and 100%. Enter a percentage from 0 to 100, then save again.","MODULE_NOT_ENABLED":"This part of the app is not switched on for your company. Ask your administrator to enable it.","PROFORMA_NOT_FOUND":"This proforma invoice no longer exists or was deleted. Go back to the PI list and open it again.","PROFORMA_LINE_NOT_FOUND":"That line is no longer on this PI. Refresh the PI to see its current lines, then try again.","PROFORMA_PRODUCT_NOT_FOUND":"A product on this PI no longer exists. Pick an active product for that line, then save.","PROFORMA_CUSTOMER_NOT_FOUND":"The customer of this PI no longer exists. Pick an active customer, then save.","PROFORMA_INVALID_STATUS":"This PI's status does not allow this step. Refresh to see its current status; a confirmed PI must be reopened before it can be edited.","PROFORMA_NUMBER_CONFLICT":"That PI number is already in use. Enter a different number, or leave it blank to get the next free one.","PROFORMA_LINE_NOT_PENDING":"This line has already been checked by Engineering, so it cannot be checked again. Undo its result first if it needs another look.","PROFORMA_LINE_PENDING":"This line is still waiting for Engineering, so there is nothing to undo. Check the line first.","PROFORMA_NO_PENDING_LINES":"No lines are waiting for Engineering on this PI. Every line has already been checked.","PROFORMA_LINES_PENDING":"Some lines are still waiting for Engineering. Check every line (or mark the rest as no change), then confirm the PI.","PROFORMA_NO_LINES":"This PI has no lines. Add at least one product line, then confirm.","PROFORMA_UOM_REQUIRED":"A line has no unit of measure and its product has none either. Pick a unit for that line, then save.","PROFORMA_PAYMENT_TERM_NOT_FOUND":"The selected payment term no longer exists. Pick another payment term (Settings › Payment Terms), then save.","PROFORMA_BANK_ACCOUNT_NOT_FOUND":"The selected bank account no longer exists. Pick another bank account (Settings › Payment Terms › Bank accounts), then save.","PROFORMA_INVALID_ACTION":"This action is not available for a PI. Refresh the page and use one of the buttons shown.","PROFORMA_INVALID_OUTCOME":"That review result is not valid. Choose no change or revise for the line, then save.","PROFORMA_REASON_REQUIRED":"A reason is required for this step. Type why, then try again.","PROFORMA_NO_BOM":"This product has no BOM yet, so there is no BOM version to use. Create and approve the product's BOM first.","PROFORMA_BOM_NOT_CHANGED":"The line already uses this BOM version, so nothing changed. Pick a different version to switch.","PROFORMA_INVALID_FILTER":"The PI list filter ({{filter}}) has a value the list does not know. Clear the filter and pick it again.","PROFORMA_INVALID_WOOD_ALLOWANCE":"Some wood buying allowances are not valid: each must be an existing wood species with a value from 1 to 3. Fix the marked rows, then save.","PROFORMA_SEND_REFUSED":"The customer has already answered this PI copy (accepted, signed or rejected), or a newer copy replaced it, so it can't be sent again. Reopen the PI to issue a new version, then send that one.","DOCUMENT_PDF_UNAVAILABLE":"The PDF could not be made right now (the PDF service did not answer). Try again in a minute; if it keeps failing, tell your administrator.","QUOTATION_NOT_FOUND":"This quotation no longer exists or was deleted. Go back to the quotation list and open it again.","QUOTATION_CUSTOMER_NOT_FOUND":"That customer no longer exists. Pick an active customer, then try again.","QUOTATION_INVALID_PRODUCT":"Line {{line}} has a product that is not available. Pick an active product for that line, then save.","QUOTATION_WORKSHEET_INACTIVE":"The pricing worksheet is not active for this customer and product. Activate the worksheet (or pick another one), then add the line.","QUOTATION_UNPRICED_LINES":"These quote lines have no price yet: {{names}}. A quote line takes the approved price of the customer’s pricing worksheet, and an active version can’t be edited. Open Sales › Pricing Worksheets → the worksheet → Versions → “New version from this”, set “Approved price / unit”, click “Submit for approval”, and the approver clicks “Approve & activate”. Then remove line {{names}} from the quote and add the product again — an existing line keeps its stored 0 price.","QUOTATION_INVALID_CUSTOMER":"The selected customer cannot be used. Pick an active customer, then save.","QUOTATION_INVALID_CURRENCY":"The selected currency is not set up. Pick a currency from Settings › Currencies, then save.","QUOTATION_LINE_NOT_IN_QUOTATION":"One of the lines you sent is not part of this quotation, so it cannot be changed here. Refresh the quotation and edit its own lines.","QUOTATION_PRODUCT_REQUIRED":"New line {{line}} has no product. Pick a product for it, then save.","QUOTATION_NOT_EDITABLE":"This quotation can no longer be edited in its current status. Create a revision to change it.","QUOTATION_INVALID_STATUS":"This step needs the quotation to be {{allowed}}, but it is {{status}}. Refresh to see its current status and use the actions shown.","QUOTATION_NO_LINES":"This quotation has no lines. Add at least one product line, then try again.","QUOTATION_CHANGE_NOTE_REQUIRED":"Say what the customer wants changed. Type a note, then request the revision.","QUOTATION_REVISION_LIMIT":"This quotation has used every revision letter (A to Z). Create a new quotation instead.","QUOTATION_NOT_REJECTABLE":"Only a quotation still being quoted can be marked lost. This one has moved on; refresh to see its status.","QUOTATION_INVALID_LOST_REASON":"That lost reason is not recognised. Choose one of the reasons in the list, then save.","QUOTATION_ALREADY_CONVERTED":"This quotation already has a sales order. Open that order instead of converting again.","QUOTATION_NOT_CONVERTIBLE":"Only a sent, accepted or confirmed quotation can become an order. Send the quotation (or get it accepted) first.","QUOTATION_INVALID_WAREHOUSE":"The selected warehouse cannot be used. Pick an active warehouse, then convert again.","QUOTATION_PROFORMA_NOT_FOUND":"That proforma invoice no longer exists. Go back to the PI list and pick another PI.","QUOTATION_PI_NOT_DRAFT":"Only a draft PI can be quoted. This PI is already confirmed or closed; reopen it first if it needs a new quote.","QUOTATION_PI_HAS_QUOTE":"This PI already has quotation {{number}}. Open that quotation instead of creating another.","QUOTATION_PI_NO_LINES":"This PI has no lines, so there is nothing to quote. Add product lines to the PI first.","QUOTATION_PI_LINES_NOT_READY":"Some PI lines have no active pricing worksheet ({{skus}}). Activate a worksheet for each of them, then quote the PI.","QUOTATION_NO_CUSTOMER":"This quotation has no customer. Pick the customer on the quotation, then try again.","DELIVERY_NOTE_NOT_FOUND":"This delivery note no longer exists or was deleted. Go back to the delivery list and open it again.","DELIVERY_NOTE_SOURCE_REQUIRED":"A delivery note needs the order it ships. Pick a sales order or a confirmed PI, then create it.","DELIVERY_NOTE_SOURCE_AMBIGUOUS":"A delivery note ships one order: pick either a sales order or a PI, not both.","DELIVERY_NOTE_SO_NOT_FOUND":"That sales order no longer exists. Pick another order, then create the delivery note.","DELIVERY_NOTE_SO_NOT_SHIPPABLE":"Only confirmed sales orders can ship, and this order is {{status}}. {{next}}","DELIVERY_NOTE_PI_NOT_FOUND":"That proforma invoice no longer exists. Pick another PI, then create the delivery note.","DELIVERY_NOTE_PI_NOT_CONFIRMED":"Only confirmed proforma invoices can ship, and this one is {{status}}. {{next}}","DELIVERY_NOTE_ASSIGNEE_NOT_FOUND":"The person picked to handle this delivery no longer exists. Pick another person, then save.","DELIVERY_NOTE_SO_LINE_REQUIRED":"Line {{line}} does not say which order line it ships. Pick the sales order line for it, then save.","DELIVERY_NOTE_SO_LINE_NOT_FOUND":"One of the order lines is not on this sales order any more. Refresh the order and pick its current lines.","DELIVERY_NOTE_QTY_EXCEEDS_REMAINING":"Line {{line}} ships {{quantity}}, but only {{remaining}} is left to ship on that order line. Lower the quantity to {{remaining}} or less.","DELIVERY_NOTE_SO_LINE_NOT_ALLOWED":"Line {{line}} points at a sales order line, but this delivery note ships a PI. Remove the order line from it.","DELIVERY_NOTE_NOT_DRAFT":"Only a draft delivery note can be changed or deleted. This one has moved on; refresh to see its status.","DELIVERY_NOTE_INVALID_STATUS":"This delivery note is {{status}}, so this step is not available. Refresh to see its status and use the next step shown.","DELIVERY_NOTE_EMPTY":"This delivery note has no lines. Add the lines to ship, then try again.","DELIVERY_NOTE_INSUFFICIENT_STOCK":"Not enough stock of {{sku}} at {{bin}}: {{available}} available, {{required}} needed. Receive or move stock there, or lower the quantity, then confirm.","DELIVERY_NOTE_SHORT_SELLABLE":"Line {{line}} ({{sku}}) is short {{short}} of sellable stock (stock on hold or in quarantine does not count). Release or receive stock, or lower the quantity, then pick again.","DELIVERY_NOTE_NOT_PICKED":"Line {{line}} ({{sku}}) has not been picked yet, so it cannot ship. Pick the delivery note first.","DELIVERY_NOTE_BIN_SHORT":"Bin {{bin}} no longer holds enough {{sku}} for line {{line}}. Pick the delivery note again so it takes stock from another bin.","DELIVERY_NOTE_PI_LINE_NOT_ALLOWED":"Line {{line}} names a proforma line, but this delivery note ships from a sales order. Remove the proforma line and pick the sales order line instead.","DELIVERY_NOTE_PI_LINE_NOT_ON_PI":"Line {{line}} points to a proforma line that is not on this proforma invoice. Refresh the invoice and pick one of its current lines.","DELIVERY_NOTE_PI_LINE_PRODUCT_MISMATCH":"Line {{line}} has a different product than the proforma line it points to. Use the same product as the proforma line.","DELIVERY_NOTE_PI_LINE_UOM_MISMATCH":"Line {{line}} has a different unit than the proforma line it points to. Use the same unit as the proforma line.","DELIVERY_NOTE_PI_ANCHOR_QUANTITY":"Line {{line}} must ship a quantity greater than 0. Enter a positive quantity.","DELIVERY_NOTE_PI_ANCHOR_NO_LINE":"Line {{line}}: the proforma invoice has no line for this product. Pick a product that is on the proforma invoice.","DELIVERY_NOTE_PI_ANCHOR_SEVERAL":"Line {{line}}: the proforma invoice has several lines for this product. Choose which proforma line this delivery line ships.","DELIVERY_NOTE_PI_ANCHOR_EXCEEDS":"Line {{line}} ships more than is left on its proforma line ({{remaining}} left). Lower the quantity to {{remaining}} or less.","DELIVERY_NOTE_PI_OVER_SHIPPED":"This shipment would ship more than a proforma line ordered. Lower the shipped quantities so no line goes over its ordered quantity.","WORKFLOW_ILLEGAL_TRANSITION":"You can't {{verb}} this at {{stage}}. Refresh to see where it stands, then use one of the steps the screen offers.","WORKFLOW_MISSING_PERMISSION":"This step (at {{stage}}) needs the \"{{permission}}\" permission, which your role does not have. Ask an administrator to grant it, or ask a colleague who has it.","WORKFLOW_REASON_REQUIRED":"To {{verb}} at {{stage}} you must say why. Type a reason, then try again.","WORKFLOW_STALE":"Someone else changed this while you had it open. Refresh to see the latest version, then do the step again.","WORKFLOW_IDEMPOTENCY_KEY_REUSED":"This request was already sent once with different details. Refresh the page, then do it again.","WORKFLOW_REQUEST_IN_FLIGHT":"The same request is still being processed. Wait a moment, then refresh to see the result.","WORKFLOW_REPLAY_MISSING":"The earlier result of this request could not be shown again. Refresh the page and check whether it went through before trying again.","PRODUCT_ORDER_WORKFLOW_MISSING":"Product orders cannot start because no approval workflow is active. Ask an administrator to activate the product order workflow.","PRODUCT_ORDER_CLOSED":"This product order is closed, so its details can no longer change.","PRODUCT_ORDER_NO_STAGE":"This product order has no workflow step, so it cannot move. Ask an administrator to check the product order workflow.","PRODUCT_ORDER_NOT_FOUND":"This product order no longer exists. Go back to the list and open it again.","PR_NOT_CURRENT_APPROVER":"You are not the current approver of this purchase request. Only the person it is assigned to (or someone allowed to act on their behalf) can decide.","PR_NOT_FOUND":"This purchase request no longer exists. Go back to the list and open it again.","PR_INVALID_PRODUCT":"Line {{line}} has a material that is not available. Pick an active material for it, then save.","PR_LINE_PRODUCT_INVALID":"This line has a material that is not available. Pick an active material, then save.","PR_UOM_REQUIRED":"Line {{line}} has no material code, so it needs a unit of measure. Pick a unit, then save.","PR_MANUAL_LINE_UOM_REQUIRED":"A manual line (no material code) needs a unit of measure. Pick a unit, then save.","PR_NOT_DRAFT":"This purchase request is {{status}}, so it can no longer be edited. Only a draft can change; reject it back to draft first if it needs a fix.","PR_REFERENCE_LOCKED":"This purchase request was raised for a PI or product from Material requirements, so its link cannot be changed: planners count it for that PI. Cancel it and raise a new one if it is for something else.","PR_LINE_NOT_FOUND":"That line is no longer on this purchase request. Refresh to see its current lines.","PR_ATTACHMENT_TOO_LARGE":"The file is larger than {{max_mb}} MB. Attach a smaller file (or a compressed copy).","PR_ATTACHMENT_EMPTY":"The file is empty. Pick the file again and attach it.","PR_ATTACHMENT_REJECTED":"This file cannot be attached (its type or name is not allowed). Attach a PDF, image or office document instead.","PR_ATTACHMENT_STORAGE_FAILED":"The file could not be saved right now. Try again in a minute; if it keeps failing, tell your administrator.","PR_ATTACHMENT_NOT_FOUND":"That attachment no longer exists. Refresh the purchase request to see its files.","PR_NO_LINES":"This purchase request has no lines. Add at least one line, then submit.","PR_APPROVER_REQUIRED":"Pick who should approve this purchase request, then submit.","PR_INVALID_APPROVER":"The approver you picked cannot approve purchase requests (inactive or without the approve permission). Pick another approver.","PR_SUBMIT_REFUSED":"This purchase request could not be submitted as it is. Check its lines and approver, then submit again.","PR_NOT_PENDING":"This purchase request is {{status}}, not waiting for approval, so there is nothing to decide. Refresh to see where it stands.","PR_NOT_APPROVED":"This purchase request is {{status}}; only an approved request can become a purchase order. Get it approved first.","PR_LINES_IN_RFQ":"Lines of this purchase request are out for quotation on {{rfqs}}. Award or cancel that RFQ first, then convert.","PR_LINES_ORDERED":"Lines of this purchase request are already ordered on {{pos}}. Open that purchase order instead of converting again.","PR_MANUAL_LINES_UNRESOLVED":"Some lines are manual (no material code). Pick a catalog material for each of them, then convert to a purchase order.","PR_INVALID_VENDOR":"The selected supplier cannot be used. Pick an active supplier, then convert.","PR_WAREHOUSE_REQUIRED":"Pick the warehouse the goods go to, then convert.","PR_MERGE_PO_INVALID":"The purchase order to add these lines to no longer exists. Pick another one or create a new order.","PR_MERGE_PO_NOT_DRAFT":"Lines can only be added to a draft purchase order. Pick a draft order or create a new one.","PR_MERGE_PO_OTHER_VENDOR":"That purchase order is for another supplier. Pick an order of the same supplier or create a new one.","PR_MERGE_PO_CURRENCY":"That purchase order's currency differs from the supplier's. Pick another order or create a new one.","PR_ALREADY_CONVERTED":"This purchase request is already a purchase order, so it cannot be cancelled. Cancel the purchase order instead.","RFQ_NOT_FOUND":"This RFQ no longer exists. Go back to the list and open it again.","RFQ_LINE_NOT_FOUND":"That line is no longer on this RFQ. Refresh to see its current lines.","RFQ_LINE_NOT_IN_RFQ":"One of the quote lines is not part of this RFQ. Refresh the RFQ and enter quotes for its own lines.","RFQ_NOT_DRAFT":"This RFQ is {{state}}, so it can no longer be edited (only a draft can). Next: {{next}}.","RFQ_NOT_AWAITING_QUOTES":"This RFQ is {{state}}, not waiting for quotes, so quotes cannot be recorded. Next: {{next}}.","RFQ_NOT_COMPARING":"This RFQ is {{state}}; a supplier can only be awarded once the quotes are being compared. Next: {{next}}.","RFQ_ALREADY_CLOSED":"This RFQ is already {{state}} and closed. Create a new RFQ if more quotes are needed.","RFQ_PR_LINE_NOT_FOUND":"A purchase request line on this RFQ no longer exists. Refresh and pick the lines again.","RFQ_PR_NOT_APPROVED":"Purchase request {{number}} is not approved, so its lines cannot go out for quotation. Get it approved first.","RFQ_LINE_NO_MATERIAL":"{{line}} has no catalog material yet. Pick a material for it on the purchase request first.","RFQ_LINE_UNIT_MISMATCH":"The unit must be the same as on {{line}}. Change the unit back, then save.","RFQ_LINE_MATERIAL_MISMATCH":"The material must be the one on {{line}} or an alternate grade of it. Pick that material or an approved alternate.","RFQ_LINE_QTY_EXCEEDS_OPEN":"{{line}}: {{qty}} is more than the {{open}} still open on that request line. Lower the quantity to {{open}} or less.","PRODUCTION_REQUEST_INVALID_STATUS":"This production request is {{status}}, so this step is not available. Next: {{next}}.","PRODUCTION_REQUEST_DOCUMENTS_INCOMPLETE":"Documents still missing: {{missing}}. Attach all four documents, then submit for review.","PRODUCTION_REQUEST_NO_LINES":"This PI has no lines, so there is nothing to plan. Add product lines to the PI first.","PRODUCTION_REQUEST_NO_ACTIVE_BOM":"Product {{sku}} has no active BOM, so its materials cannot be planned. Approve the product's BOM first, then approve the request.","PRODUCTION_REQUEST_EMPTY_FILE":"The file is empty. Pick the file again and upload it.","PRODUCTION_REQUEST_FILE_REJECTED":"This file cannot be uploaded (its type or name is not allowed). Upload a PDF, image or office document instead.","EXPORT_DOC_INVALID_DATE":"The {{field}} date is not a valid date. Pick it from the calendar (YYYY-MM-DD), then save.","EXPORT_DOC_INVALID_FIELD":"The {{field}} details could not be read. Refresh the page and enter them again.","EXPORT_DOC_PARTIAL_SHIPMENT_REQUIRED":"Partial shipment cannot be empty. Choose Allowed or Not allowed, then save.","EXPORT_DOC_INVALID_CONTRACT_PARTY":"The contract can only be signed with the buyer or the consignee. Pick one of them, then save.","EXPORT_DOC_INVALID_DOC_STATUS":"That document status is not valid. Pick not started, in progress or issued.","EXPORT_INVOICE_RESERVED_INVALID":"Reserved numbers must be 0 or more. Enter the last number already used outside the app (0 if none).","GRN_QC_INVALID_RESULT":"\"{{result}}\" is not a quality result. Choose passed, failed or partial.","GRN_NO_QUARANTINED_STOCK":"No quarantined stock was found for this line, so there is nothing to release. Refresh the receipt; it may already have been handled.","GRN_QC_ACCEPTED_QTY_EXCEEDS":"You accepted {{accepted}} but only {{received}} was received on this line. Lower the accepted quantity to {{received}} or less.","GRN_QC_ACCEPTED_QTY_INVALID":"The accepted quantity must be more than 0. If nothing passed, record the result as failed instead.","GRN_QC_ACCEPTED_QTY_REQUIRED":"A partial result needs the accepted quantity. Enter how many passed, then save.","GRN_QC_LOCATION_REQUIRED":"Choose the bin the accepted stock goes to before recording this quality result.","GRN_LINE_NOT_ON_QC_HOLD":"This line is not waiting for a quality check (it is already {{result}}). Refresh the receipt to see its current state.","GRN_LINE_NOT_FOUND":"This receipt line no longer exists. Refresh the receipt to see its current lines.","GRN_NOT_FOUND":"This goods receipt no longer exists. Go back to the list and open it again.","GRN_CANCEL_NOT_DRAFT":"This receipt is {{status}}, so it cannot be cancelled. Only a draft receipt can be cancelled; to undo a posted one, raise a return instead.","GRN_SPLIT_UNDER":"The bin split allocates only {{allocated}} of the {{accepted}} accepted on this line. Allocate the full {{accepted}} across the bins.","GRN_SPLIT_OVER":"The bin split allocates {{allocated}} but only {{accepted}} was accepted on this line. Lower the split quantities to add up to {{accepted}}.","GRN_SPLIT_BAD_LOCATION":"A bin split uses a bin outside this receipt's warehouse. Pick bins in the receiving warehouse, then post again.","GRN_SPLIT_UNKNOWN_LINE":"A bin split points at a line that is not on this receipt. Remove that split, then post again.","GRN_NO_QUARANTINE_LOCATION":"{{sku}} needs a quality check on receipt, but this warehouse has no quarantine bin. Ask an administrator to add a quarantine bin, then post again.","GRN_PIN_INVALID":"That PIN was not accepted (wrong, not set, or locked after too many tries). Check the user ID and PIN, or wait and try again.","GRN_PIN_REQUIRED":"Posting this receipt needs a second person's PIN. Enter their user ID and PIN, then post again.","GRN_POST_NO_LINES":"This receipt has no lines, so there is nothing to post. Add the lines you received, then post.","GRN_POST_NOT_DRAFT":"This receipt is already {{status}}, so it cannot be posted again. Refresh to see its status.","GRN_INVALID_DISC_KEY":"That is not a valid choice for this field. Pick one of the options in the list.","GRN_NOT_DRAFT":"This receipt is {{status}}, so it can no longer be changed. Only a draft receipt can be edited; refresh to see its status.","GRN_QTY_EXCEEDS_PENDING":"You entered {{received}} but only {{pending}} is still to be received on this purchase order line. Lower the quantity to {{pending}} or less.","GRN_LINE_VENDOR_MISMATCH":"That purchase order line belongs to a different vendor than this receipt. Add lines from the receipt's vendor only, or start a new receipt.","GRN_PO_LINE_NOT_FOUND":"A purchase order line on this receipt no longer exists. Reload the purchase order and pick its lines again.","GRN_INVALID_LOCATION":"The receiving bin is not available. Pick an active bin in the receiving warehouse, then save.","GRN_VENDOR_MISMATCH":"The vendor chosen is not the vendor on the purchase order. Use the PO's vendor, or clear the field.","GRN_PO_MISMATCH":"The purchase order chosen does not match any line on this receipt. Pick the PO the lines belong to, or clear the field.","GRN_PO_NOT_RECEIVABLE":"PO {{po}} is {{status}}, so goods cannot be received against it. Only sent, approved or partly received purchase orders can be received; send or approve the PO first.","GRN_MIXED_VENDORS":"One receipt can only cover purchase orders from the same vendor. Create a separate receipt for each vendor.","GRN_DUPLICATE_PO_LINE":"The same purchase order line appears twice on this receipt. Keep one line for it and put the total quantity there.","GRN_MIXED_LINES":"One receipt cannot mix lines from a purchase order with lines without one. Put them on separate receipts.","GRN_PRODUCT_NOT_FOUND":"A line has a material that is not available. Pick an active material for it, then save.","GRN_MANUAL_LINE_INCOMPLETE":"Every line of a receipt without a purchase order needs a material and a unit of measure. Fill them in on each line, then save.","GRN_VENDOR_NOT_FOUND":"That vendor is not available. Pick an active vendor, then save.","PALLET_SLIP_GRN_NOT_POSTED":"Pallet slips exist only once the receipt is posted. Post the receipt first, then print its pallet slips.","PALLET_SLIP_LOCATION_NOT_FOUND":"That storage location is not available. Pick a location from the list, then create the slips.","PALLET_SLIP_NOT_FOUND":"This pallet slip no longer exists. Close the slip list and open the receipt again.","PALLET_SLIP_WO_NOT_FOUND":"This work order no longer exists. Go back to the work order list and open it again.","PALLET_SLIP_WO_OPERATION_MISMATCH":"That output step is not part of work order {{wo_number}}. Pick a step of this work order, then create the slips.","GRN_MANUAL_VENDOR_REQUIRED":"A receipt without a purchase order needs a vendor. Pick the vendor, then save.","GRN_MANUAL_HAS_PO":"A receipt without a purchase order cannot name one. Clear the purchase order, or receive against it from the PO.","PO_CANCEL_HAS_RECEIPTS":"This purchase order is {{status}}: goods were already received against it, so it cannot be cancelled. Return the goods to the vendor if they came back.","PO_NOT_FOUND":"This purchase order no longer exists. Go back to the list and open it again.","PO_SEND_NOT_APPROVED":"This purchase order is {{status}}, so it cannot be sent to the vendor. Only an approved order can be sent; get it approved first.","PO_REJECT_NOT_PENDING":"This purchase order is {{status}}, so it cannot be rejected. Only an order waiting for approval can be rejected.","PO_APPROVE_NOT_PENDING":"This purchase order is {{status}}, so it cannot be approved. Only an order waiting for approval can; submit it first.","PO_NO_LINES":"This purchase order has no lines. Add at least one line, then submit it.","PO_SUBMIT_NOT_DRAFT":"This purchase order is {{status}}, so it cannot be submitted. Only a draft can be submitted for approval.","PO_LINE_NOT_FOUND":"This purchase order line no longer exists. Refresh the order to see its current lines.","PO_NOT_DRAFT":"This purchase order is {{status}}, so it can no longer be changed. Only a draft can be edited; refresh to see where it stands.","PO_LINE_RECEIVED":"Goods have already been received on this line, so its material cannot change. Add a new line for the other material instead.","PO_INVALID_PRODUCT_LINE":"The material on this line is not available. Pick an active material, then save.","PO_INVALID_PRODUCT":"Line {{line}} has a material that is not available. Pick an active material for it, then save.","PO_OBSOLETE_REVISION_BLOCKED":"These materials are on an obsolete revision: {{sku}}. Replace them with the current material, or have someone with override permission order them with a reason.","PO_OBSOLETE_REASON_REQUIRED":"To order an obsolete material you must say why. Type the override reason, then save.","PO_OBSOLETE_OVERRIDE_FORBIDDEN":"Ordering a material whose revision is obsolete needs the \"{{permission}}\" permission, which your role does not have. Swap the line to a current material, or ask an administrator.","PO_INVALID_CURRENCY":"That currency is not available. Pick an active currency, then save.","PO_INVALID_WAREHOUSE":"That warehouse is not available. Pick an active warehouse, then save.","PO_INVALID_VENDOR":"That vendor is not available. Pick an active vendor, then save.","PO_INVALID_PR_LINE":"A purchase request line on this order is not available. Reload the purchase request and pick its lines again.","SO_LINES_NOT_QUOTE_READY":"Not every line can be quoted yet (lines still pending: {{lines}}). Finish the product orders and activate their pricing worksheets, then compose the quote.","SO_QUOTE_EXISTS":"This order already has quotation {{quote}}. Open that quotation instead of composing another.","SO_WORKFLOW_MISSING":"Product orders cannot start because no product order workflow is active. Ask an administrator to activate it.","STOCK_ADJUST_APPROVER_NOT_FOUND":"The approving manager you picked is no longer a user here. Pick another approver, or leave the field empty.","STOCK_ADJUST_NO_CHANGE":"The new quantity is the same as the current quantity, so there is nothing to adjust. Enter a different quantity.","STOCK_INSUFFICIENT_ON_HAND":"This would take the stock at this location below zero. Enter a quantity of 0 or more, or check the stock on hand at this location.","STOCK_NONE_AT_LOCATION":"There is no stock of this product at this location to take out. Pick the location that holds the stock, or receive it first.","SO_LINE_ALREADY_LINKED":"This line already has a product order. Open that product order instead of creating another.","SO_LINE_NOT_FOUND":"This sales order line no longer exists. Refresh the order to see its current lines.","SO_NOT_FOUND":"This sales order no longer exists. Go back to the list and open it again.","SO_AMEND_NOT_ALLOWED":"Sales order {{so}} is {{status}}, so it cannot be amended. Only confirmed, processing or shipped orders can; a draft can simply be edited.","SO_CLOSE_NOT_DELIVERED":"Sales order {{so}} is {{status}}, so it cannot be closed. Only delivered or invoiced orders can be closed; finish delivery first.","SO_INVOICE_NOT_SHIPPED":"Sales order {{so}} is {{status}}, so it cannot be marked invoiced. Only shipped or delivered orders can; ship it first.","SO_LOST_REASON_INVALID":"That lost reason is not recognised. Choose one of the reasons in the list.","SO_CANCEL_TOO_LATE":"Sales order {{so}} is {{status}}, so it can no longer be cancelled. Goods have left or the order is billed; raise a return or credit note instead.","SO_INSUFFICIENT_STOCK":"Not enough stock of {{product}}: {{available}} available, {{required}} needed. Receive stock, or lower the quantity, then confirm.","SO_CONFIRM_NOT_APPROVED":"Sales order {{so}} is {{status}}, so it cannot be confirmed. Only an approved order can be confirmed; get it approved first.","SO_APPROVE_NOT_PENDING":"Sales order {{so}} is {{status}}, so it cannot be approved. Only an order waiting for approval can be; submit it first.","SO_CREDIT_LIMIT_EXCEEDED":"This order ({{total}}) would take {{customer}} over the credit limit: balance {{balance}}, limit {{limit}}. Lower the order, or ask finance to raise the limit or record a payment.","SO_CUSTOMER_BLOCKED":"{{customer}} is blocked, so new orders cannot be submitted. Ask finance to unblock the customer, then submit again.","SO_NO_LINES":"This sales order has no lines. Add at least one product line, then submit it.","SO_SUBMIT_NOT_DRAFT":"Sales order {{so}} is {{status}}, so it cannot be submitted. Only a draft can be submitted for approval.","SO_NOT_DRAFT":"Sales order {{so}} is {{status}}, so it can no longer be changed. Only a draft can be edited; use Amend for a confirmed order.","SO_INVALID_UOM_LINE":"The unit of measure on this line is not available. Pick an active unit, then save.","SO_INVALID_PRODUCT_LINE":"The product on this line is not available. Pick an active product, then save.","SO_INVALID_UOM":"Line {{line}} has a unit of measure that is not available. Pick an active unit, then save.","SO_INVALID_PRODUCT":"Line {{line}} has a material that is not available. Pick an active product for it, then save.","SO_NUMBER_TAKEN":"Sales order number {{so}} is already used. Enter a different number, or leave it blank to get the next free one.","SO_INVALID_CURRENCY":"That currency is not available. Pick an active currency, then save.","SO_INVALID_WAREHOUSE":"That warehouse is not available. Pick an active warehouse, then save.","SO_INVALID_CUSTOMER":"That customer is not available. Pick an active customer, then save.","WH_PUTAWAY_SUGGEST_NOT_FOUND":"The product or warehouse for this suggestion was not found. Check both are active, then try again.","WH_NO_PUTAWAY_RULE":"No putaway rule matches this product in this warehouse. Add a putaway rule for it, or choose the bin by hand.","WH_PUTAWAY_RULE_NOT_FOUND":"This putaway rule no longer exists. Refresh the rule list.","WH_PUTAWAY_RULE_EXISTS":"An active putaway rule already sends this product to this bin. Edit that rule, or deactivate it first.","WH_LOCATION_NOT_FOUND":"This bin no longer exists. Refresh the zone to see its current bins.","WH_ZONE_NOT_FOUND":"This zone no longer exists. Refresh the warehouse to see its current zones.","WH_LOCATION_BARCODE_TAKEN":"Barcode {{barcode}} already belongs to another bin. Scan or type a different barcode.","WH_NOT_FOUND":"This warehouse no longer exists. Go back to the warehouse list and open it again.","WH_ZONE_CODE_TAKEN":"Zone code {{code}} is already used in this warehouse. Pick a different code.","WH_CODE_TAKEN":"Warehouse code {{code}} is already used. Pick a different code.","WMS_TRANSFER_NOT_FOUND":"This transfer no longer exists. Go back to the transfers list.","WMS_MOVEMENT_NOT_FOUND":"This stock movement no longer exists. Go back to the movements list.","WMS_OVERAGE_NOT_FOUND":"This overage approval no longer exists. Refresh the overage queue.","WMS_CYCLE_LINE_NOT_FOUND":"This count line no longer exists. Refresh the cycle count to see its lines.","WMS_CYCLE_SESSION_NOT_FOUND":"This cycle count no longer exists. Go back to the cycle count list.","WMS_INVALID_STATUS":"\"{{status}}\" is not a status you can filter by. Clear the filter or pick one from the list.","WMS_PICK_LINE_NOT_FOUND":"This pick line no longer exists. Refresh the pick list to see its current lines.","WMS_PICK_LIST_NOT_FOUND":"This pick list no longer exists. Refresh the pick list page.","WMS_PUTAWAY_TASK_NOT_FOUND":"This putaway task no longer exists. Refresh the putaway list.","WMS_SHORTFALL_MANAGER_REQUIRED":"Recording a shortfall needs a manager to sign it off. Pick the approving manager, then complete again.","PRICE_AGREEMENT_NOT_FOUND":"This price agreement line no longer exists. Refresh the list to see the current lines.","PRICE_AGREEMENT_OVERLAP":"This line overlaps the existing line for the same supplier, material, unit, currency and minimum quantity ({{other_min}}; 0 means no minimum) valid {{other_from}} → {{other_to}} at {{other_price}} {{currency}}. End that line the day before this one starts, start this line after it ends, or give this line a different minimum quantity.","PRICE_AGREEMENT_INVALID_WINDOW":"\"Valid to\" ({{valid_to}}) is before \"Valid from\" ({{valid_from}}). Pick a \"Valid to\" on or after the start date, or leave it empty for an open-ended line.","PRICE_AGREEMENT_REFERENCE_INVALID":"The {{field}} you picked does not exist or was deleted. Pick another {{field}} from the list.","PRICE_AGREEMENT_IMPORT_INVALID":"{{count}} rows of the file have errors, so nothing was imported. Fix the rows listed in the preview, then upload the file again.","PRICE_AGREEMENT_IMPORT_FILE_INVALID":"This file could not be read as a price agreement workbook. Download the export, fill in its columns, and upload it as .xlsx.","PURCHASE_PRICES_HIDDEN":"Purchase prices are hidden for your role, so you cannot enter or change them. Ask an admin for the View purchase prices right.","WMS_USER_NOT_FOUND":"That person is not an active user, so the task cannot be assigned to them. Pick an active user.","WMS_STATE_STALE":"Someone else changed this while you had it open. Refresh to see the latest version, then do it again.","WMS_PUTAWAY_BATCH_EMPTY":"There is nothing to complete: no putaway task was selected. Select at least one task, then try again.","WMS_OVERAGE_NO_STAGE":"This overage approval is not in the approval workflow, so it cannot be decided. Ask an administrator to check the overage workflow.","WMS_UOM_REQUIRED":"This putaway task has no unit of measure. Set the unit on the material, then complete it again.","WMS_PUTAWAY_SPLIT_EXCEEDS":"The bins you split this putaway across add up to more than the quantity to put away. Lower the split quantities to match, then complete.","WMS_PUTAWAY_INVALID_TRANSITION":"This putaway task is {{status}}, so it cannot be completed. Refresh the list; only open tasks can be completed.","WMS_PUTAWAY_NO_SOURCE":"This putaway task has no source bin, so there is nothing to move from. Ask a supervisor to check the receipt that created it.","WMS_PUTAWAY_SHORTFALL_EXCEEDS":"The shortfall is larger than the quantity to put away. Lower the shortfall, then complete.","WMS_PUTAWAY_ALLOCATION_INVALID":"Every bin allocation must be more than 0. Remove or fix the empty allocation, then complete.","WMS_PUTAWAY_SHORTFALL_INVALID":"The shortfall quantity must be more than 0. Enter how many are missing, or remove the shortfall.","WMS_PUTAWAY_ALLOC_MISMATCH":"The bin allocations plus the shortfall must add up to the quantity to put away. Adjust them so nothing is left over, then complete.","WMS_PICK_SUB_BIN_NEEDS_PRODUCT":"A substitute bin was chosen without a substitute material. Pick the substitute material too, or clear the bin.","WMS_PICK_LINE_NO_BIN":"This pick line has no bin to take stock from. Choose a bin for it, then confirm.","WMS_PICK_INSUFFICIENT_STOCK":"Not enough available stock to pick. Receive or release stock, or lower the quantity, then try again.","WMS_PICK_INVALID_TRANSITION":"This pick line is {{status}}, so it cannot be confirmed again. Refresh the pick list to see what is left to pick.","WMS_PICK_ALT_QTY_REQUIRED":"Enter the quantity picked from the substitute material, then confirm.","WMS_PICK_ALT_QTY_EXCEEDS":"The substitute quantity is more than the line asks for. Lower it to the requested quantity or less.","WMS_PICK_ALT_SAME_PRODUCT":"The substitute is the same material as the line. Pick a different alternate, or confirm without a substitute.","WMS_PICK_NOT_AN_ALTERNATE":"That material is not an approved alternate for this line. Pick one from the alternates list.","WMS_PICK_ALT_UOM_MISMATCH":"That alternate is held in a different unit, and units are not converted. Pick an alternate held in the line's unit.","WMS_PICK_ALT_INSUFFICIENT":"Not enough stock of that alternate. Pick another alternate or lot, or lower the quantity.","WMS_CYCLE_INVALID_TRANSITION":"This cycle count is {{status}}, so it cannot be started. Only a planned count can be started; refresh to see its status.","EXPORT_EXTRA_LINE_QTY_LEFT":"Only {{left}} left to send for this sample. Lower the quantity.","EXPORT_CONTAINER_HAS_EXTRA_LINES":"This container still holds {{count}} extra line(s). Move or delete them first.","EXPORT_DOC_ALLOWANCE_REQUIRED":"The carton allowance cannot be empty. Enter the millimetres to add per carton side, from 0 to 50 (0 = no allowance).","EXPORT_HOLDBACK_LINE_UNKNOWN":"Line {{line}} is not on this document set, so its reason cannot be saved. Refresh the set and set the reasons again.","EXPORT_UNDELIVERED_NONE_PICKED":"No line is selected. Tick the undelivered stock lines first.","EXPORT_UNDELIVERED_NOT_FOUND":"A selected undelivered stock line no longer exists. Refresh the list and select again.","EXPORT_UNDELIVERED_NOT_OWED":"{{line}} is no longer owed (it is {{status}}), so it cannot be used here. Refresh the list and select only lines still owed.","EXPORT_UNDELIVERED_MIXED_CUSTOMERS":"The selected lines belong to more than one customer. A statement and a PI are for one customer: filter by customer, then select.","EXPORT_UNDELIVERED_NOT_CONFIRMED":"{{count}} selected line(s) are not confirmed by the customer yet. Send the statement and mark it confirmed, then create the PI.","EXPORT_UNDELIVERED_NO_PRODUCT":"{{line}} has no product, so it cannot go on a PI. Put it on a PI by hand in Proformas.","EXPORT_UNDELIVERED_NO_CUSTOMER":"The selected lines have no customer, so no PI can be made for them. Check the customer of the original PI.","EXPORT_UNDELIVERED_MIXED_CURRENCIES":"These lines are in {{currencies}}, but a new PI has only one currency, so it can't be created. Select lines of one currency, or make one PI per currency (“?” = no currency recorded on the original PI).","EXPORT_UNDELIVERED_PRODUCT_GONE":"A product on the selected lines was deleted, so no PI can be made from them. Restore the product in Products, or put those pieces on a PI by hand in Proformas.","FORECAST_QUOTE_UNAVAILABLE":"The supplier quote for {{materials}} can no longer be used: it was removed, rejected or is not in this company. Reload the Award step to pick a current price, then create the POs again.","FORECAST_QUOTE_MISMATCH":"The supplier quote picked for {{materials}} is from another vendor or for another material. Reload the Award step and pick the card again, then create the POs.","FORECAST_ALT_REASON_REQUIRED":"An alternative grade for {{materials}} has no reason. The reason is kept on the PO line for the internal record. Open Alternative on the line, pick availability, cost or other, then try again.","FORECAST_ALT_NOT_SIBLING":"{{materials}} cannot replace the BOM material: an alternative must be another grade of the same material type and size. Open Alternative on the line and pick a grade from the list.","FORECAST_ALT_NO_UNIT_CONVERSION":"{{materials}} cannot be ordered as an alternative: its unit does not convert into the BOM material's unit, so the quantity cannot be worked out. Add a conversion between the two units in Units of measure, or pick a grade in the same unit.","FORECAST_AWARD_ALREADY_ORDERED":"{{materials}} was ordered by another planner after you opened the plan. Only {{qty}} {{unit}} is still to buy — reload the plan and award that. Nothing was created.","MATERIAL_REQUIREMENTS_NO_SUPPLIER":"No preferred supplier is set for {{materials}}, so no purchase order can be created for them. Mark a preferred supplier on the material in Supply Partners, or use Create Purchase Request instead.","MATERIAL_REQUIREMENTS_LINE_COVERED":"{{materials}}: this line is already covered by stock or open purchase requests/orders. Reload to see what is left.","DAY_CLOSE_LOCKED":"This day is closed. Ask a production manager to change it; they must give a reason.","DAY_CLOSE_CONFLICT":"{{name}} saved this row after you started typing, so your figures were not saved. Check the saved figures, then choose Save mine or Use saved figures.","DAY_CLOSE_OVERRIDE_REASON_REQUIRED":"To change a closed day, give a reason. It is saved with your change.","DAY_CLOSE_REASON_REQUIRED":"Add a reason for the waiting or cancelled pieces, then save again.","DAY_CLOSE_QTY_OUT_OF_RANGE":"Quantities must be whole pieces from 0 to {{max}}. Correct the number and save again.","DAY_CLOSE_FUTURE_DAY":"This day has not happened yet. Enter the day close on the day itself or later.","DAY_CLOSE_UNKNOWN_STAGE":"This stage ({{stage}}) is not on the production line. Refresh the page and try again.","DAY_CLOSE_PI_NOT_FOUND":"This PI was not found. It may have been deleted; refresh the page.","MACHINE_CODE_EXISTS":"Machine code {{code}} is already used by another machine. Type a different code, or leave the code blank to get the next one for the machine type.","MACHINE_TYPE_CODE_EXISTS":"Machine type {{code}} is already in the list. Edit that type instead of adding it again.","MATERIAL_GROUP_MOVE_NOT_TOP_LEVEL":"Material group {{code}} can't be moved: it is only possible for a top-level group, and this one sits inside another group. Open the top-level group and move that one instead.","MATERIAL_GROUP_IN_USE":"Material group {{code}} can't be moved: {{count}} product(s), storage bins, putaway rules or stock alerts still use it or one of its types. Move or clear those first, then try again.","MACHINE_TYPE_IN_USE":"Machine type {{code}} can't be deleted or recoded: {{count}} machine(s) use it and their codes carry it. Switch the type off instead, or move those machines to another type first.","MACHINE_TYPE_NOT_FOUND":"That machine type no longer exists. Reload the page and pick a type from the list.","MACHINE_TYPE_INACTIVE":"Machine type {{code}} is switched off, so new machines can't use it. Switch it on in Machines › Machine types, or pick another type.","MACHINE_TYPE_REQUIRED":"The machine code is made from the machine type. Pick a machine type, or type the machine code yourself.","MACHINE_WORK_CENTRE_NOT_FOUND":"That work centre no longer exists. Reload the page and pick a work centre, or create it in Settings › Work Centre List.","MACHINE_SUPPLIER_NOT_FOUND":"That supplier is no longer in the vendor list. Pick another vendor, or type the supplier's name instead.","MACHINE_NAME_REQUIRED":"A machine needs a name. Fill in the Vietnamese or the English name.","MACHINE_QUANTITY_INVALID":"Quantity must be more than 0, because it is the count held in the pool. Enter a number above 0, or leave it blank.","MACHINE_QUANTITY_NOT_POOLED":"Quantity can't be saved: machine type {{type}} keeps one record per machine, so a quantity has no meaning there. Clear the quantity, or set the machine type to \"Pooled (counted by quantity)\" in Machines › Machine types.","MACHINE_UOM_NOT_FOUND":"That unit no longer exists. Reload the page and pick a unit from the list, or add it in Settings › Material Options › Units.","MACHINE_IN_USE":"Machine {{code}} can't be deleted: it is planned on, or was used on, {{count}} production step(s) of work orders {{orders}}. Set its status to Retired instead, so its history and plans stay.","MACHINE_IMPORT_HAS_ERRORS":"Nothing was imported: {{count}} row(s) of the file have errors. Fix them in the file, then upload it again.","MACHINE_REQUIRED_TO_START":"This step can't start yet: work centre {{work_centre}} has machines, so the machine the step runs on must be recorded. Pick the machine, then press Start.","MACHINE_NOT_ACTIVE":"Machine {{code}} can't be used: its status is {{status}}. Pick another machine of this work centre, or ask the machine owner to set it back to Active in Manufacturing › Machines.","MACHINE_NOT_AT_WORK_CENTRE":"Machine {{code}} belongs to another work centre, not {{work_centre}}. Pick one of the machines of work centre {{work_centre}}.","MACHINE_TYPE_USED_BY_DELETED":"Machine type {{code}} can't be deleted: {{count}} deleted machine(s) still carry codes of this type. Switch the type off instead (Machines › Machine types › Status).","MACHINE_CODE_FORMAT_EXHAUSTED":"No free machine code could be made for machine type {{type}}: the codes the format makes are all taken. Check the machine code format in Settings › SKU Standards › 06 · Machine (for example give the number more digits), or type the machine code yourself.","PROFORMA_SENT_TO_ENGINEERING":"This PI is with Engineering, so it can't be edited. Ask Engineering (or use Back to sales) to return it to Sales, then edit it.","PROFORMA_NOT_SENT_TO_ENGINEERING":"Sales has not sent this PI to technical yet, so Engineering can't review or confirm it. Ask Sales to price every line and click Send to technical.","PROFORMA_ALREADY_SENT_TO_ENGINEERING":"This PI is already with Engineering. Refresh the page to see where it is now.","PROFORMA_UNPRICED_LINES":"These lines have no price yet: {{names}}. A PI line takes the approved price of the customer's pricing worksheet, and an active version can't be edited. Open Sales › Pricing Worksheets → the worksheet → Versions → “New version from this”, set “Approved price / unit”, click “Submit for approval”, and the approver clicks “Approve & activate”. Then use “Pull price from worksheet” on the PI and send it to technical again.","PROFORMA_REPRICE_NOT_DRAFT":"Only a draft PI can pull prices from the pricing worksheet — a confirmed, closed or cancelled PI keeps its prices. Reopen the PI first if its prices must change.","PROFORMA_COLOUR_REFRESH_NOT_DRAFT":"Only a draft PI can refresh its colours from the BOM — a confirmed, closed or cancelled PI keeps the colours it was issued with. Reopen the PI first if its colours must change, or edit the colour on the line.","PROFORMA_SPLIT_QTY_MISMATCH":"Line {{line}}: {{qty1}} + {{qty2}} = {{sum}} but the quantity is {{quantity}}. The two split parts (shipment / container 1 and 2) must add up to the line's quantity. Change the split so it adds up to {{quantity}}, or clear both parts.","PROFORMA_SPLIT_QTY_TOO_SMALL":"Line {{line}}: split part {{part}} is too small. A split quantity must be at least {{min}} because smaller amounts round to zero and would be lost. Enter {{min}} or more, or clear both split parts.","WOOD_FAMILY_UNKNOWN":"The wood price book was not saved: column “{{column}}” is linked to wood family {{family}}, and no active material type belongs to that family, so the column would never price any wood. Open the column’s Wood type list and pick a family or type from it, or clear the link, then save again.","SELLING_PRICES_HIDDEN":"Selling prices are hidden for your role, so you can't open, print or send anything that shows them. Ask a sales manager for the “View selling prices” right.","WORKSHEET_NOT_EDITABLE":"This worksheet version is approved or no longer active, so its cost lines and prices can't change. To change prices, open Versions and use “New version from this”, then edit the new draft.","WORKSHEET_PRICING_REQUIRED":"Your role can't see worksheet pricing, so you can't change cost lines or prices. Ask your administrator to give your role the “View BOM pricing” permission.","WORK_CENTRE_NOT_FOUND":"This station or operation no longer exists — someone may have removed it. Reload the page to see the current list.","WORK_CENTRE_NAME_REQUIRED":"Both names are needed: enter the English and the Vietnamese name, then save again.","WORK_CENTRE_NAME_DUPLICATE":"“{{name}}” is already used by another item here. Pick a different name so the two can be told apart.","WORK_CENTRE_RATE_INVALID":"Setup and run minutes cannot be negative. Enter 0 or more.","WORK_CENTRE_SAR_ASSEMBLY_ONLY":"Post-assembly shaping can only be set on the Assembly station. Untick it, or add the operation to Assembly.","WORK_CENTRE_NO_STEPS_STATION":"This station has no operations — its time is entered per part on each BOM. Add the operation to another station.","WORK_CENTRE_CUMULATIVE_IN_USE":"How this station is counted cannot change because BOMs already use it ({{boms}}) — their times would change. Add a new station instead.","WORK_CENTRE_STATION_ARCHIVED":"This station is archived. Restore the station first, then its operations.","WORK_CENTRE_ARCHIVED":"“{{name}}” is archived, so it cannot be added to a routing. BOMs that already use it keep it. Restore it in Settings › Work Centres to use it again.","WORK_CENTRE_REORDER_STALE":"The list changed since you opened it, so the new order was not saved. Reload the page and try again.","STOCK_COUNT_POSTED_LOCKED":"Posted counts already changed stock. To correct, create a stock adjustment.","STOCK_COUNT_CANCELLED":"This count is cancelled, so it can't be changed or posted. Create a new count if you still need one.","STOCK_COUNT_DELETE_NOT_ALLOWED":"Only draft or cancelled counts can be deleted. Cancel the count first.","STOCK_COUNT_EDIT_NOT_ALLOWED":"Only draft counts can be edited — counting has already started. Cancel it and create a new count if the details are wrong.","STOCK_COUNT_CANCEL_REASON_REQUIRED":"Enter a reason to cancel this count.","STOCK_COUNT_NUMBER_TAKEN":"This count number is already used (also by deleted counts). Use a new number.","BTP_PI_NOT_AVAILABLE":"Pallet {{code}} can't be used: it is {{lot_status}}, no longer in semi-finished stock. Pick another pallet, or refresh to see what is left.","BTP_PI_OVER_AVAILABLE":"Only {{available}} left on pallet {{code}}. Other PIs, work orders or reservations hold the rest. Lower the quantity to {{available}} or pick another pallet.","BTP_PI_UNUSABLE":"Pallet {{code}} was marked unusable at receive, so it can't replace purchasing. Pick another pallet.","BTP_PI_REINSPECT_OVERDUE":"Pallet {{code}} is past its re-inspection date ({{date}}), so it can't be reused yet. Ask QC to re-inspect it, then try again.","BTP_PI_NOT_ON_PI":"Part {{part}} is not on this PI's BOMs, so it can't reduce its purchase. Pick a part this PI uses.","BTP_PI_CLOSED":"PI {{pi}} is {{pi_status}}, so semi-finished stock can't be held for it. Reopen the PI, or pick an open PI.","BTP_PI_HELD_FOR_PI":"Pallet {{code}} is held for PI {{pi}}. Undo that hold on Material requirements first, or use the free {{free}}.","BTP_PI_CHANGED":"Someone changed this pallet while you worked. Your numbers were refreshed — check and confirm again.","BTP_PI_OVER_NEED":"PI {{pi}} needs only {{need}} more of {{part}}. Semi-finished stock beyond what the PI needs can't lower its purchase — lower the quantity to {{need}}.","BTP_PI_NOT_HELD":"Pallet {{code}} is no longer held for PI {{pi}}. Refresh to see what the PI holds.","SIGNER_DOC_TYPE_NOT_ALLOWED":"{{name}} does not sign {{doc_type}}. Pick another signer, or ask an admin to add {{doc_type}} to their documents in Admin › Company settings › Signers.","SIGNER_DOC_TYPE_INVALID":"“{{value}}” is not a document a signer can sign. Reload the page and pick from the list.","SIGNER_DOC_TYPES_EMPTY":"A signer must sign at least one document. Tick the documents they sign, or tick All documents.","SIGNER_DOC_TYPE_IN_USE_BY_TEMPLATE":"These documents can't be removed because their signature templates still print this signer: {{templates}}. Change the signer on those templates first (Settings › Document Templates › Signatures)."},"auth":{"serverUnreachable":"Can't reach the server. Retrying…","signInAgain":"Sign in again","login":"Sign In","brandHeadline":"Vietnam Manufacturing Cloud ERP","brandTagline":"Built for factories. Designed for people.","register":"Register","logout":"Log out","email":"Email","password":"Password","confirmPassword":"Confirm Password","forgotPassword":"Forgot Password?","rememberMe":"Remember me","signInTitle":"Sign in","registerTitle":"Create your account","orContinueWith":"or continue with","signInWithKeenerpId":"Sign in with KeenERP ID","acceptInvite":{"title":"Set your password","subtitle":"You've been invited to {{tenant}} on KeenERP. Create a password to finish setting up your account.","password":"New password","confirm":"Confirm password","submit":"Set password & continue","showPassword":"Show password","pwRequirements":"At least 8 characters, including an uppercase letter, a lowercase letter, a number, and a symbol.","working":"Setting up…","mismatch":"Passwords do not match.","tooShort":"Password must be at least 8 characters.","invalidLink":"This invitation link is invalid or expired. Ask an admin to resend it.","genericError":"Something went wrong. Please try again.","missingParams":"This invitation link is incomplete. Ask an admin to resend it."},"usePasswordInstead":"Sign in with password instead","orSignInWithPassword":"or sign in with password","oidcError":"Sign-in with KeenERP ID failed. Please try again.","continueWithGoogle":"Continue with Google","noAccount":"Don't have an account?","haveAccount":"Already have an account?","registerNow":"Register now","signInNow":"Sign in now","invalidCredentials":"Invalid email or password","accountDeactivated":"Your account has been deactivated. Please contact your administrator.","noTenant":"No organization found for this account.","tenantSuspended":"Your organization's account has been suspended.","networkError":"Unable to connect to the server. Please check your internet connection.","loginFailed":"Login failed","emailRequired":"Email is required","passwordRequired":"Password is required","resetPasswordTitle":"Reset your password","resetPasswordDescription":"Enter your email address and we'll send you a link to reset your password.","sendResetLink":"Send reset link","sending":"Sending...","checkEmail":"Check your email","resetEmailSentTo":"We've sent a password reset link to","backToLogin":"Back to login","error":"An error occurred. Please try again.","changePassword":"Change Your Password","securityRequirement":"For security, you must set a new password before continuing.","newPassword":"New Password","passwordRequirements":"Minimum 8 characters","setNewPassword":"Set New Password","toUseAnotherAccount":"to use a different account","passwordsDoNotMatch":"Passwords do not match","passwordTooShort":"Password must be at least 8 characters","provisioned":"Accounts are provisioned by your company administrator.","resetPassword":{"invalidLink":"Invalid or Expired Link","invalidLinkDesc":"This password reset link is invalid or has expired.","requestNewLink":"Request a New Link","success":"Password Reset!","successMessage":"Your password has been reset successfully. Redirecting to login...","description":"Create a new password for your account","newPassword":"New Password","confirmPassword":"Confirm Password","placeholder":"Minimum 8 characters","resetting":"Resetting...","submit":"Reset Password"},"verifyEmail":{"error":"An error occurred. Please try again.","failed":"Verification failed","goToLogin":"Go to login","invalidToken":"Invalid verification link. No token found.","redirecting":"Redirecting to login page...","success":"Email verified!","verifying":"Verifying email...","verifyingDesc":"Please wait while we verify your email address"},"oauthCallback":{"loginFailed":"Login Failed","tryAgain":"Try Again","completing":"Completing sign in...","loading":"Loading...","accessDenied":"Access denied","invalidState":"Invalid state parameter","noCode":"No authorization code received","failed":"OAuth callback failed","incomplete":"Failed to complete login"},"signInSubtitle":"Welcome back.","emailLabel":"Email","passwordLabel":"Password","showPassword":"Show password","hidePassword":"Hide password","signInButton":"Sign in","google":"Continue with Google","forgotTitle":"Reset your password","forgotSubtitle":"Enter your email. We'll send a reset link.","checkEmailTitle":"Check your email","checkEmailSubtitle":"If an account matches, a reset link is on its way.","resetTitle":"Set a new password","newPasswordLabel":"New password","confirmPasswordLabel":"Confirm new password","saveNewPassword":"Save new password","changeTitle":"Change your password","currentPassword":"Current password","verifyTitle":"Verify your email","verifySubtitle":"Click the link in the email we sent you.","resendVerification":"Resend verification email","workspacePickerTitle":"Pick a workspace","workspacePickerSubtitle":"You're a member of more than one workspace.","lastActive":"Last active","pinTitle":"Enter your 4-digit PIN","pinPickName":"Pick a different name","pinSearch":"Search name or ID…","pinWelcome":"Welcome, {{name}}.","pinClear":"Clear","pinOK":"OK","pinShift":"Shift","pinKeypad":{"pinEntry":"PIN entry"},"loginErrors":{"invalid_credentials":"Invalid email or password","account_inactive":"This account is not active. Contact your administrator.","account_locked":"Too many attempts. Try again later or reset your password.","rate_limited":"Too many attempts. Please wait a moment.","google_cancelled":"Google sign-in was cancelled.","google_failed":"Couldn't sign in with Google. Try again or use your password.","reset_link_invalid":"This reset link is invalid or has expired. Request a new one.","server_error":"Something went wrong. Please try again."},"invalidEmail":"Enter a valid email address","signingIn":"Signing in..."},"woodUsage":{"breadcrumb":"Executive · Wood","pageTitle":"Wood Usage & Inventory","pageSubtitle":"Wood issued to production by month, quarter and year, grouped by the main species VHT runs. Click a group to see the detail by thickness and grade.","empty":{"title":"No wood issued yet","body":"No wood issued yet — figures appear after the first stock issue."},"export":"⤓ Export","loading":"Loading wood usage…","ytd":"(YTD)","total":"Total","accessDenied":{"title":"No access","body":"You don't have permission to view wood usage."},"error":{"title":"Couldn't load wood usage","body":"Something went wrong loading the report.","retry":"Retry"},"modes":{"week":"Week","month":"Month","quarter":"Quarter","year":"Year"},"modeWord":{"week":"week","month":"month","quarter":"quarter","year":"year"},"week":{"label":"W{{week}} · {{range}}","short":"W{{week}}","rangeSameMonth":"{{d1}}–{{d2}} {{month1}}","rangeCrossMonth":"{{d1}} {{month1}}–{{d2}} {{month2}}"},"periodLabel":"Period","unitLabel":"Unit","unitVolume":"m³ (volume)","unitValue":"₫m (value)","unitVolumeShort":"m³","unitValueShort":"₫m","kpi":{"totalUsed":"Total wood used · {{period}}","mostUsed":"Most-used group","groupsTypes":"Groups / wood types","estValue":"Estimated value · {{period}}","groupsSuffix":"groups","typesSuffix":"{{count}} detail types (thickness × grade)","ofTotal":"{{pct}}% of total","ofTotalValue":"{{value}} {{unit}} · {{pct}}% of total","vsPrev":"{{pct}}% vs previous","firstPeriod":"— first period","avgPrice":"at average group unit price"},"chart":{"overTime":"Wood used over time","overTimeSub":"· {{unit}} by {{mode}} · dashed line = selected period","share":"Share by group"},"section":{"groups":"Main wood groups — {{period}}"},"card":{"types":"{{count}} types","clickDetail":"→ Click for detail by type"},"detail":{"meta":"· {{code}} · {{basis}} · {{period}} · {{count}} types · total {{total}}","noBasis":"wood grade","close":"✕ Close","lam":"lam","total":"TOTAL {{name}}","colSku":"Material SKU","colSpec":"Spec (thickness)","colGrade":"Grade / treatment","colUsage":"Usage ({{unit}})","colShare":"Share","colLevel":"Usage level"},"months":{"jan":"Jan","feb":"Feb","mar":"Mar","apr":"Apr","may":"May","jun":"Jun","jul":"Jul","aug":"Aug","sep":"Sep","oct":"Oct","nov":"Nov","dec":"Dec"},"view":{"ariaLabel":"Report view","usage":"Usage","requirements":"Requirements"},"req":{"subtitle":"Monthly wood and raw material needs from confirmed PIs, exploded through each product's BOM.","rule":"Need month = PI ETD minus {{days}} days of production lead time.","warnings":"{{count}} data warnings (draft BOM, missing BOM or unlinked PI lines) may understate these needs.","loading":"Loading requirements","empty":{"title":"No confirmed PIs with BOM demand","body":"Requirements appear once a confirmed PI has products with a BOM."},"error":{"title":"Couldn't load requirements","body":"The PI demand data didn't load. Try again.","retry":"Retry"},"kpi":{"totalWood":"Total wood required","monthsSpan":"Across {{count}} months","peakMonth":"Peak month","topSpecies":"Most required species","ofTotal":"{{pct}}% of all wood","materials":"Materials required","piCount":"From {{count}} PIs"},"wood":{"title":"Wood required by species","sub":"m³ per need month","share":"Share of total wood","none":"No wood measured in m³ on these BOMs.","colSpecies":"Species"},"noDate":"No date","totalCol":"Total ({{unit}})","board":"Board / plywood","otherWood":"Other wood","mat":{"title":"Raw materials by month","sub":"Every BOM material in its own unit, grouped by section","colSku":"SKU","colName":"Material","colUom":"Unit","all":"All","items_one":"{{count}} item","items_other":"{{count}} items"},"cat":{"wood":"Wood","hardware":"Hardware","cushion":"Cushion","packaging":"Packaging","finishing":"Painting","other":"Other"},"unnamedSpecies":"{{code}} (species not named)","buy":{"title":"Purchasing list","sub":"material × rough size × month · rough m³ × buying allowance","empty":"No wood to buy for the PIs in scope.","colMaterial":"Material","colRoughSize":"Rough size","colMonth":"Month","colRough":"Rough {{unit}}","colBlanks":"Blanks","colAllowance":"Allowance","colBuy":"Buy {{unit}}","colStock":"In stock","fromVolume":"Estimated from the volume: a BOM line has no sheet nesting","blankUnit":{"pieces":"pcs","panels":"panels","sheets":"sheets"},"incomplete":"Some rows have no m³ (their BOM line is not in a volume unit): the totals are a lower bound."}},"xlsx":{"busy":"Exporting…","done":"Wood usage report exported","failed":"Couldn't export the report","retry":"Nothing was downloaded. Try again in a moment.","view":"View","sheetSummary":"Summary","sheetDetail":"Detail","sheetReqWood":"Wood by species","sheetReqMaterials":"Raw materials","colSpecies":"Wood group","colCode":"Code","colTypes":"Types","colVsPrev":"vs previous period","colMeaning":"Grade meaning","colShareOfSpecies":"Share of group","colUnitPrice":"Unit price ({{unit}}/m³)","colGroup":"Section"}},"navigation":{"logistics-shipments":"Logistics","dashboard":"Dashboard","sales":"Sales","purchasing":"Purchasing","products":"Products","inventory":"Inventory","finance":"Finance","manufacturing":"Manufacturing","reports":"Reports","accounting":"Accounting","hr":"HR","team":"Team","billing":"Billing","roles":"Roles","settings":"Settings","employees":"Employees","attendance":"Attendance","leave":"Leave","payroll":"Payroll","operate":"Operate","people":"People","orders":"Orders","deals":"Pipeline","customers":"Customers","quotations":"Quotations","worksheets":"Pricing Worksheets","price-adjustments":"Price Adjustments","purchase-orders":"Purchase Orders","vendors":"Vendors","purchase-requests":"Requests","product-list":"Product List","product-bom":"Product BOM","paint-formulas":"Paint Formulas","categories":"Categories","settings-categories":"Categories","settings-sku-standards":"SKU Standards","settings-locations":"Locations","settings-forms":"Forms","settings-formulas":"Formulas","settings-payment-terms":"Payment Terms","settings-numbering":"Document numbering","settings-doc-templates":"Document Templates","settings-purchasing-approvals":"Purchasing approvals","settings-production":"Production","settings-currencies":"Currencies","settings-shopfloor-tablets":"Shop-floor tablets","settings-materials-library":"Materials Library","settings-company":"Company","masterData":"Master data","rulesAndFormulas":"Rules & formulas","organization":"Organization","admin":"Admin","materials":"Materials","stock-levels":"Stock Levels","warehouses":"Warehouses","warehouse-workspace":"Warehouse Workspace","adjustments":"Adjustments","lots":"Lots","movements":"Movements","reservations":"Reservations","production-orders":"Production Orders","bom":"BOM Library (Catalog)","shifts":"Shifts","recruitment":"Recruitment","onboarding":"Onboarding","hr-reports":"Reports","hr-settings":"Settings","overtime":"Overtime","product-orders":"Product Orders","clock":"Clock In/Out","leave-request":"Leave Request","profile":"My Profile","tasks":"My Tasks","delegations":"Delegations","logistics":"Logistics","logistics-tracking":"Tracking","logistics-new-booking":"New Booking","planning":"Planning Board","quality":"QA / QC","rfqs":"RFQs","forecast":"Purchase Forecast","supplier-rating":"Supplier Rating","goods-receipts":"Goods Receipts","inbound-notices":"Incoming schedule","work":"Work","account":"Account","myWork":"My work","sell":"Sell","catalog":"Catalog","myShift":"My shift","production":"Production","scheduling":"Scheduling","stock":"Stock","overview":"Overview","operations":"Operations","contacts":"Contacts","sfm":"Shop floor","team-admin":"Team","logistics-providers":"Providers","putaway":"Putaway","pick-lists":"Pick Lists","cycle-counts":"Cycle Count","overages":"Overages","return-inbox":"Return Inbox","stock-ledger":"Stock Ledger","material-feedback":"Material Feedback","supplier-claims":"Supplier Claims","material-returns":"Material Returns","btp-stock":"Semi-finished stock","btp-capture":"Semi-finished capture","btp-reuse":"Semi-finished reuse","pick-tickets":"Pick Lists","qc-label-station":"Pallet Labels & QR","proformas":"Proformas (PI)","sample-requests":"Sample Requests","settings-inventory-alerts":"Inventory Alerts","administration":"Administration","admin-users":"Users","admin-roles":"Roles & Permissions","admin-approval-rights":"Approval rights","admin-company":"Company Settings","admin-email":"Email Provider","admin-audit":"Audit Log","material-requirements":"Material Requirements","material-coverage":"Material Coverage","demand-forecast":"Demand Forecast","order-materials":"Order Materials","purchase-contracts":"Purchase Contracts","price-agreements":"Price agreements","production-requests":"Production Requests (PI)","order-flow":"How ordering works","supplier-payables":"Supplier Payables","supply-partners":"Supply Partners","settings-material-options":"Material Options","engineering-bom":"Engineering BOM & Routing","settings-work-centres":"Work Centres","sales-order-docs":"Order documents","sales-planning":"Planning","purchasing-forecast":"Forecast","finance-home":"Finance Home","finance-po-payments":"PO Payments & Deposits","finance-cash-flow":"Cash Flow & Payables","executive-dashboard":"Executive Dashboard","executive":"Executive","settings-work-centre-list":"Work Centre List","sales-undelivered-stock":"Undelivered stock","machines":"Machines"},"dashboard":{"title":"Dashboard","welcome":"Welcome back","overview":"Overview","recentActivity":"Recent Activity","quickActions":"Quick Actions","monthlyRevenue":"Monthly Revenue","newOrders":"New Orders","productsInStock":"Products in Stock","activeCustomers":"Active Customers","topSellingProducts":"Top Selling Products","lowStockAlerts":"Low Stock Alerts","completed":"Completed","low":"Low","left":"left","revenueChart":"Revenue Chart","productsChart":"Products Chart","sampleData":"Sample data","sampleDataHint":"Illustrative — reporting for this card is on the roadmap","noAccess":"You don’t have access to this card.","loading":"Loading…","systemRoles":{"accountOwner":"Account Owner","admin":"System Administrator","owner":"Factory Owner","production_manager":"Production Manager","operator":"Shop Floor Worker","accountant":"Accountant","warehouse":"Warehouse Supervisor","purchasing_manager":"Purchasing Manager","qc_inspector":"Quality Control Inspector","sales":"Sales Representative","sample_workshop":"Sample Workshop","maintenance_tech":"Maintenance Technician","hr_manager":"HR Manager","employee":"Employee"},"defaultRole":"Member","viewingAs":"Viewing as","customize":"Customize","done":"Done","addWidget":"Add widget","reset":"Reset","emptyList":"Nothing to show yet","timeframe":{"week":"This week","month":"This month","quarter":"This quarter"},"vsPrev":{"week":"vs last week","month":"vs last month","quarter":"vs last quarter"},"greeting":{"morning":"Good morning, {{name}}","afternoon":"Good afternoon, {{name}}","evening":"Good evening, {{name}}"},"chips":{"approvalsWaiting":"approvals waiting","lowStockItems":"low-stock items","pricingAlerts":"pricing alerts","deliveriesInbound":"deliveries inbound"},"edit":{"dragHint":"Drag to reorder","resizeHint":"Resize","removeHint":"Remove"},"drawer":{"title":"Add widgets","sub":"Toggle what appears on your dashboard","close":"Close","on":"On your dashboard","off":"Hidden"},"toast":{"removed":"Removed · {{name}}","reset":"Layout reset to {{role}} default","approved":"Approved · {{title}}"},"time":{"justNow":"just now","minutesAgo":"{{n}}m ago","hoursAgo":"{{n}}h ago","yesterday":"Yesterday","daysAgo":"{{n}} days ago"},"widgetNames":{"kpi_revenue":"Revenue","kpi_quotes":"Open quotes & win rate","kpi_orders":"Orders in progress","kpi_inventory":"Inventory value","w_approvals":"Approvals inbox","w_trend":"Revenue & margin trend","w_pipeline":"Production pipeline","w_lowstock":"Low-stock & reorder","w_drift":"Cost-drift & pricing alerts","w_deliveries":"Incoming deliveries","w_shipments":"Outbound shipments","w_rtv":"Returns to vendor","w_quotes":"Recent quotes","w_activity":"Team activity","w_payables":"Payables snapshot","w_cash":"Cash & receivables"},"kpiRevenue":{"label":"Revenue","unconverted_one":"{{count}} invoice not converted","unconverted_other":"{{count}} invoices not converted","empty":"No invoiced PIs in this period yet. Sales appear here once an invoice is issued against a confirmed PI."},"kpiQuotes":{"label":"Open quotes","winRate":"Win rate {{pct}}%","winRateNone":"No closed quotes yet"},"kpiOrders":{"label":"In production","acrossStages":"PIs across {{n}} stages"},"kpiInventory":{"label":"Inventory value","lowBadge":"{{count}} low","acrossWarehouses":"Across {{warehouses}} warehouses · {{skus}} SKUs"},"approvals":{"title":"Approvals waiting","sub":"{{count}} items need your decision","review":"Review","approve":"Approve","more":"+ {{count}} more","empty":"All caught up — nothing waiting","reasonTitle":"Approve with a note","reasonLabel":"Reason"},"trend":{"weekPrefix":"W","title":"Revenue & margin","sub":"Bars = revenue (K) · line = gross margin %","action":"Reports","legendRevenue":"Revenue","legendMargin":"Gross margin","empty":"No sales in these periods yet. The trend appears here once a PI is confirmed and invoiced."},"pipeline":{"title":"Production pipeline","sub":"{{count}} active orders"},"pipelineStage":{"draft":"Draft","released":"Released","in_progress":"In production","completed":"Completed"},"lowstock":{"title":"Low-stock alerts","sub":"{{count}} below reorder point","action":"Alerts","createPr":"Create PR","empty":"All stock above reorder points"},"drift":{"empty":"No pricing drift right now. An alert appears here when a customer’s unit price on a newer confirmed PI falls below the earlier price.","margin":"Margin {{from}} → {{to}}","price":"Unit price {{from}} → {{to}}","openPi":"Open PI","title":"Pricing alerts","sub":"{{count}} quotes drifting or expired","action":"Review"},"deliveries":{"title":"Incoming deliveries","sub":"{{count}} POs inbound","action":"Purchasing","eta":"ETA {{date}} · {{value}}","etaNoValue":"ETA {{date}}","empty":"No inbound purchase orders"},"rtv":{"title":"Returns to vendor","sub":"{{open}} open · {{total}} total","action":"Warehouse","empty":"No returns to vendor"},"shipments":{"title":"Outbound shipments","sub":"{{transit}} in transit · {{booking}} booking","subDelayed":" · {{delayed}} delayed","action":"Logistics","statInTransit":"In transit","statBooking":"Booking","statDelivered":"Delivered","statDelayed":"Delayed","delayedSuffix":" · delayed","etaShort":"ETA {{date}}","empty":"No shipments yet"},"recentQuotes":{"title":"Recent quotes","sub":"Latest activity","action":"Quotes","empty":"No quotes yet"},"activity":{"production":{"start":"started an operation","pause":"paused an operation","resume":"resumed an operation","complete":"completed an operation"},"title":"Team activity","sub":"Recent actions across the team","empty":"No recent activity"},"payables":{"title":"Payables","sub":"Owed to vendors","action":"Payables","totalDue":"Total due","overdue":"Overdue","dueThisWeek":"Due this week","otherVendors":"Others"},"cash":{"title":"Cash & receivables","sub":"Working capital snapshot","onHand":"Cash on hand","receivables":"Receivables","netPosition":"Net position","collectionPeriod":"Avg. collection period","days":"{{n}} days","empty":"No bank balance or open receivables yet. Add a bank account in Accounting, or issue a customer invoice, and they appear here."},"approvalKind":{"approval":"Approval","task":"Task","mention":"Mention","quote":"Quote","quotation":"Quote","purchase_order":"PO","price_batch":"Batch","worksheet":"Worksheet","bom":"BOM","cycle_count":"Count"},"activitySource":{"logistics":"Logistics","production":"Production","pricing":"Pricing","sales":"Sales","warehouse":"Warehouse"},"widgetError":"We couldn’t load this card. Please try again in a moment.","errorBoundary":{"title":"This page could not be shown","body":"Something on this page failed to load. Try again; if it keeps happening, go back to the dashboard and tell your administrator which page it was.","retry":"Try again","home":"Go to dashboard","errorId":"Error ID: {{id}}"}},"inventory":{"title":"Inventory","description":"Manage stock levels, warehouses, and inventory movements","btp":{"statusLabels":{"CHO_NHAP":"Awaiting putaway","DA_NHAP":"In stock","RESERVED":"Reserved","CONSUMED":"Consumed","EXPIRED":"Expired","REJECTED":"Rejected"},"title":"Semi-finished stock","description":"Surplus semi-finished pallets awaiting reuse, with re-inspection due dates.","btpCode":"Lot code","colorFinish":"Colour / finish","quantity":"Qty","reinspectDue":"Re-inspect by","overdue":"overdue","dueSoon":"due soon","emptyTitle":"No semi-finished pallets","emptyDescription":"Captured semi-finished surplus pallets appear here.","locationRequired":"Enter a location to put the pallet away.","locationIdPlaceholder":"Location ID","putaway":"Put away","putawaySuccess":"Pallet {{code}} put away.","printLabel":"Print label","labelError":"Could not generate the label."},"btpWorkspace":{"crumb":"Inventory · Manufacturing","title":"Semi-finished products","subtitle":"Capture surplus parts from QC, receive them into stock with location & condition, and reuse them to cut purchasing and production on matching orders.","receiveFromQc":"Receive from QC","tabs":{"overview":"Overview","capture":"Capture from QC","stock":"Semi-finished stock","reuse":"Reuse Match","savings":"Savings"},"kpi":{"awaiting":"Awaiting receipt","awaitingCaption":"From QC, not in stock","inStock":"In stock","inStockCaption":"Ready to reuse","reuseRate":"Reuse rate","reuseRateCaption":"of captured semi-finished","savedMonth":"Saved this month","savedMonthCaption":"{{count}} reuse events","stockValue":"Semi-finished value in stock","stockValueCaption":"At standard cost"},"condition":{"good":"Good","touch_up":"Needs touch-up (reusable)","unusable":"Visual defect (not reusable)"},"overview":{"howTitle":"How semi-finished parts are created:","howBody":"when QC records more good parts than the order needs, they tap \"Capture as semi-finished\" on the QC screen. A semi-finished record is generated with a QR carrying the production order, SKU, component, operation and surplus qty. The warehouse just scans & confirms.","awaitingBanner":"{{count}} records are waiting to be received into semi-finished stock.","receiveNow":"Receive now →","flowTitle":"The semi-finished data flow","flowStep1Title":"① QC Inspection","flowStep1Body":"Operator records made vs. passed → surplus is calculated → taps Capture as semi-finished, prints a QR label.","flowStep2Title":"② Draft record","flowStep2Body":"A semi-finished record is generated automatically — status Awaiting receipt.","flowStep3Title":"③ Receive","flowStep3Body":"Warehouse scans the QR → fields auto-fill → confirms qty, adds rack location, condition & photos.","flowStep4Title":"④ In stock","flowStep4Body":"Official semi-finished stock with full traceability — ready to allocate.","flowStep5Title":"⑤ Reuse match","flowStep5Body":"New order, same SKU → system flags semi-finished stock on hand, suggests cutting buy/make qty.","activityTitle":"Recent activity","activityCaptured":"QC captured {{code}} — {{qty}} pcs, awaiting receipt","activityReceived":"Warehouse received {{code}} ({{qty}} pcs) into stock","activityRejected":"Warehouse rejected {{code}} ({{qty}} pcs) at receive — no stock raised","activityReused":"Reuse confirmed: {{code}} → {{wo}} — saved ≈ {{saved}}","activityEmpty":"No semi-finished activity yet.","agedBanner_one":"{{count}} lot in stock over {{days}} days — use first or clear out.","agedBanner_other":"{{count}} lots in stock over {{days}} days — use first or clear out.","agedLink":"Show them →"},"capture":{"banner":"These records were generated automatically when QC tapped \"Capture as semi-finished\". Scan the QR on the physical label (or tap Receive on a row) to auto-fill, then confirm quantity, rack location, condition and photos to move it into stock.","tableTitle":"Awaiting receipt","recordCount_one":"· {{count}} record","recordCount_other":"· {{count}} records","allReceivedCount":"· all received","colRecord":"Record","colOrder":"Production order / SKU","colComponent":"Component","colOperation":"Operation","colSurplus":"Surplus","colStatus":"Status","colActions":"Actions","statusAwaiting":"Awaiting","statusInStock":"✓ In stock","receiveAction":"Receive","closeAction":"Close","doneAction":"Done","rejectAction":"Reject","confirmAction":"✓ Confirm into stock","qtyLabel":"Qty received *","qcRecorded":"QC recorded: {{qty}}","conditionLabel":"Condition *","locationLabel":"Rack location *","warehouseLabel":"Warehouse","warehousePlaceholder":"Warehouse…","locationPlaceholder":"Search bins…","noteLabel":"Condition note","notePlaceholder":"e.g. clean surface, sharp edge needs light sanding…","photosLabel":"Photos","photosHint":"(part + rack location)","photoAlt":"Semi-finished receive photo","photoAdd":"Add photo","photoRemove":"Remove photo","photoUploadFailed":"Could not upload the photo.","chipCaptured":"Captured · {{date}}","chipFinish":"Finish · {{value}}","chipOrder":"Order · {{wo}}","opPosition":"Op {{seq}}/{{total}}","receivedToast":"{{code}} received into stock.","rejectedToast":"{{code}} rejected.","receiveFailed":"Could not update the record.","empty":"No records awaiting receipt.","allDoneTitle":"All records received","allDoneBody":"Semi-finished stock is updated.","viewStock":"View semi-finished stock →","pickWarehouseFirst":"Select a warehouse first","confirmNeedsBin":"Select a rack location (bin) to confirm into stock.","loadFailedTitle":"Couldn't load the records","loadFailedHint":"Check your connection and try again. If it keeps failing, ask an administrator.","doneStatus":"Done","loading":"Loading records…","photosLoadFailed":"Couldn't load the photos. Check your connection and try again.","photoRemoveTitle":"Remove this photo?","photoRemoveMessage":"The photo is deleted from this receive record. You can add it again afterwards.","photoRemoveConfirm":"Remove photo","photoRemoveFailed":"Couldn't remove the photo. Try again."},"stock":{"banner":"Official semi-finished stock — each lot carries its source production order, SKU, operation, rack location, condition and photos. Only appears here after the warehouse scans & confirms.","summary":"Lots {{lots}} · Total qty {{qty}}","colLot":"Lot ID","colSku":"SKU","colComponent":"Component","colOperation":"Operation","colQty":"Quantity","colLocation":"Location","colCondition":"Condition","colSource":"Source","colPhotos":"Photos","searchPlaceholder":"Search lots…","emptyTitle":"No lots in semi-finished stock","emptyDescription":"Received pallets appear here with location, condition and photos.","matchingOrders":"See matching orders →","issueAction":"Issue to line","issuedToast":"{{code}} issued to the line.","issueFailed":"Could not issue the pallet.","colProduct":"Product","colReceived":"Received","colCustomer":"Customer","colAge":"Age","ageDays_one":"{{count}} day","ageDays_other":"{{count}} days","ageWarn":"In stock over {{days}} days — use first or clear out","colValue":"Est. value","colHeld":"Held for PI","colNote":"Note","colAvailability":"Availability","availability":{"available":"Available","held":"Held","awaiting_putaway":"Awaiting putaway","not_reusable":"Not reusable"},"summaryValue":"Lots {{lots}} · Total qty {{qty}} · Value {{value}}","agedFilter":"Showing lots in stock over {{days}} days","agedClear":"Show all lots","loadFailedTitle":"Couldn't load the stock list","loadFailedHint":"Check your connection and try again. If it keeps failing, ask an administrator.","retry":"Try again","issueConfirmTitle":"Issue {{code}} to the line?","issueConfirmMessage":"The pallet leaves semi-finished stock and is counted as reused for its work order. This cannot be undone.","issueConfirmAction":"Issue to line"},"reuse":{"pickerLabel":"New order","pickerPlaceholder":"Select a work order…","pickPrompt":"Pick a work order to check its components against semi-finished stock.","matchFailed":"Could not compute the match.","matchFound":"Match found:","matchBanner":"order {{wo}} ({{sku}} · {{name}}) has {{count}} components covered by semi-finished stock. Highlighted cells show available semi-finished stock that can cut buy/make quantities.","noMatch":"No semi-finished stock matches the components of {{wo}}.","cardOrder":"New order","cardSku":"SKU","cardQty":"Order qty","cardCoverage":"Semi-finished coverage","cardCoverageValue":"{{count}} components","planTitle":"Material plan — semi-finished availability","legend":"Semi-finished available","colComponent":"Component","colNeeded":"Needed","colOnHand":"Semi-finished on hand","colLocation":"Location","colCondition":"Condition","colBuyMake":"Buy / make","colStatus":"Status","matched":"✓ Matched","needsQc":"Needs QC ok","buyNew":"Buy / make new","allocTitle":"Confirm reuse quantities","allocMath":"Buy/make = {{needed}} − {{use}} = {{result}}","reuseLabel":"Reuse","ofMax":"/ {{max}}","summaryLabel":"Summary:","summaryLine":"reuse {{count}} semi-finished parts · estimated saving ≈ {{amount}}","summaryLineNoPrice":"reuse {{count}} semi-finished parts","confirmAction":"✓ Confirm reuse & adjust orders","confirmFailed":"Could not confirm the reuse.","doneTitle":"Reuse confirmed","doneBody":"{{codes}} reserved for {{wo}}. Estimated saving ≈ {{amount}}. Issue the pallets to the line from the Stock tab.","doneBodyNoPrice":"{{codes}} reserved for {{wo}}. Issue the pallets to the line from the Stock tab.","viewSavings":"View savings report →","loading":"Computing the match…","opportunitiesTitle":"Orders with reusable stock","oppWo":"Work order","oppProduct":"Product","oppStatus":"Status","oppAvailable":"Available to reuse","oppReview":"Review","status":{"planned":"Scheduled","released":"Released","in_progress":"In progress"},"confirmNeedsQty":"Nothing to reuse yet. Enter a quantity above 0 for at least one component to confirm."},"savings":{"savedMonth":"Saved this month","savedMonthCaption":"From confirmed reuse","events":"Reuse events","eventsCaption":"This month","reuseRate":"Reuse rate","reuseRateCaption":"of captured semi-finished","savedYtd":"Saved YTD","savedYtdCaption":"Cumulative","eventsTitle":"Recent reuse events","colDate":"Date","colLot":"Lot","colReusedOn":"Reused on","colParts":"Parts","colSaved":"Saved","empty":"No reuse events yet."},"drawer":{"title":"Receive into warehouse — {{code}}","description":"Count the pallet, choose its shelf and condition, then confirm. Stock is only raised when you confirm.","cancel":"Cancel","save":"Receive into stock","saving":"Receiving…","reject":"Reject lot","needQty":"Enter the quantity you counted — more than 0 and at most {{max}} (what QC recorded).","rejectTitle":"Reject {{code}}?","rejectMessage":"This lot will not enter stock and can't be received later. Say why in the note so QC can follow up.","rejectConfirm":"Reject lot","unusableHint":"A visual-defect lot is kept in stock for the record but is never offered for reuse. Use Reject if it should not be kept at all.","touchUpHint":"A touch-up lot can be reused — it is tagged so the line knows it needs light rework first.","warehousesFailed":"Couldn't load the warehouse list. Check your connection and try again.","warehousesFailedBlocker":"Save is unavailable until the warehouse list loads — use Try again.","noWarehouses":"No warehouse is set up yet. Ask an administrator to add one in Settings › Locations › Warehouses, then reopen this form.","noWarehousesBlocker":"Save is unavailable: no warehouse exists. An administrator adds one in Settings › Locations › Warehouses."}},"returnToSupplier":{"statusLabels":{"DRAFT":"Draft","PENDING_APPROVAL":"Pending approval","APPROVED":"Approved","SHIPPED":"Shipped","CLOSED":"Closed","CONFIRMED":"Confirmed","CANCELLED":"Cancelled"},"origin":{"grn":"Goods receipt","stock":"Stock","inspection":"Inspection"},"reason":{"quality_below_grade":"Quality below grade","damaged_in_shipping":"Damaged in shipping","wrong_item":"Wrong item","over_delivery":"Over-delivery","defective_inspection":"Failed inspection","warranty_recall":"Warranty / recall"},"settlement":{"CREDIT_NOTE":"Credit note","REPLACEMENT":"Replacement","REPAIR_RETURN":"Repair & return","DEBIT_NOTE":"Debit note","SCRAP_AT_VENDOR":"Scrap at vendor"},"title":"Returns to Supplier","description":"Ship defective material back to the vendor and notify Purchasing.","newReturn":"New return","emptyTitle":"No returns yet","emptyDescription":"Raise a return when defective stock must go back to a vendor.","returnNumber":"Number","lineCount":"Lines","createdDate":"Created","confirmedDate":"Confirmed","items":"Items","quantity":"Quantity","confirm":"Confirm & issue","cancel":"Cancel","confirmedSuccess":"Return confirmed; stock issued.","cancelledSuccess":"Return cancelled.","movement":"Movement","issued":"Issued","backToList":"Back to list"},"reports":{"stockLedger":{"title":"Stock Ledger","description":"Standardized opening / in / out / closing report per material, in both units.","helpIntro":"The stock ledger totals opening, in, out and closing quantities for each material over the chosen period.","helpStep1":"Pick the report period (from / to date).","helpStep2":"Filter by warehouse and choose how rows are grouped.","helpStep3":"Export to CSV to save or reconcile.","helpTip1":"Closing = Opening + In − Out.","exportCsv":"Export CSV","periodStart":"From","periodEnd":"To","warehouse":"Warehouse","allWarehouses":"All warehouses","groupBy":"Group by","groupByProduct":"Material","groupByLocation":"Location","groupByLot":"Lot","sku":"Code","name":"Name","stockUom":"Stock unit","stockUomFull":"Stock unit","accountingUom":"Accounting unit","accountingUomFull":"Accounting unit","openingStock":"Opening","inStock":"In","outStock":"Out","usedStock":"Used","closingStock":"Closing","openingAccounting":"Opening (acct)","inAccounting":"In (acct)","outAccounting":"Out (acct)","closingAccounting":"Closing (acct)","closingAccountingFull":"Closing (accounting)","searchPlaceholder":"Search code or name…","emptyTitle":"No movements in this period","emptyDescription":"Adjust the filters or period to see stock activity."}},"products":"Products","categories":"Categories","stock":"Stock","lowStock":"Low Stock","outOfStock":"Out of Stock","addProduct":"Add Product","productName":"Product Name","sku":"SKU","quantity":"Quantity","unitPrice":"Unit Price","totalValue":"Total Value","manageWarehouses":"Manage Warehouses","totalWarehouses":"Total Warehouses","totalSKUs":"Total SKUs","totalStock":"Total Stock","searchPlaceholder":"Search by SKU or product name...","allWarehouses":"All Warehouses","noStock":"No stock found","noStockDesc":"Stock records will appear once products are received","product":"Product","location":"Location","onHand":"On Hand","reserved":"Reserved","available":"Available","value":"Value","warehouses":"Warehouses","warehousesDescription":"Warehouses are the physical sites where you receive, store, and ship stock.","warehousesEmptyTitle":"No warehouses yet","warehousesEmptyDescription":"Add a warehouse to start tracking stock by site. Each warehouse holds its own zones, locations, and stock levels.","addWarehouse":"Add Warehouse","editWarehouse":"Edit Warehouse","warehouseCode":"Warehouse Code","warehouseName":"Warehouse Name","address":"Address","contactName":"Contact Name","contactPhone":"Contact Phone","helpIntro":"This is the inventory overview: total stock value, SKU and warehouse counts, and a searchable list of on-hand stock across every site.","helpStep1":"Use the search box to find a product by SKU or name.","helpStep2":"Filter by warehouse to narrow stock to a single site.","helpStep3":"Click a row to open the product, or use Manage Warehouses to set up sites.","helpTip1":"Available equals on-hand minus reserved; a zero or negative value means the stock is fully committed.","warehousesHelpIntro":"Warehouses are the physical sites where you receive, store, and ship stock. Each warehouse holds its own zones, locations, and stock.","warehousesHelpStep1":"Click Add Warehouse to register a new site with its code and address.","warehousesHelpStep2":"Edit a warehouse to update its contact details.","warehousesHelpStep3":"Set up zones and locations inside a warehouse before receiving stock there.","warehousesHelpTip1":"A warehouse code cannot be changed after creation, so pick a stable convention.","warehousesMapAction":"Map","sampleInventory":{"title":"Sample BOM catalog","subtitle":"Every BOM ever sampled · highest version shown · click a row for older versions & changes. Sample stock is checked when creating a request.","searchPlaceholder":"Search product / MSP code / material…","filterLabel":"Filter samples","filters":{"all":"All ({{n}})","instock":"In stock ({{n}})","nostock":"Out of stock ({{n}})","multi":"Multi-version ({{n}})","stockIn":"In","stockOut":"Out"},"colProduct":"Product","colCustomer":"Customer","colCode":"Code (MSP-Ver)","colVersion":"Version (highest)","colStock":"Sample stock","colLocation":"Location","colDimensions":"Dimensions","colMaterial":"Wood / material","colMaterialFull":"Wood / material","colVersionCount":"Versions","versionCount":"{{n}} versions","history":"History","hide":"Hide","historyTitle":"Version history — {{product}} ({{n}} versions)","histVersion":"Version","histUpdated":"Updated","histChange":"Change","histBy":"By","histStock":"Stock","latest":"LATEST","empty":"No results.","loadFailed":"Could not load the sample catalog."},"stockLevels":{"title":"Stock Summary","description":"View real-time stock levels across all warehouses","searchPlaceholder":"Search products...","allWarehouses":"All Warehouses","allStatus":"All Status","lowStock":"Low Stock","outOfStock":"Out of Stock","normal":"Normal","emptyTitle":"No stock on hand","emptyDescription":"Stock levels appear here once products are received into a warehouse. Receive a movement or adjust stock to populate this view.","noStockDesc":"Add products and warehouses to track inventory","exportCsv":"Export CSV","adjust":"Adjust","sku":"SKU","product":"Product","warehouse":"Warehouse","location":"Location","lot":"Lot","uom":"UoM","uomFull":"Unit of measure","unitMismatch":{"materialUnit":"Material unit: {{unit}}","materialUnitConverted":"= {{qty}} {{unit}} (material unit)","hint":"This stock is stored in a different unit from the material. The quantity is shown as stored, not converted."},"qtyOnHand":"On Hand","qtyReserved":"Reserved","qtyAvailable":"Available","unitCost":"Unit Cost","totalValue":"Total Value","totalProducts":"Total Products","totalValue2":"Total Value","lowStockCount":"Low Stock","pageInfo":"Showing {{from}}–{{to}} of {{total}}","viewDetails":"View details","secIdentification":"Identification","secLocation":"Location & lot","secQuantities":"Quantities","secCosting":"Costing","helpIntro":"Stock levels show real-time on-hand, reserved, and available quantities for every product, warehouse, and lot.","helpStep1":"Use the filters to narrow by warehouse, product, or low-stock only.","helpStep2":"Click a row to open its detail drawer, or use the row action to adjust stock.","helpStep3":"Export the current view to CSV for offline review.","helpTip1":"Row colours follow the alert flags: red = depleted (everything on hand is reserved), amber = reorder or missing price.","alerts":{"tabs":{"items":"Items","alerts":"Alerts","sampleBoms":"Sample BOMs","undelivered":"Undelivered"},"settingsLink":"Alert settings","itemCount":"{{n}} items","pctOfCeiling":"{{n}}%","ceilingStatus":{"ok":"OK","warn":"Watch","over":"Over","no_limit":"No limit set"},"overTitle":"Over budget ceiling","overEmpty":"No warehouse over its ceiling.","warnTitle":"Approaching ceiling · {{band}}–100%","warnEmpty":"Nothing approaching its ceiling.","ofCeiling":"{{value}} of {{ceiling}} ceiling","flaggedTitle":"Reorder & data flags","flaggedSubtitle":"· items below cover, missing price, out of stock or all reserved","flaggedEmpty":"No flagged items — thresholds are all healthy.","colItem":"Item","colWarehouse":"Warehouse","colOnHand":"On hand","colIssued30d":"Issued (30 days)","colFlag":"Flag","colStatus":"Status","flags":{"missing_price":"Missing price","out_of_stock":"Out of stock","depleted":"All reserved","reorder":"Reorder","in_stock":"In stock"}},"qtyByUnit":{"title":"Quantity by unit","items_one":"{{count}} item","items_other":"{{count}} items","more_one":"+ {{count}} other unit — See all →","more_other":"+ {{count}} other units — See all →","note":"Different units can't be added together, so stock is totalled per unit.","colUnit":"Unit","colQuantity":"Total quantity","colItems":"Items","colValue":"Value","empty":"No stock to total."},"missingPriceCount":"Missing price","missingPriceHint":"Products with stock but no unit cost. Click to show only those rows.","rowsTotal_one":"{{n}} stock row","rowsTotal_other":"{{n}} stock rows","rowsFiltered_one":"{{n}} of {{total}} stock row","rowsFiltered_other":"{{n}} of {{total}} stock rows","rowsTruncated":"Only the first {{n}} of {{total}} stock rows could be loaded. Pick a warehouse to see the rest.","productChip":"Product: {{product}}","productChipFallback":"selected product","productChipClear":"Clear the product filter","errorStockTitle":"Stock levels did not load","errorStockBody":"The stock list could not be read, so no rows are shown. Check your connection and press Retry. If it keeps failing, ask your system administrator.","errorKpiTitle":"Summary cards did not load","errorKpiBody":"The totals could not be read. The stock list below is not affected. Press Retry; if it keeps failing, ask your system administrator.","errorAlertsTitle":"Alert flags did not load","errorAlertsBody":"Low-stock and missing-price flags could not be read, so the Status column and the Low stock filter show nothing. Press Retry; if it keeps failing, ask your system administrator.","undelivered":{"intro":"Goods customers have ordered but not yet received, next to the finished-goods stock. In stock counts every warehouse typed Finished goods. To send a statement, mark it sent or open a new PI for the remainder, use the full page.","openFullPage":"Open full page","searchPlaceholder":"Search customer, PI or item…","emptyTitle":"Nothing owed to customers","emptyBody":"Every ordered piece has shipped. New lines appear here when a shipment leaves less than the PI ordered.","errorTitle":"Undelivered goods didn't load","errorBody":"Check your connection and press Retry. If it keeps failing, open the full page or ask your administrator.","noAccessTitle":"You can't see undelivered goods","noAccessBody":"This list needs the Sales documents (view) or Logistics (view) permission. Ask your administrator to add it to your role."}},"adjustments":{"title":"Stock Adjustments","description":"Record inventory adjustments and corrections","newAdjustment":"New Adjustment","searchPlaceholder":"Search adjustments...","allTypes":"All Types","increase":"Increase","decrease":"Decrease","transfer":"Transfer","noAdjustments":"No adjustments","noAdjustmentsDesc":"Record stock adjustments when inventory counts differ"},"lots":{"title":"Lots","description":"Lots track inventory by batch so you can manage expiry, quarantine, and remaining quantity.","addLot":"Add lot","emptyTitle":"No lots yet","emptyDescription":"Lots are created automatically when stock is received, or you can add one manually. None exist yet.","lotNumber":"Lot number","productIdLabel":"Product ID","expiryDate":"Expiry date","manufacturedDate":"Manufactured date","remaining":"Remaining","status":{"available":"Available","quarantine":"Quarantine","expired":"Expired","consumed":"Consumed"},"qualityTimeline":{"received":"Received","hold":"QC hold","released":"Released","rejected":"Rejected","consumed":"Consumed"},"actions":{"quarantine":"Quarantine","release":"Release","expire":"Mark expired","consume":"Consume","confirmQuarantine":"Move lot to quarantine?","confirmExpire":"Mark this lot as expired?","transitionSuccess":"Lot status updated","transitionFailed":"Failed to update lot status"},"expiringSoon":"Expiring in {{days}} days","expiringBanner":"{{count}} lots expire within 30 days","detailTitle":"Lot details","product":"Product","sku":"SKU","createdAt":"Created","viewDetails":"View details","tabDetails":"Details","tabMovements":"Movements","secIdentification":"Identification","secDates":"Dates","secStock":"Stock","noMovements":"No movements recorded for this lot.","searchPlaceholder":"Search product…","helpIntro":"Lots track inventory by batch so you can manage expiry, quarantine status, and remaining quantity per batch.","helpStep1":"Filter by status or search by product to find a lot.","helpStep2":"Click a lot to open its detail drawer, including movements and dates.","helpStep3":"Use Add lot to register a batch manually when needed.","helpTip1":"Lots expiring within 30 days are highlighted and listed in the banner; review them first to avoid write-offs."},"movements":{"title":"Stock movements","description":"An append-only ledger of every receipt, issue, transfer, and adjustment of stock.","emptyTitle":"No movements yet","emptyDescription":"Movements are recorded automatically whenever stock is received, issued, transferred, or adjusted. None exist yet.","type":{"receipt":"Receipt","issue":"Issue","transfer":"Transfer","adjustment":"Adjustment","return_to_supplier":"Return to supplier"},"newReceipt":"Record receipt","newIssue":"Record issue","newTransfer":"＋ Transfer","newAdjustment":"＋ Adjustment","reverse":"Reverse this movement","reverseConfirm":"Post a compensating reverse entry?","reverseReason":"Reason for reversal","reversedBy":"Reversed by {{ref}}","reverses":"Reverses {{ref}}","filters":{"type":"Type","warehouse":"Warehouse","dateFrom":"From","dateTo":"To","reference":"Reference"},"byReferenceTitle":"Movements for {{type}} {{id}}","adjustmentReason":"Reason","reasons":{"DAMAGE":"Damage","SHRINKAGE":"Shrinkage","FOUND":"Found stock","COUNT_VARIANCE":"Count variance","THEFT":"Theft","EXPIRED_DISPOSAL":"Expired disposal","RECLASSIFICATION":"Reclassification","OTHER":"Other"},"product":"Product","location":"Location","newQuantity":"New quantity","currentQuantity":"Current quantity","newQuantityHint":"Absolute new on-hand quantity","adjustmentNotesHint":"Optional notes","detailTitle":"Movement details","colType":"Type","quantity":"Quantity","colReference":"Reference","date":"Date","createdBy":"Created by","viewDetails":"View details","searchPlaceholder":"Search movements…","helpIntro":"Stock movements are an append-only ledger of every receipt, issue, transfer, and adjustment of stock.","helpStep1":"Use the filters to narrow by type, warehouse, date range, or reference.","helpStep2":"Click a row to open the full movement detail.","helpStep3":"Use the buttons above to record a new receipt, issue, transfer, or adjustment.","helpTip1":"Movements cannot be edited; to correct a mistake, post a compensating reverse entry.","transferQuantityHint":"Must be greater than 0","unitCost":"Unit cost","unitCostHint":"Cost of one unit of this stock. Filled with the current cost, or the product's standard cost when there is none. Leave it blank to keep the current cost.","unitCostLockedHint":"The unit cost is locked because a lower quantity takes stock out at its current cost. To change the cost, enter a quantity above the current quantity.","adjustErrorTitle":"Adjustment not saved","adjustErrorNoChange":"The new quantity is the same as the current quantity, so there is nothing to adjust. Enter a different quantity.","adjustErrorInsufficient":"This would take the stock at this location below zero. Enter a quantity of 0 or more.","adjustErrorGeneric":"The adjustment could not be saved. Check the quantity and unit cost, then try again. If it keeps failing, ask your inventory administrator."},"reservations":{"title":"Reservations","description":"Reservations soft-lock stock for an order so it cannot be picked for anything else until fulfilled.","emptyTitle":"No active reservations","emptyDescription":"Reservations appear here when stock is soft-locked for a sales or production order. None are active right now.","reference":"Reference","sku":"SKU","searchPlaceholder":"Search reservations…","viewDetails":"View details","status":{"pending":"Pending","confirmed":"Reserved","fulfilled":"Released","released":"Cancelled","expired":"Expired","set_aside":"Set aside"},"release":"Release","fulfill":"Fulfill","edit":"Edit","expiresAt":"Expires {{at}}","driftDetected":"Stock-on-hand drift detected — reconciliation job will fix this on the next run","actions":{"released":"Reservation released","fulfilled":"Reservation fulfilled","updated":"Reservation updated"},"kpi":{"totalActive":"Active reservations","totalQtyReserved":"Total qty reserved","expiringWithin24h":"Expiring within 24h"},"editTitle":"Edit reservation","quantity":"Quantity","expiresAtField":"Expires at","notes":"Notes","fields":{"product":"Product","location":"Location","lot":"Lot","uom":"Unit","referenceType":"Reference type","referenceNumber":"Reference number","priority":"Priority","reservedBy":"Reserved by","createdAt":"Created at"},"confirmRelease":"Release this reservation? The quantity will be returned to available stock.","confirmFulfill":"Mark this reservation as fulfilled?","releaseTitle":"Release reservation","fulfillTitle":"Fulfill reservation","auditPlaceholder":"Audit history will appear here once available.","auditPlaceholderTitle":"Audit log","detailTitle":"Reservation details","helpIntro":"Reservations soft-lock stock for an order so it cannot be picked for anything else until the reservation is fulfilled or released.","helpStep1":"Filter by status to focus on pending or confirmed reservations.","helpStep2":"Click a reservation to open its detail and release, fulfill, or edit it.","helpStep3":"Watch the KPI row for reservations expiring within 24 hours.","helpTip1":"Releasing a reservation returns its quantity to available stock immediately."},"serials":{"column":"Serial","drawerTitle":"Serial numbers","colSerial":"Serial number","colStatus":"Status","colLot":"Lot","empty":"No serial numbers at this location.","status":{"available":"Available","reserved":"Reserved","sold":"Sold","consumed":"Consumed","returned":"Returned","scrapped":"Scrapped","in_transit":"In transit"}},"cycleCount":{"status":{"draft":"Draft","assigned":"Assigned","in_progress":"Counting","pending_review":"In review","approved":"Approved","posted":"Posted","cancelled":"Cancelled"},"type":{"full":"Full","cycle":"Cycle","spot":"Spot","reconciliation":"Reconciliation"},"reason":{"scheduled_cycle":"Scheduled cycle","spot_check":"Spot check","discrepancy_investigation":"Discrepancy investigation","damage_write_off":"Damage / write-off","year_end":"Year-end count"},"deltaReason":{"miscount_recount":"Miscount / recount","unrecorded_issue":"Unrecorded issue","unrecorded_receipt":"Unrecorded receipt","damage_breakage":"Damage / breakage","theft_loss":"Theft / loss","wrong_location":"Wrong location","uom_conversion_error":"UoM / conversion error","other":"Other"},"landing":{"crumb":"Inventory · Cycle Count","title":"Cycle Count","subtitle":"Request, assign, count and reconcile physical inventory against the Stock Ledger. Approved variances post as adjustment movements, keeping on-hand accurate without a full stock-take.","newCount":"New count","newCountConfirm":{"title":"Start a new count?","message":"A draft count will be created for warehouse {{warehouse}}.","confirm":"Create count"},"kpi":{"open":"Open counts","openSub":"assigned · counting · review","inCounting":"In counting","inCountingSub":"on the floor now","awaitingReview":"Awaiting review","awaitingReviewSub":"variance to approve","netVariance":"Net variance · month","netVarianceSub":"{{count}} posted"},"chips":{"all":"All"},"columns":{"count":"Count","scope":"Scope","type":"Type","assignee":"Assignee","due":"Due","progress":"Progress / variance","status":"Status"},"items_one":"{{count}} item","items_other":"{{count}} items","unassigned":"Unassigned","empty":"No counts in this view.","noWarehouse":"No active warehouse found — add one before starting a count."},"typePill":{"blind":"Blind","informed":"Informed"},"detail":{"back":"All counts","subtitleItems_one":"{{count}} item","subtitleItems_other":"{{count}} items","subtitleDue":"due {{date}}","stages":{"request":"Request","assign":"Assign","count":"Count","review":"Review","post":"Post"},"common":{"goToStage":"Go to current stage","backToAssign":"Back to assign","goToReview":"Go to review","backToCount":"Back to count","backToReview":"Back to review","review":"Review"},"stage1":{"title":"Define the count","sub":"Set why and where, choose the method, then hand-pick the materials to count. System quantities are snapshotted when the count is released.","reason":"Reason for count","warehouse":"Warehouse","due":"Due date","method":"Count method","informed":"Informed","blind":"Blind","methodHelperBlind":"Counter won't see system qty — validated at review.","methodHelperInformed":"Counter sees system qty and explains any delta while counting.","materials":"Materials to count · {{count}}","searchPlaceholder":"Search materials by code or name to add…","noMatches":"No matching materials.","newMaterialTag":"New — no stock yet","columns":{"material":"Material","category":"Category","location":"Location","systemQty":"System quantity"},"emptyItems":"No materials yet — search above to add.","needMaterials":"Add at least one material to create the count.","removeLine":"Remove line","selected_one":"{{count}} material selected","selected_other":"{{count}} materials selected","cancel":"Cancel count","createAssign":"Create & assign","locked":"Locked — count already released.","lockedCancelled":"Cancelled — counted numbers are kept for history; stock was not changed.","assignedToast":"Count created — assign a counter","cancelledToast":"Count cancelled"},"stage2":{"title":"Assign & schedule","sub":"Choose who counts and when. Releasing the count freezes the on-hand snapshot and generates the count sheet.","counters":"Counter(s)","staffPlaceholder":"Search staff by name or role…","unassigned":"Unassigned","scheduled":"Scheduled date & time","scheduledDate":"Scheduled date","scheduledTime":"Scheduled time","method":"Method","methodBlind":"Blind count","methodInformed":"Informed count","instructions":"Instructions to counter (optional)","instructionsPlaceholder":"e.g. Verify lot labels on rack A-03 before counting.","preview":{"title":"Count sheet preview","lines":"Lines","locations":"Locations","zones_one":"{{count}} zone · {{zones}}","zones_other":"{{count}} zones · {{zones}}","snapshotValue":"Snapshot value","tolerance":"Tolerance"},"explainBlind":"Blind: counter enters raw counts with no reference — variance is revealed and validated at the Review stage.","explainInformed":"Informed: counter sees system qty and picks a reason for any delta as they count.","createFirst":"Create the count first.","backToRequest":"Back to request","noCounter":"No counter","frozenOnRelease":"snapshot frozen on release","request":"Request","release":"Release to counter","releasedFooter":"Released · snapshot frozen, count sheet ready","goToCount":"Go to count","releasedToast":"Released — snapshot frozen, count sheet ready"},"stage3":{"title":"Count sheet","subBlind":"Blind count — enter the physical quantity you find. System quantities are hidden until review.","subInformed":"Enter the physical quantity for each material. Explain any delta from the system figure.","modeDesk":"Desktop","modeField":"Field / tablet","progress":"Progress","system":"System","counted":"Counted","reasonLabel":"Reason for delta","reasonPlaceholder":"Select reason…","notCounted":"Not counted yet","remaining_one":"{{count}} line remaining","remaining_other":"{{count}} lines remaining","allCounted":"All lines counted","save":"Save progress","submit":"Submit count","submitBlind":"Submit for validation","fieldFooterHint":"Field view — how the assigned counter sees this on a tablet. Tap −/+ or the number to enter counts.","exitField":"Exit field view","notReleased":"This count hasn't been released yet. Complete Assign to open the count sheet.","submittedFooter":"Count submitted — see Review.","progressSaved":"Progress saved","countEveryLine":"Count every line first","cannotClear":"A recorded count can't be cleared — enter the correct quantity instead.","alreadySubmitted":"This count was already submitted for review.","submittedToast":"Count submitted for review","submittedForValidation":"Submitted for validation","titleBlindShort":"Blind count","titleInformedShort":"Informed count","counter":"Counter","countedOf":"{{done}}/{{total}} counted"},"stage4":{"title":"Variance review","titleBlind":"Variance review — system revealed","sub":"Confirm the counted figures and reasons. Anything over ±{{tolerance}}% needs a reason before it can post.","subBlind":"System quantities are now compared against the blind count. Approve within-tolerance lines; assign a reason to anything over ±{{tolerance}}% before posting.","cards":{"lines":"Lines counted","within":"Within ±{{tolerance}}%","over":"Over tolerance","net":"Net value impact"},"columns":{"material":"Material","system":"System","counted":"Counted","deltaQty":"Quantity change","deltaPct":"Change (%)","value":"Value","status":"Status","approval":"Approval","reason":"Reason"},"status":{"match":"Match","within":"Within ±{{tolerance}}%","over":"Over tolerance"},"reasonRequired":"Reason required…","flagged":"Flagged for manager review","approveVariance":"Approve variance","lineList_one":"line {{lines}}","lineList_other":"lines {{lines}}","needReasonLines":"Choose a reason for {{where}} to continue.","flagsPendingLines":"Approve the variance on {{where}} first (press “Approve variance” on each line), or send the count back for recount.","flagsPendingNoRight":"The variance on {{where}} needs a manager’s approval. Ask a user with the “Approve variances” right to approve it, or send the count back for recount.","awaitingApprover":"Waiting for an approver","approveAll":"Approve all flagged lines ({{count}})","approveAllProgress":"Approving {{done}} of {{total}}…","approveAllTitle":"Approve all flagged lines?","approveAllBody":"This records your approval of the variance on {{where}}. Each approval is saved under your name.","approveAllConfirm":"Approve all","approveAllDone":"Variance approved on {{where}}","approveAllFailed":"Approved {{ok}} of {{total}} flagged lines. Could not approve {{where}}: {{reason}}","noAdjustPermission":"Approving or recounting requires the inventory adjust permission.","ready_one":"{{count}} adjustment ready to post · net {{net}}","ready_other":"{{count}} adjustments ready to post · net {{net}}","recount":"Request recount","approve":"Approve & continue","approvedBy":"Approved by {{name}}","goToPost":"Go to posting","nothingYet":"Nothing to review yet — submit the count first.","recountToast":"Sent back for recount","approvedToast":"Approved — ready to post"},"stage5":{"title":"Post adjustments","sub":"Approved variances post to the Stock Ledger as adjustment movements. On-hand updates immediately; the full audit trail is retained.","columns":{"material":"Material","location":"Location","system":"System","adjustment":"Adjustment","newOnHand":"New on-hand","value":"Value","reason":"Reason"},"noAdjustments":"No adjustments — every line matched the system. Nothing to post.","netImpact":"Net value impact","audit":{"title":"Audit trail","countedBy":"Counted by","reviewedBy":"Reviewed by","approvedBy":"Approved by"},"postingDate":"Posting date","postsAsNote":"Posts as movement type Adjustment (CC) referencing {{number}}. Reflected in the Stock Ledger opening/closing report.","postedBanner":{"title":"Posted to Stock Ledger","sub_one":"{{count}} adjustment · net {{net}} · {{date}}","sub_other":"{{count}} adjustments · net {{net}} · {{date}}"},"viewLedger":"View in Stock Ledger","willWrite_one":"{{count}} adjustment will be written","willWrite_other":"{{count}} adjustments will be written","nothingToPost":"No changes to post","post_one":"Post {{count}} adjustment","post_other":"Post {{count}} adjustments","closeCount":"Close count","approveFirst":"Approve the variance review first.","reference":"Reference {{number}} · posted {{date}}","postedToast_one":"Posted {{count}} adjustment to Stock Ledger","postedToast_other":"Posted {{count}} adjustments to Stock Ledger","closedToast":"Count closed — no variance","needAdjustRight":"Posting changes stock, and your role cannot adjust inventory. Ask a warehouse manager or an administrator who has the inventory adjust right to post this count."}},"actions":{"menuLabel":"Count actions","edit":"Edit","cancel":"Cancel count","delete":"Delete","blocked":{"postedLocked":"Posted counts already changed stock. To correct, create a stock adjustment.","editAssigned":"Only draft counts can be edited here. Counters, schedule and notes can still be changed on the Assign step.","editStarted":"Only draft counts can be edited — counting has already started. Cancel it and create a new count if the details are wrong.","editCancelled":"Cancelled counts can't be edited. Create a new count if you still need one.","alreadyCancelled":"This count is already cancelled.","deleteNeedsCancel":"Only draft or cancelled counts can be deleted. Cancel the count first."},"cancelConfirm":{"title":"Cancel {{number}}?","message":"Counting stops and the count can't be approved or posted. Counted numbers stay on the record for history, and stock is not changed.","reasonLabel":"Reason for cancelling","reasonPlaceholder":"e.g. Wrong zone picked","confirm":"Cancel count","keep":"Keep count"},"deleteConfirm":{"title":"Delete {{number}}?","message":"The count disappears from the list and the KPI cards. Stock is not changed, and its number won't be reused.","confirm":"Delete count"},"cancelledToast":"{{number}} cancelled — stock not changed","deletedToast":"{{number}} deleted"}},"zones":{"title":"Zones","subtitle":"Sub-areas within a warehouse","addZone":"Add zone","editZone":"Edit zone","deleteZone":"Delete zone","noZones":"No zones in this warehouse","zoneCode":"Zone code","zoneName":"Zone name","zoneNameVi":"Zone name (Vietnamese)","zoneType":"Zone type","locationsCount":"{{count}} locations","isActive":"Active","manageLocations":"Manage locations","zoneTypes":{"receiving":"Receiving","storage":"Storage","staging":"Staging","shipping":"Shipping","quarantine":"Quarantine","returns":"Returns"},"toasts":{"created":"Zone created","updated":"Zone updated","deleted":"Zone deleted","deleteConfirm":"Delete this zone and all its locations?"}},"locations":{"title":"Locations","subtitle":"Bin-level storage slots","addLocation":"Add location","bulkAdd":"Bulk create","noLocations":"No locations in this zone","barcode":"Barcode","scanBarcode":"Scan barcode","barcodeNotFound":"No location matches that barcode","locationCode":"Location code","nameVi":"Name (Vietnamese)","nameViHelp":"Shown instead of the bin code on Vietnamese pages. Leave blank to show the code.","locationType":"Location type","aisle":"Aisle","rack":"Rack","shelf":"Shelf","bin":"Bin","maxItems":"Max items","maxItemsFull":"Maximum items","maxWeight":"Max weight (kg)","maxWeightFull":"Maximum weight (kg)","maxVolume":"Max volume (cbm)","isBlocked":"Blocked","blockedReason":"Block reason","bulkPrefix":"Code prefix","count":"Count","barcodePrefix":"Barcode prefix","locationTypes":{"pick":"Pick","reserve":"Reserve","bulk":"Bulk","floor":"Floor","rack":"Rack","pick_face":"Pick face","kiln":"Kiln","flammable":"Flammable","finished_goods":"Finished goods","quarantine":"Quarantine"},"toasts":{"created":"Location created","updated":"Location updated","bulkCreated":"{{count}} locations created","saveError":"Failed to save location","deleted":"Location deleted","deleteConfirm":"Delete this location?"},"preview":"Preview","previewCount":"{{count}} locations","position":"Position","copyBarcode":"Copy barcode","searchPlaceholder":"Search locations…","weightKg":"{{value}} kg","countRatio":"{{shown}} / {{total}}","warehouseFallback":"Warehouse {{id}}","viewAllLocations":"View all {{count}} locations"},"putaway":{"suggestionTitle":"Suggested location","noSuggestion":"No matching putaway rule — pick manually","useSuggestion":"Use suggestion","priority":"Priority {{n}}","title":"Putaway","description":"Putaway tasks direct staff to move received stock from receiving into its storage bin.","emptyTitle":"No putaway tasks yet","emptyDescription":"Tasks are created when stock is received and needs binning. None are waiting right now.","filterAll":"All","searchPlaceholder":"Search putaway tasks","colId":"Task","colQty":"Quantity","colStatus":"Status","colPriority":"Priority","status":{"pending":"Pending","in_progress":"In progress","completed":"Completed","cancelled":"Cancelled"},"priorityLabels":{"low":"Low","normal":"Normal","high":"High","urgent":"Urgent"},"helpIntro":"Putaway tasks direct staff to move received stock from the receiving area into its storage bin.","helpStep1":"Filter by status to focus on pending or in-progress tasks.","helpStep2":"Open a task to see the quantity and its suggested storage location.","helpStep3":"Move the stock to the bin and confirm the task complete.","helpTip1":"Work higher-priority tasks first so receiving stays clear for the next delivery.","shortfallReason":{"damaged_in_transit":"Damaged in transit","damaged_in_storage":"Damaged in storage","unusable_defective":"Unusable / defective","quality_reject":"Quality reject (QC fail)","miscount_at_putaway":"Miscount at putaway","other":"Other"}},"deleteError":"Could not delete warehouse.","loadError":"Could not load inventory.","saveError":"Could not save warehouse.","toasts":{"warehouseCreated":"Warehouse created.","warehouseDeleted":"Warehouse deleted.","warehouseUpdated":"Warehouse updated."},"issueForm":{"productId":"Product ID","productIdPlaceholder":"Enter product UUID (autocomplete coming soon)","fromLocationId":"From Location ID","fromLocationIdPlaceholder":"Enter source location UUID (autocomplete coming soon)","quantityHint":"Must be greater than 0","referenceType":"Reference Type","referenceId":"Reference ID","referenceIdPlaceholder":"e.g. SO-0042","notes":"Notes (optional)","notesPlaceholder":"Optional notes"},"receiptForm":{"productId":"Product ID","productIdPlaceholder":"Enter product UUID (autocomplete coming soon)","warehouse":"Warehouse","selectWarehouse":"Select warehouse…","toLocationId":"To Location ID","toLocationIdPlaceholder":"Enter destination location UUID (or use suggestion above)","uomId":"UoM ID","uomIdPlaceholder":"Enter unit of measure UUID","quantityHint":"Must be greater than 0","unitCost":"Unit Cost","unitCostHint":"Must be greater than 0","lotNumber":"Lot Number (optional)","lotNumberPlaceholder":"e.g. LOT-2026-001","notes":"Notes (optional)","notesPlaceholder":"Optional notes"},"warehouseWorkspace":{"title":"Warehouse","description":"One place to run the warehouse — receive, store, move, pick, and ship from a single flow.","breadcrumb":"Inventory · Warehouse operations","selectWarehouse":"Warehouse","noWarehousesTitle":"No active warehouses","noWarehousesDescription":"Create a warehouse under Inventory → Warehouses to start using the workspace.","tabs":{"ledger":"Stock Ledger","receive":"Receive","movements":"Movements","putaway":"Putaway","picks":"Picks","xfpicks":"Transfer Picks","returns":"Return to Stock","rtv":"Return to Vendor","reservations":"Reservations","fg":"Finished Goods In","dispatch":"Finished Goods Out","quality":"Quality (Lots)"},"stockLedger":{"intro":"Receive, put away, move, adjust and pick every material across warehouses. Opening + In − Out − Used = Closing for the selected period; finished goods flow into the same report.","valuationNote":"Closing values use the moving-average cost recorded at posting time; recompute after backdated movements.","kpiMaterials":"Materials (SKU)","kpiAllWarehouses":"in all warehouses","kpiStockValue":"Stock value","kpiStockValueCaption":"closing × unit cost","kpiLowStock":"Low stock","kpiLowStockCaption":"need reorder review","kpiLowStockOk":"all above min","kpiOpenTasks":"Open tasks","kpiOpenTasksCaption":"putaway + picks","typeLabel":"Type","typeAll":"All stock","typeMat":"Raw materials","typeFg":"Finished goods","groupMaterial":"Material","groupType":"Type (materials vs FG)","groupCategory":"Category","groupWarehouse":"Warehouse","groupLabelMat":"Raw materials","groupLabelFg":"Finished goods","groupLabelUncategorized":"Uncategorized","colMin":"Minimum","colStatus":"Status","colFullCartons":"Full cartons","colLooseUnits":"Loose","colOnOrder":"On order (not yet issued)","colNote":"Notes","unitsPerBoxHint":"{{count}} pcs per carton","colMinStatus":"Minimum · status","colValue":"Value","colPis":"PIs","colRequired":"Required","requiredUnavailable":"Unit mismatch — cannot total","noStatus":"—","status":{"depleted":"Depleted","reorder":"Below min","cover":"Low cover","ok":"OK"},"overrideDot":"A blue dot marks a per-item reorder override.","closingNote":"Closing = Opening + In − Out − Used for the selected period.","rowClickNote":"Click any material row to adjust its reorder level.","reorder":{"title":"Reorder level","effectiveMin":"Effective min","daysOfCover":"Days of cover","daysValue":"{{days}} days","onHand":"On hand","basisLabel":"Basis","basisOverride":"Per-item override","basisCategory":"Category default","basisNone":"Auto (no policy set)","minInputLabel":"Per-item minimum ({{uom}})","minInputPlaceholder":"Leave blank to use category default","save":"Save override","clear":"Clear","savedToast":"Reorder level saved for {{code}}","clearedToast":"Override cleared — using category default","noMin":"—","unitLabel":"Unit:","noCategory":"uncategorised","policyNote":"The {{category}} category default {{defaultClause}}, from {{sourceClause}}. Set a per-item floor below to override it for this material only. Current basis: {{basis}}.","policyDefaultSet":"is {{min}} {{uom}}","policyDefaultUnset":"is not set","policySourceDays":"{{days}} days of cover","policySourceCentral":"the central policy"},"materialDrawer":{"finishedGood":"Finished good","unitLabel":"Unit","vendorLabel":"Vendor","storageLabel":"Storage","statStdCost":"Std cost","statStdCostSub":"per {{uom}}","statStockValue":"Stock value","statStockValueSub":"on hand × cost","statOnHand":"On hand","statAvailable":"Available","allWarehouses":"all warehouses","committed":"{{qty}} {{uom}} committed","noneCommitted":"none committed","movementPeriod":"Movement this period","flowOpening":"Opening","flowIn":"In","flowOut":"Out","flowUsed":"Used","flowClosing":"Closing","daysOfCover":"Days of cover:","daysOfCoverValue":"{{days}} days","daysOfCoverRate":"at this period's consumption rate","daysOfCoverNone":"— no consumption in period","recentMovements":"Recent movements","noMovements":"No movements recorded in scope"}},"pickLists":{"intro":"Pick lists released for this warehouse — track picking progress from pending to completed.","colCode":"Code","colPurpose":"Purpose","colStatus":"Status","colLines":"Lines","statusAll":"All","statusFilterLabel":"Filter by pick list status","searchPlaceholder":"Search pick lists…","emptyTitle":"No pick lists for this warehouse","emptyDescription":"Pick lists appear here when orders are released for picking in this warehouse."},"reservations":{"intro":"Reservations set stock aside for an order — a hold on inventory, not a movement: the stock stays put and still counts as on-hand until the hold is released (consumed for production) or cancelled (freed back to available). This differs from Finished Goods, which is the finished-goods stock itself; here you only place a claim on stock.","colSku":"SKU","colProduct":"Product","colStatus":"Status","statusAll":"All","statusFilterLabel":"Filter by reservation status","searchPlaceholder":"Search reservations…","emptyTitle":"No reservations for this warehouse","emptyTitleAll":"No reservations in any warehouse","emptyDescription":"Stock holds against orders at this warehouse's locations appear here.","emptyDescriptionAll":"Stock holds against orders across all warehouses appear here.","newReservation":"+ New reservation","viewLabel":"View","viewByPi":"By PI","viewByMaterial":"By material","colProforma":"Proforma / reference","colOrderType":"Order","colItems":"Items","colReservedQty":"Reserved","colHold":"Hold / expiry","colCreated":"Created","holdReleased":"Released {{date}}","holdNone":"No hold set","holdExpiredAgo":"Expired {{days}}d ago","holdExpiresToday":"⚠ Expires today","holdExpiresSoon":"⚠ Expires in {{days}}d","holdExpiresIn":"Expires in {{days}}d","summaryByPi":"References {{total}} · Reserved {{reserved}} · Expiring ≤2d {{expiring}}","summaryByMaterial":"Reserved lines {{total}}","detailTitle":"Reservation ·","drawerBanner":"Reserved for {{reference}}. Releasing for production posts the consumption; cancelling frees the stock.","alertExpiresToday":"⏰ Hold expires today — extend the hold or release for production before the stock is freed.","alertExpiresSoon":"⏰ Hold expires in {{days}} day(s) — extend the hold or release for production before the stock is freed.","alertExpired":"⌛ Hold expired {{days}}d ago. Stock returned to available.","kvHoldUntil":"Hold until","kvTimeLeft":"Time left","kvItems":"Items","timeOverdue":"{{days}}d overdue","timeToday":"Today","timeDays":"{{days}} days","actionCancel":"Cancel","actionExtend":"Extend hold +14d","actionRelease":"✓ Release for production","actionSetAside":"Set aside stock →","actionReinstate":"Reinstate hold →","toastCancelled":"{{reference}} cancelled — stock freed","toastExtended":"{{reference}} hold extended by 14 days","toastSetAside":"{{reference}} stock set aside — held for {{days}} days","toastReinstated":"{{reference}} hold reinstated — stock re-reserved","toastReleased":"{{count}} item(s) released to {{reference}}","toastCreated":"{{count}} reservation line(s) created","builderTitle":"New reservation","builderSub":"Set material aside against an order.","moLabel":"Manufacturing order","moPlaceholder":"Select MO…","piLabel":"Proforma # — optional reference","piPlaceholder":"e.g. PI-2026-0148","clientLabel":"Client","clientPlaceholder":"Search customer…","warehouseLabel":"Warehouse","warehouseAuto":"Auto — from available stock","holdDaysLabel":"Hold for (days)","itemsTitle":"Items to reserve","itemsEmpty":"No items yet — search below to add materials.","addItemPlaceholder":"Search material to add…","actionCreate":"Create reservation","detailSub":"Created {{date}}","piPanelLabel":"Proforma invoice","reservedItems":"Reserved items · {{count}}","lineBin":"bin {{code}}","lineOnHand":"on hand {{qty}} {{uom}}","lineShort":"⚠ short — reserved beyond available","lineShortPill":"Short","timeNone":"—","productLabel":"Product / description","productPlaceholder":"Fills from the selected manufacturing order","qtyPlaceholder":"Qty","addItem":"＋ Add item"},"kpis":{"openPutaways":"Open putaways","openPicks":"Open picks","occupancy":"Occupancy","occupancyValue":"{{pct}}%","noData":"—","expiringLots":"Expiring lots","pendingDiscrepancies":"Pending discrepancies","activeReservations":"Active reservations","captions":{"openPutaways":"Awaiting shelving","openPicks":"Released for picking","occupancy":"Of usable capacity","expiringLots":"Within 30 days","pendingDiscrepancies":"From goods receipts","activeReservations":"Holding stock now"}},"receiving":{"poStatus":{"title":"Purchase orders — receiving status","subtitle":"grouped by PI — every material PO for an order, arrived vs outstanding. Search also finds archived / closed POs.","searchPlaceholder":"Search PO, vendor, PI, material…","poCount":"{{count}} POs","itemsRecd":"{{recd}}/{{total}} items","closedOn":"closed {{date}}","cardAria":"{{po}} — {{vendor}}","archivedTitle":"Archived · closed POs","noMatch":"No purchase order matches that search.","loading":"Loading receiving status…","unlinkedPi":"Not linked to a PI","status":{"received":"Received","partial":"Partly received","awaiting":"Awaiting delivery"},"strip":{"clearedLabel":"✓ cleared for finance","clearedNote":"{{count}} POs received — balance ready to release","waitingLabel":"⏸ awaiting receipt","waitingNote":"{{count}} balances held until goods are checked in"},"badge":{"cleared":"Finance: {{amount}} balance cleared to pay","waiting":"Balance on delivery {{amount}} — unlocks when this PO is fully received","deliveryComplete":"Finance: delivery complete — balance can be released"},"drawerTitle":"PO receiving","drawerSub":"{{vendor}} · {{stream}}","drawerFinanceHead":"→ Finance handoff","drawerFinanceCleared":"Delivery complete — {{amount}} balance on delivery is cleared to pay. Finance can release it in PO Payments & Deposits.","drawerFinanceWaiting":"{{amount}} balance on delivery unlocks when this PO is fully received.","drawerFinanceComplete":"Delivery complete — the balance can be released in PO Payments & Deposits.","colLine":"Line","colOrdered":"Ordered","colReceived":"Received","colRemaining":"Remaining","receiptsLog":"Receipts log","noReceiptsYet":"No receipts recorded yet.","colPo":"PO number","colSupplier":"Supplier","colStatus":"Status","colExpected":"Estimated delivery","colFinance":"Finance"},"intro":"Each delivery becomes lots in stock, posts a Receipt movement per line, and raises Putaway tasks. Click a receipt to view its lines.","colGrn":"GRN","colVendor":"Vendor","colPo":"PO number","colStatus":"Status","colDiscrepancies":"Discrepancies","colDate":"Receipt date","discrepancyTypes":{"qty_short":"Short","qty_over":"Over","spec_fail":"Spec fail","docs_missing":"Docs missing"},"statusAll":"All","statusFilterLabel":"Filter by receipt status","searchPlaceholder":"Search receipts…","emptyTitle":"No goods receipts for this warehouse","emptyTitleAll":"No goods receipts in any warehouse","emptyDescription":"Receipts appear here once purchase orders are received into this warehouse.","emptyDescriptionAll":"Receipts appear here once purchase orders are received into any warehouse.","newDelivery":"＋ Receipt","colWarehouse":"Warehouse","colQuantity":"Quantity","colValue":"Receipt value","colReceivedBy":"Received by","discChip":"⚠ {{count}}","noValue":"—","disc":{"short":"Short shipment (under-delivered)","over":"Over shipment (extra received)","damage":"Damaged in transit","wrong":"Wrong item delivered","qc":"Quality reject (QC fail)"},"discTasks":{"short":"Request credit / chase balance","over":"Return excess / adjust PO","damage":"Raise damage claim","wrong":"Return & reorder correct item","qc":"QC hold + return to supplier"},"excess":{"undecided":"Refer to Purchasing (undecided)","return":"Return excess to supplier","keepfree":"Keep — free of charge","keepsettle":"Keep — settle the difference"},"excessTasks":{"undecided":"Purchasing: decide excess disposition","return":"Arrange return of excess","keepfree":"Confirm free-of-charge with supplier","keepsettle":"Amend PO & approve extra payment"},"delivery":{"title":"New delivery","subtitle":"Receive materials into stock","banner":"Pick any material from the master — each line becomes a lot in stock, posts a Receipt movement, and raises a Putaway task to its bin.","supplier":"Supplier *","supplierPlaceholder":"Supplier name…","receiptDate":"Receipt date *","intoWarehouse":"Into warehouse *","purchaseOrder":"Purchase orders","poSearchPlaceholder":"Search PO or vendor…","poChipsEmpty":"No open purchase orders","poChipsPickSupplier":"Pick a supplier to list their purchase orders — or search a PO number above.","poChipOtherVendor":"{{vendor}} — a receipt can only span one vendor","poNone":"— manual receipt (no PO) —","poFullyReceived":"✓ {{po}} is fully received — no open lines remain.","manualLinesTitle":"Materials","manualLinesEmpty":"No lines yet — search below to add materials to this delivery.","colMaterial":"Material","colQty":"Qty","colQtyFull":"Quantity","colUom":"Unit of measure","colBin":"Bin","addMaterialPlaceholder":"＋ Add material…","manualNote":"Manual receipt from {{supplier}}","errSupplierDate":"Enter supplier and receipt date","errWarehouse":"Pick the receiving warehouse","errNoLines":"Add at least one material with a quantity","errVendorUnknown":"Supplier \"{{supplier}}\" is not in the vendor master — pick one from the list","mapSection":"Warehouse map","mapIdleHint":"Click a shelf to see its capacity, or arm a line’s ▦ then pick a shelf","mapArmedHint":"Pick a shelf for {{code}} →","mapAllZones":"All zones","mapAssignBtn":"Assign bin from map","mapBtnShort":"Map","mapAssigned":"{{code}} → {{bin}}","shelfPct":"{{pct}}% full","shelfFree":"{{vol}} m³ free","shelfIncoming":"incoming: {{codes}}","post":"Receive into stock","posted":"Received {{count}} line(s) from {{supplier}} · putaway raised","postedWithFollowUps":"Received {{count}} line(s) · {{followUps}} follow-up task(s) raised","poLinesTitle":"Order lines · confirm received qty","poLinesCount":"{{count}} line(s)","poLinesSearch":"Search SKU or name…","dimension":"Dimension","description":"Description","quantity":"Quantity","qcRequiredPill":"QC required","footQcHold":"{{count}} line(s) → QC hold","footNeedDisposition":"{{count}} over-delivery line(s) need a disposition","poLinesNoMatch":"No order lines match your search.","storeIn":"Store in","ordered":"Ordered","recdSoFar":"Recd so far","remaining":"Remaining","thisDelivery":"This delivery","exactNote":"✓ Completes the line — PO line will close","acceptedChip":"✓ {{qty}} {{uom}} accepted to stock","heldChip":"◐ {{qty}} {{uom}} held for review","overNote":"Only the ordered balance closes the line. The {{qty}} {{uom}} excess posts to stock and is routed to the overage-approval queue until Purchasing settles it with the supplier.","disposition":"Proposed disposition","noteToPurchasing":"Note to Purchasing","notePlaceholder":"Context for the decision…","routedBadge":"▶ Routed to Purchasing: {{task}}","shortBy":"{{qty}} {{uom}} short of remaining —","underChoice":"Under-delivery handling","partialDelivery":"Partial delivery","reportIssue":"Report issue","partialNote":"◷ {{qty}} {{uom}} balance stays open on {{po}} for a later shipment","issueReason":"Reason","issueNote":"Note","followUpBadge":"▶ Follow-up task: {{task}}","summary":"{{received}} line(s) received this delivery · {{partial}} left partially open · {{held}} with held excess · {{followUps}} follow-up task(s) to raise","splitAdd":"+ Split across bins","splitAddBin":"+ Add bin","splitHint":"Split · primary bin {{bin}} takes the rest","splitBin":"Split bin","splitQty":"Split quantity","splitRemove":"Remove bin","splitPrimaryGets":"{{bin}} gets {{qty}} {{uom}}","splitOver":"Over by {{qty}} {{uom}}","errSplitExceeds":"Bin split exceeds received qty for {{name}}","reset":"Reset"},"detail":{"title":"Receipt · {{grn}}","supplier":"Supplier","receiptDate":"Receipt date","intoWarehouse":"Into warehouse","downloadForm":"Download form (01-VT)","receivedBy":"Received by","lines":"Lines","materialsReceived":"Materials received","ordered":"Ordered","thisReceipt":"This receipt","rejected":"Rejected","partialAppendix":"◷ {{qty}} balance open — partial delivery against {{grn}}","excessAppendix":"◐ {{qty}} excess (routed to overage approval)","dispositionLabel":"Disposition: {{label}}","taskLabel":"Follow-up: {{task}}","accepted":"Accepted","discChip":"{{diff}} · {{label}}","colSku":"SKU","colMaterial":"Material","colDescription":"Description","colUom":"Unit of measure","colBin":"Bin","colValue":"Value"}},"putaway":{"intro":"Received stock waiting to be shelved — work tasks by priority to keep the dock clear.","colSku":"SKU","colProduct":"Product","colQty":"Quantity","colStatus":"Status","colPriority":"Priority","statusAll":"All","statusFilterLabel":"Filter by task status","searchPlaceholder":"Search putaway tasks…","emptyTitle":"No putaway tasks for this warehouse","emptyTitleAll":"No putaway tasks in any warehouse","emptyDescription":"Putaway tasks appear here when received stock is waiting to be shelved.","printLabel":"Label","colTask":"Task","colRoute":"From → To","colWarehouse":"Warehouse","colAssignee":"Assignee","unassigned":"Unassigned","receivingZone":"RECEIVING","noBinYet":"—","summary":"Tasks {{total}} · Open {{open}}","drawer":{"title":"Putaway · {{task}}","qty":"Qty","from":"From","suggested":"Suggested bin","noSuggestion":"—","receivingZone":"RECEIVING","putIntoBin":"Put into bin","confirm":"✓ Confirm putaway","confirmedToast":"Task put away to {{bin}}","assignee":"Assignee","unassigned":"Unassigned","created":"Created","lastUpdated":"Last updated","assignedToast":"Task assigned to {{name}}","unassignedToast":"Task unassigned","splitAdd":"+ Split across bins","splitBin":"Split bin","splitQty":"Split quantity","splitRemove":"Remove split","splitPrimaryQty":"Remaining to the primary bin","splitPrimaryGets":"{{bin}} gets {{qty}}","splitOver":"Over by {{qty}}","splitExceeds":"Split exceeds task quantity ({{qty}})","confirmedSplitToast":"Put away across {{count}} bins"},"colReference":"Reference","colMaterials":"Materials","colProgress":"Progress","colUpdated":"Updated","sourceTransfer":"Transfer","sourceReceipt":"Receipt","linesCount":"{{count}} lines","multipleAssignees":"Multiple","unassignedGlyph":"?","noUpdate":"—","ticketSummary":"Tickets {{total}} · Open {{open}}","ticketSearchPlaceholder":"Search ticket, reference, material…","ticketStatus":{"pending":"Pending","in_progress":"In progress","waiting":"Waiting","completed":"Completed"},"ticket":{"title":"Putaway ticket · {{ref}}","subtitle":"{{warehouse}} · {{count}} lines","transferKicker":"Transfer — destination putaway","receiptKicker":"Receipt — putaway","transferWaitingCopy":"⏳ Waiting on the source pick. Confirm the pick, then put all lines away here.","transferActiveCopy":"Put every line away to its bin — the transfer completes when the last line lands.","receiptCopy":"Put every received line into its storage bin to complete the delivery.","assigneeLabel":"Assignee (whole ticket)","unassigned":"Unassigned","linesHeading":"Lines · {{count}}","putIntoBin":"Put into bin","fromLocation":"· from {{from}}","qtyThisBin":"Qty · this bin","receivingZone":"RECEIVING","splitAdd":"+ Split across bins","splitBin":"Split bin","splitQty":"Split quantity","splitRemove":"Remove split","splitRemoveGlyph":"×","checkGlyph":"✓","totalPrefix":"Total ","totalOf":" / {{qty}} {{uom}}","totalShort":" · {{qty}} short","overBy":"⚠ over by {{qty}} {{uom}}","shortCopy":" not put away — written off and manager alerted.","shortReason":"Reason","shortNote":"Note","shortNotePlaceholder":"what's wrong…","shortFallback":"short","doneLine":"{{qty}} {{uom}} → {{bin}}","doneShortSuffix":" · ⚠ {{qty}} {{reason}}","waitingLine":"⏳ Waiting on the source pick — unlocks once picked into transit.","managerLabel":"Alert manager (for flagged shortfalls)","managerPlaceholder":"Select manager…","managerRequired":"Select a manager to alert for the flagged shortfalls","overToast":"Check qty for {{sku}} — total can't exceed {{qty}}","confirm":"✓ Confirm putaway · {{count}} lines","confirmedToast":"{{ref}}: {{count}} lines put away","confirmedShortToast":" · ⚠ {{count}} flagged","confirmedShortToastManager":" · ⚠ {{count}} flagged — {{manager}} alerted","openSourcePick":"Open source pick →","confirmBlockedOver":"Cannot confirm: {{sku}} is over-allocated by {{over}} (ticket quantity is {{qty}}). Lower the bin quantities so the total is no more than {{qty}}."}},"movements":{"intro":"The full movement journal for this warehouse — receipts, issues, transfers, and adjustments.","introAll":"The full movement journal across all warehouses — receipts, issues, transfers, and adjustments.","colDate":"Date","colType":"Type","colSku":"SKU","colProduct":"Product","colDescription":"Description","colQty":"Quantity","colUom":"Unit of measure","colFrom":"From","colTo":"To","colReference":"Reference","colVoucher":"Voucher number","typeAll":"All types","typeFilterLabel":"Filter by movement type","fromDate":"From","toDate":"To","windowHint":"Showing the last {{days}} days by default. Clear the From date to see older movements.","searchPlaceholder":"Search movements…","emptyTitle":"No movements for this warehouse","emptyTitleAll":"No movements in any warehouse","emptyDescription":"Receipts, issues, transfers, and adjustments touching this warehouse appear here.","emptyDescriptionAll":"Receipts, issues, transfers, and adjustments across all warehouses appear here.","transferChip":"TRF {{ref}}","colLocation":"Location","colWarehouse":"Warehouse","colBy":"By","displayType":{"receipt":"Receipt","issue":"Issue","used":"Used","return":"Return","transfer":"Transfer","adjustment":"Adjustment","rtv":"Return to vendor"},"adjust":{"title":"Record adjustment","subtitle":"Correct on-hand against a count","material":"Material","materialPlaceholder":"Search SKU or name…","description":"Description","lineNoteLabel":"Notes","lineNotePlaceholder":"Note for this line…","materialsSection":"Raw materials","resultSku":"SKU","resultName":"Name","warehouse":"Warehouse","bin":"Bin","countedQty":"Counted qty","delta":"Delta","deltaEmpty":"—","reason":"Reason","approverLabel":"Approving manager","approverPlaceholder":"Select manager…","noteLabel":"Note","notePlaceholder":"Detail for the audit trail…","zeroDelta":"No change to record — counted equals on hand.","post":"Record adjustment","postedToast":"Adjustment recorded for {{sku}}","postBatch":"Record {{count}} adjustments","postedBatchToast":"{{count}} adjustments recorded","batchFailedAt":"Posted {{done}} of {{total}} adjustments before an error.","linesEmpty":"Search above to add materials — each one gets its own count line.","onHandLabel":"On hand now:","onHandValue":"{{qty}} {{uom}} · {{warehouse}}","noBins":"No bins","noBinsHint":"This warehouse has no storage locations defined yet — add zones/bins under Inventory → Warehouses."},"colStatus":"Status","requestStatus":{"posted":"Posted","pending":"Pending","in_transit":"In transit","in_progress":"In progress","waiting":"Waiting","completed":"Completed","cancelled":"Cancelled"},"lineState":{"waiting":"Waiting","in_transit":"In transit","landed":"Landed"},"lifecycle":{"title":"{{type}} · {{ref}}","subtitle":"{{name}} · {{sku}}","bannerKicker":"Request status","bannerAtomicCopy":"Posted directly to the ledger — an atomic entry with no downstream tasks. It cannot be edited; correct it with another movement.","bannerSequenceCopy":"This request runs as a sequence of tasks. Each main task below groups its own subtasks and links to its worklist.","sequenceHeading":"Task sequence","checkGlyph":"✓","openArrow":"{{label}} →","productHeading":"Product","detailFrom":"From","detailTo":"To","detailReason":"Reason","detailOrderRef":"Order ref","detailRaised":"Raised","detailPick":"Pick list","linesHeading":"Lines ({{count}})","thMaterial":"Material","thQty":"Quantity","thBin":"Bin","thState":"State","badgeRequest":"Request","badgePick":"Pick","badgePutaway":"Putaway","badgeDone":"Done","badgeReceipt":"Receipt","phaseRequestTitle":"Transfer request","phasePickTitle":"Pick task","phasePickTitleRef":"Pick task · {{ref}}","phasePutawayTitle":"Putaway task","phaseDoneTitle":"Transfer complete","phaseReceiptTitle":"Delivery received","phaseInStockTitle":"In stock","phaseAtomicTitle":"{{type}} posted","metaRaised":"Raised {{date}} · {{from}} → {{to}}","metaRaisedOrder":"Raised {{date}} · {{from}} → {{to}} · {{order}}","metaReceipt":"{{ref}} · into RECEIVING · {{warehouse}}","metaCompleted":"Completed {{date}}","metaLanded":"{{done}} of {{count}} lines landed at {{warehouse}}","metaDonePutaway":"Done {{date}}","metaIntoTransit":"Into transit {{date}}","metaInStock":"Put away into storage bin","metaAtomic":"{{qty}} {{uom}} · by {{by}} · {{date}}","metaAtomicReason":"{{reason}} · {{qty}} {{uom}} · by {{by}} · {{date}}","subReserved":"Stock reserved at source","subReservedSub":"Availability held at {{warehouse}}","subReservedDone":"Released — fully picked","subReservedProgress":"{{committed}} of {{count}} lines committed","subPull":"Pull materials at source","subPullSub":"Pick the {{count}} lines at {{warehouse}}","subTransit":"Picked into transit","subTransitSub":"Posted into In-Transit, awaiting putaway","subPutaway":"Putaway · {{id}}","subPutawaySub":"{{product}} → bin {{bin}} at {{warehouse}}","subPutawaySubAssignee":"{{product}} → bin {{bin}} at {{warehouse}} · {{assignee}}","subPutawayWaitingMeta":"Waiting on the source pick","subPutawayFallback":"Destination putaway","subPutawayFallbackSub":"One task per line, routed IN-TRANSIT → destination bin","subAwaitingPutaway":"Awaiting putaway","subAwaitingPutawaySub":"No putaway task linked","openPick":"Open pick task","openTask":"Open task","openReceipt":"Open receipt"}},"transfers":{"intro":"Transfer orders touching this warehouse — draft, pick, ship, and receive between sites.","colRef":"Reference","colDirection":"Direction","inbound":"Inbound","outbound":"Outbound","colRoute":"Route","colState":"Status","colLines":"Lines","colRequested":"Requested","colPicked":"Picked","colReceived":"Received","colVariance":"Variance","colCreated":"Created","colProduct":"Product","colQty":"Quantity","colFromBin":"From bin","colToBin":"To bin","fefoSuggest":"FEFO","fefoSuggestTitle":"Suggest earliest-expiry lot and bin (FEFO)","fefoNoStock":"No available lots to suggest for this product in the source warehouse.","lineFefoLot":"Lot {{lot}}","stateFilterLabel":"Filter by status","stateAll":"All","stateLabels":{"draft":"Draft","picked":"Picked","in_transit":"In transit","received":"Received","cancelled":"Cancelled"},"newTransfer":"New transfer","emptyTitle":"No transfers","emptyDescription":"No transfer orders touch this warehouse yet. Create one to move stock between warehouses.","searchPlaceholder":"Search transfer pick, reference…","sourceWarehouse":"From warehouse","sourceWarehousePlaceholder":"Select source…","destWarehouse":"To warehouse","destPlaceholder":"Select destination…","sameWarehouseError":"Source and destination warehouses must be different.","notesLabel":"Notes","notesPlaceholder":"Optional notes","linesTitle":"Items to move","linesEmpty":"No items yet — search above to add materials to this transfer.","addProductPlaceholder":"Search a material by SKU or name to add it…","createDraft":"Create draft","detailTitle":"Transfer","cancelledBanner":"This transfer was cancelled: {{reason}}","bookingLabel":"Shipping booking (optional)","bookingPlaceholder":"Booking / vehicle reference","cancelReasonLabel":"Cancel reason","cancelReasonPlaceholder":"Why is this transfer cancelled?","actionCancel":"Cancel transfer","actionConfirmCancel":"Confirm cancel","actionPick":"Pick items","actionShip":"Mark in transit","actionReceive":"Receive into stock","reasonLabel":"Reason","otherReasonLabel":"Reason detail","otherReasonPlaceholder":"Describe why this transfer is needed…","orderRefLabel":"For order","orderRefPlaceholder":"e.g. PI-2026-104","reasons":{"replenish":"Replenish pick face","consolidate":"Consolidate stock","kiln":"Move to kiln","relocate":"Relocate / reorganize","qualityHold":"Quality hold","resupply":"Inter-warehouse resupply","other":"Other"},"recordTransfer":"Record transfer","recordTransferSub":"Creates a pick at the source and a linked putaway at the destination","orderRefHint":"— PI / PO, optional","pickPutawayInfo1":"Recording this raises a ","pickPutawayPick":"pick list","pickPutawayInfo2":" at the source and a ","pickPutawayPutaway":"putaway task","pickPutawayInfo3":" at the destination, both linked to the transfer. Stock leaves the source when the pick is confirmed and lands when the putaway is done — until then the quantity shows as ","pickPutawayCommitted":"committed","pickPutawayInfo4":".","binPlaceholder":"Select bin…","lineAvailabilityLabel":"available {{warehouse}}:","lineAvailabilityValue":"{{qty}} {{uom}}","lineCommitted":"{{qty}} committed","linesCount_one":"{{count}} item","linesCount_other":"{{count}} items","validationNoLines":"Add at least one material","validationQtyRequired":"Enter a quantity for every item","validationBinRequired":"Choose a from bin and a to bin for every item","validationSameBin":"From and to bin are the same","downloadForm":"Download transfer slip (03/XKNB)","assignedPicker":"Assigned picker","assignedReceiver":"Receiving staff","assigneePlaceholder":"Select staff…","errQcHold":"A lot on this transfer is in QC hold — clear IQC before moving it.","errReserved":"Not enough free stock — part of this quantity is reserved for another document."},"palletSlip":{"printButton":"Print pallet slips","blockedDraft":"Pallet slips are saved when the receipt is posted. Post this receipt first, then print its slips.","blockedCancelled":"This receipt was cancelled, so it has no pallet slips. Record a new receipt to get slips.","modalTitle":"Pallet slips — {{grn}}","savedBanner":"Receipt posted. Its pallet slips are saved and numbered — print them now, or any time later from the receipt.","loading":"Loading pallet slips…","retry":"Try again","empty":"This receipt has no pallet slips yet (it was posted before slips were saved).","createButton":"Create pallet slips","creating":"Creating…","createBlocked":"Creating slips needs receiving edit rights. Ask a user with receiving edit access to create them, then print here.","colNumber":"Pallet no.","colItem":"Item","colQty":"Quantity","colBin":"Bin","colPrinted":"Printed","printedTimes_one":"{{count}} time","printedTimes_other":"{{count}} times","neverPrinted":"Not printed yet","printOne":"Print","printAll":"Print all ({{count}})","previewLabel":"Slip preview","markFailed":"The slips were sent to the printer, but the print count could not be saved: {{message}}","form":{"header":"{{company}} - {{code}} - {{form}} (v9)","warehouseTitle":"WAREHOUSE PALLET SLIP","warehouseFormName":"Warehouse pallet slip","productionTitle":"PRODUCTION PALLET SLIP","productionFormName":"Production pallet slip","palletNo":"Pallet number","lot":"Lot / supplier lot","documents":"Documents","docPo":"PO no.","docPnk":"Receipt (PNK)","docPxk":"Issue (PXK)","supplier":"Supplier / customer-supplied","itemCode":"Item code (material / product code)","itemName":"Item name","description":"Description","qtyUom":"Quantity - UoM","packages":"Packages / cartons on pallet","receivingDate":"Receiving date","weight":"Weight (kg)","source":"Source","srcSupplier":"Supplier","srcCustomer":"Customer supplied","srcProduction":"Production receipt","srcReturned":"Returned goods","receivingWarehouse":"Receiving warehouse","whRaw":"Raw materials","whSemi":"Semi-finished","whFinished":"Finished goods","storageLocation":"Storage location","locZone":"Zone","locRack":"Rack","locBin":"Bin","deliveredBy":"Delivered by (signature)","storekeeper":"Storekeeper received","date":"Date","prodLot":"Production lot / work order","docWo":"Work order","docPi":"PI","docHandover":"Stage handover note","customerOrder":"Customer / order","productCode":"Product code","productName":"Product name","partAssembly":"Part / assembly","productionDate":"Production date","stage":"Stage → next stage","teamShiftMachine":"Team / shift / machine","workshopLocation":"Temporary workshop location","teamHandover":"Team handing over (signature)","nextStageReceived":"Next stage / semi-finished storekeeper received"}},"allWarehouses":"All warehouses","views":{"label":"Workspace view","board":"Flow board","boardSub":"Overview & tasks","records":"Records & forms","recordsSub":"Full tables & data entry"},"newRecord":{"button":"New record","heading":"Create — one shared set of forms","items":{"grn":"Goods receipt (GRN)","movement":"Stock movement / adjustment","transfer":"Transfer order","pick":"Pick ticket","returnToStock":"Return to stock","returnToVendor":"Return to vendor","reservation":"Reservation","dispatch":"FG dispatch","fgReceipt":"Receive finished goods (from MO)"}},"board":{"queueTitle":"Task queue","emptyBucket":"Nothing here","tasksUnavailable":"Live task data is unavailable right now — counts and the queue will fill in once the workspace tasks service responds.","rows":{"comingIn":"Coming in — supplier to shelf","hub":"Hub","goingOut":"Going out — fulfil an order","moving":"Moving — between warehouses","production":"Production → finished goods","backToVendor":"Back to vendor","checkFix":"Check & fix"},"nodeTitles":{"receive":"Receiving","putaway":"Put away","ledger":"Stock Ledger","picks":"Picking","returns":"Returns","xfpicks":"Transfer","reservations":"Reservations","fg":"FG Receipt","dispatch":"Dispatch","rtv":"Vendor returns","corrections":"Corrections"},"captions":{"receive":"check & log delivery","putaway":"to a bin","ledger":"Every movement lands here — the single source of truth","picks":"pull for orders","returns":"leftovers back","xfpicks":"wh → wh","reservations":"set aside for PI","fg":"from production","dispatch":"ship to customer","rtv":"send to supplier","corrections":"fix a miscount"},"buckets":{"now":"Now","next":"Next up","blocked":"Blocked","done":"Done"},"taskTypes":{"putaway":"Put away","transfer":"Transfer","material_return":"Return to stock","rtv":"Vendor return","reservation":"Reservation","fg_qc":"QC release","dispatch":"Dispatch"},"mapShow":"Show flow map","mapHide":"Hide flow map","mapCaption":"how work moves through the warehouse","queueSubtitle":"live from the same records — click a card to open it","taskSearchPlaceholder":"Search task, ref, route…","typeAll":"All","legendHint":"Click any step to open its list","legend":{"in":"Coming in","move":"Moving","out":"Going out","vendor":"To vendor","check":"Check & fix"},"hubStatItems":"items on hand","hubStatValue":"stock value","hubStatLow":"low / reorder","hubTitle":"On the shelf — Stock Ledger","hubSub":"Everything physically in the building. Click to open the full ledger."},"returns":{"intro":"Leftover material from a finished production order goes back here. Pick the order, enter the leftover qty per batch and its condition — reusable stock returns to a bin; scrap is written off.","create":"New return to stock","emptyTitle":"No returns to stock yet","emptyDescription":"Record a return when leftover material comes back from production.","searchPlaceholder":"Search return, order…","colCode":"Return number","colOrder":"Order","colLines":"Lines","colReturnedQty":"Returned to stock","colWarehouse":"Warehouse","colCreated":"Created","colStatus":"Status","statusLabels":{"DRAFT":"Draft","SUBMITTED":"Submitted","CONFIRMED":"Posted","REJECTED":"Rejected"},"grades":{"A":"Class A — Premium","B":"Class B — Standard","C":"Class C — Economy"},"reasons":{"excess":"Excess — not consumed","damaged":"Damaged / below standard","order_cancelled":"Order cancelled","no_payment":"No payment — order on hold","wrong_item":"Wrong item picked","other":"Other — add comment"},"builderTitle":"Record return to warehouse","builderBanner":"Select the pending delivery order. The system lists the entire batch that was picked & delivered to manufacturing — fill in the qty returned to stock, qty scrapped and grade for each batch.","colBin":"Destination bin","binDefaultOption":"Default bin","batchCount":"{{count}} batch(es)","summary":"Returns {{total}} · Draft {{draft}}","locationPlaceholder":"Select bin / location…","batchTitle":"Details on returns per batch","colMaterial":"Lot / Material","colIssued":"Quantity issued to manufacturing","colReturned":"Qty returned to stock","colReturnedFull":"Quantity returned to stock","colScrapped":"Qty scrapped","colScrappedFull":"Quantity scrapped","colBalance":"Balance consumed","colProportion":"Proportion","colGrade":"Grade","colReasonReturn":"Reason for return","exceedsIssued":"⚠ Exceeds {{qty}} issued","commentLabel":"Comment","commentPlaceholder":"Add comment…","balanceFootnote":"Balance consumed = issued − returned − scrapped (what production actually used). Returned posts back to its bin; scrapped is written off. Set the recovered grade and a reason per batch.","actionSaveDraft":"Save draft","actionPost":"✓ Post return","toastPosted":"Return {{id}} posted — stock is back on the shelf","toastDraftSaved":"Return {{id}} saved as draft","toastRejected":"Return {{id}} rejected","detailTitle":"Return ·","notePosted":"Returned quantities were posted back to stock in {{warehouse}} on {{date}}.","noteDraft":"Posting puts the returned quantities back on the shelf — one return movement per batch. Scrapped quantities are recorded but not added to stock.","kvOrder":"Order","kvLines":"Lines","kvRejectReason":"Reject reason","rejectReasonLabel":"Reason for rejection","actionReject":"Reject","actionConfirmReject":"Confirm reject","actionConfirm":"✓ Confirm — post to stock","lineBin":"bin {{bin}}","statIssued":"Issued","statReturned":"Returned","statScrapped":"Scrapped","statBalance":"Balance","slip":{"printCta":"Print return slip","printButton":"Print","title":"MATERIAL RETURN SLIP","subtitle":"Post-production material return","companyName":"Company name","companyAddress":"","docNo":"No.: {{id}}","metaOrder":"Source order","metaWarehouse":"Returned to warehouse","metaReturnedBy":"Department","metaDepartmentValue":"Production","metaDate":"Date","colNo":"Row number","colMaterial":"Material","colLot":"Lot","colIssued":"Quantity issued","colReturned":"Quantity returned","colScrapped":"Quantity scrapped","colCondition":"Condition (grade · reason)","totalLabel":"Total returned ({{count}} line(s))","sigReturnedBy":"Returned by (Production)","sigSupervisor":"Production supervisor","sigWarehouse":"Warehouse confirmation","sigHint":"(Sign and print full name)"},"detailSub":"{{order}} · {{product}} · {{date}}","builderSub":"Select the delivery / PX pick list, then enter qty returned, qty scrapped and grade per batch.","piBannerTitle":"Return against proforma","builderEditTitle":"Edit return · {{id}}","toastDraftUpdated":"Return {{id}} updated","colTimes":"Times","timesValue":"{{count}}×","timesHistoryRow":"used {{consumed}} · scrapped {{scrapped}} · grade {{grade}}","pxLabel":"Delivery order / Pick list (PX #)","pxLabelHint":"— carries all material delivered to the order","pxPlaceholder":"Select a PX…","contextLine":"{{client}} · {{mo}} · PI {{pi}} · {{product}} ×{{qty}}","contextWarehouse":"Warehouse: {{warehouse}} — returned qty posts back into its bins.","builderBannerNote":"\"SL\" on the source form means quantity.","emptySelectPx":"Select a PX above to load the batch delivered to that order.","colPieces":"Wood pieces","colPiecesFull":"Wood pieces","colReturnedSize":"Returned size","colNote":"Note","returnedSizePlaceholder":"e.g. 20×40×500mm","postBlockedNoQty":"Nothing to post yet: enter a returned or scrapped quantity on at least one line.","postBlockedOver":"Cannot post: a line returns or scraps more than was issued. Lower that quantity so it fits the issued balance.","postBlockedNoBin":"Cannot post: a line being returned has no destination bin. Pick a bin on every returned line, or save as draft and finish later."},"fg":{"intro":"This tab is the finished-goods stock itself. Completed production is received here as a finished-goods lot (traceable to its MO), held in QC until released, then kept as sellable stock until it is picked for a customer delivery. Click a product to see its lots and release QC holds. Reservations, by contrast, does not hold stock — it only sets existing stock aside for an order.","emptyTitle":"No finished goods in scope","emptyDescription":"Receive finished goods from a completed manufacturing order to build sellable stock.","receiveCta":"Receive from production","kpis":{"sellableValue":"Sellable value","sellableValueCaption":"{{count}} product(s)","sellableOnHand":"Sellable on hand","sellableOnHandCaption":"ready to ship","qcHold":"In QC hold","qcHoldCaption":"{{count}} lot(s) awaiting release","openDispatches":"Open dispatches","openDispatchesCaption":"draft / picked"},"views":{"label":"Finished goods view","byProduct":"By product","byPi":"By PI","hintProduct":"Finished goods grouped by product — expand to see the PIs behind each count","hintPi":"Finished goods grouped by proforma (PI) — expand to see the products & lots for each PI"},"searchProduct":"Search finished product…","searchPi":"Search PI, product…","colExpand":"Expand","colProduct":"Finished product","colPis":"PIs","colSellable":"Sellable","colQcHold":"QC hold","colLots":"Lots","colBin":"Location","colValue":"Value","colPi":"Proforma (PI)","colProducts":"Products","colLot":"Lot","colMo":"Manufacturing order","colStatus":"Status","colQty":"Quantity","colReceived":"Received","noPi":"— no PI —","moreCount":"+{{count}}","footerProducts":"{{count}} product(s) · sellable value {{value}}","footerPis":"{{count}} PI(s) · value {{value}}","footerProductsNoPrice":"{{count}} product(s)","footerPisNoPrice":"{{count}} PI(s)","expandTitle":"Contributing lots · PI → MO","openDetail":"Open full detail & QC release","emptyLots":"No active lots.","lotStatus":{"available":"Sellable","quarantine":"QC hold","expired":"Expired","consumed":"Depleted"},"kv":{"sellable":"Sellable","qcHold":"QC hold","lots":"Lots","unitCost":"Unit cost"},"metaPi":"PI {{pi}}","metaMo":"MO {{mo}}","metaBin":"Bin {{bin}}","metaReceived":"Received {{date}}","release":"Release to sellable","releaseToast":"{{lot}} released — now sellable","drawerEmpty":"No active lots — receive from production to add stock.","receive":{"title":"Receive from production","sub":"Log finished product from a customer order (PI) into inventory","banner":"Pick the customer, then their proforma (PI) — its ordered finished goods load below. Each nonzero split becomes a finished-goods lot: straight to sellable stock or into QC hold (release once inspected).","customerLabel":"Customer *","customerPlaceholder":"— select customer —","piLabel":"Proforma (PI) *","piPlaceholder":"— select PI —","pickCustomerFirst":"— pick customer —","noConfirmedPi":"No confirmed proformas for this customer — confirm a PI first.","itemsTitle":"Ordered finished goods","emptyItems":"Select a customer and PI to load the ordered items.","totalLabel":"Received total","sellableLabel":"→ Sellable qty","qcLabel":"→ QC hold qty","perBoxLabel":"Units / box","warehouseLabel":"Warehouse","sellableBinLabel":"Sellable bin","qcBinLabel":"QC bin","noWo":"No open manufacturing order for this product — it cannot be received yet.","itemsRequired":"Enter a sellable or QC quantity on at least one receivable item.","submit":"Receive into stock","toastMulti":"{{count}} lot(s) received for {{pi}}","receiptDateLabel":"Receipt date","receivedByLabel":"Received by","receivedByPlaceholder":"— select staff —"},"lotsHead":"Lots · {{count}}","metaBom":"BOM {{bom}}","metaBoxes":"{{boxes}} box(es) · {{perBox}}/box","metaOfReceived":"of {{received}}"},"dispatch":{"intro":"Dispatch is driven by a customer SO / PI — pick sellable finished goods against the order, then ship. Shipping posts an Issue movement and draws the picked lots down. Click a dispatch to advance it.","emptyTitle":"No dispatches yet","emptyDescription":"Create a dispatch to pick and ship finished goods against a customer sales order.","newCta":"New dispatch","summary":"{{count}} dispatches · open {{open}}","searchPlaceholder":"Search dispatch, SO, PI, customer…","expandHint":"Click a row to expand item / SKU detail","colExpand":"Expand","colDispatch":"Dispatch number","colCustomer":"Customer","colItems":"Items","colStatus":"Status","colLogistics":"Logistics","colCarrier":"Carrier","colCreated":"Created","colBy":"By","unassigned":"Unassigned","colProduct":"Product","colSku":"SKU","colLot":"Lot","colLotStatus":"Lot status","colQty":"Quantity","colBin":"Bin","itemsValue":"{{qty}} units","logisticsInTransit":"In transit","logisticsDelivered":"Delivered","detailTitle":"Items · {{count}} · {{pi}}","detailLoading":"Loading items…","detailEmpty":"No items on this dispatch.","notAllocated":"— not allocated —","openDispatch":"Open dispatch","statusLabels":{"draft":"Draft","ready":"Ready","picking":"Picking","picked":"Picked","shipped":"Shipped","delivered":"Delivered","cancelled":"Cancelled"},"drawerTitle":"Dispatch · {{id}}","banner":"Customer delivery — {{client}}: pick sellable finished goods against {{order}}, then ship. Shipping posts Issue movements.","bannerShipped":"Shipped {{date}} · {{carrier}} · {{tracking}}","lineAvail":"sellable {{qty}}","lineShort":"short — only {{qty}} sellable","profile":{"title":"Customer shipping profile","portFrom":"Port of departure","portTo":"Port of arrival","carrier":"Preset carrier","incotermMode":"Incoterm · Mode","source":"from {{client}} profile"},"carrierLabel":"Carrier","carrierPlaceholder":"e.g. Gemadept Logistics","trackingLabel":"Tracking #","trackingPlaceholder":"Tracking / BOL","pickArrow":"Pick stock →","shipArrow":"Ship →","pickToast":"{{id}} picked — ready to ship","shipToast":"{{id}} shipped to {{client}}","cancelToast":"{{id}} cancelled","gin":{"printCta":"Print delivery note","printButton":"Print","loading":"Preparing the delivery note…"},"issueNote":{"printCta":"Print goods issue note","printButton":"Print","title":"GOODS ISSUE NOTE","companyName":"Company name","companyAddress":"","formCode":"Form 02 - VT","docNo":"No.: {{id}}","dateLine":"Date: {{date}}","metaCustomer":"Receiver (customer)","metaSoRef":"Sales order","metaWarehouse":"Issued from warehouse","metaDate":"Delivery date","colNo":"Row number","colProduct":"Product","colSku":"SKU","colLot":"Lot","colQty":"Quantity","colUom":"Unit of measure","totalLabel":"Total ({{count}} line(s))","sigPreparer":"Prepared by","sigStorekeeper":"Storekeeper","sigDeliverer":"Deliverer","sigReceiver":"Receiver","sigHint":"(Sign and print full name)"},"builder":{"title":"New dispatch","sub":"Pick finished goods for a customer delivery","banner":"Pick the customer, then their proforma (PI) — its finished goods load below. On Pick stock, lines are allocated from sellable lots (FEFO); shipping posts Issue movements.","customerLabel":"Customer *","customerPlaceholder":"— select customer —","piLabel":"Proforma (PI) *","piPlaceholder":"— select PI —","pickCustomerFirst":"— pick customer —","noConfirmedPi":"No confirmed proformas for this customer — confirm a PI before dispatching.","linesTitle":"Finished goods to ship","linesEmpty":"Select a customer to load their finished goods.","linesEmptyPi":"Select a proforma (PI) to load its items.","addProduct":"Add product","colProduct":"Product","colQty":"Quantity to ship","colAvail":"Available (sellable)","availHint":"{{qty}} sellable","noSellable":"no sellable stock","submitBlockedNoStock":"Can't create this dispatch yet: none of its products has sellable stock in this warehouse. Receive the stock or move it to a sellable bin, or choose another warehouse, then create the dispatch.","submit":"Create dispatch","createToast":"Dispatch {{id}} created","warehouseLabel":"Warehouse","scope":"{{count}} product(s) available","assigneeLabel":"Assign to","assigneePlaceholder":"— unassigned —","metaBom":"BOM {{bom}}","blockedTitle":"Before you can create this dispatch","blockedCustomerWhat":"No customer selected","blockedCustomerWhy":"A dispatch is made for one customer. Pick the customer at the top of this form.","blockedPiWhat":"No order (PI) selected","blockedPiWhy":"The goods are picked against a confirmed PI. Pick the customer's PI above; if none is listed, ask Sales to confirm it.","blockedLinesWhat":"No line has a quantity","blockedLinesWhy":"Enter a quantity above 0 on at least one product line.","blockedWarehouseWhat":"No warehouse selected","blockedWarehouseWhy":"Choose the warehouse the goods leave from. If the list is empty, ask an administrator to give you a warehouse.","blockedNoStockWhat":"No sellable stock in this warehouse","blockedNoStockWhy":"None of the products to ship has sellable stock here. Receive the stock or move it to a sellable bin, or choose another warehouse."},"itemsHead":"Items · {{count}}","assignedTo":"Assigned to {{name}}","actionsLoading":"Loading this dispatch — try again in a moment.","blockedActionsTitle":"Why some actions are unavailable"},"rtv":{"intro":"Send received material back to a supplier — quality issues, shipping damage, wrong item, over-delivery or warranty. Approving posts the stock decrement; shipping and settlement are tracked to close.","colCode":"Code","colVendor":"Vendor","colStatus":"Status","colCreated":"Created","searchPlaceholder":"Search returns…","emptyTitle":"No returns to vendor","emptyDescription":"Raise a return when defective stock must go back to a vendor.","newRtv":"+ New return to vendor","summary":"RTVs {{total}} · Open {{open}} · {{value}}","summaryNoValue":"RTVs {{total}} · Open {{open}}","colOrigin":"Origin","colReason":"Primary reason","colSettlement":"Settlement","colLines":"Lines","colValue":"Value","detailTitle":"RTV ·","notePendingApproval":"Awaiting approval from {{approver}}. Approving posts the stock decrement.","noteApproved":"Approved — stock removed from bins. Ready to ship to vendor.","noteShipped":"Shipped {{date}} · {{carrier}}. Awaiting settlement: {{settlements}}.","noteClosed":"Closed — settlement received.","noteDraft":"Draft — assign an approver and submit for approval to post the stock decrement.","kvVendor":"Vendor","kvContact":"Contact","kvOrigin":"Origin","kvRaisedBy":"Raised by","kvPo":"Original PO","builderEditTitle":"Edit return · {{id}}","kvApprover":"Approver","kvValue":"Value","lineQtyReturned":"−{{qty}}","lineQtyReturnedWithUom":"−{{qty}} {{uom}}","shipBanner":"Confirm the goods have physically left for {{vendor}}. Stock was already removed at approval — this records when it shipped and how, so the RTV can be tracked to settlement ({{dispositions}}).","shipDate":"Ship date","shipCarrier":"Carrier","shipTracking":"Tracking / waybill #","shipTrackingPlaceholder":"e.g. GHN-778120","shipNote":"Shipment note — optional","carriers":{"vendor_pickup":"Vendor pickup","ghn":"GHN","viettel_post":"Viettel Post","jt_express":"J&T Express","kerry_express":"Kerry Express","company_vehicle":"Company vehicle","other":"Other"},"assignApprover":"Assign approver","selectApprover":"Select approver…","actionCancel":"Cancel RTV","actionSubmit":"Submit for approval →","actionReject":"Reject","actionApprove":"✓ Approve & post","actionMarkShipped":"→ Mark shipped","actionBack":"Back","actionConfirmShip":"✓ Confirm shipment","actionCloseSettled":"✓ Close (settled)","actionSaveDraft":"Save draft","toastCancelled":"{{id}} cancelled","toastSubmitted":"{{id}} submitted for approval","toastRejected":"{{id}} sent back to draft for revision","toastApproved":"{{id}} approved · stock removed","toastShipped":"{{id}} marked shipped","toastClosed":"{{id}} closed — settlement received","toastDraftSaved":"{{id}} saved as draft","builderTitle":"New return to vendor","builderSub":"Pick the origin & vendor, add the material lines being sent back, then submit for approval.","originLabel":"Origin","vendorLabel":"Vendor","vendorPlaceholder":"Select vendor…","vendorLoading":"Loading vendor…","poLabel":"Original PO — reference","poPlaceholder":"e.g. PO-2026-104","poNote":"Original PO: {{po}}","grnLabel":"GRN / delivery ref","grnPlaceholder":"Select GRN…","contactLabel":"Vendor contact — for the RTV / debit notice","contactPlaceholder":"Name · phone / email","linesTitle":"Materials to return","linesEmpty":"Pick a vendor, then add the materials being sent back.","colMaterial":"Material","colOnHand":"On hand","colQtyReturn":"Qty to return","colQtyReturnFull":"Quantity to return","colNote":"Note","notePlaceholder":"Optional…","overOnHand":"⚠ Only {{qty}} on hand","duplicateMaterial":"That material is already on the list","addMaterialPlaceholder":"Search material to add…","selectVendorFirst":"Select a vendor first to add materials.","printCta":"Print goods issue note","slip":{"printButton":"Print","title":"GOODS ISSUE NOTE","subtitle":"(Return to vendor)","companyName":"Company name","companyAddress":"","formCode":"Form 02 - VT","docNo":"No.: {{id}}","dateLine":"Date: {{date}}","metaVendor":"Receiver (vendor)","metaContact":"Vendor contact","metaOrigin":"Origin","metaPo":"Original PO","metaGrn":"Goods receipt (GRN)","metaWarehouse":"Issued from warehouse","colNo":"Row number","colMaterial":"Material","colLot":"Lot","colBin":"Bin","colQty":"Quantity","colReason":"Reason","totalLabel":"Total ({{count}} line(s))","sourceTitle":"Source document","sourcePo":"Purchase order","sourceGrn":"Goods receipt","sourceWarehouse":"Warehouse","sourceBins":"Bin location(s)","sigPreparer":"Prepared by","sigReceiver":"Receiver","sigStorekeeper":"Storekeeper","sigDeliverer":"Deliverer","sigDirector":"Director","sigHint":"(Sign and print full name)"},"detailSub":"{{vendor}} · {{po}} · {{date}}","noPo":"no PO","linesHeader":"Materials returned ({{count}})","lineLabelQtyReturned":"Qty returned","lineLabelValue":"Value","evidenceHeader":"{{count}} photo(s) / evidence attached","evidenceEmpty":"No evidence photos attached","photoAdd":"Attach evidence photo","photoRemove":"Remove photo","photoAlt":"Evidence photo","photoUploadFailed":"Could not upload the photo","photoDeleteFailed":"Could not remove the photo","downloadForm":"Download issue slip (02-VT)","submitBlockedNoVendor":"Cannot submit: pick the supplier you are returning goods to.","submitBlockedNoQty":"Cannot submit: enter a return quantity on at least one line.","submitBlockedOver":"Cannot submit: a line returns more than is on hand. Lower that quantity to what the warehouse holds.","submitBlockedNoApprover":"Cannot submit for approval: choose an approver above. You can still save as draft and submit later."},"xfpicks":{"intro":"Source picks raised when a warehouse transfer is created — they pull stock at the source and post it into transit. Receiving the transfer at the destination then lands the stock into its bin.","summary":"Transfers {{total}} · Open {{open}}","productionPicksBadge":"{{n}} production picks in progress (tablet)","colOrderRef":"Order ref","colPurpose":"Purpose","purposeTransfer":"Transfer","viewSequence":"View full task sequence →","sourcePickBanner":"Transfer — source pick · {{from}} → {{to}}","bannerOpenCopy":"Confirming pulls these materials from the source and posts them into transit — receiving the transfer at {{to}} then lands the stock.","bannerTransitCopy":"Stock is in transit. Receiving lands it into the bin at {{to}} and completes the transfer.","bannerDoneCopy":"Picked into transit — completed on {{date}}.","actionConfirmPick":"✓ Confirm pick — release to transit"},"lotQuality":{"intro":"Every received batch is a lot — traced from receiving through each pick → return cycle. See what is on hand now alongside how it performed, and roll it up by vendor to decide who to reorder from.","viewLabel":"View","viewByLot":"By lot","viewByVendor":"By vendor","colLot":"Lot ID","colMaterial":"Material","colCategory":"Category","colVendor":"Vendor","colReceived":"Received","colDelivered":"Delivered","colRemaining":"Remaining","colTimes":"Times","colGrades":"Grade in → now","colScrap":"Scrap+DOA","colYield":"Usable yield","summary":"Lots {{count}} · On hand {{value}} · Avg yield {{avgYield}}%","summaryNoPrice":"Lots {{count}} · Avg yield {{avgYield}}%","searchPlaceholder":"Search lot, material, vendor…","emptyTitle":"No lots in scope","emptyDescription":"Received batches appear here with their quality history.","gridFootnote":"Remaining is computed live from movements. Times = pick → return cycles this lot has been through. Click a row to open the full lot history.","vendorEmptyTitle":"No vendor data","vendorEmptyDescription":"Vendor scorecards build up as lots are received and used.","vendorFootnote":"Rates are weighted by delivered value so materials with different units compare fairly. Preferred = yield ≥ 88% & scrap ≤ 5%; Watch = scrap ≤ 12%; Review = higher loss — reconsider before reordering.","vendorSub":"{{lots}} lot(s) · {{materials}} material(s)","vendorStatus":{"preferred":"Preferred","watch":"Watch","review":"Review"},"heroLabel":"Usable yield","metricScrap":"Scrap + damage rate","metricDoa":"Damage on arrival","metricCycles":"Avg times before scrap","metricAtGrade":"Delivered at/above grade","metricValue":"Delivered value","drawerTitle":"Lot history ·","drawerSub":"{{material}} · {{vendor}}","kvDelivered":"Delivered","kvTimes":"Times pulled","kvYield":"Usable yield","kvRemaining":"On lot now","gradeReceived":"received (ordered {{ordered}})","verdictDegraded":"Degraded in use","verdictHolding":"Holding grade","statConsumed":"Consumed","statReturned":"Returned","statScrapped":"Scrapped","timelineUnavailable":"Totals across every pick → return cycle. Per-cycle quantities, order and grade are not available yet.","viewVendorScorecard":"View {{vendor}} scorecard","receivedFrom":"Received {{date}} · from {{vendor}}","qualityHeading":"Quality — receiving vs. as used","cyclesHeading":"Pick → return cycles ({{count}})","cyclesEmpty":"Not yet issued to production — no cycles recorded.","timelineHeading":"Lot timeline ({{count}})","timelineEmpty":"No lifecycle events recorded for this lot yet."}},"warehouseMap":{"cellLabel":"{{rack}}.{{shelf}}","cellPct":"{{pct}}%","zoneLabel":"Zone: {{zone}}","legendLow":"Low (<60%)","legendMid":"Medium (60–85%)","legendHigh":"High (>85%)","legendBlocked":"Blocked","legendUnknown":"Unknown","ariaCell":"Location {{code}}, {{status}}","statusBlocked":"blocked","statusUnknown":"occupancy unknown","statusPct":"{{pct}}% full","allZones":"All zones","capacityByZone":"Capacity by zone","zonePct":"{{pct}}%","zoneFree":"{{vol}} m³ free","zoneNoCapacity":"no capacity set","zoneRacks":"{{count}} racks","zoneCells":"{{count}} bins","capacity":"Capacity","maxVolume":"Max volume","freeVolume":"Free volume","volumeUnit":"m³","itemCount":"Item count","contents":"Contents","empty":"No items in this location","colProduct":"Product","colLot":"Lot","colQty":"Quantity","title":"Warehouse Map","description":"Visual occupancy map of all warehouse locations.","rackLabel":"Rack {{rack}}","freeSpace":"{{vol}} m³ free"},"pickLists":{"title":"Pick lists","description":"Pick lists tell warehouse staff which lots to pull, in FEFO order, for each job.","emptyTitle":"No pick lists yet","emptyDescription":"Pick lists are created when a production or sales order needs stock pulled. None exist yet.","filterAll":"All","searchPlaceholder":"Search pick lists","colCode":"Pick number","colPurpose":"Purpose","colStatus":"Status","status":{"pending":"Pending","in_progress":"In progress","completed":"Completed","cancelled":"Cancelled"},"purpose":{"production":"Production","shipping":"Shipping","transfer":"Transfer","adjustment":"Adjustment"},"helpIntro":"Pick lists tell warehouse staff exactly which lots to pull, in FEFO order, to fulfil a production or sales order.","helpStep1":"Filter by status to focus on pending or in-progress picks.","helpStep2":"Open a pick list to see each line: product, suggested lot, location, and quantity.","helpStep3":"Pull the suggested lots and confirm each line as you go.","helpStep4":"Once every line is picked, the list moves to completed.","helpTip1":"Lots are suggested first-expiry-first-out (FEFO); pull the suggested lot rather than a fresher one."},"cycleCounts":{"status":{"planned":"Planned","in_progress":"In progress","count_review":"Count review","completed":"Completed","cancelled":"Cancelled"},"scope":{"full":"Full","zone":"Zone","location":"Location","product_class":"Product class","abc_class":"ABC class"}},"overages":{"title":"Overages","description":"Overages are receipts of more stock than the purchase order expected, held for approval.","emptyTitle":"No overages to review","emptyDescription":"An overage is logged when a receipt exceeds its purchase order quantity. Nothing is awaiting approval right now.","searchPlaceholder":"Search overages","colId":"Overage","colExpected":"Expected","colReceived":"Received","colOverage":"Over","colPct":"Over %","helpIntro":"Overages are receipts of more stock than the purchase order expected, held here for approval before they post.","helpStep1":"Search to find a specific overage record.","helpStep2":"Compare expected, received, and over quantities for each line.","helpTip1":"A high over-percentage may signal a supplier or counting error worth checking before approval.","approve":"Approve","reject":"Reject","approved":"Overage approved","rejected":"Overage rejected","approveTitle":"Approve overage","rejectTitle":"Reject overage","decisionSubtitle":"Surplus of {{overage}} ({{pct}}% over the ordered quantity).","reasonLabel":"Reason","reasonPlaceholder":"Why this overage is approved or rejected (required)."},"receiving":{"title":"Receive Against PO","description":"Select one or more purchase orders from the same vendor and record the quantities received.","sectionSelectPOs":"Select Purchase Orders","searchPOPlaceholder":"Search by PO number or vendor (type 2+ chars)...","removePO":"Remove PO","vendorLocked":"Vendor locked to {{vendor}} — only POs from this vendor can be added.","vendorMismatchHint":"different vendor","errorVendorMismatch":"All selected purchase orders must be from the same vendor.","emptySelectPO":"Search and select a purchase order above to start receiving.","emptyNoOpenLines":"All lines on the selected purchase orders are fully received.","colProduct":"Product","colOrdered":"Ordered","colPending":"Pending","colQtyReceived":"Qty Received","colQtyReceivedFull":"Quantity Received","colQtyRejected":"Qty Rejected","colQtyRejectedFull":"Quantity Rejected","colLocation":"Location","colSupplierLot":"Supplier Lot","pickLocation":"Pick location","supplierLotPlaceholder":"Optional lot ref","sectionMap":"Select location for: {{line}}","errorLocationRequired":"All lines must have a storage location assigned before posting.","pinRequired":"PIN co-sign required","operatorShortId":"Operator ID (email prefix)","operatorShortIdPlaceholder":"e.g. john.doe","submitButton":"Receive & Post","successPosted":"Goods receipt created and posted successfully.","sectionScan":"Scan","scanHint":"Scan a PO barcode to add it, or a product barcode to count a received unit on its line.","scannedLine":"Counted 1 unit of {{product}}","scannedPo":"Added PO {{po}}","scanMultiple":"Multiple POs match — pick one from the list below.","scanNoMatch":"No matching PO or open line for {{code}}.","chipLines":"{{count}} lines","pickShelf":"Pick a shelf →","clearLocation":"clear","footLocated":"{{located}}/{{total}} located"},"qcHold":{"title":"QC Hold Queue","description":"Goods-receipt lines awaiting QC inspection. Release each line by passing, failing, or partially accepting it.","helpIntro":"The QC Hold Queue shows all inventory lines that must be inspected before being released to a final storage location.","helpStep1":"Click the Inspect action on a row to open the inspection panel.","helpStep2":"Choose Pass, Fail, or Partial and fill in the required details.","helpStep3":"Confirm — stock moves to the final location (Pass/Partial) or is flagged with a reason (Fail).","helpTip1":"Use Partial when only some of the quantity passes inspection.","colGrn":"GRN number","colProduct":"Product","colQuantity":"Quantity","colLot":"Lot","colQuarantineLocation":"Quarantine Location","colReceivedDate":"Received Date","emptyTitle":"No items on QC hold","empty":"All goods-receipt lines have been inspected. Nothing is currently held for QC.","searchPlaceholder":"Search by GRN or product...","actionInspect":"Inspect","drawerTitle":"Inspect — GRN {{grn}}","summaryQty":"Qty: {{qty}}","summaryLot":"Lot: {{lot}}","selectResult":"Inspection result","acceptedQty":"Accepted quantity","acceptedQtyHint":"Must be greater than 0 and at most {{max}}","selectWarehouse":"Warehouse","selectLocation":"Final storage location","locationSelected":"Selected: {{id}}","noLocations":"No locations available for this warehouse.","failReason":"Rejection reason","failReasonPlaceholder":"Describe why this lot is being rejected...","confirmAction":"Confirm {{result}}","actionSuccess":"QC decision recorded successfully.","result":{"passed":"Pass","failed":"Fail","partial":"Partial"}},"shortage":{"title":"Material shortage","body":"Work order {{wo}} is short on {{count}} components"},"returnInbox":{"title":"Return inbox","empty":"No returns awaiting confirmation","newLocation":"New location ID","confirm":"Confirm","reject":"Reject","rejectedReason":"Rejected by warehouse","downloadForm":"Download form","selectWarehouse":"Select warehouse","pickLocation":"Pick location","locationChosen":"Location: {{code}}","rejectReasonLabel":"Reject reason","product":"Product"},"pickTickets":{"crumb":"Inventory · Warehouse operations","title":"Pick Lists","descriptionLead":"Every pick list raised against open","descriptionEmphasis":"proformas (dự trù)","descriptionTail":"— with live stage, shortages and follow-ups. Open one to reload its detail, or start a new pick.","newTicket":"New pick list","noWarehouse":"No active warehouse found. Create a warehouse before creating pick lists.","kpiOpen":"Open picks","kpiFollowUp":"Need follow-up","kpiPicking":"Picking now","kpiClosed":"Closed","colTicket":"Ticket","colReference":"Reference","colFor":"For","colMaterials":"Materials","colShort":"Short","colStage":"Stage","colRound":"Round","colFollowUp":"Follow-up","colPicker":"Picker","colCreated":"Created","colValue":"Value","followUp":{"partial":"Round {{round}} · {{short}} to finish","shortTask":"Shortage task raised","picking":"Reconciling on floor","queued":"Awaiting picker","draft":"Planning","none":"—"},"searchPlaceholder":"Search pick tickets","emptyTitle":"No pick tickets yet","emptyDescription":"Create a pick list and add orders to consolidate their materials for the warehouse.","stage":{"draft":"Draft","queued":"Queued","picking":"Picking","partial":"Partially picked","closed":"Closed"},"closeKind":{"fulfilled":"Fulfilled","short":"Closed short"},"shortReason":{"not_on_shelf":"Stock not on shelf","count_short":"Physical count short","damaged":"Damaged / rejected on pick","reserved_elsewhere":"Reserved for another order","qc_hold":"Quarantine / QC hold","awaiting_replenishment":"Awaiting replenishment","other":"Other…"},"detailDescription":"Consolidated materials across the selected orders. Adjust quantities, release to the floor, and post what was pulled.","backToList":"All pick lists","sourcesTitle":"Orders in this pick","noSources":"No orders added yet — search below to add one.","sourceSearchPlaceholder":"Search sales orders…","addMaterialPlaceholder":"Add material not in an order…","addMaterial":"Add material","kpiMaterials":"Materials","kpiShortLines":"Short lines","kpiPosted":"Posted as used","kpiOutstanding":"Outstanding","partialBanner":"Round {{round}} — earlier rounds are posted; the remainder is still open.","closedShortBanner":"Shortfall communicated back to planning.","closedFulfilledBanner":"Fully picked — all planned quantities posted as Used to the Stock Ledger.","prCreated":"Purchase request {{number}} created from the outstanding lines.","reservedBanner":"Stock is reserved for this ticket ({{count}} active reservations). Reservations release automatically when a round posts.","reservedChip":"{{qty}} held","pickerLabel":"Picker","pickerUnassigned":"Unassigned","tabAll":"All materials","tabOther":"Other","colMaterial":"Material","colRequired":"Required","colOnHand":"Available / on hand","colLocation":"Location","colPlanned":"Pick qty","colPlannedFull":"Pick quantity","colPulled":"Pulled","colPosted":"Posted","colReason":"Reason","colShortagePr":"Shortage PR","rowCreatePr":"Create PR","reasonPlaceholder":"Reason for short…","reasonRequiredNote":"Every shortfall needs a reason before posting.","extraBadge":"Added","noLines":"No materials yet — add an order or a manual line.","actionRelease":"Release to pick queue","actionReserve":"Reserve available stock","actionUnreserve":"Release reserved stock","actionRecall":"Recall to draft","actionStart":"Start picking","actionPostFulfil":"Confirm fulfilment — post used","actionPostKeepOpen":"Post — keep open to finish later","actionPostShortClose":"Post — send shortage to planning","actionResume":"Resume — pick remaining {{count}}","actionShortClose":"Close & send shortage to planning","actionReopen":"Reopen pick","actionCreatePr":"Create PR from shortage","postConfirmTitle":"Post this round?","postConfirm":{"fulfil":"All pulled quantities will be posted as used stock and the pick will close as fulfilled.","keep_open":"Pulled quantities will be posted as used; the remainder stays open for another round.","short_close":"Pulled quantities will be posted as used; the pick closes short and a shortage task goes to planning."},"lineStatus":{"ready":"Ready","partial":"Partial","short":"Short","picked":"Picked","flagged":"Flagged","note_needed":"Note needed","skipped":"Skipped","outstanding":"Outstanding"},"stepper":{"draft":"Plan quantities and orders","queued":"Released, waiting on the floor","picking":"Reconciling pulled quantities","closed":"Posted and archived","round":"Round {{round}}"},"removeLine":"Remove line","requiredBy":"Required by","manualLine":"Manually added line","stockLocations":"Stock locations","noStock":"No available stock in this warehouse.","primaryBin":"Primary","quantities":"Quantities","colStatus":"Status","actionGenerateTicket":"Generate pick ticket","actionReprintTicket":"Reprint ticket","printTicket":{"companyName":"Company name","companyAddress":"","docCode":"Doc code","docCodeValue":"KHO-BM-DNCP-01","docVersion":"Version","docVersionValue":"1.0","docDate":"Date","formTitle":"MATERIAL ISSUE REQUEST","formSubtitle":"Giấy đề nghị cấp phát vật tư","ticketNo":"Ticket no.","requestDate":"Request date","requestedBy":"Requested by","department":"Department","departmentValue":"Warehouse","purpose":"Purpose","purposeValue":"Issue materials for production","orders":"Orders","usageLocation":"Usage location","usageLocationValue":"Production floor","colSeq":"Row number","colName":"Material / tool name","colCode":"Code","colUom":"Unit of measure","colRequested":"Quantity requested","colIssued":"Quantity issued","colNotes":"Notes","totalItems":"TOTAL — {{count}} items","sigRequester":"Requester","sigKeeper":"Warehouse keeper","sigReceiver":"Recipient","sigHint":"(Sign and print full name)","printButton":"Print","assignPicker":"Assign picker","sigBlank":"____________"},"piSearchPlaceholder":"Add a proforma (PI)…","kpiOpenSub":"in progress","kpiFollowUpSub":"partial or short","kpiPickingSub":"on the floor","kpiClosedSub":"this period","kpiMaterialsSub":"lines on this ticket","kpiShortLinesSub":"need attention","kpiPostedSub":"posted as used stock","kpiOutstandingSub":"still to pick","metaCardLabel":"Pick ticket","metaCardCreated":"Created {{date}}","sourcesTitleNumbered":"{{n}} · Sources in this pick","sourceItems":"{{count}} items","stepperMeta":{"picker":"Picker {{name}}","released":"Released {{date}}","closed":"Closed {{date}}"},"partialBannerRich":"{{count}} outstanding — earlier rounds are posted; the remainder is still open.","partialRoundChip":"ROUND {{round}} POSTED","taskChip":"TASK {{code}}","affectsLabel":"Affects","affectsShortChip":"{{qty}} {{uom}} short","bannerPicked":"{{qty}} picked","bannerToGo":"{{qty}} {{uom}} to go","bannerShortBy":"short {{qty}} {{uom}}","footerTicket":"Ticket","footerShort":"{{count}} short","footerCoverable":"All lines coverable from stock","footerPicker":"Picker: {{name}}","footerOutstanding":"{{count}} outstanding to pick","reservedElsewhere":"Reserved −{{qty}} {{uom}}","toast":{"reserved":"Stock reserved for this ticket","released":"Released to the pick queue","postedFulfil":"Posted — pick fulfilled","postedKeepOpen":"Posted — remainder kept open for another round","postedShortClose":"Posted — shortage sent to planning"},"nothingToPickYet":"Nothing to pick yet","reasonNotePlaceholder":"Describe…","partialBannerTail":"Picked quantities are on the ledger. Resume when the shortfall is replenished.","actionPostShortCloseHint":"Post everything picked, close this pick, and raise a shortage task to purchasing for the {{count}} unfilled line(s).","actionPostKeepOpenHint":"Post everything picked as Used now, but keep this pick open. The {{count}} unfilled line(s) stay outstanding so you can pick the rest once stock is replenished."}},"products":{"readinessLink":"Check import readiness","readinessLinkTitle":"Check many BOM workbooks before importing them (read-only)","title":"Products","description":"Manage your product catalog, raw materials, and components","helpIntro":"The product catalog holds every item you buy, make, or sell. Each product carries its type, status, cost, and price.","helpStep1":"Use the search box to find a product by SKU, name, or barcode.","helpStep2":"Open Filters to narrow the list by type or status.","helpStep3":"Click Add Product to create a new item, or click a row to open and edit it.","helpTip1":"Set a product to Active once it is ready to be used in orders or production.","addProduct":"Add Product","viewDetails":"View details","searchPlaceholder":"Search by SKU, name, or barcode...","filters":"Filters","clearFilters":"Clear Filters","allTypes":"All Types","allStatuses":"All Statuses","showing":"Showing","of":"of","products":"products","page":"Page","noProductsFound":"No products found","noCustomer":"No customer","getStarted":"Get started by adding your first product","tryAdjusting":"Try adjusting your filters","failedToLoad":"Failed to load products","tryAgain":"Try again","loadingRest":"Showing the first {{shown}} of {{total}} products — loading the rest…","type":"Type","typeLabels":{"raw_material":"Raw Material","component":"Component","finished_good":"Finished Good","service":"Service","consumable":"Consumable"},"statusLabels":{"draft":"Draft","active":"Active","discontinued":"Discontinued","obsolete":"Archived"},"bomStackFoot":"Edit the parts, wood and hardware here; master data stays on the row Edit action.","tableHeaders":{"sku":"SKU","name":"Name","description":"Description","type":"Type","status":"Status","cost":"Cost","price":"Price","onHand":"On-hand","stockValue":"Stock value","customer":"Customer","unit":"Unit","wood":"Wood","paint":"Paint"},"detail":{"backToProducts":"Back to Products","productNotFound":"Product not found","activating":"Activating...","activate":"Activate","basicInfo":"Basic Information","pricing":"Pricing","capabilities":"Capabilities","inventorySettings":"Inventory Settings","sku":"SKU","barcode":"Barcode","type":"Type","nameEnglish":"Name (English)","nameVietnamese":"Tên (Vietnamese)","description":"Description","standardCost":"Standard Cost","listPrice":"List Price","purchasable":"Purchasable","sellable":"Sellable","manufacturable":"Manufacturable","trackInventory":"Track Inventory","trackLots":"Track Lots","trackSerials":"Track Serials","reorderPoint":"Reorder Point","reorderQty":"Reorder Qty","safetyStock":"Safety Stock","leadTime":"Lead Time","days":"days"},"form":{"newProduct":"New Product","editProduct":"Edit Product","addDescription":"Add a new product to your catalog","editDescription":"Update product details","basicInfo":"Basic Information","pricing":"Pricing","capabilities":"Capabilities","inventory":"Inventory","sku":"SKU","skuPlaceholder":"e.g., RAW-001","barcode":"Barcode","optional":"Optional","productNameEnglish":"Product Name (English)","productNameVietnamese":"Tên sản phẩm (Vietnamese)","type":"Type","category":"Category","selectCategory":"Select category...","unitOfMeasure":"Unit of Measure","selectUnit":"Select unit...","description":"Description","standardCostVND":"Standard Cost (VND)","listPriceVND":"List Price (VND)","canBePurchased":"Can be Purchased","canBeSold":"Can be Sold","canBeManufactured":"Can be Manufactured","trackInventory":"Track Inventory","trackLots":"Track Lots/Batches","trackSerials":"Track Serial Numbers","reorderPoint":"Reorder Point","reorderQuantity":"Reorder Quantity","safetyStock":"Safety Stock","leadTimeDays":"Lead Time (days)","saveChanges":"Save Changes","createProduct":"Create Product","loadError":"Failed to load product","saveError":"Failed to save product","skuPreview":"SKU Preview","customer":"Customer","customerItemNo":"Customer item no.","customerItemNoHint":"The customer's own item / SKU number, printed under our SKU on PIs and quotes.","selectCustomer":"Select customer...","productType":"Product Type","selectProductType":"Select product type...","variantChar":"Variant","selectVariantChar":"Select variant...","version":"Version","dimensions":"Dimensions W×D×H (cm)","widthShort":"W","depthShort":"D","heightShort":"H"},"kpi":{"products":"Products","productsSub":"in catalog","active":"Active","activeSub":"ready to sell","inProgress":"In progress","inProgressSub":"draft / pending","customers":"Customers","customersSub":"with products"},"categories":{"title":"Product Categories","description":"Organize products into hierarchical categories","helpIntro":"Categories group your products into a hierarchy so the catalog stays easy to browse and report on.","helpStep1":"Use the search box to find an existing category.","helpStep2":"Click New Category to add one, giving it a name and an optional parent.","helpStep3":"Pick a parent category to nest it, or leave it empty to create a root category.","helpTip1":"Keep the hierarchy shallow so products stay easy to find.","backToProducts":"← Products","newCategory":"New Category","addCategory":"Add Category","editCategory":"Edit Category","searchPlaceholder":"Search categories...","tryAgain":"Try again","code":"Code","categoryName":"Category Name","categoryNamePlaceholder":"e.g. Electronics, Raw Materials","nameEnglish":"Name (English)","nameVietnamese":"Name (Vietnamese)","parentCategory":"Parent Category","categoryDescription":"Description","categoryDescPlaceholder":"Brief description of this category","noParent":"No parent (root category)","noCategories":"No categories yet","noCategoriesDesc":"Create categories to organize your products","createFirst":"Create your first category to organize products","saving":"Saving...","creating":"Creating...","cancel":"Cancel","saveChanges":"Save Changes","create":"Create","confirmDelete":"Are you sure you want to delete this category?","confirmDeleteMessage":"Are you sure you want to delete this category? All products in this category will become uncategorized.","toasts":{"categoryCreated":"Category created successfully","categoryDeleted":"Category deleted successfully","categoryUpdated":"Category updated successfully"}},"confirmDeleteMessage":"Are you sure you want to delete this category? All products in this category will become uncategorized.","fields":{"accountingUnit":"Accounting Unit","sameAsStock":"(same as stock unit)","conversionFactor":"Conversion Factor","conversionPreview":"1 {{stockUom}} = {{factor}} {{acctUom}}","qcRequired":"QC Required","defaultLocation":"Default Location","loadingLocations":"Loading locations…"},"crumb":"Catalog","bulkImport":"Bulk import (CSV)","bulkImportTitle":"Bulk CSV import — coming soon","addProductTitle":"Add a new product","tabsAll":"All","rawMaterialsElsewhere":"Raw materials are listed on the Materials page.","rawMaterialsLink":"Open Materials","tabsAriaLabel":"Filter products by type","bulkDelete":{"action":"Delete ({{n}})","selected":"{{n}} selected","selectAllMatching":"Select all {{n}} matching","allMatchingSelected":"All {{n}} matching products selected","confirmTitleDelete_one":"Delete the selected product?","confirmTitleDelete_other":"Delete {{n}} products?","confirmTitleArchive_one":"Archive the selected product?","confirmTitleArchive_other":"Archive {{n}} products?","confirmTitleBoth":"Delete or archive {{n}} products?","confirmTitleDeleteOf":"Delete {{n}} of {{total}} products?","confirmTitleArchiveOf":"Archive {{n}} of {{total}} products?","confirmTitleBothOf":"Delete or archive {{n}} of {{total}} products?","confirmDelete_one":"{{n}} is used nowhere and will be deleted.","confirmDelete_other":"{{n}} are used nowhere and will be deleted.","confirmArchive_one":"{{n}} will be archived because it is used.","confirmArchive_other":"{{n}} will be archived because they are used.","confirmKept_one":"{{n}} will be kept as it is.","confirmKept_other":"{{n}} will be kept as they are.","confirmArchiveNote":"Archived products leave pickers and searches but stay on their documents. You can restore them from the Archived filter.","confirmCtaDelete":"Delete {{n}}","confirmCtaArchive":"Archive {{n}}","confirmCtaBoth":"Delete and archive","confirmTitleDeleteNamed":"Delete “{{name}}”?","confirmTitleArchiveNamed":"Archive “{{name}}”?","confirmDeleteOne":"Nothing uses it, so it will be deleted.","confirmArchiveOne":"It is in use (see below), so it will be archived instead of deleted.","confirmCtaDeleteOne":"Delete","confirmCtaArchiveOne":"Archive","listDelete_one":"{{n}} to delete","listDelete_other":"{{n}} to delete","listArchive_one":"{{n}} to archive (in use)","listArchive_other":"{{n}} to archive (in use)","listKept_one":"{{n}} kept","listKept_other":"{{n}} kept","moreRows":"and {{n}} more","tooMany":"{{n}} products are selected, but one bulk delete takes at most {{max}}. Narrow the list with search or filters first.","progress":"Deleting and archiving {{done}} of {{total}}…","doneTitle_one":"{{n}} product deleted or archived","doneTitle_other":"{{n}} products deleted or archived","doneMessage":"Deleted: {{deleted}} · Archived: {{archived}}.","doneDeletedNamed":"“{{name}}” deleted","doneArchivedNamed":"“{{name}}” archived because it is in use","doneArchivedHint":"Restore it from the Archived filter.","noneDeletable_one":"The selected product can be neither deleted nor archived.","noneDeletable_other":"None of the {{n}} selected products can be deleted or archived.","keptNote_one":"{{n}} kept.","keptNote_other":"{{n}} kept.","keptPreviewShowWhy_one":"{{n}} will be kept. Show why","keptPreviewShowWhy_other":"{{n}} will be kept. Show why","keptShowWhy_one":"{{n}} was kept. Show why","keptShowWhy_other":"{{n}} were kept. Show why","reason":{"not_found":"Not found or already deleted","family_finishes_not_selected":"Base of finishes that are not selected","archive_not_allowed":"In use, and you may not archive products","already_archived":"In use and already archived"},"idleHint":"Select rows to act on several products at once."},"rowActions":{"clone":"Clone","cloning":"Cloning…","cloneDone":"Cloned into new draft {{sku}}.","cloneError":"Couldn't clone {{sku}}. Nothing was created — try again."}},"productCodeFate":{"freed":"Code {{code}} will be freed and can be used again.","usedOn":"Code {{code}} stays reserved because it is used on {{doc}} {{ref}}.","usedOnMore":"Code {{code}} stays reserved because it is used on {{doc}} {{ref}} (and {{n}} more).","usedIn":"Code {{code}} stays reserved because it is used in {{kind}}.","bomApproved":"Code {{code}} stays reserved because its BOM is approved.","reserved":"Code {{code}} stays reserved.","freedCount_one":"{{n}} code will be freed and can be used again.","freedCount_other":"{{n}} codes will be freed and can be used again.","reservedCount_one":"{{n}} code stays reserved (used, or BOM approved).","reservedCount_other":"{{n}} codes stay reserved (used, or BOM approved).","doc":{"pi":"PI","so":"SO","quote":"quotation","po":"PO","pr":"PR","rfq":"RFQ","grn":"GRN","work_order":"work order","sample":"sample request","worksheet":"pricing worksheet","invoice":"invoice","bill":"vendor bill","einvoice":"e-invoice","bom":"BOM","stock_count":"stock count","transfer":"transfer order","pick_ticket":"pick ticket","lot":"lot","paint_formula":"paint formula"}},"productArchive":{"archive":"Archive","restore":"Restore","close":"Close","refusedTitle":"“{{name}}” can’t be deleted","refusedMessage":"It’s still used in the places below. Archive it instead: it leaves pickers and searches, and stays on these records.","refusedMessageNoArchive":"It’s still used in the places below. Someone who can edit products can archive it instead.","archived":"“{{name}}” archived","restored":"“{{name}}” restored","archiveFailed":"Couldn’t archive “{{name}}”. Try again.","restoreFailed":"Couldn’t restore “{{name}}”. Try again.","bulkArchiveTitle":"Archive selected items ({{count}})?","bulkArchiveMessage":"They leave pickers and searches and stay on existing records. Find them again under Status: Archived.","bulkRestoreTitle":"Restore selected items ({{count}})?","bulkRestoreMessage":"They come back to pickers and searches.","bulkArchived":"Archived: {{count}}","bulkRestored":"Restored: {{count}}","bulkFailed":"Couldn’t update the selected items. Try again.","filterLabel":"Status","filter":{"active":"Active","archived":"Archived","all":"All"},"archivedHint":"Archived: hidden from pickers and searches","opensInNewTab":"opens in a new tab","andMore":"and {{count}} more"},"bomWorkspace":{"photo":{"title":"Product photos","count_one":"{{count}} photo","count_other":"{{count}} photos","empty":"No product photos yet — add some, drop images on this card, or re-import the BOM file that contains one.","emptyNoRight":"No product photos yet. You cannot add one because your role does not have the “edit stock” right — ask an administrator or a stock manager to add it, or to give you that right.","addPhotos":"Add photos","main":"Main","setMain":"Set as main","remove":"Remove","removeConfirm":{"title":"Remove this photo?","message":"The photo is removed from this product. The main photo does not change.","mainNext":"This is the main photo. After removing it, the next photo becomes the main photo on documents and lists.","mainLast":"This is the product's only photo. After removing it, documents and lists show no product photo until you add one."},"removed":"Photo removed","removeError":"The photo could not be removed. Reload the page and try again.","mainSet":"Main photo changed","mainError":"The main photo could not be changed. Reload the page and try again.","view":"View product photo","viewNumber":"View photo {{index}}","viewerTitle":"Photo {{index}} of {{total}}","prev":"Previous photo","next":"Next photo","loadError":"The product photos could not be loaded.","retry":"Retry","progress":"{{percent}}%","dismiss":"Dismiss","uploaded_one":"{{count}} photo added","uploaded_other":"{{count}} photos added","uploadPartial":"{{added}} added, {{failed}} not added — see the reason next to each file.","uploadAllFailed_one":"The photo was not added — see the reason next to the file.","uploadAllFailed_other":"{{count}} photos were not added — see the reason next to each file.","fileWrongType":"Not added: this file type is not supported. Use a JPG, PNG or WebP image.","fileTooLarge":"Not added: the file is larger than 5 MB. Make it smaller and add it again.","fileUploadFailed":"Not added: the upload failed. Check your connection and add it again."},"paintGroups":{"own":"This customer’s colours","all":"Other colours"},"line":{"materialDeleted":"Material deleted"},"finishFamily":{"saveFirst":"Save your changes first.","mergedInto":"Merged into {{sku}}","shares":"Shares {{base_sku}}'s BOM.","openBase":"Open {{base_sku}}","editHint":"Only wood, grade, paint and the material of a part (a plating, a fabric colour) can differ for this finish (its paint comes from the paint formula on its variant chip); everything else is edited on the base.","paintFromFormula":"This finish's paint comes from its paint formula {{code}} (set on its variant chip). The finishing lines below are {{base_sku}}'s and read-only here.","paintFromFormulaNone":"Set a paint code on this finish's variant chip — its paint comes from that paint formula. The finishing lines below are {{base_sku}}'s and read-only here.","readOnlyHint":"Read-only here: the BOM is edited on the base.","detach":"Use its own BOM","detachTitle":"Give this product its own BOM?","detachBody":"{{sku}} gets its own draft BOM, copied from what it uses now, and stops sharing {{base_sku}}'s BOM and approval.","detachConfirm":"Use its own BOM","detached":"{{sku}} now has its own BOM.","detachError":"Couldn't give this product its own BOM.","attach":"Share base BOM","attachPickLabel":"BOM to share","attachOption":"{{letter}} · {{sku}}","attachTitle":"Share {{base_sku}}'s BOM?","attachBody":"{{sku}} will use {{base_sku}}'s BOM and keep only its own wood, grade, paint and part materials. Its own BOM is kept as a version snapshot.","attachConfirm":"Share BOM","attached":"Now sharing {{base_sku}}'s BOM.","attachError":"Couldn't share the base BOM.","save":"Save finish","saved":"Finish saved.","saveError":"Couldn't save the finish.","baseValue":"Base: {{value}}","none":"none","reset":"Reset"},"finishChip":{"title":"Finish {{sku}}","edit":"Set wood and paint of {{sku}}","hint":"This finish's paint comes from the paint formula picked here. Everything else is edited on the base.","species":"Wood species","paint":"Paint code","paintOption":"{{code}} · {{name}}","paintScope":"Every colour in the paint library — this customer's own listed first.","noPaints":"No colours in the paint library yet.","none":"None","noPaintWarn":"Without a paint code this finish publishes no paint and its worksheet uses the base's finishing lines.","notInLibrary":"{{value}} (not in the list)","setPaint":"Set paint code","cancel":"Cancel","save":"Save wood and paint","saving":"Saving wood and paint…","saved":"Wood and paint saved for {{sku}}.","saveError":"Couldn't save the finish's wood and paint.","changePaint":"Change paint code","paintsLoading":"Loading colours…","paintsError":"Couldn't load colours.","retry":"Try again","notListedHint":"Not in the paint library. Pick a listed code."},"labels":{"title":"Labels","count":"{{count}} labels","countOne":"{{count}} label","hint":"Each product keeps its own labels, even on a shared BOM.","add":"Add label","save":"Save labels","saved":"Labels saved.","saveError":"Couldn't save the labels.","loading":"Loading labels…","loadError":"Couldn't load the labels.","retry":"Retry","empty":"No labels yet","invalid":"Every label needs a name and a quantity above 0.","aria":{"name":"Label {{n}} name","spec":"Label {{n}} spec","qty":"Label {{n}} quantity","unit":"Label {{n}} unit","notes":"Label {{n}} notes","remove":"Remove label {{n}}"},"cols":{"pos":"Row number","name":"Label","material":"Material","spec":"Spec","qty":"Quantity","unit":"Unit","notes":"Notes"},"picker":{"select":"Select material…","search":"Search materials…","empty":"No materials match"}},"skuFamily":{"base":"Base","toConfirm":"Please review SKU","open":"Open the BOM of {{sku}}","confirmLetter":"Mark SKU reviewed","letterConfirmed":"SKU {{sku}} marked as reviewed.","confirmLetterError":"Couldn't mark the SKU as reviewed. Try again.","modeLabel":"Kind of variant","modeNew":"New finish or fabric","modeNewHint":"A new product with the next free letter; it copies this BOM. Change its wood, paint colour or cushion fabric below.","modeExisting":"Existing product","modeExistingHint":"One of this customer's products becomes a finish of this model. Its own BOM stays as it is.","pickLabel":"Product","pickPlaceholder":"Search this customer's products…","pickOption":"{{sku}} — {{name}}","newSku":"New SKU","dash":"—","confirm":"Add as variant","cancel":"Cancel","confirmTitle":"Make {{sku}} a finish of this model?","confirmMessage":"Its SKU becomes {{sku}}. Its current number {{old}} is left unused. The new SKU is marked for review until someone checks it.","joined":"Added as {{sku}}.","joinError":"Couldn't add it as a variant. Try again.","paintNotSet":"paint not set"},"unlinked":{"title":"Unlinked materials","subCustomer":"BOM material lines with no catalogue item, one row per material","subProduct":"This BOM's material lines with no catalogue item","summary_one":"{{count}} material ({{lines}} BOM lines) has no catalogue link.","summary_other":"{{count}} materials ({{lines}} BOM lines) have no catalogue link.","scopeCustomer":"Linking a material links it on every draft or revision BOM of this customer. BOMs in review or approved are not changed.","scopeProduct":"Linking a material links it on this BOM only.","status":{"matched":"Matched","ambiguous":"Pick one","missing":"Not in catalogue"},"col":{"material":"Material","tab":"Tab","usedIn":"Used in","status":"Status","catalogue":"Catalogue material","action":"Action"},"thickness":"{{value}} mm thick","grade":"Grade {{grade}}","noName":"(no name)","usedLines_one":"{{count}} line","usedLines_other":"{{count}} lines","usedBoms_one":"{{count}} BOM","usedBoms_other":"{{count}} BOMs","lockedLines_one":"{{count}} in an approved BOM, not changed","lockedLines_other":"{{count}} in approved BOMs, not changed","lockedAll":"Approved BOMs only","lockedAllHint":"Every BOM using this material is approved. Start a new BOM version to change it.","pick":"Catalogue material for {{name}}","chooseOne_one":"Choose one ({{count}} option)","chooseOne_other":"Choose one ({{count}} options)","candidate":"{{sku}} — {{name}}","candidateDetail":"{{sku}} — {{name}} · {{detail}}","candidateRecommended":"★ Recommended · {{label}}","recommended":"Recommended","searchAll":"Search the whole catalogue…","backToSuggestions":"Back to suggestions","noSuggestion":"No suggestion","link":"Link","linkAria":"Link {{name}} to the selected catalogue material","linkAll_one":"Link {{count}} match","linkAll_other":"Link all {{count}} matches","linkAllConfirmTitle_one":"Link {{count}} material to its catalogue match?","linkAllConfirmTitle_other":"Link {{count}} materials to their catalogue match?","linkAllConfirmMessage_one":"{{count}} BOM line will point to its catalogue item. Lines in BOMs in review or approved are not changed.","linkAllConfirmMessage_other":"{{count}} BOM lines will point to their catalogue item. Lines in BOMs in review or approved are not changed.","linkAllConfirm":"Link materials","cancel":"Cancel","linkedToast_one":"Linked {{count}} BOM line.","linkedToast_other":"Linked {{count}} BOM lines.","lockedToast_one":"{{count}} line in a BOM in review or approved was not changed.","lockedToast_other":"{{count}} lines in BOMs in review or approved were not changed.","linkError":"Couldn't link the material. Try again.","loadError":"Couldn't load the unlinked materials.","retry":"Try again","emptyTitle":"Every material is linked","emptyBody":"All material lines on this customer's BOMs point to a catalogue item.","emptyBodyProduct":"All material lines on this BOM point to a catalogue item.","blockedDirty":"Save or discard your BOM changes before linking materials.","viewOnly":"You can view this list. Linking needs BOM edit access.","close":"Close","tableLabel":"Unlinked materials","entry_one":"{{count}} unlinked material","entry_other":"{{count}} unlinked materials","entryTitle":"Materials on BOM lines that are not linked to a catalogue item","inReviewLines_one":"{{count}} in a BOM in review — send back for revision to change","inReviewLines_other":"{{count}} in BOMs in review — send back for revision to change","inReviewAll":"In review — send back for revision to change","inReviewAllHint":"This BOM is waiting for approval. Request revision to change its materials.","createMaterial":"Create material","createMaterialAria":"Create a catalogue material for {{name}} and link it","finishTag":"Finish {{sku}}","finishHint":"This finish uses its own wood or grade for these parts. Linking sets the material on the finish only; the base keeps its own.","parts":"Parts: {{parts}}"},"workbookExport":{"action":"Export BOM","actionTitle":"Download the selected products' BOMs as a DỰ TRÙ workbook — re-import it with “Import BOM workbook”","drawerTitle":"Download this BOM as a DỰ TRÙ workbook — re-import it with “Import BOM workbook”","needSelection":"Select finished goods to export their BOMs","tooMany":"Export at most {{max}} products at a time","busy":"Exporting…","done":"BOM exported","doneSkipped":"{{file}} — {{skipped}} without a BOM left out","noBom":"None of the selected products has a BOM yet","failed":"Couldn't export the BOM","retry":"Try again in a moment."},"workbookImport":{"paintFormulas":{"title":"Paint formulas from the paint sheet","hint":"Paint processes whose code is not in the paint library are created as formulas for this customer when a product that uses them is imported, then linked like any library formula. Existing formulas are never changed.","willCreate":"Will be created","notCreated":"Not created","counts":"Steps: {{steps}} · Components: {{components}} · Linked to a material: {{linked}}","unlinked":"No catalogue material (kept as text): {{names}}","usedBy":"Used by: {{names}}","reason":{"exists":"Already in the paint library — left unchanged","other_customer":"This code belongs to another customer's formula","deleted":"A deleted formula still holds this code — restore it in Settings → Formulas","no_code":"The process title names no paint code","no_rate":"The step table has no g/m² (Kg hh / m2) column","step_no_rate":"Step “{{step}}” has no coat weight (g/m²)","no_steps":"No step has a chemical with a mixing ratio","conflict":"The sheet defines this code twice, differently","unused":"No product in this file uses this process","no_permission":"Creating formulas needs the formula editor permission"}},"families":{"title":"Model families","hint":"Finishes with the same wood parts and cushion are one model. New finished goods of a model share the base's number with their own letter and are marked for SKU review. Products already in the catalogue keep their SKU.","share":"Share one number","base":"Base","notSelected":"not selected","keepsSku":"keeps its SKU {{sku}}","keepsOwn":"keeps its own number (Variant typed)","baseNotSelected":"Select the base row so its finishes can share its number.","fromMap":"From family map","suggested":{"title":"Possible variants","hint":"Same name without wood and colour words, sizes within 3 mm. Not grouped unless you tick them.","tag":"Suggested","accept":"Group as one model","reason":"Differs only in {{words}}, sizes within {{delta}} mm","split":"Split off","restore":"Put back","merge":"Merge with…","base":"Base row","splitList":"Split off","tooFew":"Needs at least two rows to group."}},"paintFile":{"label":"Paint formula file (optional)","choose":"Choose paint formula file","none":"No paint formula file","hint":"Attach the paint formula workbook so short codes resolve and g/m² per step fill in","remove":"Remove","removeLabel":"Remove the paint formula file","errors":{"fileType":"Choose an .xlsx paint formula file.","tooLarge":"The paint formula file is larger than 5 MB.","empty":"The paint formula file is empty."}},"familyMap":{"label":"Family map (MÃ GỐC)","choose":"Choose family map","none":"No family map","hint":"Optional. The team's MÃ GỐC workbook (.xlsx, .xls or .xlsm, up to 10 MB). Finishes are grouped into models the way it lists them; without it, they are grouped from the workbook.","remove":"Remove","removeLabel":"Remove the family map","errors":{"fileType":"Choose an .xlsx or .xlsb family map.","tooLarge":"The family map is larger than 10 MB.","empty":"The family map file is empty."},"title":"Family map","file":"{{name}} · sheets read: {{sheets}}","familiesUsed":"{{used}} of {{total}} families used","matched_one":"{{count}} product matched","matched_other":"{{count}} products matched","unmatchedRows_one":"{{count}} map row not in this workbook","unmatchedRows_other":"{{count}} map rows not in this workbook","unmatchedProducts_one":"{{count}} product not in the map","unmatchedProducts_other":"{{count}} products not in the map","ambiguousProducts_one":"{{count}} product matches several rows","ambiguousProducts_other":"{{count}} products match several rows","skippedRows_one":"{{count}} row skipped","skippedRows_other":"{{count}} rows skipped","customerNotFound":"This customer isn't named in the family map, so names were matched across every customer in it.","customerLabels":"Rows matched under: {{labels}}.","familyRowsTitle":"Rows of this workbook's families that it doesn't list","rowLine":"{{name}} · {{letter}} · base: {{base}}","moreRows_one":"{{count}} more row from families not in this workbook","moreRows_other":"{{count}} more rows from families not in this workbook","unmatchedProductsTitle":"Products not in the map (grouped from the workbook)","ambiguousProductsTitle":"Products matching several map rows (grouped from the workbook)","catalogueAttach_one":"{{count}} finish joins a base already in the catalogue","catalogueAttach_other":"{{count}} finishes join a base already in the catalogue","catalogueAttached_one":"{{count}} finish already shares its base's BOM","catalogueAttached_other":"{{count}} finishes already share their base's BOM","catalogueRefused_one":"{{count}} finish not joined to its catalogue base","catalogueRefused_other":"{{count}} finishes not joined to their catalogue base","catalogueMissing_one":"{{count}} finish has its base in neither this workbook nor the catalogue","catalogueMissing_other":"{{count}} finishes have their base in neither this workbook nor the catalogue","catalogueAttachTitle":"Finishes joining a base already in the catalogue (imported from another PI file)","catalogueAttachLine":"{{name}} → {{sku}} · letter {{letter}} · shares its BOM","catalogueAttachedLine":"{{name}} → already shares {{sku}}'s BOM","catalogueRefusedTitle":"Base already in the catalogue, not joined (these keep their own number and BOM)","catalogueRefusedLine":"{{name}}: {{reason}}","catalogueReason":{"existing":"its base is {{sku}}, but this row imports into its own finished good {{target}} — attach it from the BOM page","ambiguous":"several finished goods are named {{base}}","otherCustomer":"its base {{sku}} belongs to another customer","baseIsFinish":"its base {{sku}} itself shares {{owner}}'s BOM","noBom":"its base {{sku}} has no BOM yet","notFormat":"its base's SKU {{sku}} was not built by the SKU format","notEditable":"{{sku}}'s BOM is {{status}} — only a draft or a BOM in revision takes new finishes","mismatch":"differs from {{sku}}'s BOM in more than wood, grade or paint ({{parts}})"},"bomStatus":{"pending":"submitted for approval","approved":"approved","priced":"priced","final":"final"},"more":"+{{count}} more"},"readinessLink":"Check several files first","readinessHint":"— see what to set up before importing many workbooks.","action":"Import BOM workbook","actionTitle":"Import a dự trù workbook (.xlsb / .xlsx) into product BOMs","title":"Import BOM workbook","sub":"Read a dự trù workbook (SP, wood, DUTRU, painting) into draft product BOMs. Nothing is saved until you import.","done":"Done","cancel":"Cancel","retry":"Try again","importAnother":"Import another workbook","importing":"Importing…","importBtn_one":"Import {{count}} product","importBtn_other":"Import {{count}} products","loading":"Reading the workbook and matching products…","dash":"—","file":{"label":"Workbook","choose":"Choose file","none":"No file chosen","hint":".xlsb or .xlsx, up to 25 MB."},"customer":{"label":"Customer","placeholder":"Search customers…","hint":"Filled in from the file name when it matches. Saved name matches are kept per customer."},"empty":{"title":"Choose a dự trù workbook to start","body":"The preview lists every product in the SP sheet (ordered ones first), the finished good each maps to, and the materials the catalogue is missing. Nothing is written until you import."},"errors":{"previewTitle":"Couldn’t read this workbook","preview":"Couldn’t preview the workbook.","commit":"The import failed. Nothing was saved for the products that errored — try again.","missing":"Couldn’t download the missing materials list.","fileType":"Choose an .xlsb or .xlsx workbook.","tooLarge":"The workbook is larger than 25 MB.","empty":"The file is empty.","forbidden":"You don’t have permission for this import (creating finished goods needs product create access).","network":"The file could not be sent. This usually means the workbook was saved again (or re-synced by OneDrive / Zalo) after you picked it, or the connection dropped. Close the file in Excel, pick it again here and retry."},"summary":{"title":"Preview","sheets":"Sheets read: {{names}}","groups":"Assembly groups","line":"{{total}} products in this workbook · {{ordered}} on this PO · {{selected}} selected to import","selectedProducts":"Selected products","prodReady":"{{count}} ready","prodSuggested":"{{count}} suggested — check","prodNeedTarget_one":"{{count}} needs a finished good","prodNeedTarget_other":"{{count}} need a finished good","theirMaterials":"Their materials","matReady":"{{count}} ready","matChoose":"{{count}} choose one","matAsText":"{{count}} not in catalogue (import as text)","groupsToCheck_one":"{{count}} group to check below","groupsToCheck_other":"{{count}} groups to check below","groupsAllTied":"Assembly rows: all tied to products"},"productStatus":{"matched":"Matched","suggested":"Suggested","unmatched":"Unmatched","suggestedHelp":"Best guess from the name — check it. Confirmed matches are remembered for next time."},"materialStatus":{"matched":"Matched","ambiguous":"Pick one","missing":"Missing"},"groupSection":{"hardware":"Assembly hardware","packaging":"Packaging (cartons)","subcontract":"Upholstery subcontract"},"groupStatus":{"assigned":"Assigned","suggested":"Suggested","unassigned":"Unassigned"},"category":{"wood":"Wood","packaging":"Packaging","hardware":"Hardware","cushion":"Cushion","finishing":"Painting","subcontract":"Subcontract"},"products":{"needsTargetSummary_one":"{{count}} selected product still needs a finished good — pick one or choose “Create new” on the highlighted row.","needsTargetSummary_other":"{{count}} selected products still need a finished good — pick one or choose “Create new” on each highlighted row.","scrollLabel":"Workbook products","title":"Products","orderedOnly":"Ordered only ({{count}})","none":"The SP sheet lists no products.","noneOrdered":"No product in this workbook has an order quantity — turn off “Ordered only” to pick from the catalogue.","selectAll":"Select all shown products","selectRow":"Import {{name}}","row":"Row {{row}}","itemCode":"Code {{code}}","dims":"{{dims}} mm","notOrdered":"Not ordered","needsTarget":"Pick a finished good or create a new one.","newVersion":"New version v{{version}}","unchangedVersion":"Unchanged · keeps v{{version}}","usesBomOf":"Uses BOM of {{sku}} · v{{n}}","usesBomDiffers":"The file's parts differ from the BOM of {{sku}}. A colour variant has no BOM of its own, so the import ignores the file's parts and saves only this variant's labels and paint recipes. To change the parts, edit {{sku}}.","usesBomDiffersApproved":"The file's parts differ from the BOM of {{sku}}, and that BOM is approved. The import saves nothing for this variant. To change anything, open a revision of {{sku}} first, then import again.","partPaintNotInList":"Parts use paint {{codes}}, which is not in this BOM's paint list. You can still import; add the paint to the list on the BOM page.","newProduct":"New finished good","newBom":"New BOM","linesTotal_one":"{{count}} line","linesTotal_other":"{{count}} lines","lineCount":"{{count}} {{category}}","matMatched":"{{count}} matched","matAmbiguous":"{{count}} to pick","matMissing":"{{count}} missing","matChosen":"{{count}} chosen","col":{"name":"Workbook product","qty":"Quantity","colour":"Colour","status":"Match","target":"Finished good","bom":"BOM","lines":"Lines","materials":"Materials"},"warningsMore":"{{count}} more","warningsLess":"Show less","needsTargetGuide_one":"{{count}} selected product has no finished good yet — pick one on its row, or use “Create new”.","needsTargetGuide_other":"{{count}} selected products have no finished good yet — pick one on each row, or use “Create new”.","bulkCreate_one":"Create new for the {{count}} unmatched product","bulkCreate_other":"Create new for {{count}} unmatched products","bulkSuggest_one":"Use the suggestion for {{count}} product","bulkSuggest_other":"Use suggestions for {{count}} products","createLineNoCategory":"New finished good · {{name}}","categoryRef":"{{name}} ({{code}})","conflict":"Also chosen for {{names}} — each finished good can take one row","conflictSummary_one":"{{count}} row shares its finished good with another row — pick a different one or untick a row.","conflictSummary_other":"{{count}} rows share a finished good with another row — pick a different one or untick a row.","newProductSummary_one":"{{count}} new finished good needs a product type or a valid version — see the highlighted rows.","newProductSummary_other":"{{count}} new finished goods need a product type or a valid version — see the highlighted rows.","matSuggested":"({{count}} suggested)"},"target":{"placeholder":"Search finished goods…","createNew":"Create new: {{name}}","createHint":"A new finished good is created with this standard name.","suggested":"Suggested · {{score}}% match","typeToSearch":"Type to search all finished goods"},"materials":{"scrollLabel":"Workbook materials","missingFilename":"BOM_missing_materials.xlsx","tabAll":"All","tabMissing":"Missing","tabAmbiguous":"To pick","source":"{{sheet}} · row {{row}}","usedBy_one":"{{count}} product","usedBy_other":"{{count}} products","pick":"Material for {{name}}","asText":"Imported as text","productRef":"{{sku}} — {{name}}","matchedByCode":"Matched by the material code in the file","matchedBySupplierName":"Matched by supplier item name (NCC: {{supplier}})","unitConverted":"{{qtyFrom}} {{from}} → {{qtyTo}} {{to}} (×{{factor}})","unitViaSupplier":"Converted by the unit and factor set on supplier {{supplier}}","unitViaMaterial":"Converted by the material's own units","unitNoFactor":"No conversion {{from}} → {{to}}: line kept as {{qty}} {{from}}. Set it in Inventory › Materials › the material › units, or the supplier unit + factor on the supplier.","col":{"name":"Material","category":"Category","uom":"Unit","source":"Source","usedBy":"Used by","status":"Status","resolution":"Catalogue material"},"titleSelected":"Materials for the selected products","titleAll":"All workbook materials","showAll":"Show all workbook materials ({{count}})","noneSelected":"Tick products above to see the materials they need.","downloadMissingWorkbook":"Download missing list (whole workbook, {{count}})","chooseOne_one":"Choose one ({{count}} option)","chooseOne_other":"Choose one ({{count}} options)","importAsText":"Import as text","candidateDetail":"{{sku}} — {{name}} · {{detail}}","candidateRecommended":"★ Recommended · {{label}}","recommended":"Recommended","emptyAmbiguous":"Nothing to choose — every material matched or is marked missing.","emptyMissing":"Every material is in the catalogue.","emptyAll":"The selected products use no materials.","statusChosen":"Chosen","searchCatalogue":"Search the catalogue…","searchCatalogueHint":"Type a material code or name to search the catalogue.","asTextUnlessPicked":"Imported as text unless you pick a catalogue material.","acceptSuggestion":"Accept suggestion","suggestionHint":"Suggested from name, size and finish — confirm it or choose another.","acceptAll_one":"Accept {{count}} suggestion","acceptAll_other":"Accept all {{count}} suggestions","acceptAllHint":"Picks the suggested material on every line that has one. You can still change each line."},"groups":{"search":"Search products…","searchLabel":"Search products for {{group}}","noMatch":"No product matches.","listLabel":"Products for {{group}}","title":"Assembly groups (DUTRU)","hint":"Packaging, hardware and cushion rows the workbook could not tie to a product on its own. Tick the products each group applies to.","meta_one":"{{section}} · row {{row}} · {{count}} line","meta_other":"{{section}} · row {{row}} · {{count}} lines","applyTo_one":"Applies to {{count}} product","applyTo_other":"Applies to {{count}} products","ordered":"(ordered)","assigned_one":"{{count}} group assigned from the workbook","assigned_other":"{{count}} groups assigned from the workbook","assignedLine":"{{group}} → {{products}}","showAllProducts":"Show all products ({{count}})","showRelevant":"Show only related products","other":"Other groups not tied to a product ({{count}})","noneForSelection":"No assembly group needs checking for the selected products."},"foot":{"selected":"{{count}} of {{total}} products selected","nothingSelected":"Select at least one product to import.","needTargets_one":"{{count}} selected product still needs a finished good.","needTargets_other":"{{count}} selected products still need a finished good.","conflicts_one":"{{count}} row shares a finished good with another row.","conflicts_other":"{{count}} rows share a finished good with another row.","needCustomer":"Pick the customer before importing new finished goods.","newProductDetails_one":"{{count}} new finished good still needs its product type, unit or version.","newProductDetails_other":"{{count}} new finished goods still need their product type, unit or version.","paintDefault":"{{name}}: pick the default paint for {{token}} in its paint column (the file’s short code matches several formulas), or choose “No paint formula” — then import.","paintDefaultMore_one":"(and {{count}} more product needs the same.)","paintDefaultMore_other":"(and {{count}} more products need the same.)"},"confirm":{"title":"Create new BOM versions?","message_one":"{{count}} selected product already has a BOM ({{names}}). The current BOM is kept in history and a new draft version replaces its lines.","message_other":"{{count}} selected products already have a BOM ({{names}}). The current BOM is kept in history and a new draft version replaces its lines.","confirm":"Import and version","cancel":"Go back"},"toast":{"done":"BOM workbook imported — {{created}} new, {{versioned}} new versions","partial":"{{done}} BOMs imported, {{failed}} failed — see the result list","photosFailed_one":"BOMs imported, but {{count}} photo could not be saved. Upload it on the BOM page.","photosFailed_other":"BOMs imported, but {{count}} photos could not be saved. Upload them on the BOM page."},"result":{"paintFormulasCreated":"Paint formulas created","warningsTitle_one":"{{count}} import note","warningsTitle_other":"{{count}} import notes","title":"Import result","created":"New BOMs","versioned":"New versions","failed":"Failed","productMeta_one":"{{sku}} · v{{version}} · {{count}} line","productMeta_other":"{{sku}} · v{{version}} · {{count}} lines","newVersion":"Version {{version}}","newBom":"New BOM","openBom":"Open BOM","failedTitle_one":"{{count}} product was not imported","failedTitle_other":"{{count}} products were not imported","failedPill":"Not imported","aliasesLine_one":"{{count}} product name remembered for next time","aliasesLine_other":"{{count}} product names remembered for next time","renamedTitle_one":"{{count}} material renamed","renamedTitle_other":"{{count}} materials renamed","textNote":"Materials imported as text can be linked to the catalogue later in the BOM.","unchanged":"Unchanged","keptVersion":"No changes — kept version {{version}}","sharesBase":"Shares {{sku}}'s BOM — unchanged"},"renames":{"title_one":"{{count}} material will be renamed","title_other":"{{count}} materials will be renamed","hint":"The workbook names these materials, so their catalogue records take the new name (the code, unit, costs and stock stay as they are). Every BOM, PI and document that uses them will show the new name. To keep the current name, change it in the workbook before you import."},"paint":{"matchedByName":"Matched by name: {{text}}","nameAmbiguous":"Several formulas are named “{{name}}” ({{codes}}) — pick one","col":"Paint","matched":"{{code}} ✓","picked":"{{code}} (picked)","cleared":"No paint link","notInLibrary":"{{codes}} not in paint library — ask the team to create it","noneInFile":"No paint in file","useFile":"Use the file's codes: {{code}}","choose":"Pick a paint formula (optional)","option":"{{code}} — {{name}}","noFormula":"No paint formula","pick":"Paint formula for {{name}}","summary":"Paint","summaryLine":"{{linked}} linked · {{missing}} not in library · {{none}} none","missingCodes":"Not in the paint library: {{codes}}. Ask the team to create these formulas — the import never creates one and imports those products without a paint link.","resultLinked":"Paint {{code}}","listLabel":"Paint codes for {{name}}","default":"Default","defaultHint":"The product's default paint: parts with no code of their own (or “NA”) get this one.","makeDefault":"Make {{code}} the default","remove":"Remove {{code}}","add":"Add a paint code…","undoClear":"Undo — keep the paint from the file","unresolved":"Not in the paint library: {{codes}}. These codes will not be linked. Add the formula in Paint formulas, or fix the code in the file, then preview again.","ambiguous":"{{token}} matches several paint formulas ({{codes}}) — pick the one this product uses","pickCandidate":"Pick the formula for {{token}}"},"sample":{"download":"Download sample","error":"Couldn’t download the sample workbook."},"readerGuide":{"title":"What the importer reads","intro":"Sheets are found by their headers, not their names. The sample workbook shows every layout below.","sp":{"title":"SP — product list","body":"A header row with TÊN SẢN PHẨM and SỐ LƯỢNG. Also read: QUY CÁCH (DÀI / RỘNG / CAO), NGUYÊN LIỆU, CHẤT LƯỢNG, MÀU SƠN with the paint code in the next column (leave its header blank), GHI CHÚ, M2. Products with a quantity are on this PO; the list ends at TỔNG CỘNG."},"wood":{"title":"GỖ — wood parts","body":"A “Tên chi tiết” header. Each row carries its product name in the column to the left of the part name; then finished size (dày / rộng / dài), pieces per product, unit, material, rough size, grade and colour. “CỤM …” rows group the parts below them."},"dutru":{"title":"DUTRU — packaging and hardware","body":"Sections “1. Carton & đóng gói” and “2. Vật tư lắp ráp”. Each group starts with a numbered row naming its product(s) in column B; its lines give the material, size and the quantity per carton or per product."},"paint":{"title":"TINH SON — painting","body":"A “QUY TRÌNH SƠN” row names each process (its code, e.g. VHT-05/26). Chemicals and mixing ratios sit below it; each product’s column holds the grams of mixture per step. They become finishing lines in kg."},"familyMap":{"title":"Family map file (MÃ GỐC), optional","body":"A second file that groups finishes into models the team's way. Any sheet whose header row (within its first 15 rows) has Mã PB, Vai trò, Khách and Tên mẫu (khách gọi) is read; other columns and sheets are ignored. A base row (Vai trò GỐC, or letter A) starts a family, and the variant rows below it (└ Biến thể) join it until the next base row. A product joins a row by customer and model name, matched exactly but ignoring case, accents and spacing. Without this file, finishes are grouped from the workbook."},"skipped":{"title":"Skipped","body":"Other sheets, summary blocks, total rows (TỔNG…), DUTRU sections other than packaging and hardware, and formulas without a saved value."},"problems":{"title":"Common problems","noQty":"A material or part line with no quantity is skipped (it shows as a warning).","dutruUntied":"A DUTRU group whose product name matches no SP product is not tied to anything — pick its products in the preview.","notInCatalogue":"Materials not in the catalogue import as text — download the missing list for the team to add them.","paintNotInLibrary":"A paint code not in the paint library is not linked — ask the team to create the formula, or pick one in the preview."}},"guide":{"title":"How it works","step1":"Tick the products to import","step2":"Check each finished good — “Suggested” is our best guess; confirm or change it","step3":"Resolve materials — choose one where asked; missing ones import as text","step4":"Import","draftNote":"Creates DRAFT BOMs. Products that already have a BOM get a new version; nothing is final until approved."},"photos":{"title":"Photos in the workbook","placed_one":"{{count}} photo will be added to a product or part that has none yet.","placed_other":"{{count}} photos will be added to products or parts that have none yet.","placedNote":"A photo is only added where there is none; a photo already on the system is never replaced.","notesTitle":"Pictures that will not be imported","unplaced_one":"{{count}} picture could not be matched to a product or part row and will not be imported ({{sources}}).","unplaced_other":"{{count}} pictures could not be matched to a product or part row and will not be imported ({{sources}}).","unplacedHint":"You can upload these photos on the BOM page after the import."},"photosResult":{"saved":"Photos added: {{products}} on products, {{parts}} on BOM parts.","kept":"{{count}} already had a photo or had no clear line, so they were left as they are.","failedTitle_one":"{{count}} photo could not be saved","failedTitle_other":"{{count}} photos could not be saved","failedHint":"The BOMs were imported. Open the BOM page of each product listed and upload its photo there."},"notes":{"summary_one":"{{count}} note about this workbook","summary_other":"{{count}} notes about this workbook","show":"Show","hide":"Hide"},"customerPrompt":{"title":"Pick the customer","body":"New finished goods use it for their SKU and saved names.","likely":"Likely:"},"newProduct":{"familyCode":"Takes the base's number","familyCodeValue":"base number + {{letter}}","familyOwnNumber":"Own number","familyOwnNumberHint":"The Variant typed here wins over the family letter {{letter}}. Clear it to take the base's number.","title":"New product details","titleFor":"New product details for {{name}}","type":"Product type","typePlaceholder":"Choose a type","variant":"Variant","variantPlaceholder":"e.g. A","version":"Version","versionHint":"Optional · {{digits}} digits","typeError":"Choose the product type — it is the type part of the SKU.","versionError":"The version must be {{digits}} digits and not 0.","skuIncomplete":"SKU incomplete","skuIncompleteHint":"Variant missing — you can add it now or later in the draft BOM.","noCustomerCode":"The customer part of the SKU fills in once a customer with a code is picked.","unit":"Product unit (unit of the finished product)","unitPlaceholder":"Choose the product's unit","unitError":"Choose the product's unit."},"matchReasons":{"suggested":"Suggested · {{pct}}% sure","score":"{{pct}}% match","name":"Name {{value}}%","formerName":"Former name","supplierName":"Supplier item name","size":"Size {{value}}","finish":"Finish {{value}}","colour":"Colour","unit":"Unit {{value}}","category":"Other material group","agrees":"matches","differs":"differs","unstated":"Not on the sheet: {{value}}"}},"crumb":"Products · BOM","title":"Product BOM","description":"Build the material spec, route it through approval, and roll up cost per finished unit.","loadError":"Failed to load the BOM workspace","noWorkflow":"The order BOM workflow is not set up for this company yet, so order stages are not shown. Ask an administrator to set it up.","loading":"Loading…","noOrders":"No product orders in progress","filterSamples":"Samples","samplePickerLabel":"Select sample BOM","noSampleBoms":"No sample BOMs yet","emptyDrafts":{"filter":"Empty drafts","listLabel":"Empty draft BOMs","listCount_one":"{{n}} empty draft BOM.","listCount_other":"{{n}} empty draft BOMs.","listCapped":"Showing the first {{shown}} of {{n}} empty draft BOMs.","readOnlyHint":"These drafts have no parts, boxes, header details, notes or approval history. Most were created by simply opening a product's BOM page. Open one to fill it in.","emptyTag":"Empty","nothingEntered":"Nothing entered yet","variantOnly_one":"{{count}} variant chip, no parts","variantOnly_other":"{{count}} variant chips, no parts","loading":"Loading empty drafts…","loadError":"Couldn't load the empty draft BOMs.","retry":"Try again","noneTitle":"No empty drafts","noneBody":"Every draft BOM has parts, boxes, header details, notes or approval history."},"orderPickerLabel":"Select product order","newOrder":"New product BOM","lockBanner":{"title":"Read-only at this stage.","body":"Parts are editable while the order is with the BOM team — use the approval panel to route it back for revision.","noAccessTitle":"Read-only.","noAccessBody":"Only BOM editors (engineering / planning) can change this BOM, its SKU and product details."},"partsCount":"· {{count}} parts","empty":{"wood":"No wood parts yet.","hardware":"No hardware lines.","cushion":"No cushion / upholstery on this product.","packaging":"No packaging lines yet.","finishing":"No finishing lines yet.","other":"No other lines yet."},"removeLine":"Remove part","saveLines":"Save parts","saving":"Saving…","saved":"Parts saved","saveError":"Failed to save parts","reasonDrawer":{"title":"Reason required","hint":"This decision is recorded in the revision history.","label":"Reason"},"transitionDone":"Workflow updated","transitionError":"Workflow action failed","spec":{"order":"Order","product":"Product","clientRef":"Client reference","unit":"Unit","unitChange":"Change","woodTotals":"Wood net / rough","m3NetRough":"m³"},"genspec":{"title":"General specifications","subtitle":"The finished product this BOM builds.","length":"Length (mm)","width":"Width (mm)","height":"Height (mm)","quantity":"Quantity","material":"Material","woodGrade":"Wood grade","paint":"Paint","roughFactor":"Rough factor ×","roughFactorHint":"Rough m³ = finished m³ × this factor for every wood part, boards included. Blank = the price book’s factor; a part can set its own."},"variants":{"defaultName":"Base","label":"Variant","none":"No variants defined","add":"Add variant","remove":"Remove variant","edit":"Edit variant","addTitle":"Add variant","codeLabel":"Variant code","codePlaceholder":"e.g. WAL","skuLabel":"Variant SKU","ownProductHint":"With a SKU filled in, saving creates this variant as its own product — same SKU as the base, only the variant code differs — with this BOM’s saved version copied across: its chip takes the wood and paint colour chosen here, its Cushion tab the new fabric.","ownProductDone":"Variant created as its own product · {{sku}}","ownProductError":"Couldn’t create the variant product — try again.","editTitle":"Edit variant","drawerHint":"A variant is a wood × paint-colour combination; on a product it can also change the cushion fabric.","paintColour":"Paint code","name":"Variant name","woodSpecies":"Wood species","paintCode":"Paint code","save":"Save variant","substitutionNote":"Showing materials for variant {{variant}} — wood parts in {{species}}.","nameAuto":"— optional, auto from wood + colour","namePlaceholder":"e.g. Oak · Natural","speciesNotPriced":"Not in the wood price book — saved as text, but it can’t be costed until it’s added under Settings → Formulas → Wood Pricing","speciesPlaceholder":"e.g. Oak, R.OAK, Cao su","noColours":"No colours in the library yet","woodOwnHint":"The new product’s BOM keeps this BOM’s wood parts, so its wood cost stays the same. The wood species here is its label: change the wood parts on the new BOM’s Wood parts tab after saving.","unsavedCopy":"This BOM has unsaved changes. Save them first: the new variant copies the saved BOM.","fillSomething":"Fill in at least one field above to save the variant.","newModelHint":"The new model is a plain copy of this BOM. Set its wood, paint colour and cushion fabric on its own BOM.","editNamed":"Edit variant {{name}}","fabric":{"title":"Cushion fabric","hint":"Optional. Lines on the Cushion tab that use the current fabric take the new one in the copy; everything else is copied as it is.","current":"Fabric now","none":"No fabric change","lines_one":"{{count}} line","lines_other":"{{count}} lines","new":"New fabric","newPlaceholder":"Search materials by name or SKU…","noCushionHint":"This BOM has no cushion lines yet. The fabric you pick is added to the new variant's Cushion tab; enter its quantity there before you submit the BOM for approval.","noSearchRight":"Searching materials needs the stock view right (Inventory). Ask an administrator to grant it.","pickCurrent":"Pick the fabric on this BOM that the new one replaces.","needsSku":"A fabric variant is its own product: fill in Variant SKU."}},"sections":{"ariaLabel":"BOM sections","wood":"Wood parts","hardware":"Hardware","cushion":"Cushion","packaging":"Packaging","finishing":"Painting","other":"Other"},"cols":{"pos":"#","posFull":"Row number","part":"Part","partCode":"Part code","t":"Thickness","w":"Width","l":"Length","qty":"Qty","qtyFull":"Quantity","unit":"Unit","netM3":"Net m³","roughT":"Rough thickness","roughW":"Rough width","roughL":"Rough length","roughPcs":"Pieces","roughM3":"Rough m³","notes":"Notes","inherits":"inherits from sub-parts","areaM2":"Area m²","material":"Material","grade":"Grade","qc":"Specification","paintCode":"Paint code","outsourced":"Outsourced","outsourcedTooltip":"Bought in or subcontracted rather than made in-house","difficulty":"Difficulty","img":"Image","imgAdd":"Add a photo of this part","imgView":"Photo attached","imgClose":"Close photo","imgRemove":"Remove the photo","imgError":"Could not upload the photo.","partsPerSheet":"Parts/sheet","partsPerSheetHint":"Board rows: how many of this part one sheet yields (the better of both orientations, with the price book’s saw kerf)","roughFactor":"Factor ×","roughFactorHint":"This part’s rough factor: rough m³ = finished m³ × factor. Blank = the BOM’s factor, else the price book’s.","paintColour":"Paint colour","paintColourAria":"Paint colour of {{part}}"},"saveHeader":"Save changes","tabs":{"tech":"Tech & Revisions","logistics":"Weight & CBM","names":"Product names","docs":"Documents","namesMissing":"Missing","docsToConfirm":"{{count}} to confirm"},"tech":{"title":"Technical requirements","placeholder":"One requirement per line, e.g. Structure: fixed (glued) assembly","empty":"No technical requirements recorded.","revisionsTitle":"Revision history","rev":"Revision","date":"Date","by":"By","change":"Change","noRevisions":"No workflow actions recorded yet."},"difficulty":{"easy":"Easy","medium":"Medium","hard":"Hard"},"logistics":{"title":"Weight & CBM","subtitle":"Logistics specs per packed unit — drive freight, container loading and quotes.","net":"Net weight","netHint":"Product only, excludes packaging.","gross":"Gross weight","grossHint":"Includes carton & protection.","cbm":"Volume (CBM)","cbmHint":"Carton outer volume.","density":"Density","units20":"Units / 20ft","units40":"Units / 40ft HQ","load40":"Load / 40ft HQ","grossLtNetWarn":"Gross weight is below net weight — gross includes packaging, so it should be at least the net weight. Please check the values."},"files":{"title":"Photos & files","countHint":"{{photos}} photos · {{files}} files","addPhoto":"Add product photo","view":"View","attach":"Attach drawing / file","uploading":"Uploading…","uploaded":"Files attached","uploadError":"File action failed","remove":"Remove file"},"approval":{"title":"Approval workflow","phaseTitle":"Version {{version}} · Rev {{rev}}"},"verbs":{"submit":"Submit","approve":"Approve","reject":"Request revision","reroute":"Reroute","complete":"Complete"},"cost":{"title":"Cost roll-up","perUnit":"per finished unit","total":"Total material cost","locked":"Final BOM locked after approval","none":"No pricing captured yet","edit":"Edit pricing","cancel":"Cancel","save":"Save pricing","addLine":"Add line","addPackaging":"Add packaging","product":"Product","qty":"Qty","price":"Unit price","packagingKind":"Packaging type","footnote":"Indicative — drives the quote. Excludes labour & overhead.","unmapped":"{{count}} pricing lines not mapped to a design part","prefill":"Prefill from design BOM ({{count}} parts)","coverage":{"mapped":"Mapped from a design part","added":"Added during pricing","orphaned":"Source design part removed"},"missingTitle":"{{count}} design parts are not on this final BOM","missingBody":"These parts are on the design BOM but no final BOM line covers them, so their cost is not in the total and purchasing will not buy them: {{parts}}. To fix: click Edit pricing, then \"Add missing design parts\", pick each part's material and price, and save. If you cannot edit pricing, ask purchasing to add them.","missingMore":"and {{count}} more","addMissing":"Add missing design parts ({{count}})","missingLocked":"These parts are on the design BOM but no final BOM line covers them, so their cost is not in the total: {{parts}}. This final BOM is locked after final approval and can no longer be edited here — tell purchasing so they can order these parts.","missingOtherStage":"These parts are on the design BOM but no final BOM line covers them, so their cost is not in the total: {{parts}}. Lines can be added only while the order is at the \"{{stage}}\" stage: move the order to that stage (or ask whoever runs the order), then use Edit pricing → \"Add missing design parts\".","missingNoAccess":"These parts are on the design BOM but no final BOM line covers them, so their cost is not in the total: {{parts}}. You don't have permission to edit pricing at this stage: ask purchasing (someone who can act at the \"{{stage}}\" stage) to add them.","cannotCompare":"This final BOM can't be compared with the design: it was priced before final lines were linked to design parts. Check by hand that every design part has a line here.","rowsNoMaterial":"{{count}} rows have no material yet ({{rows}}): pick a material for each, or remove the row, then save.","rowN":"Row {{n}}"},"packaging":{"carton":"Carton","pallet":"Pallet","strap":"Strap","pe_film":"PE film","label":"Label","sticker":"Sticker","other":"Other"},"pricing":{"perM3":"₫/m³","cost":"Cost ₫ / $","meta":"rough ×{{factor}} ·","priceBook":"price book","totalsLabel":"Total · rough volume & material cost","totalsWood":"wood","totalsBoard":"board","metaRough":"rough ×{{factor}} · kerf {{kerf}} mm","metaRoughBom":"rough ×{{factor}} (this BOM) · kerf {{kerf}} mm"},"library":{"cancel":"Cancel","saveTooltip":"Save this part to the standard-parts library","savedToLibrary":"Saved to the parts library","saveError":"Could not save to the parts library"},"revPill":"V{{version}} · Rev {{rev}}","revPillTitle":"Current version","version":{"newVersion":"New version","created":"Version {{version}} opened — previous version archived","confirmTitle":"Open a new version of {{sku}}?","confirmBody":"Version {{version}} stays exactly as approved. Every change goes into version {{next}}, which goes through the full approval again.","confirmAction":"Open new version","noteLabel":"What changes in this version? (optional)","notePlaceholder":"e.g. thicker legs, new hardware","error":"Could not create the new version"},"productInfo":{"title":"Product details","subtitle":"Edit the finished good here while its BOM is a draft.","name":"Name (EN)","nameVi":"Name (VI)","description":"Description","nameRequired":"Enter a name.","save":"Save details","saving":"Saving…","saved":"Product details saved","saveError":"Could not save the product details"},"skuVariant":{"title":"SKU variant","subtitle":"Customer, type and sequence stay as they are; staff enter the variant and version.","incomplete":"SKU incomplete","incompleteHint":"The SKU has no variant yet — add it while the BOM is a draft.","current":"Current SKU","variant":"Variant","variantPlaceholder":"e.g. B","version":"Version","preview":"New SKU","save":"Save SKU","saving":"Saving…","saved":"SKU updated to {{sku}}","saveError":"Could not update the SKU","variantError":"Use 1–{{max}} letters (A–Z).","versionError":"{{digits}} digits, not 0.","versionManaged":"Set by BOM versions once approved","letterLocked":"A different paint colour, wood or fabric is a new variant"},"samplePromote":{"tag":"Sample code","tagHint":"Coded with the sample letter {{letter}}. Promote it once the sample is approved as the production variant.","action":"Promote sample","confirmTitle":"Promote sample {{sku}}?","confirmBody":"The code drops the sample letter {{letter}} and takes the model’s next official letter, version 01. PI, PO and BOM rows stay linked; draft worksheet and BOM text copies follow. This can’t be undone here.","confirm":"Promote","done":"Sample promoted to {{sku}}","error":"Could not promote the sample"},"flatten":{"action":"Move sub-parts to the top level","hint":"Choose groups on this tab whose sub-parts become separate top-level parts. You see every change before anything is saved.","confirmTitle":"Move sub-parts to the top level?","confirmBody":"Tick the groups to change. Their sub-parts become separate parts in the same order and the BOM is saved. Use ⤷ later to put a part back under another one.","counts":"Groups selected: {{groups}} · Sub-parts: {{parts}}","groupLabel":"Group “{{name}}”","groupParts":"To the top level: {{parts}}","rowLabelOnly":"The group row has only a name, so it is removed.","rowUsed":"The group row is kept: {{lines}} on another tab is used on it. Change that line's “Used on” first if you want to remove the row.","removeRow":"Also remove the row “{{name}}”","volumeRemoved":"Wood volume stays as it is: only the parts are counted.","volumeKept":"The row stays as a part of its own, counted like any part on top of its parts — in the wood volume, the paint and the final BOM.","codesRenumber":"Part codes: this BOM has not been approved yet, so each moved part and each kept group row is renumbered as a loose part (-CT01, -CT02 …). Their old codes, and the code of a removed row, are retired and never given out again. A code another BOM of the model also shows is kept.","codesFrozen":"Part codes: this BOM has been approved before, so its codes are frozen — every moved part and kept group row keeps the code it has. The code of a removed row is never given out again.","confirm":"Move to top level","noneSelected":"No group was ticked, so nothing changed.","error":"The sub-parts were not moved. Nothing was saved.","note":"Moved wood sub-parts to the top level (groups: {{groups}}, parts: {{parts}}):","noteMore_one":"and {{count}} more group","noteMore_other":"and {{count}} more groups","noteError":"The parts were saved, but the note for Comments & history could not be posted.","dirty":"Save or discard your changes first, then move the sub-parts.","locked":{"status":"This BOM version is approved or in review, so its parts can't be changed. Press \"New version\" (or ask the approver to request a revision), then move the sub-parts.","stage":"This order's BOM is not open for editing at its current stage. Ask the order owner to send it back for revision.","noRight":"You can't edit this BOM. Ask an administrator to give you the right to edit products.","finish":"This finish shares its base product's BOM. Open the base product and move the sub-parts there.","sharedApproved":"This order uses its product's BOM, which is approved or in review. Open the product's BOM, press \"New version\", then move the sub-parts there.","generic":"This BOM can't be edited right now, so its parts can't be changed."}},"assembly":{"collapseTooltip":"Expand / collapse sub-parts","addSub":"Add sub-part","clonePart":"Clone part","cloneSub":"Clone sub-part","copySuffix":" (copy)","subCount":"{{count}} sub-parts","partBadge":"Part","noSubs":"no sub-parts yet","mainNamePlaceholder":"Main part name","subNamePlaceholder":"Sub-part name","promote":"Promote to top level","demote":"Make a sub-part of the part above","noParentAbove":"Add a part above this row first — a sub-part needs a part to belong to.","subCountOne":"{{count}} sub-part"},"vhist":{"title":"Version history","current":"current","liveVersion":"Live version — being edited","liveVersionReadOnly":"Live version","archived":"Archived version","viewTitle":"View version {{version}}","loading":"loading…","viewError":"Could not load that version","sku":"SKU","lastEdited":"Last edited {{when}}","by":"by {{name}}","event":{"submit":"Submitted {{when}}","approve":"Approved {{when}}","add_pricing":"Priced {{when}}","final_approve":"Finalised {{when}}"},"live":{"pending":"In review — v{{version}}","approved":"Approved — v{{version}}","priced":"Priced — v{{version}}","final":"Final (approved) — v{{version}}"}},"vview":{"banner":"Viewing archived version V{{version}} — read-only","backToCurrent":"Back to current","parts":"Parts","noParts":"This version had no parts.","variants":"Variants","colPart":"Part","colCategory":"Category","colDims":"Thickness × Width × Length (mm)","colQty":"Quantity","colGrade":"Grade","colMaterial":"Material"},"comments":{"title":"Comments & history","none":"No notes yet.","system":"System","placeholder":"Add a note…","post":"Post","error":"Could not post the note"},"finishing":{"subline":"{{system}} · {{steps}} steps · formula from paint library","surface":"Surface m²","perUnit":"Finishing / unit","manage":"Manage paint colours","editFormula":"Edit formula","step":"Process step","product":"Product","ratio":"Ratio","pricePerKg":"₫/kg","footnote":"Formula is managed in the paint-colour library — editing it there updates every product using {{code}}. Ratios are by weight (TINH SƠN).","notInLibrary":"This variant's colour {{code}} isn't in the paint library yet.","noColour":"The active variant has no paint code yet — set one on the variant chip.","emptyHint":"Add it to the library to define its mixing formula, then it'll appear here.","libTitle":"Paint colours","libHint":"Manage colours and their mixing formulas. Variants pull their paint from this list.","libCount":"{{count}} colours · each with its mixing formula","libEmpty":"No paint colours yet.","addColour":"Add colour","scope":"Applies to","scopeCustomer":"This customer only","scopeNamed":"{{name}} only","scopeShared":"All customers","scopeHintCustomer":"Only this customer's BOMs can pick this colour.","scopeHintShared":"Every customer's BOMs can pick this colour.","code":"Colour code","name":"Display name","system":"Finishing system","stepsCol":"Steps","backToList":"Back to list","formula":"Mixing formula","addStep":"Add step","saveColour":"Save colour","parts":{"partRate":"Part's own rate","unitAria":"Unit of {{part}}'s own rate","unitM2":"g/m²","unitPiece":"g/piece","partRateAria":"{{part}}: own rate for {{step}}","howPiece":"{{rate}} g/pc × {{n}} pcs","title":"Parts to paint and process","part":"Part","material":"Material","size":"Thickness × Width × Length (mm)","sizeValue":"{{t}} × {{w}} × {{l}}","qty":"Pieces / product","area":"Area m² / product","process":"Paint process","processAria":"Paint process of {{part}}","notPainted":"— not painted —","noRecipe":"This product has no recipe for this code yet","fromColour":"from colour {{text}}","fromName":"from name {{text}}","totalArea":"Total paint area / product","saveRecipesFirst":"Save or discard the paint changes before changing a part's process.","saveBomFirst":"Save the BOM before changing a part's process.","assignError":"Could not change the part's paint process.","duplicateCode":"Two processes of this product use {{code}}: their area is not taken from the parts (the typed surface applies).","areaTag":"Area {{value}} m² / 1 product","areaFromParts":"Sum of {{n}} parts","productRate":"Product rate for the step (g/m²)","productRateHint":"The same value as the product's row on the formula screen","enterRate":"enter","rateAria":"Product rate for {{step}} (g/m²)","noRate":"no rate","pieces":"({{n}} pcs)","grams":"{{value}} g","how":"{{rate}} × {{area}}","stepTotal":"Step total – grams of mixture / 1 product","totalTitle":"Product paint total (by material code)","code":"Code","component":"Component","gramsPerUnit":"g / 1 product","kgPerUnit":"kg / 1 product","total":"Total","colour":"Colour"},"recipes":{"title":"Paint recipes","countOne":"{{count}} recipe","count":"{{count}} recipes","hint":"Paint per finished unit, computed from each formula's coat weights and the painted surface.","bomSurface":"BOM surface m²","total":"Total paint / unit","perUnit":"Recipe / unit","kgValue":"{{value}} kg","add":"Add recipe","addPlaceholder":"Pick a paint formula","addSearch":"Search code or name","addEmpty":"No formulas left to add","addNoMatch":"No formulas match","labelPlaceholder":"Process name, e.g. leg frame","labelAria":"Name of recipe {{n}}","recipeAria":"Paint recipe {{n}}: {{code}}","noCodeName":"Extras only","steps":"{{count}} steps","setsChip":"sets the chip's paint code","surface":"Surface","surfaceModeAria":"How recipe {{n}}'s surface is set","surfaceM2Aria":"Painted surface of recipe {{n}} (m²)","surfaceShareAria":"Share of the BOM surface for recipe {{n}} (%)","surfaceMode":{"inherit":"BOM surface","m2":"Own m²","share":"Share of BOM"},"shareRead":"{{value}}% of the BOM surface","m2Read":"{{value}} m²","effectiveSurface":"{{value}} m² painted","noSurfaceShort":"No surface yet","formulaRate":"Formula {{value}} g/m²","override":"Override g/m²","overrideAria":"Override coat weight for {{step}} (g/m²); blank uses the formula","overridePending":"Kept, not applied: the chip's paint changed. Edit or save to apply it.","overrideBadge":"Override {{value}} g/m²","extra":"Extra / touch-up","addExtra":"Add extra","extraNone":"No extra or touch-up consumption.","extraPick":"Pick a material","extraSearch":"Search materials","extraEmpty":"No materials match","extraDescAria":"Chemical of extra {{n}}","extraKgAria":"Kg per unit of extra {{n}}","removeExtra":"Remove extra {{n}}","recipeTotal":"Recipe total","moveUp":"Move recipe {{n}} up","moveDown":"Move recipe {{n}} down","remove":"Remove recipe {{n}}","sharedNote":"The formula is shared: editing it changes every product using {{code}}. Ratios are by weight.","sharedNoteCount":"The formula is shared: editing it changes every product using {{code}} ({{count}} products). Ratios are by weight.","sharedNoteReadOnly":"Shared formula: used by every product with {{code}}. Ratios are by weight.","sharedNoteCountReadOnly":"Shared formula: used by every product with {{code}} ({{count}} products). Ratios are by weight.","stale":"Saved for {{stored}}, but the chip now uses {{code}}: the numbers below are {{code}}'s formula without this recipe's {{count}} overrides. Save to keep the overrides for {{code}}; steps it doesn't have are then listed as unmatched.","staleReadOnly":"Saved for {{stored}}, but the chip now uses {{code}}: the numbers below are {{code}}'s formula without this recipe's {{count}} overrides.","frozen":{"title":"Approved paint","notice":"This BOM is approved: these are the paint quantities published in {{version}}, the ones production uses. Formula edits apply at the next approval.","currentNotice":"Showing today's recipes recomputed from the current formulas, read-only. Production still uses {{version}}.","showCurrent":"Show current recipes","showApproved":"Show approved paint","designVersion":"design v{{version}}","published":"published {{date}}","lines":"{{count}} lines","colReference":"Reference","colSku":"SKU","colChemical":"Chemical","colKg":"Kg / unit","total":"Approved paint / unit","empty":"The approved version has no paint lines."},"unmatched":"Overrides for steps this formula doesn't have: {{steps}}.","removeUnmatched":"Remove these overrides","noFormula":"Formula {{code}} isn't in the paint formula library.","createFormula":"Create it in Settings › Formulas","chipNotInLibrary":"The chip's paint code \"{{code}}\" isn't in the paint formula library.","noCode":"No paint formula: only this recipe's extras count.","noSurface":"No painted surface yet. Set the BOM surface or this recipe's own m².","emptyTitle":"No paint process yet","emptyHint":"Add a recipe: pick the paint formula this product is finished with.","emptyReadOnly":"This product has no paint recipe.","implicit":"No saved recipe yet: computed from the chip's paint code {{code}} at the BOM surface. Save to keep overrides and extras.","implicitReadOnly":"No saved recipe yet: computed from the chip's paint code {{code}} at the BOM surface.","legacyLines":"{{count}} old finishing lines on this BOM are ignored: the recipes drive paint consumption.","locked":"This BOM version is approved, so its recipes are read-only. The published BOM keeps the consumption frozen at approval; formula edits apply at the next approval.","loading":"Loading paint recipes…","loadError":"Couldn't load the paint recipes.","retry":"Retry","save":"Save recipes","discard":"Discard changes","saved":"Paint recipes saved","saveError":"Couldn't save the paint recipes","invalidSummary":"Fix the highlighted values before saving.","invalid":{"surface":"Enter a surface between 0 and 9,999,999.999 m².","share":"Enter a share above 0% and up to 100%.","override":"Enter a coat weight between 0 and 100,000 g/m².","extraKg":"Enter kg per unit between 0 and 100,000.","text":"A name or description is too long: names and descriptions up to 200 characters, codes up to 100.","tooMany":"A product can have at most 10 recipes.","tooManyExtras":"A recipe can have at most 50 extras.","tooManyOverrides":"A recipe can have at most 100 coat-weight overrides."},"implicitParts":"No saved recipe yet: computed from the chip's paint code {{code}} on its parts' area. Save to keep overrides and extras.","implicitPartsReadOnly":"No saved recipe yet: computed from the chip's paint code {{code}} on its parts' area."},"qty":{"recipe":"Process","step":"Step","extra":"Extra / touch-up","stepsRow_one":"× {{n}} product → kg mixture","stepsRow_other":"× {{n}} products → kg mixture","kgFor_one":"kg for {{n}} product","kgFor_other":"kg for {{n}} products","measure":"Measure","empty":"No paint on this product."}},"leave":{"title":"Leave without saving?","body":"You have changes on this BOM that are not saved. If you leave this page now, they will be lost.","confirm":"Leave and lose changes","stay":"Stay on this page"},"boxes":{"title":"Boxes & contents","addBox":"Add box","empty":"No boxes defined yet. Add a box and assign the parts that go inside.","meta":"Carton {{dims}} mm · {{units}} finished units/box · {{items}} items","edit":"Edit","delete":"Delete","item":"Item in box","noItems":"No items yet","addItem":"Add item to box","removeItem":"Remove item","addTitle":"Add box","editTitle":"Edit box","drawerHint":"A carton/box this product ships in. Add the items it contains afterwards.","name":"Box name","namePlaceholder":"e.g. Master carton (2 chairs)","dims":"Carton dimensions (L×W×H mm)","unitsPerBox":"Finished units / box","save":"Save box","addItemTitle":"Add item to box","itemDrawerHint":"Pick one of this product's parts, or type a packaging material.","saveItem":"Add item"},"clone":{"pickSource":"Clone from order…","button":"Clone BOM","cloning":"Cloning…","confirmReplace":"Replace the current draft lines with the cloned BOM?","done":"BOM cloned","error":"Clone failed"},"firstRun":{"scratchTitle":"Start from scratch","scratchSub":"Open an empty worksheet. The base version is created first — add finish variations once the parts are in.","scratchButton":"Start from scratch","cloneTitle":"Start from an existing BOM","cloneSub":"Copy the parts, variants and specs from another order's BOM, then adjust."},"nameInputLabel":"Product name","bomApproval":{"draft":"Draft","pending":"In review","revision":"Returned for revision","approved":"Design approved","priced":"Priced","final":"Final — ready to quote","step":{"draft":"Material requirements added","pending":"Submitted for approval","approved":"Approved by Lead / Manager","priced":"Pricing added (Purchasing)","final":"Final approval"},"pricedLinkTooltip":"Open the pricing worksheet","action":{"submit":"Submit for approval","approve":"Approve BOM","request_revision":"Request revision","add_pricing":"Add pricing","final_approve":"Final approval","reopen":"Reopen as new version"},"toast":{"submit":"Submitted for approval","approve":"BOM approved","request_revision":"Sent back for revision","add_pricing":"Pricing added — the BOM is priced","final_approve":"Final approval done — ready to quote","reopen":"Reopened as a new version"},"refusal":{"unlinked":"Some parts have no material","unpriced":"Some parts have no price","zeroQuantity":"Some lines have no quantity","openUnlinked":"Open unlinked materials","onMember":"On {{sku}}: {{parts}}","onFinish":"On finish {{sku}}: {{parts}}","dismiss":"Dismiss"},"actionError":"Couldn't complete that step. Try again.","request":{"anyone":"Anyone who can approve","pickApprover":"Pick an approver","stepRequired":"{{step}} (required)","pickAll":"Pick who approves each step before you submit. Every step needs an approver.","noApprovers":"Nobody can be picked yet. Ask an admin to give someone the ‘Approve BOMs’ right (Admin > Roles & Permissions), then try again.","submitTitle":"Submit for approval","submitSubtitle":"Choose who approves each step. Every step needs an approver, and only people with the ‘Approve BOMs’ right can be picked.","priority":"Priority","priorityNormal":"Normal","priorityUrgent":"Urgent","note":"Note for approvers","notePlaceholder":"What should the approvers check?","approversHeading":"Approvers","submit":"Submit","cancel":"Cancel","changeApprovers":"Change approvers","changeTitle":"Change approvers","changeSubtitle":"Only steps that are not done yet can be changed. The new approver is notified when the BOM reaches their step.","save":"Save","saved":"Approvers updated","submittedBy":"Submitted by {{name}} · {{date}}","waitingFor":"Waiting for {{name}}","waitingForAnyone":"Waiting for anyone who can approve","blockedNoPermission":"Your role can't act on BOM approvals. Ask an admin to give your role the right to approve BOMs.","blockedAssigned":"This step is assigned to {{name}}, so only they can approve it or send it back. To hand it to someone else, ask the person who submitted the BOM or an admin to change the approver.","blockedIneligible":"{{name}} can no longer approve (inactive or role changed). Ask the person who submitted the BOM or an admin to pick another approver.","candidatesError":"Couldn't load the approver list. Close and try again.","noLongerEligible":"{{name}} (can no longer approve)","reassigned":"Approver changed — {{step}}: {{name}}","nestingRepaired":"Part groups rebuilt from the workbook (status unchanged)"}},"addPart":"Add part","addItem":"Add item","groups":{"dims":"Dimensions (mm)","qty":"Quantity","material":"Material & yield","rawDims":"Raw dimensions (mm)","cost":"Cost"},"picker":{"linkCatalogue":"Link catalogue item…","selectMaterial":"Select material…","searchMaterial":"Search material…","noMaterials":"No materials match.","useTyped":"Use “{{value}}”","woodUnpriced":"Not in the wood price book — can’t be costed until it’s added","selectPaint":"Colour…","searchPaint":"Search colour…","noPaints":"No colours match.","noPaintsAtAll":"No colours in the library yet — add one from Finishing · Manage.","colourPlaceholder":"e.g. NA"},"subPartsCount":"{{count}} sub-parts","finishedSpec":"finished spec (mm)","partsCountOne":"· {{count}} part","import":{"button":"Import from Excel","title":"Import wood parts","instructions":"Upload an Excel (.xlsx) or CSV file with columns: Name, T, W, L, Quantity. The first row may be a header. Each part is added with its dimensions on a sub-part.","chooseFile":"Choose file","changeFile":"Change file","dropHint":"Drag a file here, or choose one below.","template":"Download template","reading":"Reading file…","cancel":"Cancel","commit":"Add {{count}} parts","commitOne":"Add 1 part","added":"{{count}} parts imported — review and save.","addedOne":"1 part imported — review and save.","previewTitle":"{{valid}} of {{total}} rows ready to import","previewSkipped":"· {{count}} skipped","status":{"ok":"Ready"},"field":{"name":"Name","thickness":"T (mm)","width":"W (mm)","length":"L (mm)","quantity":"Qty","status":"Status"},"rowIssue":{"noName":"Name is missing","badNumber":"{{field}} is not a number","negative":"{{field}} must be 0 or more","qtyRequired":"Qty must be greater than 0"},"error":{"parseFailed":"Could not read the file. Make sure it is a valid .xlsx or .csv.","emptyFile":"The file has no rows.","missingColumns":"Missing required column(s): {{columns}}. Include Name, T, W, L, Qty — or drop the header row and put them in that order."}},"subPartsCountOne":"{{count}} sub-part","hardware":{"count":"· {{count}} items","countOne":"· {{count}} item","qtyNote":"qty per finished unit","totalLabel":"Hardware cost / unit","usedOnNone":"—","cols":{"sku":"SKU","item":"Item","spec":"Spec","dimL":"Length","dimW":"Width","dimH":"Height","unit":"Unit","qtyPerUnit":"Quantity / unit","unitCost":"Unit cost","line":"Line","usedOn":"Used on"},"totalLabelCushion":"Cushion cost / unit","totalLabelPackaging":"Packaging cost / unit"},"linkedToMaster":"Linked to the material master","alternative":{"label":"Suggested alternative (ordering)","chip":"Suggested alt. (ordering): {{sku}}","unknown":"Suggested alternative (ordering)","remove":"Remove","movedHint":"New alternatives are chosen in Purchasing › Forecast when ordering."},"bulkDelete":{"aria":"Delete draft BOMs","selectAll":"Select all {{n}} empty drafts (every page, not just the rows shown)","action":"Delete empty drafts ({{n}})","actionSelected":"Delete ({{n}})","confirmTitle_one":"Permanently delete {{count}} draft BOM?","confirmTitle_other":"Permanently delete {{count}} draft BOMs?","confirmKept":"{{kept}} of the {{total}} selected cannot be deleted and will be kept ({{why}}).","confirmPermanent_one":"This deletes the BOM permanently. It cannot be undone.","confirmPermanent_other":"This deletes the {{count}} BOMs permanently. It cannot be undone.","confirmProductsRemoved_one":"{{count}} product is not used anywhere else and is deleted with its BOM.","confirmProductsRemoved_other":"{{count}} products are not used anywhere else and are deleted with their BOMs.","confirmProductsKept_one":"{{count}} product is used elsewhere and is kept ({{where}}).","confirmProductsKept_other":"{{count}} products are used elsewhere and are kept ({{where}}).","confirmProductsKeptPlain_one":"{{count}} product is used elsewhere and is kept.","confirmProductsKeptPlain_other":"{{count}} products are used elsewhere and are kept.","doneProductsRemoved_one":"{{count}} product deleted with its BOM.","doneProductsRemoved_other":"{{count}} products deleted with their BOMs.","doneProductsKept_one":"{{count}} product was kept.","doneProductsKept_other":"{{count}} products were kept.","confirmLines_one":"{{count}} of {{total}} has lines.","confirmLines_other":"{{count}} of {{total}} have lines.","confirmLineTotal_one":"{{count}} line in total.","confirmLineTotal_other":"{{count}} lines in total.","finishesNotSelected_one":"finish not selected: {{skus}}","finishesNotSelected_other":"{{count}} finishes not selected: {{skus}}","confirmNoLines_one":"It has no lines.","confirmNoLines_other":"None of them has any lines.","confirmCta":"Delete {{count}} permanently","done_one":"Deleted {{count}} draft BOM","done_other":"Deleted {{count}} draft BOMs","singleAction":"Delete BOM","singleHint":"Delete this draft BOM permanently, and its product if nothing else uses it","singleChecking":"Checking whether this BOM can be deleted…","singleCheckFailed":"Could not check whether this BOM can be deleted","singleBlocked":"Cannot delete: {{why}}","reason":{"not_found":"Already deleted or not found","not_draft":"Not a draft (archive it instead)","approval_history":"Was submitted or approved before","family_finishes":"Base of finishes that are not selected","published":"A production BOM was published from it","sample_request":"Used by a sample request","on_order":"Taken by an order (order BOM or final BOM)"}},"drafts":{"filter":"Drafts","listLabel":"Draft BOMs","searchPlaceholder":"Search product code or name","onlyEmpty":"Only empty","listCount_one":"{{n}} draft BOM.","listCount_other":"{{n}} draft BOMs.","listCapped":"Showing the first {{shown}} of {{n}} draft BOMs.","selectedCount_one":"{{n}} selected","selectedCount_other":"{{n}} selected","allMatchingSelected":"All {{n}} matching drafts selected","selectAllMatching":"Select all {{n}} matching drafts","selectShown":"Select the {{n}} rows shown","selectRow":"Select {{name}}","clear":"Clear","colCode":"Code","colProduct":"Product","colVersion":"Version","colLines":"Lines","loading":"Loading draft BOMs…","loadError":"Couldn't load the draft BOMs.","retry":"Try again","noneTitle":"No draft BOMs","noneBody":"No draft BOM matches this search.","idleHint":"Select drafts to delete several at once."},"names":{"title":"Product names","subtitle":"Set once after the BOM, before the first PI. Empty boxes use the BOM name shown in grey.","complete":"Complete","customsMissing":"Customs name missing","loading":"Loading product names…","loadError":"Couldn't load the product names.","retry":"Retry","bomName":"BOM name","fieldLabel":{"pi":"Name on PI","documents":"Name on documents","customs":"Customs declaration name (Vietnamese)","plan":"Name on production plan"},"fieldHelp":{"pi":"Printed on the proforma invoice sent to the customer.","documents":"One name shared by every export document.","customs":"Printed only on the customs invoice. Should contain the document name.","plan":"Internal name used by the factory teams."},"requiredPlaceholder":"Required — no default","usedOn":"Used on","uses":{"pi":"Proforma (PI)","commercialInvoice":"Commercial invoice","packingList":"Packing list","cbm":"CBM","contract":"Contract","customsInvoice":"Customs invoice","productionPlan":"Production plan","monthlyPlan":"Monthly plan"},"cartons":{"title":"Additional cartons","carton":"Carton","documents":"Name on documents","plan":"Name on production plan","documentsAria":"Name on documents for {{carton}}","planAria":"Name on production plan for {{carton}}"},"footer":"A product with the customs name missing can still go on a PI, but the PI and export documents will show a warning until it is filled in.","saved":"Name saved.","saveError":"Couldn't save the name."},"docs":{"heading":"Confirm {{count}} documents · Version {{version}}","subAnd":"and","subRequire":"need at least one new upload on this version (a new file or a new version of a current file).","subReuse":"keeps the current files.","status":{"awaiting":"Awaiting confirmation","unchanged":"Unchanged","change":"Change","new_model":"New model"},"slot":{"drawing":"Technical drawings","label":"Labels & marks","carton":"Carton & packing","packing_process":"Packaging process"},"slotSub":{"drawing":"Linked to product code (MSP)","label":"Product label","carton":"Container specifications","packing_process":"Packaging process"},"statusAria":"Status of {{slot}}","noFile":"No file on record yet.","reuse":"Reuse the current files (unchanged).","selectFile":"Select files","fileAria":"New files for {{slot}}","notePlaceholder":"Note changes (required)…","noteAria":"Change note for {{slot}}","required":"Required: upload at least one file (a new file, or a new version of a current one) + add a note.","awaiting":"Document awaiting confirmation — select a status above to proceed.","nothingAttached":"Nothing attached yet.","active":"ACTIVE","downloadAs":"Download as {{name}}","bannerBlocked":"{{count}} document(s) awaiting confirmation or a new file","bannerOk":"All documents confirmed","loading":"Loading documents…","loadError":"Couldn't load the documents.","retry":"Retry","unsaved":"Save the BOM first — documents are confirmed per saved BOM version.","saveError":"Couldn't update the document.","uploaded":"File uploaded for {{slot}}.","uploadError":"Couldn't upload the file.","tooLarge":"{{name}} is larger than 50 MB.","downloadError":"Couldn't open the file.","dropHint":"or drag files here — several at once is fine","dropActive":"Drop the files to attach them","pendingTitle":"Not saved yet — check these are the right files","pendingAria":"Files waiting to be saved for {{slot}}","pendingMeta":"{{size}} · {{type}}","thumbAlt":"Preview of {{name}}","cancelPending":"Cancel","noteNeeded":"Add a note about what changed before saving the files.","previousNote":"Previous note: {{note}}","wrongType":"{{name}} isn't an accepted file type (PDF, XLSX, DOCX, JPG, PNG, ZIP).","deleteAria":"Delete {{name}} (v{{version}})","deleteHint":"Delete this version","deleteInUse":"In use by BOM {{names}} — it can't be deleted.","deleteTitle":"Delete this file?","deleteBody":"{{name}} (v{{version}}) will be removed from the version history.","deleteBodyActive":"{{name}} (v{{version}}) will be removed from the version history and v{{previous}} becomes this file's current version again.","deleteBodyLast":"{{name}} (v{{version}}) will be removed from the version history. No file will be on record for this document.","deleteConfirm":"Delete file","deleted":"{{name}} deleted.","deleteError":"Couldn't delete the file.","uploadRejected":"\"{{name}}\" could not be uploaded: the server rejected the file (it may be empty, damaged or not a supported type). Check that it opens on your computer, or choose another file, then upload again.","keepsFiles":"Keeps the {{count}} current file(s) from the previous version.","filesHeading":"Files ({{count}})","historyToggle":"Version history ({{count}})","uploadedMany":"{{count}} files uploaded for {{slot}}.","uploadPartial":"{{failed}} of {{total}} files couldn't be uploaded ({{saved}} saved). The reason is shown next to each file still in the list — fix it or remove the file, then press Save again.","uploadAllFailed":"None of the {{count}} files could be uploaded. The reason is shown next to each file — fix it or remove the file, then press Save again.","pendingNewFile":"New file — starts at v1","pendingNewVersion":"Continues {{name}} — saved as its next version","pendingReplace":"Replaces {{name}} — saved as its next version","pendingWaiting":"Waiting to upload…","pendingUploading":"Uploading…","pendingRemove":"Remove {{name}} from the list","saveFiles":"Save files ({{count}})","addMore":"Add more files","noteForAll":"This note is saved with every file in this upload.","uploadedAs":"Uploaded as {{name}}","replace":"Replace","replaceAria":"Replace {{name}} with a new version","replaceHint":"Upload a new version of this file — the new file may have any name","replaceFileAria":"Replacement file for {{slot}}","deleteBodyOnly":"{{name}} (v{{version}}) will be removed from this document. The other files stay.","deleteFileTitle":"Remove this file?","deleteFileBody":"{{name}} and all {{count}} of its versions will be removed from this document. The other files stay.","deleteFileConfirm":"Remove file","deleteFileAria":"Remove {{name}} and all its versions","deleteFileHint":"Remove this file and all its versions"},"woodCalc":{"noSheetSize":"No sheet size","noSheetSizeHint":"The linked material has no width × length (Rộng / Dài), so purchasing converts its volume to sheets instead. Add the sheet size to the material.","partExceedsSheet":"Larger than the sheet","partExceedsSheetHint":"This part does not fit on one sheet of the linked material.","partsPerSheetTitle":"From a {{w}} × {{l}} mm sheet","factorOverride":"own","factorOverrideHint":"This part’s own rough factor overrides the BOM’s and the price book’s."},"woodRecalc":{"title":"Published quantities differ — re-approve to update","body":"The production BOM was published with {{published}} m³ of wood; with the current rough factors it would be {{next}} m³. Reopen and approve this BOM to publish the new quantities."},"historyRo":{"loadError":"Could not load the BOM history.","retry":"Retry"},"partCode":{"label":"Part code, line {{line}}","columnHint":"Product code + C1, C2… for a sub-assembly, + C1-CT01… for its parts, + CT01… for a loose part. Numbers run on past C9 and CT99 (C10, CT100…). All finishes of a model share one numbering, and a number is never reused.","pending":"Assigned on save","pendingHint":"The code is given when the BOM is saved, in row order.","editHint":"Type another free number, e.g. C2, C2-CT05 or CT07. Locked for good once the BOM is first approved; later versions keep every code.","full":"No free number","fullHint":"Every number in this sequence has been used.","lockedHint":"Locked since the BOM was first approved.","sharedHint":"Another BOM of this model shows the same code, so it is kept as is here."},"paintList":{"empty":"No paint process yet","default":"default","defaultHint":"Parts with no paint process of their own use this one.","remove":"Remove paint {{code}} from the list","add":"Add a paint process…","dismiss":"Dismiss","blocked_one":"{{count}} part uses {{code}} — reassign it on the Painting tab, then remove it from the list.","blocked_other":"{{count}} parts use {{code}} — reassign them on the Painting tab, then remove it from the list.","saveFirst":"Save or discard your changes on the Painting tab first, then change the paint list.","saveError":"The paint list could not be saved. Nothing was changed — try again.","partNotInList":"{{code}} is not in this BOM's paint list","addToList":"Add to paint list","partsNotInListSubmit":"These parts use a paint that is not in the BOM's paint list: {{parts}}. You can still submit, but costing and the paint sheet will not list that paint until it is added.","finishNotSet":"Not set","lockedApproved":"This BOM is approved or waiting for approval, so its paint cannot be changed. Open a revision first (Request revision), then edit the paint.","lockedNoRight":"You do not have the right to edit this BOM's paint. Ask someone who can edit BOMs."},"partPaint":{"groupList":"This BOM's paints","groupOther":"Other code…","search":"Search this BOM's codes, or type any library code…","noMatch":"No paint code matches. Check the code, or add the formula in Paint formulas first.","legacyDefault":"NA → default","legacyDefaultHelp":"This part says “NA” and has no code of its own, so it uses the BOM's default paint code. Pick a code to save one on the part."},"paintColours":{"inUse":"Paint codes in use","none":"No part has a paint code yet","parts":"{{count}} parts","partsOne":"1 part","noCode":"No paint code"},"versioning":{"revisionTitle":"Return the approved BOM for revision?","revisionBody":"Returning an approved BOM opens version {{next}}. The approved version {{version}} is kept as it is.","revisionConfirm":"Return and open version {{next}}","reopenTitle":"Reopen the final BOM?","reopenBody":"Reopening a final BOM opens version {{next}}. The final version {{version}} is kept as it is.","reopenConfirm":"Reopen as version {{next}}","impactTitle":"Changes in this version","impactError":"Could not load the version changes","impactErrorBody":"The SKUs this version will give each variant could not be read.","impactRetry":"Retry","impact":{"bump":"{{sku}} → {{next}}","none":"No change, stays {{sku}}","needs_new_variant":"{{sku}}: paint colour, wood or fabric changed. Put it back or use + Add variant","first":"First approval, stays {{sku}}","skipped":"{{sku}} is kept: its code is not built by the SKU format","limit":"{{sku}} has used its last version number"},"impactTag":{"bump":"Next version","none":"No change","needs_new_variant":"New variant","first":"First approval","skipped":"Kept","limit":"Last version"},"fields":{"paint_colour":"Paint colour","wood":"Wood","fabric":"Fabric"},"approvedToast":"Approved. {{changes}}","change":{"bumped":"{{from}} is now {{to}}","skipped":"{{sku}} kept: its code is not built by the SKU format","unchanged":"{{sku}} unchanged","first":"{{sku}} approved for the first time"},"skipReason":{"not_regenerable":"{{sku}} kept: its code is not built by the SKU format","baseline_missing":"{{sku}} kept: its last approved version could not be compared"}},"sheet":{"actions":{"download":"Download spreadsheet","upload":"Upload spreadsheet","downloadHint":"Download the whole BOM as one Excel file to edit offline.","uploadHint":"Upload the edited Excel file and review the changes before saving.","downloadError":"The spreadsheet could not be built. Reload the page and try again; if it keeps failing, tell your administrator.","reading":"Reading the file…","checking":"Checking material codes…","readError":"This file could not be read as an Excel (.xlsx) file. Open it in Excel, save it as .xlsx and upload it again.","noSheets":"None of the BOM sheets were found in this file. Download a spreadsheet from this page, fill that one in and upload it.","checkError":"The file was read, but checking it against the BOM failed, so nothing was changed. Upload the file again; if it keeps failing, tell your administrator.","uploadDirty":"Save or discard your changes first, then upload the file.","downloadDirty":"Save or discard your changes first, so the file matches the BOM."},"locked":{"status":"This BOM version is approved and locked. Start a new revision to edit it.","stage":"This order's BOM is not open for editing at its current stage. Ask the order owner to send it back for revision.","noRight":"You can't edit this BOM. Ask an administrator to give you the right to edit products.","finish":"This finish shares its base product's BOM, so it can't be uploaded here. Open the base product and upload there."},"tab":{"wood":"Wood parts","hardware":"Hardware","cushion":"Cushion","packaging":"Packaging","cartons":"Cartons","painting":"Painting"},"review":{"title":"Review spreadsheet changes","file":"File: {{file}}","materialCodeIgnored":"The Material code column on the Wood sheet is read-only. Edits to it were not applied; to change a part's material, link it in the BOM.","oldAssembly":"This file was downloaded before the Assembly column decided the structure, and none of its sub-parts has an Assembly value, so every saved sub-part stays under its assembly. To move sub-parts to the top level, download a new file and clear their Assembly cells.","becomesGroup":"Becomes a group: it now holds sub-parts, so its own size is no longer counted — its sub-parts are.","leavesGroup":"No longer a group: it has no sub-parts left, so it is counted as a part with its own size.","stale":"This BOM was changed after this file was downloaded. Saving will replace those changes with the file. Download a fresh copy if you're not sure.","noStamp":"This file has no download stamp, so it was not downloaded from this BOM. Every row is treated as new and every existing row on the sheets in the file is removed. Check the Removed rows before saving.","blocked":"Fix the rows listed below in your file, then upload it again.","noChanges":"No changes — the file matches the BOM.","counts":"{{added}} added · {{changed}} changed · {{removed}} removed · {{unchanged}} unchanged","added":"Added","changed":"Changed","removed":"Removed","unchanged":"Unchanged","errors":"Problems to fix","sheetMissing":"There is no {{sheet}} sheet in the file — {{tab}} not changed","sheetEmpty":"{{sheet}} sheet is empty — {{tab}} not changed","change":"{{col}}: {{from}} → {{to}}","fromCatalogue":"{{col}}: {{from}} → {{to}} (from the catalogue)","catalogueNote":"Spec and unit come from the material catalogue for rows with a material code.","catalogueLabel":"The catalogue now names this material “{{to}}”; the row keeps “{{from}}”.","empty":"(empty)","save":"Save changes","saving":"Saving…","close":"Close","saved":"Spreadsheet changes saved.","showUnchanged":"Show {{count}} unchanged","hideUnchanged":"Hide unchanged","wholeBox":"Box {{name}}","boxFields":"Carton, units or notes","stepLines":"Wood parts, Hardware, Cushion, Packaging and Painting","stepRenames":"Material renames","renames":{"title":"Material names changed in the file ({{n}})","hint":"These rows keep their material, but the file gives it a new name. Tick a rename to rename the material everywhere it is used (Materials, every BOM, documents). Its code, unit, costs and stock stay the same.","line":"Rename material {{sku}}: {{old}} → {{new}}","row":"{{sheet}} · row {{row}}","willRename":"Will be renamed when you save.","kept":"Not renamed: the material keeps its current name.","tickAll":"Tick all","untickAll":"Untick all","noneTicked":"No changes to save — the only differences are material names. Tick a rename to apply it, or close.","conflict":"Not renamed: {{sku}} has more than one new name in the file ({{names}}). Give it one name and upload again."},"stepBoxes":"Cartons","partial":"Only part of the spreadsheet was saved. Saved: {{saved}}. Not saved: {{failed}}. {{reason}} Fix that, then press Save again here: only the tabs that were not saved are sent again. If you close this window, download a fresh copy before you upload again.","failedAll":"Nothing was saved. {{reason}}","yes":"Yes","no":"No","codeRuleNote":"If a product-code question appears when you save, only the choices that save onto this product are offered here, because the cartons are saved onto this product too. To save the changes as a new product or a new variant, make them on this page instead of in the spreadsheet.","unlinkedTitle":"Not linked to the catalogue ({{count}})","unlinkedNote":"These rows are saved as plain text. Link each one to a catalogue material, or create the material, with Unlinked materials on the BOM before you submit it for approval.","unlinkedRow":"{{sheet}} row {{row}}: {{name}} — {{why}}","unlinkedUnknown":"not in the material catalogue","unlinkedAmbiguous":"matches more than one material"},"saveError":{"cancelled":"The save was cancelled at the product-code question, so nothing was written. Upload the file again and choose how to save.","forbidden":"You don't have the right to change this BOM. Ask an administrator to give you the right to edit products.","conflict":"The BOM was changed or locked by someone else while you were reviewing. Reload the page, download a fresh spreadsheet and redo your edits in it.","invalid":"The server did not accept some values in the file (for example a material that no longer exists, or a number out of range). Check the file, upload it again and review the rows marked in red.","network":"The server could not be reached. Check your connection and try again.","unknown":"The save failed for a reason the app can't explain. Try again; if it keeps failing, tell your administrator.","sessionExpired":"Your session expired. Sign in again, then upload the file again."},"err":{"noName":"{{sheet}} row {{row}}: the name is empty. Type a name on this row, or delete the row.","noItem":"{{sheet}} row {{row}}: neither a material code nor an item name is filled in. Enter the material code or the item name, or delete the row.","badNumber":"{{sheet}} row {{row}}: \"{{value}}\" in the {{col}} column is not a number. Use digits only, like 12.5 or 12,5.","negative":"{{sheet}} row {{row}}: {{col}} can't be negative. Enter 0 or a positive number.","qtyRequired":"{{sheet}} row {{row}}: the quantity is empty. Enter how many are needed (a number), or delete the row.","badBool":"{{sheet}} row {{row}}: \"{{value}}\" in the {{col}} column must be Yes or No.","badDifficulty":"{{sheet}} row {{row}}: difficulty \"{{value}}\" must be easy, medium or hard, or empty.","lookupFailed":"{{sheet}} row {{row}}: the material catalogue could not be checked for {{code}}. Check your connection and upload the file again.","unknownPart":"{{sheet}} row {{row}}: no wood part is named \"{{name}}\". Use a part name from the Wood parts sheet, or keep the Line ID as downloaded.","ambiguousPart":"{{sheet}} row {{row}}: more than one wood part is named \"{{name}}\". Keep the Line ID from the download so the right part is used.","badPaintProcess":"{{sheet}} row {{row}}: paint process \"{{value}}\" is not in this product's paint library. Pick one from the list on the Instructions sheet, or leave it empty for not painted.","boxNameMissing":"{{sheet}} row {{row}}: this row has no box name and there is no box above it. Type the box name on the first row of the box.","noHeader":"{{sheet}} sheet: the header row was not found. Keep the header row from the downloaded file as row 1 and upload again. If this product has no {{tab}}, leave the {{sheet}} sheet empty or delete it.","missingColumn":"{{sheet}} sheet: the \"{{col}}\" column is missing. Put the header back as it was in the download and upload again. If this product has no {{tab}}, leave the {{sheet}} sheet empty or delete it.","emptyItemName":"{{sheet}} row {{row}}: the item name is empty. Type a name or delete the row.","unknownAssembly":"{{sheet}} row {{row}}: part {{name}} is put in assembly \"{{assembly}}\", which is not on this sheet. Type the name of an assembly that is on this sheet in its Assembly cell, or clear the cell.","assemblyRemoved":"{{sheet}} row {{row}}: part {{name}} was in assembly \"{{assembly}}\", which is no longer on this sheet. Type the name of another assembly on this sheet in its Assembly cell, delete the row, or put the assembly back.","selfAssembly":"{{sheet}} row {{row}}: part {{name}} names itself in its Assembly cell, so it would be both a part and its own sub-part. Clear the Assembly cell, or type the name of another top-level row.","nestedAssembly":"{{sheet}} row {{row}}: part {{name}} is put in \"{{assembly}}\", which is itself a sub-part. A sub-part can't have sub-parts: clear the Assembly cell of \"{{assembly}}\", or put {{name}} in a top-level assembly.","ambiguousAssembly":"{{sheet}} row {{row}}: part {{name}} is put in \"{{assembly}}\", but more than one top-level row has that name (on this sheet, or as its saved name before a rename). Rename one of them, then upload again.","partRemoved":"{{sheet}} row {{row}}: part {{name}} is no longer on the Wood parts sheet. Delete this Painting row or put the part back."},"xl":{"sheetName":{"instructions":"Instructions","wood":"Wood parts","hardware":"Hardware","cushion":"Cushion","packaging":"Packaging","cartons":"Cartons","painting":"Painting"},"col":{"assembly":"Assembly","partName":"Part name","nameVi":"Name VI","t":"Thickness","w":"Width","l":"Length","qty":"Quantity","material":"Wood type","grade":"Grade","paintColour":"Paint colour","roughT":"Rough thickness","roughW":"Rough width","roughL":"Rough length","roughPcs":"Rough pieces","roughFactor":"Rough factor","notes":"Notes","outsourced":"Outsourced","difficulty":"Difficulty","lineId":"Line ID","materialCode":"Material code","itemName":"Item name","spec":"Spec","length":"Length","width":"Width","height":"Height","unit":"Unit","qtyPerUnit":"Quantity per unit","unitCost":"Unit cost","boxName":"Box name","cartonL":"Carton length","cartonSize":"Carton size","cartonW":"Carton width","cartonH":"Carton height","unitsPerBox":"Units per box","boxNotes":"Box notes","contains":"Contains","boxQty":"Quantity","paintProcess":"Paint process"},"instr":{"title":"How to use this spreadsheet","step1":"1. Download this file from the BOM page (you already did).","step2":"2. Edit it in Excel: one row per item. Add rows to add items, delete rows to remove them.","step3":"3. Do not edit the Line ID column (grey). It is how the app knows which BOM line a row is. Leave it empty on new rows.","step4":"4. Upload the file on the BOM page with Upload spreadsheet, then review what was added, changed and removed.","step5":"5. Click Save changes in the review. Nothing is saved before that.","step6":"6. A sheet that is empty, or deleted from the file, leaves that tab unchanged.","note1":"Wood parts: the Assembly column decides the structure. Leave it blank for a top-level part; type the name of a top-level row on this sheet to make the row a sub-part of it (that row becomes an assembly). Clearing the cell moves a sub-part to the top level. Sorting the rows does not change it. A row can't name itself or a sub-part.","note2":"Cartons: one row per item in a box. Fill the box columns on the first row of each box only.","note3":"Painting: one row per wood part. Choose the paint process from the list below, or leave it empty for not painted.","numbers":"Numbers: both 1.5 and 1,5 are read as one and a half. Quantity is required on every row.","productLabel":"Product","downloadedLabel":"Downloaded","stampLabel":"BOM change stamp (do not edit)","processesTitle":"Valid paint processes","processesNone":"This product has no paint library yet."}}},"columns":{"title":"Columns","hint":"Show, hide and reorder this tab's columns. # and the name column stay first.","moveUp":"Move up","moveDown":"Move down","reset":"Reset columns","drag":"Drag to move this column","hidden":"{{count}} hidden"}},"orders":{"title":"Orders","salesOrders":"Sales Orders","purchaseOrders":"Purchase Orders","orderNumber":"Order Number","customer":"Customer","supplier":"Supplier","orderDate":"Order Date","dueDate":"Due Date","totalAmount":"Total Amount","status":{"draft":"Draft","pending":"Pending","confirmed":"Confirmed","processing":"Processing","shipped":"Shipped","delivered":"Delivered","cancelled":"Cancelled"},"triage":{"existingProduct":"Existing product","newNeedsBom":"New · needs BOM","spawnBom":"Spawn BOM order","bomStage":"BOM stage","ready":"Ready","notReady":"Not ready","composeQuote":"Compose quote","allLinesReady":"All lines are ready to quote","linesPending":"{{count}} lines pending","quoteReadiness":"Quote readiness","qty":"Qty {{qty}}","untitledLine":"Line {{number}}"},"pipeline":{"draft":"Draft","bom_in_progress":"BOM in progress","bom_approved":"BOM approved","bom_costed":"BOM costed","quoted":"Quoted","confirmed":"Confirmed","order":"Draft","bom":"BOM in progress","bom_approve":"BOM approved","cost":"BOM costed","final":"Product approved","quote":"Quoted","quote_approve":"Quote approved","client":"Client review","done":"Confirmed","owners":{"sales":"Sales","eng":"BOM · Engineering","lead":"Team Lead","purchasing":"Purchasing","salesmgr":"Sales Manager","client":"Client","system":"System"}},"workspace":{"breadcrumb":"Sales · Order Workspace","orderLines":"Order lines","openWorkspace":"Order workspace","backToOrder":"Back to order","linkedQuote":"Linked quote","openQuote":"Open quote","noQuote":"No quote composed yet","quoteRevision":"Rev {{rev}}","noLines":"No lines on this order","activity":"Activity","noActivity":"No activity yet.","activityRev":"Rev {{rev}}","activityActions":{"submit":"Submitted for approval","recall":"Recalled","approve":"Quote approved","request_changes":"Changes requested","send":"Sent to client","resend":"Resent to client","reopen":"Reopened as new revision","client_accept":"Client accepted","client_revision":"Client requested revision","client_reject":"Client declined"},"stage":{"draft":"Draft","confirmed":"Confirmed","in_production":"In production","shipped":"Shipped","delivered":"Delivered","invoiced":"Invoiced"},"kpi":{"status":"Status","orderDate":"Order date","warehouse":"Warehouse","grandTotal":"Grand total"},"approval":{"awaiting":"{{so}} is awaiting approval","approve":"Approve","reject":"Reject","approved":"Order approved","rejected":"Order rejected and cancelled","rejectTitle":"Reject this order?","rejectMessage":"Rejecting cancels the order and records it as lost. Tell the sales owner why.","rejectNoteLabel":"Reason for rejection","rejectNotePlaceholder":"e.g. margin too low, customer credit hold"},"fromQuote":"From quote {{number}}"}},"deals":{"breadcrumb":"Sales","title":"Pipeline","subtitle":"Quote through delivery — one record per deal, moving between stages and parties.","searchPlaceholder":"Quote no., order no., customer, PO…","stage":{"all":"All deals","quoting":"Quoting","won":"Won","production":"In production","shipping":"Shipping","closed":"Invoiced & closed","lost":"Lost & cancelled"},"stageNote":{"all":"quote → close","won":"to order & confirm"},"status":{"draft":"Draft","pending_approval":"Pending approval","approved":"Approved","sent":"Sent to customer","revision_requested":"In revision","accepted":"Accepted","confirmed":"Confirmed","processing":"In production","shipped":"Shipped","partial":"Partially shipped – balance outstanding","delivered":"Delivered","converted":"Converted","cancelled":"Cancelled","rejected":"Lost","expired":"Expired","costing":"With costing","invoiced":"Invoiced","closed":"Closed"},"party":{"sales":"Sales","costing":"Costing","manager":"Manager","customer":"Customer"},"sub":{"draft":"Drafting","costing":"With costing","pending_approval":"Approval","approved":"Ready to send","sent":"With customer","revision_requested":"Revising"},"subStrip":{"whoseMove":"Whose move","all":"All","returnNote":"Returning a quote to an earlier party is normal — it stays one record"},"col":{"ref":"Reference","customer":"Customer","products":"Products","qty":"Quantity","total":"Total","status":"Status","validUntil":"Valid until","owner":"Owner","accepted":"Accepted","customerPo":"Customer PO","progress":"Progress","delivery":"Delivery","invoice":"Invoice","reason":"Reason","waitingOn":"Waiting on","reasonCode":"Reason code"},"table":{"countsNote":"{{shown}} of {{total}} · columns follow the stage","loading":"Loading…","empty":"Nothing at this stage.","emptyMatching":"Nothing at this stage matching “{{q}}”.","moreProducts":"+{{n}}","expired":"expired","daysLeft":"{{n}} days left","customerAccepted":"customer accepted","issueOrderNo":"Issue order no.","overdue":"overdue","countsNoteTimeline":"{{shown}} of {{total}} · lifecycle progress","viewToggle":"Table or timeline view","viewTable":"Table","viewTimeline":"Timeline"},"refCell":{"fromQuote":"from {{q}} · Rev {{rev}}","rev":"Rev {{rev}}","revNoOrder":"Rev {{rev}} · no order no. yet","amd":"Amd {{n}}","auto":"auto","revOrderPi":"Rev {{rev}} · order {{pi}} (draft)"},"waitCell":{"days":"{{n}}d","overSla":"{{over}}d over the {{sla}}-day SLA"},"moneyCell":{"locked":"· locked"},"progressCell":{"pct":"{{pct}}%","shippedOf":"{{shipped}} of {{total}} shipped"},"life":{"quoted":"Quoted","accepted":"Accepted","orderIssued":"Order issued","inProduction":"In production","shipped":"Shipped","invoiced":"Invoiced"},"drawer":{"loading":"Loading…","quotedAs":"quoted as {{q}}","close":"Close","statTotal":"Total · {{currency}}","statUnits":"Units","statDelivery":"Delivery","statValidUntil":"Valid until","fxRate":"at {{rate}} {{from}}→{{to}}","fxLocked":"Rate locked at acceptance","fxIndicative":"Indicative — locks when accepted","hasIt":"has it — {{days}} days since {{since}}","revisionThread":"Revision thread","handOffs":"{{n}} hand-offs · price shown against Rev A","lineItems":"Line items","waitingOn":"Waiting on {{party}}","raised":"Raised {{date}} · Rev {{rev}}","raisedNoRev":"Raised {{date}}","yourMove":"Your move as {{role}}","markLost":"Mark lost","amend":"Amend","editOrder":"Edit order","amendments":"Change orders","amendmentsCount":"{{n}} amendment(s) · same order number","amendPct":"{{pct}}%","openQuote":"Open quote","openOrder":"Open order","deliverTo":"Deliver to","deliverToPort":"Discharge port","deliverToIncoterm":"Incoterm","deliverToInvoiced":"Invoiced to {{customer}} — this account is never billed.","orderDocuments":"Order documents →","openPlanning":"Open planning","markInvoiced":"Mark invoiced","closeOrder":"Close order","closeConfirmTitle":"Close order {{ref}}?","closeConfirmBody":"The order leaves the active pipeline and no further amendments or shipments can be recorded against it.","closeConfirmConfirm":"Close order","noQuoteReason":"This deal has no quote — it started as an order/PI."},"lines":{"product":"Product","qty":"Qty","shipped":"Shipped","unit":"Unit","amount":"Amount"},"refs":{"quoteNo":"Quote no.","orderNo":"Order no.","notIssued":"not issued","customerPo":"Customer PO","owner":"Owner"},"event":{"submit":"Submitted for approval","recall":"Recalled","approve":"Approved","request_changes":"Changes requested","send":"Sent to customer","resend":"Resent to customer","reopen":"Reopened for revision","client_accept":"Customer accepted","client_revision":"Customer requested a revision","client_reject":"Customer rejected"},"actions":{"send_costing":"Send for costing","costing_done":"Enter costs","recost":"Re-cost","approve":"Approve","send":"Send to customer","log_reply":"Log reply","issue_order":"Issue order no.","escalate":"Escalate","returnToCosting":"Return to costing"},"needsYou":{"title":"Needs you","asRole":"as {{role}} · oldest waiting {{n}}d","empty":"Nothing waiting on {{role}} right now.","held":"{{n}}d held","returnReasonPrompt":"Reason for returning to costing (required)"},"toasts":{"actionFailed":"Action failed","sentToCosting":"Sent for costing","costingDone":"Costs entered — sent for approval","approved":"Approved","sent":"Sent to customer","replyLogged":"Customer acceptance logged","orderIssued":"Order issued as a draft PI","escalated":"Escalated to the sales manager","returnedToCosting":"Returned to costing","noWarehouse":"No active warehouse to issue the order from","invoiced":"Order marked invoiced","closed":"Order closed","issueOrderForbidden":"You need permission to create PIs to issue an order."},"totalsIn":"Totals in","lostCode":{"price":"Price","lead_time":"Lead time","capacity":"Capacity","no_response":"No response","spec_mismatch":"Spec mismatch","cancelled_by_customer":"Cancelled by customer","other":"Other"},"markLost":{"title":"Close {{q}} as lost","reasonLabel":"Reason code","reasonHint":"— this is what win/loss reporting counts","noteLabel":"Note","notePlaceholder":"What the customer actually said…","footerNote":"Moves to Lost & cancelled","cancel":"Cancel","save":"Close as lost"},"amendKind":{"quantity":"Quantity","unit_price":"Unit price","delivery_date":"Delivery date","specification":"Specification","cancel_line":"Cancel a line"},"amend":{"title":"Amend {{ref}}","subtitle":"Amendment {{n}} · same order number, new version","warning":"This order is already in {{status}}. Amending notifies production and purchasing, and the amendment is stamped into the thread with your reason — it does not create a second order.","whatChanges":"What changes","detail":"Detail","detailPlaceholder":"e.g. qty 500 → 420 on C-462 Chair","reason":"Reason","reasonHint":"— required, it is what the thread explains","reasonPlaceholder":"e.g. customer reduced the retail programme","priceImpact":"Price impact","priceImpactHint":"— % against the confirmed value, optional","priceImpactPlaceholder":"-12","footerNote":"Notifies production & purchasing","cancel":"Cancel","raise":"Raise amendment","toastNeedDetail":"Say what changes","toastNeedReason":"A reason is required — the thread has to explain the change","toastSuccess":"{{ref}} amended (Amd {{n}}) — production and purchasing notified"},"metrics":{"winRate":"Win rate","pct":"{{pct}}%","days":"{{n}} days","winRateSub":"{{won}} won · {{lost}} lost","winRateEmpty":"nothing decided yet","quoteToAccepted":"Quote → accepted","quoteToAcceptedSub":"average on won deals","quoteToAcceptedEmpty":"no accepted quotes yet","slowestHandOff":"Slowest hand-off","slowestSub":"holding {{n}} days on average","slowestEmpty":"nothing in flight","pastSla":"Past SLA","pastSlaOver":"needs escalating","pastSlaOk":"everything inside SLA","topLossReason":"Top loss reason","topLossSub":"{{n}} of {{total}} lost","topLossEmpty":"nothing lost yet"},"newQuote":"＋ New quote","newQuoteDrawer":{"title":"New quote","sub":"Full quote builder","caption":"Full quote screen"},"timeline":{"delivery":"Delivery {{date}}","valid":"Valid {{date}}"},"docNotFound":{"quote":"Quote not found — it may have been deleted or the link is wrong.","order":"Order not found — it may have been deleted or the link is wrong.","back":"Back to Pipeline"},"versions":{"title":"Versions","loading":"Loading versions…","error":"Couldn't load versions.","retry":"Retry","empty":"No versions recorded for this deal.","latest":"Latest","col":{"version":"Version","type":"Document","date":"Date","qty":"Qty","amount":"Amount","status":"Status","by":"By","changes":"What changed"},"docType":{"quote":"Quote","pi":"PI","order":"Order"},"ref":{"rev":"Rev {{value}}","ver":"v{{value}}","amd":"Amd {{value}}","original":"Original"},"priceDelta":"Price {{pct}}%","linesRevised_one":"{{count}} line revised","linesRevised_other":"{{count}} lines revised","bom":"BOM v{{n}}"}},"sales":{"title":"Sales","description":"Manage sales orders, customers, and quotations","salesOrders":"Sales Orders","customers":"Customers","quotations":{"backToList":"← Quotations","notFound":"Quotation not found.","backToListLink":"Back to list","customerLabel":"Customer","convertToSO":"Convert to SO","converting":"Converting...","generatePI":"Generate PI","convertedSuccess":"Sales order {{soNumber}} created","fields":{"quoteDate":"Quote date","validUntil":"Valid until","currency":"Currency","subtotal":"Subtotal","tax":"Tax","discount":"Discount","grandTotal":"Grand total"},"lineColumns":{"seq":"#","description":"Description","qty":"Qty","unitPrice":"Unit price","discountPct":"Discount %","taxPct":"Tax %","lineTotal":"Line total"},"title":"Quotations","description":"Prepare and send price quotations to customers.","new":"New quotation","validUntil":"Valid until","notesToCustomer":"Notes to customer","kpi":{"openQuotes":"Open quotes","pipelineValue":"Pipeline {{value}}","awaitingClient":"Awaiting client","confirmed":"Confirmed","wonValue":"Won {{value}}","priceReview":"Revision requested","winRate":"Win rate","winRateSub":"{{won}} of {{total}} closed"},"viewTable":"Table","viewBoard":"Board","emptyTitle":"No quotations yet","emptyDescription":"Quotations are price offers you send to customers before an order. Create your first quotation to get started.","lines":{"add":"Add line","qty":"Quantity","unitPrice":"Unit price","total":"Total","remove":"Remove","description":"Description"},"scope":{"mine":"My quotes","team":"Team","all":"All"},"helpIntro":"Create and track quotations before they convert to sales orders.","helpStep1":"Use the My, Team, and All toggle to change which quotations you see.","helpStep2":"Switch between table and board views to organize quotations by status.","helpStep3":"Click New to draft a quotation.","helpTip1":"An accepted quotation can be converted into a sales order from its detail page.","columns":{"quote":"Quote","customer":"Customer","total":"Total","status":"Status","validUntil":"Valid until"},"tabs":{"all":"All","open":"Open","pending":"Pending","sent":"Sent","confirmed":"Confirmed","closed":"Closed"},"validAccepted":"accepted","validExpired":"expired","validDaysLeft":"{{days}}d left"},"newOrder":"New Order","totalOrders":"Total Orders","pendingOrders":"Pending Orders","activeCustomers":"Active Customers","totalRevenue":"Total Revenue","manageOrders":"View and manage all sales orders","manageCustomers":"View and manage customer database","searchPlaceholder":"Search by order number or customer...","allStatuses":"All Statuses","recentOrders":"Recent Orders","noOrders":"No orders found","viewAllOrders":"View All Orders","orderNumber":"Order number","customer":"Customer","date":"Date","total":"Total","showing":"Showing","of":"of","statusLabels":{"draft":"Draft","submitted":"Submitted","approved":"Approved","processing":"Processing","shipped":"Shipped","delivered":"Delivered","cancelled":"Cancelled"},"addCustomer":"Add Customer","editCustomer":"Edit Customer","searchCustomers":"Search by code, name, or tax ID...","noCustomers":"No customers found","customerCode":"Customer Code","customerName":"Customer Name","nameVietnamese":"Name (Vietnamese)","type":"Type","contact":"Contact","email":"Email","phone":"Phone","taxId":"Tax ID","billingAddress":"Billing Address","shippingAddress":"Shipping Address","creditLimit":"Credit Limit (VND)","paymentTerms":"Payment Terms (days)","allTypes":"All Types","customerTypeLabels":{"company":"Company","individual":"Individual","direct":"Direct (B2B)","distributor":"Distributor","retailer":"Retailer","oem":"OEM"},"customerStatusLabels":{"active":"Active","inactive":"Inactive","blocked":"Blocked","prospect":"Prospect","pending":"Pending"},"quotationsPage":{"title":"Quotations","description":"Create and manage sales quotations","newQuotation":"New Quotation","noQuotations":"No quotations yet","noQuotationsDesc":"Create your first quotation to get started","searchPlaceholder":"Search quotations...","allStatuses":"All Statuses","statusLabels":{"draft":"Draft","sent":"Sent","accepted":"Accepted","rejected":"Rejected","expired":"Expired"},"createQuotation":"Create Quotation","quotationCreated":"Quotation created"},"form":{"createOrder":"Create Order","newOrderDescription":"Create a new sales order","createQuotation":"Create Quotation","quotationCreated":"Quotation created successfully"},"newCustomer":"New Customer","newCustomerSubtitle":"Create export customer — auto customer code, dedup, multi address & banking","tabs":{"general":"General Info","commercial":"Commercial","shipping":"Shipping","banking":"Banking","documents":"Documents","review":"Review"},"companyName":"Company name","shortName":"Short name","country":"Country (ISO-2)","customerType":"Customer type","previewCode":"Preview code","primaryContact":"Primary contact","intermediaryBank":"Intermediary bank","exportWizard":"Export wizard","productOrders":{"loadError":"Could not load this product order.","workflowUnavailable":"Workflow actions and history are unavailable right now. The order details above are still current.","title":"Product Orders","description":"Run custom-product orders through the BOM workflow from customer brief to ready-to-quote.","createCta":"New Product Order","newTitle":"New Product Order","newSubtitle":"Capture a customer brief; the BOM workflow stages route the rest","createSuccess":"Created order {{number}}","searchPlaceholder":"Order number or product name…","stateLabel":"State","stateAll":"All states","state":{"in_progress":"In progress","completed":"Completed","cancelled":"Cancelled"},"priority":{"low":"Low","medium":"Medium","high":"High"},"productType":{"chair":"Chair","table":"Table","cabinet":"Cabinet","bed":"Bed","deck":"Deck","other":"Other"},"stage":{"new_order":"New Order","bom_spec_50":"Preliminary BOM (50%)","warehouse_review":"Warehouse Review","mgmt_design_approval":"Management Design Approval","bom_finalize":"Final BOM","mgmt_final_approval":"Final Approval","ready_to_quote":"Ready to Quote"},"verb":{"submit":"Submit","approve":"Approve","reject":"Reject","reroute":"Reroute","complete":"Complete"},"verbActions":{"submit":"Submit to next stage","approve":"Approve and advance","reject":"Reject and send back","reroute":"Reroute","complete":"Complete"},"transitionSuccess":"{{verb}} succeeded","transitionConflict":"This order changed since you loaded it. Reload and try again.","transitionReasonRequired":"A reason is required for this action.","columns":{"orderNumber":"Order number","product":"Product","stage":"Stage","priority":"Priority","state":"State","created":"Created","fobPrice":"FOB price"},"pagination":"Showing {{start}}-{{end}} of {{total}}","emptyTitle":"No product orders yet","emptyDescription":"Product orders capture custom customer briefs and route them through the BOM stages. Create a new product order to capture the first brief.","validation":{"required":"Customer and product name are required"},"fields":{"customer":"Customer","customerPlaceholder":"Select a customer…","briefName":"Product brief name","briefNamePlaceholder":"e.g. Sweden export — solid oak dining chair","briefDescription":"Brief description","briefDescriptionPlaceholder":"Dimensions, joinery, finish, references…","clientCode":"Client code / SKU","clientCodePlaceholder":"e.g. 2110100005268","clientDescription":"Client description","clientDescriptionPlaceholder":"e.g. DC VS310 P BK/BE","productType":"Product type","quantity":"Estimated quantity","priority":"Priority","targetQuoteDate":"Target quote date","created":"Created"},"detailHeading":"Order details","actionsHeading":"Actions","noActions":"No actions available at this stage","historyHeading":"History","noHistory":"No transitions yet","initialEntry":"Order created","rejectDialog":{"title":"Reject and send back","body":"Provide a reason. The previous owner will receive a task to address it.","reasonLabel":"Reason","reasonPlaceholder":"Why is this being rejected? (mandatory)","confirmCta":"Reject"},"helpIntro":"Manage product orders as they move through production stages.","helpStep1":"Search by order number or filter by state to narrow the list.","helpStep2":"Select an order to view its current stage and history.","helpStep3":"Click Create product order to start a new one.","helpTip1":"The stage column shows where each order is in the workflow."},"drawer":{"titleNew":"New Customer","titleEdit":"Edit Customer","close":"Close","discard":"Discard","saveDraft":"Save Draft","saveAndActivate":"Save & Activate","save":"Save","savingDraft":"Saving…","saved":"Saved","saveFailed":"Save failed","restoreDraftQuestion":"Restore unsaved draft?","restoreDraftYes":"Restore","restoreDraftDiscard":"Discard","saving":"Saving…","savedNSecondsAgo":"Saved {{n}}s ago","saveFailedRetry":"Save failed — retry","activated":"Activated","activateFailed":"Could not activate"},"sections":{"identity":"Identity","primaryContact":"Primary Contact","locations":"Locations","additionalContacts":"Additional Contacts","commercial":"Commercial Terms","banking":"Banking","documents":"Documents"},"drawerFields":{"salutation":"Salutation","givenName":"Given name","familyName":"Family name","displayNameVi":"Display name (Vietnamese)","title":"Title","titleHelper":"e.g. Procurement Manager","department":"Department","mobile":"Mobile","preferredLang":"Preferred language","websiteHelper":"https://example.com","codePreview":"Code preview","taxIdHelper":"Required for VN registered companies","segmentLabel":"Segment","currency":"Currency","currencyHelper":"Default invoicing currency","timezone":"Timezone","timezoneHelper":"Used for delivery windows and reports","localePref":"UI language","localePrefHelper":"Customer-portal default","openingHours":"Opening hours","assignedContact":"Assigned contact","internalNote":"Internal note","email":"Email","phone":"Phone","label":"Label","labelPlaceholder":"Main warehouse","openingHoursPlaceholder":"Mon-Fri 8:00-17:00","notes":"Notes","incoterm":"Incoterm","destinationPort":"Destination port","freightForwarder":"Freight forwarder","paymentTermsDays":"Payment terms (days)","creditLimit":"Credit limit ({{currency}})","assignedSalesperson":"Assigned salesperson","leadTimeTargetDays":"Lead time target (days)","shortName":"Short name","country":"Country","website":"Website","segment":{"sme":"SME","enterprise":"Enterprise","individual":"Individual"},"defaultPaymentTerm":"Default payment term","defaultPaymentTermCompany":"— use company default —"},"drawerContacts":{"add":"Add contact","addBilling":"+ Billing contact","addShipping":"+ Shipping contact","addDecisionMaker":"+ Decision maker","makePrimary":"Make primary","primary":"Primary","billingContact":"Billing","shippingContact":"Shipping","deactivate":"Deactivate","emptyTitle":"No additional contacts","emptyBody":"Add billing, shipping, or decision-maker contacts.","deleteContact":"Delete contact"},"drawerLocations":{"add":"Add location","addShipping":"+ Add shipping","addFacility":"+ Add facility","types":{"billing":"Billing","shipping":"Shipping","facility":"Facility","hq":"HQ"},"primaryBilling":"Primary billing","primaryShipping":"Primary shipping","lastBillingError":"At least one billing location is required.","emptyTitle":"No locations yet","emptyBody":"Add a billing address to continue.","atLeastOneBilling":"A billing location is required.","delete":"Delete"},"drawerBanking":{"add":"Add bank account","isDefault":"Default account","swift":"SWIFT / BIC","iban":"IBAN","accountNo":"Account number","beneficiary":"Beneficiary name","intermediary":"Intermediary bank","lcTerms":"L/C terms","emptyTitle":"No bank accounts","emptyBody":"Add bank details for invoices and remittance.","delete":"Delete","bankName":"Bank name","bankAddress":"Bank address"},"drawerDocuments":{"drop":"Drop files here or click to upload","kinds":{"businessLicense":"Business License","taxCert":"Tax Certificate","nda":"NDA","contract":"Contract","other":"Other"},"emptyTitle":"No documents","emptyBody":"Upload contracts, licenses, or other supporting files.","kind":"Kind","deleteDocument":"Delete document"},"duplicate":{"title":"Possible duplicate found","viewExisting":"View existing","continueAnyway":"Continue anyway","mergeInto":"Merge into existing","matchScore":"{{score}}% match"},"unsaved":{"title":"Discard changes?","body":"You have unsaved changes. Leaving will lose them.","keepEditing":"Keep editing","discard":"Discard"},"status":{"savingDraft":"Saving draft…","saved":"Saved","activated":"Activated","offline":"Offline — changes will sync when reconnected"},"salutation":{"mr":"Mr.","ms":"Ms.","dr":"Dr.","anh":"Anh","chi":"Chị","em":"Em"},"drawerCustomerType":{"direct":"Direct","distributor":"Distributor","retailer":"Retailer","oem":"OEM"},"commercial":{"propagationNote":"Defaults from country selection — edit to override."},"identity":{"duplicateChecking":"Checking for duplicates…"},"orders":{"title":"Sales orders","description":"Track and manage confirmed sales orders from customers.","new":"New sales order","create":"Create order","created":"Sales order created.","updated":"Sales order updated.","editTitle":"Edit {{so}}","linesEditHint":"Line items are edited on the order detail page.","emptyTitle":"No sales orders yet","emptyDescription":"Sales orders hold confirmed customer purchases. Convert a quotation or create one manually to get started.","scope":{"mine":"My orders","team":"Team","all":"All"},"helpIntro":"Track and manage sales orders for your customers.","helpStep1":"Use the My, Team, and All toggle to change which orders you see.","helpStep2":"Select an order to open its detail and update its status.","helpStep3":"Click New to create a sales order.","helpTip1":"New orders start as Draft until they are submitted for approval.","notifyParty":{"consignee":"Same as consignee","customer":"Customer","freight_agent":"Freight agent"},"deliverTo":{"title":"Deliver to","subtitle":"Sets the consignee on the shipping documents","shipToLabel":"Ship to","directOption":"Direct — {{customer}} receives the goods","draftOption":"{{name}} — draft, no address","addOption":"＋ New ship-to account…","addOptionEmpty":"＋ Add a ship-to account for this customer…","signpostToast":"Ship-to accounts are created on the customer record in Contacts › Ship-to accounts","receivingContact":"Receiving contact","noneOnFile":"— none on file —","consigneeLabel":"Consignee on the shipping documents","badgeDirect":"direct","badgeClientOf":"client of {{customer}}","noAddress":"No address on file — a shipment cannot be consigned to this account until one is added in Contacts.","tel":"Tel {{tel}}","invoicedToLead":"Invoiced to","invoicedToTail":"— this account is never billed.","dischargePort":"Discharge port","incoterm":"Incoterm","notifyPartyLabel":"Notify party","notifyCustomerOption":"Customer — {{customer}}"},"terms":{"label":"Payment terms","manageLink":"Manage payment terms in Settings","empty":"No payment terms set up yet"},"lc":{"title":"Letter of credit","subtitle":"Tracked against this order — the documents presented to the bank must match it exactly","number":"L/C number","numberPlaceholder":"e.g. ILC0264/26","bank":"Issuing bank","bankPlaceholder":"e.g. MUFG Bank, Fukuoka","dateIssued":"Date issued","expiryDate":"Expiry date","latestShipment":"Latest shipment date","warnDelivery":"Requested delivery ({{d}}) is after the latest shipment date on the L/C ({{latestShip}}).","warnExpiry":"Latest shipment date falls after the L/C expires."}},"duplicateCheck":{"taxIdInUse":"Tax ID already in use","possibleDuplicate":"Possible duplicate customer","taxIdMatch":"Tax ID ⚠"},"hubHelpIntro":"This is the sales overview. Review order totals, revenue, and recent activity at a glance.","hubHelpStep1":"Check the summary cards for total orders, pending orders, and revenue.","hubHelpStep2":"Open Sales Orders or Customers from the quick links to manage records.","hubHelpStep3":"Search or filter recent orders by status to find a specific order.","hubHelpTip1":"Revenue counts only approved, processing, shipped, and delivered orders.","priceAdjustments":{"title":"Price Adjustments","description":"Every pricing alert and bulk-increase batch in one place — drill in, or roll several into a batch","newBatch":"New BPI batch","stats":{"openAlerts":"Open alerts","openAlertsSub":"need attention","costDriftExposure":"Cost-drift exposure","costDriftExposureSub":"{{count}} accepted quotes at risk","adjustmentBatches":"Adjustment batches","adjustmentBatchesSub":"{{count}} in progress","expiringQuotes":"Expiring quotes","expiringQuotesSub":"need re-quote"},"filters":{"all":"All","costDrift":"Cost drift","expiring":"Expiring","costBatches":"Cost batches","strategic":"Strategic"},"searchPlaceholder":"Search customer, product, batch…","columns":{"type":"Type","customer":"Customer","subject":"Subject","trigger":"Trigger","impact":"Impact","status":"Status","owner":"Owner"},"selectRow":"Select alert","type":{"costDrift":"Cost drift","expiring":"Expiring","costBatch":"Cost batch","strategicBatch":"Strategic batch"},"alertStatusOpen":"Open","status":{"draft":"Draft","approved":"In progress","sent":"In progress","in_negotiation":"In negotiation","confirmed":"Confirmed","applied":"Applied","cancelled":"Cancelled"},"driver":{"material_cost":"Material cost","market_conditions":"Market conditions","fx_shift":"FX shift","strategic_margin":"Strategic margin","competitive_response":"Competitive response","customer_tier":"Customer tier","promotion_discount":"Promotion / discount","annual_contract_review":"Annual contract review"},"row":{"driftTrigger":"Worksheet v{{from}} → v{{to}}","driftImpact":"{{amount}} at risk","expiresIn":"Quote expires in {{days}} days","expiresToday":"Quote expires today","expired":"Quote expired {{date}}","expiringImpact":"Re-quote before {{date}}","expiredImpact":"Re-quote required","customersCount":"{{count}} customers","productsCount":"{{count}} products"},"bulk":{"selected":"{{count}} selected","rollable":"{{count}} can roll into a bulk-increase batch","roll":"Roll into BPI batch →","dismiss":"Dismiss","dismissed_one":"{{count}} alert dismissed","dismissed_other":"{{count}} alerts dismissed","clear":"Clear","rollError":"Could not roll the selected alerts into a batch","rollPartial":"{{failed}} of {{total}} customers could not be added to the batch"},"footer":{"tip":"Tip · select cost-drift or expiring rows to roll into one batch"},"empty":"Nothing in this view.","review":{"closeAria":"Close","whyFired":"Why this fired","was":"Was","now":"Now","revenueAtRisk":"Revenue at risk","expiresToday":"Expires today","expiresIn_one":"Expires in {{count}} day","expiresIn_other":"Expires in {{count}} days","expiredAgo_one":"Expired {{count}} day ago","expiredAgo_other":"Expired {{count}} days ago","validUntil":"Valid until {{date}}","context":{"trigger":"Trigger","impact":"Impact","revenueAtRisk":"Revenue at risk","linkedQuote":"Linked quote","owner":"Owner","detected":"Detected","validUntil":"Valid until"},"historyHeading":"History","history":{"drift_detected":"Cost drift detected — worksheet v{{version_from}} → v{{version_to}}","quote_accepted":"Quote {{quote_number}} accepted","expiry_reminder_one":"Expiry reminder — {{count}} day left","expiry_reminder_other":"Expiry reminder — {{count}} days left","quote_expired_one":"Quote expired — {{count}} day ago","quote_expired_other":"Quote expired — {{count}} days ago","quote_sent":"Quote {{quote_number}} sent"},"noteLabel":"Decision note","noteOptional":"optional","notePlaceholder":"Add context for snooze / dismiss…","driftAction":"Re-price in Sales Quote","expiringAction":"Re-quote","snooze_one":"Snooze {{count}} day","snooze_other":"Snooze {{count}} days","dismiss":"Dismiss","openWorksheet":"Open pricing worksheet","snoozedToast_one":"Alert snoozed for {{count}} day","snoozedToast_other":"Alert snoozed for {{count}} days","dismissedToast":"Alert dismissed","muteError":"Could not update the alert","fallback":{"alertRaised":"Alert raised","marginImpact":"Margin impact detected","nearingExpiry":"Quote nearing expiry"}},"batch":{"crumb":"Sales · Price Adjustments","title":"Price Adjustment Batch","back":"Price Adjustments","loading":"Loading batch…","notFound":"Batch not found.","save":"Save","saved":"Batch saved","cancel":"Cancel batch","cancelled":"Batch cancelled","sendToSales":"Send to Sales →","sentToSales":"Sent to Sales","applyConfirmed":"Apply confirmed → master","applyToMaster":"Apply to master →","applied":"Prices applied to master","viewInHistory":"View in price history →","addCustomerHint":"Add a customer to begin","confirmHint":"Every customer must approve before you can apply","meta":{"driver":"Driver","reason":"Reason","proposalDate":"Proposal date","effective":"Expected effective","manager":"Manager / approver","assignSales":"Assign to Sales","assignSalesReadonly":"Sales rep assignment is managed by RBAC","unassigned":"Unassigned","authorisedBy":"Authorised by","messageToCustomer":"Message to customer","scope":"Scope","scopeValue":"{{customers}} customers · {{products}} products"},"steps":{"managerInitiates":"Manager initiates","salesReviews":"Sales reviews & sends","customerApproval":"Customer approval","appliedToMaster":"Applied to Product Master"},"send":{"title":"Send to customer","titleResend":"Resend to customer","subtitle":"Email the customer their price proposal. A PDF and a portal link are included automatically.","subtitleFor":"Email {{name}} their price proposal. A PDF and a portal link are included automatically.","toLabel":"To","toPlaceholder":"customer@example.com","replyToLabel":"Reply-to","replyToPlaceholder":"Company default","replyToHint":"Replies go here. Leave blank to use your company's default reply-to address.","subjectLabel":"Subject","subjectPlaceholder":"Auto-generated from the batch number","messageLabel":"Message","messagePlaceholder":"Optional note to the customer","attachHint":"The proposal PDF and a secure portal link are attached automatically.","cancel":"Cancel","send":"Send","resend":"Resend","languageLabel":"PDF language","sentTo":"Proposal emailed to {{name}} ({{to}}).","notEmailedTitle":"Proposal sent, but not by email","reasonNotConfigured":"Email isn't set up for this company yet — ask an admin to check Settings › Email. Share the portal link instead.","reasonNoRecipient":"This customer has no email address. Add one on the customer, or share the portal link.","reasonFailed":"The email could not be sent. Try again, or share the portal link.","linkOnlyTitle":"Proposal emailed without the PDF","reasonRenderFailed":"The PDF could not be generated, so the email carries the portal link only. Try Download PDF, then send again."},"customers":{"heading":"Per-customer proposals","setupHeading":"Customers & rates","products":"{{count}} products","allowed":"allowed {{min}}–{{max}}%","rateRange":"Rate range","customerRate":"Customer rate","mixed":"mixed","sent":"Sent","notSent":"Not sent","uplift":"Uplift","confCounter":"{{confirmed}}/{{total}} conf.","send":"Send proposal →","resend":"↻ Re-send proposal","sendRevised":"Send revised →","portalLink":"Portal link","copyLink":"Copy link","copied":"Link copied","empty":"No customers in this batch yet. Add one above to pull in their products and rates.","addCta":"+ Add customer to batch","addPlaceholder":"Search customers by name or code…","noMatches":"No matching customers","remove":"Remove customer","previewProposal":"Preview proposal","previewLanguage":"Proposal language","language":{"en":"English","vi":"Vietnamese","bilingual":"Bilingual"},"added_one":"{{name}} added · {{count}} product pulled","added_other":"{{name}} added · {{count}} products pulled","searching":"Searching…","errors":{"no_active_worksheets":"{{name}} has no active pricing worksheet with a product — activate one under Pricing Worksheets, then add them again.","duplicate_customer":"{{name}} is already in this batch.","invalid_band":"Minimum rate must not exceed maximum rate."}},"lines":{"num":"#","product":"Product","size":"Size","old":"Old (USD)","oldPrice":"current price","rate":"Rate %","proposed":"Proposed","confirmed":"Confirmed","decision":"Decision","final":"Final","accept":"Accept","hold":"Hold","held":"held","allowedHint":"allowed {{min}}–{{max}}%","outOfBand":"{{rate}}% is outside the allowed {{min}}–{{max}}% band","rateClampedTitle":"Rate adjusted to allowed band","rateClampedAbove":"{{rate}}% is above the {{max}}% max — adjusted to {{clamped}}% (allowed {{min}}–{{max}}%)","rateClampedBelow":"{{rate}}% is below the {{min}}% min — adjusted to {{clamped}}% (allowed {{min}}–{{max}}%)","customerProposed":"Customer proposed","pctIncrease":"% increase","sendFirst":"Send the proposal first — decisions are recorded once the customer has it."},"history":{"heading":"Activity","empty":"No activity yet.","action":{"created":"Batch created","submitted":"Submitted to Sales","sent":"Proposal sent","resent":"Proposal re-sent","revised":"Proposal revised","client_approved":"Customer approved","client_adjust":"Customer requested adjustments","client_declined":"Customer declined","confirmed":"Batch confirmed","applied":"Applied to master","cancelled":"Batch cancelled","note":"Note"},"role":{"manager":"Manager","sales":"Sales","customer":"Customer","system":"System"}},"exportProposal":"Export proposal","thread":{"heading":"Negotiation thread","empty":"No customer activity yet."},"exportProposalDone_one":"Proposal exported for {{count}} customer","exportProposalDone_other":"Proposal exported for {{count}} customers","preview":{"title":"Proposal preview","subtitle":"This is what {{customer}} will see.","download":"Download PDF","closeAria":"Close preview","loadError":"Could not load the proposal preview."}},"newBatchDrawer":{"kicker":"New price adjustment","title":"Price Adjustment Batch"},"rowActions":{"review":"Review","dismiss":"Dismiss","open":"Open","edit":"Edit","cancel":"Cancel batch","delete":"Delete","keep":"Keep it","cancelTitle":"Cancel {{number}}?","cancelBody":"Its customers' portal links stop working and no price is applied. This cannot be undone.","deleteTitle":"Delete {{number}}?","deleteBody":"The batch disappears from the list. Only a draft or cancelled batch can be deleted.","cancelled":"{{number}} cancelled","deleted":"{{number}} deleted","notAllowed":"This batch can no longer be changed this way — refresh the list."}},"proformas":{"attachments":{"title":"Attachments","count":"{{count}} file(s)","add":"Add files","dropTitle":"Drag files here, or click to choose","dropSub":"Buyer PO, drawings, photos, spreadsheets — PDF, Excel, Word, JPG, PNG or ZIP up to 50 MB","uploading":"Uploading {{count}} file(s)…","empty":"No files on this PI.","emptyEditable":"No files yet — add the buyer's PO, drawings or photos.","cancelledNote":"This PI is cancelled — its files are read-only.","loadError":"Could not load the files.","retry":"Retry","extFallback":"FILE","thumbAlt":"Preview of {{name}}","open":"Open {{name}}","download":"Download","downloadAria":"Download {{name}}","remove":"Remove","deleteAria":"Remove {{name}}","deleteTitle":"Remove this file?","deleteMessage":"“{{name}}” will be removed from this PI.","delete":"Remove file","uploadedToast":"{{count}} file(s) uploaded","removedToast":"File removed","removeFailed":"Could not remove the file","downloadFailed":"Could not download the file","openFailed":"Could not open the file","uploadFailedFile":"{{name}} was not uploaded: {{reason}}","errTypeFile":"{{name}}: only PDF, Excel, Word, JPG, PNG or ZIP files can be attached.","errSizeFile":"{{name}} is larger than 50 MB.","errEmptyFile":"{{name}} is empty.","errType":"This file type cannot be attached.","errSize":"The file is larger than 50 MB.","errEmpty":"The file is empty.","errCancelled":"This PI is cancelled — files can no longer be added or removed.","errNotFound":"This file no longer exists.","pendingSub":"e.g. the customer's PO (scan or photo)","pendingEmpty":"No files chosen yet. They are uploaded to the PI when you create it.","pendingMeta":"{{size}} · uploads when the PI is created","pendingUploading":"Uploading file {{current}} of {{total}}…","pendingFailedFile":"{{name}} was not attached to {{pi}}: {{reason}} The PI was created — open it and add the file again under Attachments.","errConnection":"The connection dropped before the upload finished.","errUploadGeneric":"The server did not accept the file.","errReadFile":"{{name}} could not be read. Check the file is not open or moved, then choose it again."},"title":"Proforma Invoices (PI)","description":"Customer proformas (dự trù) hold the material requirements a pick list consolidates. Confirm a PI to make it available as a pick-list source.","newPi":"New PI","statusAll":"All","sentToCustomer":"Sent to customer · {{date}}","colSent":"Sent to customer","sentYes":"Sent to customer","sentNo":"Not sent yet","statusLabels":{"draft":"Draft","confirmed":"Confirmed","closed":"Closed","cancelled":"Cancelled"},"colNumber":"PI number","colCustomer":"Customer","colStatus":"Status","colLines":"Lines","colIssued":"Issued","colValidUntil":"Valid until","emptyTitle":"No proformas yet","emptyDescription":"Create a PI with its material lines, confirm it, and it becomes a pick-list source.","searchPlaceholder":"Search proformas","createTitle":"New proforma invoice","customerLabel":"Customer","customerPlaceholder":"Search customers…","linesTitle":"Material lines","noLines":"No lines.","addLinePlaceholder":"Add a product…","qtyLabel":"Quantity","splitQty":"Split quantity (shipment / container 1 and 2)","splitQtyShort":"Split","splitQty1":"Quantity on shipment / container 1","splitQty2":"Quantity on shipment / container 2","splitQty1Placeholder":"1st","splitQty2Placeholder":"2nd","splitQtyFixFirst":"A line's split quantity does not add up to its quantity. Fix the split or clear both parts, then save.","addLine":"Add line","notesLabel":"Notes","createButton":"Create PI","created":"Proforma {{number}} created.","actionConfirm":"Confirm","actionClose":"Close PI","actionCancel":"Cancel PI","crumb":"Sales · Documents","colCode":"Code","colProduct":"Product","colUnit":"Unit","openCustomer":"Open customer","pickSource":"Pick source","terms":"Net {{days}}","createSubtitle":"Customer, terms and priced product lines — the same builder the quote uses.","piNumberAuto":"Assigned on save","savingAsDraft":"Saving as draft","kpiSub":{"draft":"not yet confirmed","confirmed":"ready as pick source","closed":"fully picked","cancelled":"no longer active"},"kpiSubDraftHolders":"{{sales}} with sales · {{engineering}} with engineering","colType":"Type","colLocation":"Location","colCurrency":"Currency","fxRateLabel":"Exchange rate","fxRateFrozen":"1 {{ccy}} = {{rate}} VND · frozen on {{date}}","fxRateVnd":"VND · no conversion · frozen on {{date}}","fxRateOnConfirm":"Taken from Settings and frozen when the PI is confirmed","fxRateNotStored":"Confirmed before rates were frozen: no rate is stored on this PI. Reports convert it at the current rate in Settings › Currencies.","fxRateWillFreeze":"1 {{ccy}} = {{rate}} VND from {{source}} — frozen when the PI is confirmed","fxSourceCompany":"Company Settings › Reference FX rate","fxSourceCurrencies":"Settings › Currencies","colPaymentTerms":"Payment terms","typeLabels":{"export":"Export","sample":"Sample"},"engStatus":{"pending":"Pending","nochange":"No change","adjust":"Adjusted","new":"New sample"},"changeType":{"design_adjustment":"Design / dimension adjustment","material_bom_change":"Material / BOM change","new_sample":"New sample (full replacement)","other":"Other"},"historyAction":{"created":"PI created","line_nochange":"Line verified · No change","line_revised":"Line revised","line_undo":"Line verification undone","mark_remaining":"Remaining lines · No change","confirmed":"Engineering confirmed","reopened":"Reopened for engineering review","closed":"PI closed","cancelled":"PI cancelled","container_changed":"Container changed","wood_allowances_changed":"Wood buying allowance changed","deleted":"PI deleted","quick_updated":"Note / ETD quick edit","sent_to_engineering":"Sent to technical","returned_to_sales":"Back to sales","prices_pulled":"Prices pulled from worksheet","colours_refreshed":"Colours refreshed from BOM"},"sectionCustomer":"Customer","searchOrSelect":"Search or select…","customerHintEmpty":"Pick a customer to load contacts, currency and destination port.","directoryTerms":"directory terms Net {{days}}","attentionLabel":"Attention","attentionExtra":"contact","attentionPick":"Select contact…","attentionPlaceholder":"Name — role","customerRefLabel":"Customer reference","customerRefPlaceholder":"Customer PO / enquiry no.","salesOwnerLabel":"Sales owner","auto":"auto","piNumberHint":"Next in sequence · Settings › SKU Standards › Documents","sectionTerms":"Terms & delivery","sectionTermsSub":"payment terms and bank block come from Settings › Payment Terms","validForLabel":"Valid for","daysUnit":"days","incotermLabel":"Incoterms","portFromLabel":"Port of loading","portFromExtra":"from","portToLabel":"Port of discharge","portToExtra":"to","portToPlaceholder":"Destination port","leadTimeLabel":"Lead time","targetDeliveryLabel":"Target delivery","targetDeliveryExtra":"override","defaultTag":"default","depositPct":"{{pct}}% deposit","bankLabel":"Bank account","bankExtra":"printed on the PI","bankNone":"No active {{ccy}} account","validUntilPrefix":"Valid until","targetDeliveryPrefix":"target delivery","targetDeliveryDerived":"(issued + lead time)","sectionProducts":"Products","sectionProductsSub":"these lines feed the pick list","addProduct":"Add product","pricesIn":"Prices in","pickerHint":"Showing this customer's products. A line's price is the approved price of the customer's pricing worksheet — it can't be typed.","pickerNeedCustomer":"Pick a customer first: the search lists that customer's products.","pickerSearch":"Search product code or name…","moq":"MOQ","priceFromWorksheet":"From worksheet v{{version}}","priceFromWorksheetFx":"From worksheet v{{version}} · ${{usd}} × {{rate}}","priceFromWorksheetStored":"From the approved pricing worksheet","priceNoWorksheet":"No approved pricing worksheet for this product and customer, so this line is 0. Create one in Sales › Pricing Worksheets, set “Approved price / unit”, click “Submit for approval”, and the approver clicks “Approve & activate”.","priceNoApprovedPrice":"Pricing worksheet v{{version}} is active but has no approved price, so this line is 0. An active version can't be edited: open Sales › Pricing Worksheets → the worksheet → Versions → “New version from this”, set “Approved price / unit”, click “Submit for approval”, and the approver clicks “Approve & activate”.","priceNoRate":"No exchange rate for {{ccy}} to convert the USD worksheet price, so this line is 0 — set the rate in Settings › Currencies.","unpricedDraftNote":"{{count}} line(s) have no approved price (0). You can save the PI as a draft, but it can't be sent to technical until every line is priced from an approved pricing worksheet.","pickerNoLinked":"No products linked to this customer yet.","pickerNoLinkedHint":"Link products to this customer in Contacts › customer › Products.","pickerWorksheetTag":"worksheet","colSku":"SKU","colLot":"Lot no","lotPlaceholder":"LOT-01","colDescription":"Description","colColor":"Color","colDimension":"Dimension (mm)","dimensionPlaceholder":"W×D×H","colMaterialFinish":"Material / Finish","colCartonM3":"Carton M³","colUnitPrice":"Unit price","colLineTotal":"Line total","colLineTotalExVat":"Line total (before VAT)","colEtd":"ETD","colDestinationPort":"Destination port","colNote":"Note","resizeColumn":"Resize column","noProducts":"No products yet — add one from the catalog.","productsCount_one":"{{count}} product","productsCount_other":"{{count}} products","totalQuantity":"Total quantity","totalVolume":"Total volume","subtotal":"Subtotal","subtotalExVat":"Subtotal (before VAT)","vatNote":"VAT is added when the PI is saved, using each line's VAT % or the company default.","notesSub":"printed on the PI, one per line","notesPlaceholder":"Packing, labelling, delivery window…","sectionTotals":"Totals","depositRow":"Deposit ({{pct}}%)","balance":"Balance","totalRow":"Total · {{ccy}}","savingAsDraftPrefix":"Saves as","savingAsDraftWord":"draft","savingAsDraftSuffix":"· confirm it to release the lines to the pick list","colVatPct":"VAT %","colDiscountPct":"Discount %","vatPlaceholder":"Company default (0% for export)","vatInvalid":"Enter a VAT between 0 and 100, or leave it empty to use the company default.","toastVatInvalid":"A line has an invalid VAT %. Enter a number from 0 to 100, or clear the field to use the company default.","toastPickCustomer":"Pick a customer first","toastAddLine":"Add at least one product line","volumeValue":"{{value}} m³","newProformaEyebrow":"New proforma","issuedOn":"Issued {{date}}","tabWithEngineering":"With engineering","footerCount_one":"{{count}} proforma","footerCount_other":"{{count}} proformas","totalLinesShown":"Total lines shown","productLinesTitle":"Product lines","expandAll":"Expand all","collapseAll":"Collapse all","lineDetails":"Line details","noNotes":"No notes.","leadTimeValue_one":"{{count}} day","leadTimeValue_other":"{{count}} days","pickSourceNotYet":"Not yet","engProgress":{"verified":"Verified · confirm PI","incomplete":"Incomplete","notStarted":"Not started"},"queueTitle_one":"{{count}} proforma awaiting engineering confirmation","queueTitle_other":"{{count}} proformas awaiting engineering confirmation","queueSub":"Lines stay out of the pick list and production until each one is verified.","queueStart":"Start review","queueBadgeNew":"New","queueBadgeReconfirm":"Re-confirm","reviewAndConfirm":"Review & confirm","stageCreated":"Created","stageCreatedSub":"Sales","stageReview":"Engineering review","stageReviewSub":"Verify model / BOM","stageConfirmed":"Confirmed","stageConfirmedSub":"Ready for production","stageClosed":"Closed","stageClosedSub":"Fully picked","engBannerTitle":"Awaiting engineering confirmation","salesBannerTitle":"With Sales","salesBannerBody":"Finish the lines and prices, then Send to technical. Engineering checks the lines after that.","engBannerReconfirm":"Re-confirmation needed — {{version}} was raised or reopened.","engBannerBody":"Pick an action for each product line below. The PI stays incomplete until every line is verified, then Confirm PI releases it to the pick list.","linesVerified":"Lines verified","confirmedBanner":"Confirmed by Engineering at {{version}}. To change it, reopen for review — lines changed in that review raise a new version.","reopenForReview":"Reopen for review","colVer":"Ver","colEngStatus":"Status","colEngAction":"Engineering action","productLinesEngTitle":"Product lines · engineering verification","verifiedOfTotal":"{{verified}} of {{total}} verified","markRemaining":"Mark remaining as no change","actNoChange":"No change","actAdjust":"Adjust","actNew":"New","engActionsFor":"Engineering action for {{code}}","engDone":"Done","engUndo":"Undo","formTitleAdjust":"Adjustment — create a new version","formTitleNew":"New sample — raise a new version","changeTypeLabel":"Change type","confirmedByLabel":"Confirmed by","reasonLabel":"Reason / description of change","reasonPlaceholder":"e.g. Customer changed table top 1200→1400mm, leg BOM updated.","reasonRequired":"Enter the reason for the change.","saveAsVersion":"Save as {{version}}","historyTitle":"Version history","historyEvents_one":"{{count}} event","historyEvents_other":"{{count}} events","historyEmpty":"No history yet.","historyLines_one":"{{count}} line","historyLines_other":"{{count}} lines","historyConfirmedDetail":"{{nochange}} no change, {{changed}} changed","confirmPending_one":"Confirm PI · {{count}} line pending","confirmPending_other":"Confirm PI · {{count}} lines pending","confirmRelease":"Confirm PI · release to pick list","footerChooseOutcome":"Choose a verification outcome above to confirm","queuePosition":"Queue {{index}} of {{total}}","queueLeft_one":"{{count}} left in queue","queueLeft_other":"{{count}} left in queue","queuePrev":"Previous in queue","queueNextAria":"Next in queue","nextInQueue":"Next in queue →","piView":"View PI","piSend":"Send PI","signerLabel":"Signed by","signerOption":"{{name}} · {{role}}","previewTitle":"Proforma invoice {{number}}","previewPrint":"Print","previewLoadError":"Could not load the PI document. Please try again.","previewFrozen":"Layout frozen at issue · {{name}}","previewFrozenUnnamed":"Layout frozen at issue","previewLayout":"Layout: {{name}}","previewLayoutDefaultName":"Default","previewLayoutNoCustomerPre":"(no customer template — set one in ","previewLayoutWhere":"Settings › Document templates","previewLayoutNoCustomerPost":")","docWarn":{"sellerIncomplete":"Your company's {{fields}} are empty, so the PI prints a dash there.","sellerFill":"Fill them in","sellerAsk":"Ask an admin to fill them in {{where}}.","sellerWhere":"Administration › Company Settings","noBank":"No bank account is set up, so Bank details and Beneficiary print a dash. Add one in Settings › Payment Terms › Bank accounts, then pick it in Edit PI.","bankFallback":"No bank account is picked on this PI, so it prints your default account ({{label}}). Pick another one in Edit PI if needed.","field":{"name":"company name","addr":"address","tel":"phone","fax":"fax","tax_id":"tax code"}},"sendTitle":"Send PI {{number}}","sendSubject":"Proforma invoice {{number}} from {{seller}}","sendBody":"Please find attached our proforma invoice {{number}}.","sendAttachment":"{{file}} (PDF attached)","sendAction":"Send","sendDone":"PI {{number}} emailed to {{to}}","sendNotConfigured":"Email isn't set up for this company yet — ask an admin to check Settings › Email.","sendNoRecipient":"Add at least one recipient.","sendPdfUnavailable":"The PI PDF could not be generated, so nothing was sent.","sendFailed":"The email could not be sent. Please try again.","pdfDownload":"Download PDF","pdfError":"Could not generate the PI PDF. Please try again.","toastConfirmed":"{{number}} confirmed at {{version}} — released to pick list","toastReopened":"{{number}} reopened for review","toastClosed":"{{number}} closed","toastCancelled":"{{number}} cancelled","cancelConfirmTitle":"Cancel {{number}}?","cancelConfirmMessage":"The PI stops being a pick-list source. This cannot be undone.","cancelConfirmKeep":"Keep PI","reopenConfirmTitle":"Reopen {{number}} for review?","reopenConfirmMessage":"It goes back to awaiting confirmation, and every line must be verified again before the PI can be confirmed.","detailLoadError":"Could not refresh this proforma — showing the list data.","errLinesPending":"Every line must be verified before the PI can be confirmed.","errLineNotPending":"This line was already verified — refresh and try again.","errLinePending":"This line is still pending — there is nothing to undo.","errNoPendingLines":"There are no pending lines left.","errInvalidStatus":"This PI changed status in the meantime — refresh and try again.","errNoLines":"A PI needs at least one product line.","errNotFound":"This proforma or line no longer exists.","viewBom":"View BOM","worksheetLink":"Worksheet v{{version}}","worksheetLinkTitle":"Open the pricing worksheet this line was priced from","bomChip":"BOM {{version}}","bomPiLineChip":"PI line {{version}}","bomSubtitle":"Bill of materials used for {{pi}}","bomLoading":"Loading BOM…","bomLoadError":"Couldn’t load the BOM for this line.","bomFinish":"Finish","bomOpenFull":"Open full BOM →","bomNoAccess":"Full BOM needs access — ask an admin.","bomTabNoAccess":"This tab needs access to the product BOM — ask an admin.","bomAdjust":"Adjustment → {{version}}","bomNew":"New sample → {{version}}","bomConfirmedWarning":"This PI is confirmed — reopen it for review to change a line version.","bomEmptyTitle":"No BOM yet for this product","bomEmptyBody":"Engineering hasn’t built a bill of materials for {{sku}} yet.","bomQtyOnPi":"Quantity on PI: {{qty}} {{uom}}","bomForQty":"For {{qty}} {{uom}}","bomForQtyM3":"Net m³ × {{qty}}","bomPinned":"Confirmed PI: showing BOM {{version}}, the version pinned on this line.","bomPinnedWithPaint":"Confirmed PI: showing BOM {{version}}, pinned on this line, with the paint as of the confirmation.","bomWarnNoPin":"This line was confirmed before BOM versions were pinned: the current BOM is shown.","bomWarnPinnedUnavailable":"BOM {{version}} pinned on this line is no longer on record: the current BOM is shown.","bomWarnPaintLive":"No paint was recorded for BOM {{version}} when this PI was confirmed: today’s paint recipes and formulas are shown.","bomPaintingProcess":{"none":"No paint","solid":"Solid paint","stain":"Stain","lacquer":"Lacquer","custom":"Custom finish"},"customsNameMissing":"No customs name yet","customsNameMissingLink":"Add it on the BOM names tab","piNumberShortCodeHint":"NN/YY . {{company}} - {{code}} · numbered per customer and year","piNumberShortCodeHintNoCompany":"NN/YY - {{code}} · numbered per customer and year","containerTypeLabel":"Container type","containerTypePlaceholder":"e.g. 40HC","containerQtyLabel":"Containers","containerQtyValue_one":"{{count}} container","containerQtyValue_other":"{{count}} containers","containerLabel":"Container","partialShipmentLabel":"Partial shipment","partialShipment":{"unset":"Not set (prints Allowed)","allowed":"Allowed","not_allowed":"Not allowed"},"materialPlaceholder":"Material on the PI","materialHint":"Printed under MATERIAL on the PI. Empty uses the product material.","materialPerLine":"Material per line","materialForLine":"Material for {{sku}}","materialSetCount_one":"{{count}} of {{total}} lines set","materialSetCount_other":"{{count}} of {{total}} lines set","materialFromProduct":"From the product","revisedDateLabel":"Revised date","revisedDateHint":"Empty: the date of the latest revision","revisedDateAuto":"Automatic","sectionPrint":"Printed on the PI","sectionPrintSub":"document-only fields","containerOnlyHint":"Confirmed PI: only the container can change here. The change is recorded in the PI history.","printFieldsSaved":"PI print fields saved","backLabel":"PI {{number}} {{customer}}","errInvalidWoodAllowance":"Each allowance must name a wood price book species (or all species) and be from ×1 to ×3.","confirmConfirmTitle":"Confirm {{number}}?","confirmConfirmMessage":"Confirming releases this PI to production and the pick list. Check every line version before you go on — to change it later you must reopen it for review.","confirmConfirmKeep":"Not yet","confirmedBannerBy":"Confirmed by {{name}} · {{date}} at {{version}}. To change it, reopen for review — lines changed in that review raise a new version.","confirmedBannerPending":"Confirmed at {{version}}. To change it, reopen for review — lines changed in that review raise a new version.","confirmedBySomeone":"Engineering","engBannerReadyTitle":"All lines verified — ready to confirm","engBannerReady":"Every line has an engineering outcome. Press Confirm PI to release it — nothing moves on until you do.","engBannerReadyNoRights":"Every line has an engineering outcome. Someone with approve rights must press Confirm PI to release it.","footerReadyToConfirm":"All lines verified — press Confirm PI to release it.","xlsxDownload":"Download Excel","docLangSaveError":"Couldn't save the document language. The files still print in the pair you picked.","docLangLocalOnly":"Applies to your downloads only — not saved to the order.","docLangLoadError":"Document language not loaded — retry","xlsxError":"Could not generate the PI workbook. Please try again.","actionOpen":"Open","listActions":{"addNote":"Add note","editNote":"Edit note","updateEtd":"Update ETD","noteLabel":"Note","notePlaceholder":"Internal note on this PI","etdLabel":"ETD for all lines","etdHint":"Lines with a different ETD will be changed. Earliest now: {{date}}","save":"Save","cancel":"Cancel","clear":"Clear ETD","toastNoteSaved":"Note saved","toastEtdSaved":"ETD updated"},"actionDelete":"Delete","deleteConfirmTitle":"Delete {{number}}?","deleteConfirmMessage":"The PI disappears from every list and its number stays used. Only a draft or cancelled PI that nothing (delivery, purchase order, work order…) uses can be deleted.","toastDeleted":"{{number}} deleted","sendSubjectNoSeller":"Proforma invoice {{number}}","sendNotSentTitle":"The PI was not emailed","materialTotals":{"tab":"PI material totals","info":"PI total = BOM quantity per product × the quantity of each PI line, summed per material.","counted":"{{counted}}/{{total}} lines have a BOM","missing":"{{count}} without one ({{skus}}), not counted","ruleLive":"Draft PI: every line reads the live BOM.","rulePinned":"Confirmed PI: each line reads the BOM version pinned when the PI was confirmed.","ruleCancelled":"Cancelled PI: not counted in demand; every line reads the live BOM, for reference only.","woodQc":"{{value}} mm thick","loading":"Loading material totals…","error":"Could not load the material totals.","empty":"No line of this PI has a BOM yet, so there is nothing to total.","emptySection":"None in these BOMs.","warningsTitle":"Not counted / check","warnNoBom":"{{sku}}: no BOM yet","warnNoProduct":"A line without a product","warnFreeText":"{{sku}}: part “{{detail}}” has no material code","warnPinnedUnavailable":"{{sku}}: BOM {{detail}} pinned at confirmation is not available, the live BOM is used","warnPinnedPaint":"Paint on pinned lines is what that BOM version published; per-version paint snapshots come later.","lineQty":"Qty {{qty}}","bomVersion":"BOM v{{version}}","colTotal":"PI total","colSpecies":"Wood species","colFormula":"Formula","colPanel":"Panel","colSheetSize":"Sheet size (thickness × width × length)","colMaterial":"Material","colCode":"Code","colUom":"Unit of measure","sectionWood":"1. Natural wood","factorNote":"Scrap factor from the BOM (read-only): × {{factor}}","factorNoteMixed":"Scrap factor from the BOM (read-only): varies by part","parts":"{{count}} parts","m3Net":"m³ net","timesFactor":"× {{factor}} = m³ to buy","timesBomFactor":"× BOM factor = m³ to buy","m3Value":"{{value}} m³","woodTotal":"Natural wood total: m³ net / m³ to buy","woodHint":"m³ to buy = T × W × L × parts per product ÷ 10⁹ × scrap factor × PI quantity.","sectionPanels":"2. Panels (MDF, plywood), in sheets","sheetsValue":"{{value}} sheets","panelsHint":"Sheets per product come from the BOM nesting. Panels are not multiplied by the scrap factor.","sectionPaint":"3. Paint (sum of each BOM's Painting tab)","paintTotal":"Paint total (kg)","kgValue":"{{value}} kg","sectionHardware":"4. Hardware (screws, dowels, inserts…)","sectionPackaging":"5. Packaging (cartons, liners, foam)","sectionCushion":"6. Cushion","sectionOther":"Other materials","perUnit":"{{value}} / product","qtyHint":"Quantity = BOM quantity per product × PI quantity.","readsLive":"Reads the live BOM","warnNoPin":"{{sku}}: confirmed before BOM versions were pinned, the live BOM is used","warnMixedUnits":"{{sku}}: the BOMs count this material in different units, so it is shown on separate rows","sheetsToBuy":"≈ {{value}} sheets to buy"},"bomStatusChip":"BOM: {{status}}","colDocuments":"Documents","openDocuments":"Open documents","bomSkuAtPin":"Built to {{sku}} (the version confirmed on this PI); the product is now {{current}}.","reopenConfirmTitleAlt":"Mở lại {{number}} để duyệt?","reopenIssuedLead":"This PI already has issued documents.","reopenIssuedCount_one":"Reopening marks it as Superseded:","reopenIssuedCount_other":"Reopening marks all {{count}} as Superseded:","reopenDocVersion":"v{{n}}","reopenIssuedNote":"They stay on file and in the customer's portal history. Re-issue them after the PI is confirmed again. The customer is not notified.","reopenReasonLabel":"Reason (shown on the superseded documents)","reopenAndSupersede":"Reopen and supersede","reopenKeepConfirmed":"Keep confirmed","toastReopenedSuperseded_one":"{{number}} reopened for review; 1 document superseded","toastReopenedSuperseded_other":"{{number}} reopened for review; {{count}} documents superseded","reopenIssuedFailed":"Could not read the documents this reopen would supersede. Nothing was reopened; try again.","openQuote":"Open quote","composeQuote":"Create quote","quoteComposed":"Quote {{number}} created from this PI","blocked":{"loading":"Loading the PI — try again in a moment."},"editPi":"Edit PI","editTitle":"Edit proforma invoice","editSubtitle":"Change the customer, terms and lines, then save. Prices follow the customer's approved pricing worksheets. Sales can edit the PI until it is sent to technical.","editSave":"Save changes","toastEdited":"{{number}} saved","repricePull":"Pull price from worksheet","repriceHint":"Re-read every line's price from the customer's approved pricing worksheets.","repriceChanged":"Prices updated on {{count}} line(s) from the approved pricing worksheets.","repriceNone":"Prices already match the approved pricing worksheets — nothing changed.","repriceLine":"#{{no}} {{sku}}: {{from}} → {{to}}","repriceStillUnpriced":"Still 0 — no approved worksheet price: {{refs}}. Create and approve one in Sales › Pricing Worksheets.","colourRefresh":"Refresh colours from BOM","colourRefreshHint":"Fill every line's Color with all the product's current BOM paint colours (default first). Colours typed by hand are kept.","colourRefreshChanged":"Colours updated on {{count}} line(s) from the products' BOM paint.","colourRefreshNone":"Colours already match the products' BOM paint — nothing changed.","colourRefreshLine":"#{{no}} {{sku}}: {{from}} → {{to}}","colourRefreshKeptTyped":"Kept the colour typed by hand on {{refs}}. To use the BOM colours there, open Edit PI, clear that line's Color and save — it then takes the BOM colours.","colourRefreshKeptTypedNoEdit":"Kept the colour typed by hand on {{refs}}. To use the BOM colours there, ask someone with the “View selling prices” right to open Edit PI and clear that line's Color.","colourRefreshConfirmTitle":"Refresh colours on {{number}}?","colourRefreshConfirmMessage":"{{count}} line(s) will take the products' current BOM paint colours:","colourRefreshConfirm":"Update colours","colourRefreshCancel":"Not now","sendTech":"Send to technical","sendTechConfirmTitle":"Send {{number}} to technical?","sendTechConfirmMessage":"Engineering is notified and checks every line. While the PI is with Engineering it can't be edited; to change it, use Back to sales.","toastSentTech":"{{number}} sent to technical","backToSales":"Back to sales","backToSalesConfirmTitle":"Send {{number}} back to Sales?","backToSalesConfirmMessage":"The PI leaves Engineering's queue and Sales can edit it again. Engineering's checks stay on lines whose product and quantity do not change.","backToSalesReasonLabel":"Reason (optional)","toastBackToSales":"{{number}} is back with Sales","footerWaitingSales":"With Sales — waiting for Send to technical","holderTech":"With technical","holderSales":"With sales","pricesHidden":"Prices hidden — ask a sales manager for the “View selling prices” right"},"orderDocs":{"renumber":{"bannerMerge":"Invoices of this shipment were merged: {{moves}}. Send the invoice, packing list and contract to the customer again.","oneContainer":"This invoice has one container: add a container on the CBM sheet to split it.","oneInvoice":"The set already ships on one invoice.","barLabel":"Invoices of this set","invoiceN":"Invoice {{n}}","unnumbered":"Unnumbered","shipped":"Already shipped","shippedPill":"Shipped","issued":"Issued","countNote":"{{count}} invoices in this shipment.","splitHint":"Choose which invoice each container goes on. Each invoice gets its own number, invoice, packing list and contract.","needsNumber":"Assign a number before splitting.","splitPerContainer":"One invoice per container","joinAll":"One invoice for all","markShipped":"Mark as shipped","askTitle":"Which invoice numbers does this shipment take?","newNumbers":"Numbers of this shipment","invoiceRow":"Invoice {{n}} · cont {{containers}}","keeps":"keeps its number","movesTitle":"Later invoices move back by {{count}}","cannotMove":"Cannot be moved","noMoves":"These numbers are free: no other invoice moves.","blockedShipped":"An invoice that already shipped keeps its number. Choose other numbers for this shipment.","shiftNote":"Each shipment that moves gets a reminder to resend its documents. Issued documents of a moved invoice are superseded and re-issued with the new number.","choiceLabel":"Numbers for the new invoices","takeAndShift":"Take these numbers · move {{count}} invoice(s) back","takeDesc":"New numbers: {{numbers}}.","useNextFree":"Use the next free numbers instead","useNextFreeDesc":"New numbers: {{numbers}}. No other invoice moves.","confirm":"Split invoice","cancel":"Cancel","previewFailed":"Could not prepare the split","splitDone":"Split done: {{count}} invoice(s) in this shipment","splitFailed":"Could not split the invoice","joinTitle":"One invoice for all containers?","joinMessage":"{{number}} keeps its number and takes every container. The other numbers ({{others}}) are freed; no other invoice moves.","joinConfirm":"Merge into one invoice","joinDone":"Merged into one invoice: {{number}}","joinFailed":"Could not merge the invoices","shipTitle":"Mark invoice {{number}} as shipped?","shipMessage":"Its number is fixed from now on: a later split never moves it.","shipDone":"Invoice {{number}} shipped. Its number is now fixed.","shipFailed":"Could not mark the invoice as shipped","banner":"The invoice number of this shipment was moved back: {{moves}}. Send the invoice, packing list and contract to the customer again with the new number.","bannerMove":"{{from}} → {{to}} (invoice {{by}} took the number)","bannerMovePlain":"{{from}} → {{to}}","bannerMoveMerge":"{{from}} merged into {{to}}; {{from}} is free again","joinBlockedShipped":"A shipped invoice keeps its number and containers, so the invoices cannot be merged.","supersededNote":"Invoice {{number}} changed number, so its documents were superseded. Re-issue each superseded document, then use Re-issue to issue the set again with the new number.","blockedNoShortCode":"Moving later invoices needs the customer's short code. Add it to the customer, or use the next free numbers.","formatChanged":"These invoices take the customer's current number format when they move: {{numbers}}.","ack":"Mark as checked","ackFailed":"Could not mark the change as checked"},"loading":"Loading order documents…","loadFailed":"Could not load the order documents","backToLanding":"Back to order documents","saveFailed":"Save failed","noHubTitle":"No document hub yet","noHubSub":"Create the document hub for this order to start the six order documents.","createHub":"Create document hub","picker":{"title":"Order documents","sub":"Pick a sales order to open its document hub.","searchPlaceholder":"Search orders…","noOrders":"No orders found","resolving":"Resolving {{order}}…"},"landing":{"eyebrow":"Sales · Documents","title":"Order documents","titleAlt":"Chứng từ đơn hàng","lead":"Every proforma, drafts included, and every sales order that is confirmed, in production or shipped. One row per order, with where each document stands. Open a row for its documents, CBM worksheet and printing.","exportCsv":"Export CSV","retry":"Retry","search":"Search PI, SO, customer code or name, port","needsAttention":"Needs attention","attentionAria":"Needs attention: {{count}} orders","open":"Open","openAria":"Open {{ref}}","notPlanned":"not planned","cbm":"{{n}} m³","updatedAgo":"{{time}} ago","kpi":{"inDocuments":"In documents","inDocumentsHint":"{{pis}} proformas · {{sos}} sales orders","toSend":"To send","toSendHint":"drafts waiting on us","pending":"Pending customer","pendingHint":"sent · awaiting reply in portal","awaitingSignature":"Awaiting signature","awaitingSignatureHint":"contracts out to sign","superseded":"Superseded","supersededHint":"PI reopened · re-issue needed"},"seg":{"label":"Stage","all":"All","pi_draft":"PI draft","pi_confirmed":"PI confirmed","so_confirmed":"SO confirmed","in_production":"In production","shipped":"Shipped"},"col":{"reference":"Reference","customer":"Customer","stage":"Stage","documents":"Documents","docStatus":"Document status","containers":"Containers · CBM","etd":"ETD","value":"Value","updated":"Updated","actions":"Actions"},"sub":{"piOnProforma":"PI · v{{n}} on proforma","piDraft":"PI · draft v{{n}}","piReopened":"PI · reopened for review"},"overall":{"draft":"Draft","in_progress":"In progress","superseded":"Superseded","issued":"Issued","complete":"Complete"},"note":{"reissue":"{{count}} documents to re-issue","fullSet":"Full set issued","drift":"Proforma changed since the PI copy","changesRequested":"Customer asked for changes: {{doc}}","rejected":"Customer rejected: {{doc}}","flagged":"Flagged in the shipment tracker","overdue":"No customer reply past the follow-up window","forSignature":"Contract out for signature","awaitingReply":"Awaiting the customer's reply","notStarted":"{{count}} not started","piAwaiting":"PI awaiting Engineering confirmation","piInReview":"PI back in Engineering review","nothingSent":"Nothing sent yet","ready":"{{done}} of {{total}} documents ready"},"docStatus":{"forSignature":"For signature","notStarted":"Not started","superseded":"Superseded"},"legend":{"chips":"Chips","kind":{"proforma_invoice":"proforma invoice","sale_contract":"sale contract","commercial_invoice":"commercial invoice","cbm_plan":"worksheet","invoice_by_container":"invoice by container","packing_list":"packing list"},"tone":{"notStarted":"Not started","draft":"Draft","sent":"Sent / review","inProgress":"In progress / changes","done":"Approved / signed / issued","superseded":"Superseded / rejected"}},"empty":{"noOrders":"No orders in the documentation stage yet.","noMatch":"No orders match these filters."},"csv":{"type":"Type","typePi":"Proforma","typeSo":"Sales order","piRef":"PI number","code":"Customer code","note":"Note","containers":"Containers","cbm":"CBM (m³)","pol":"Port of loading","pod":"Port of discharge","currency":"Currency","invoiceNo":"Invoice no."},"rel":{"now":"just now","m":"{{n}} min","h":"{{n}} h","d":"{{n}} d","w":"{{n}} w"},"doc":{"proforma_invoice":"PI","sale_contract":"SC","commercial_invoice":"IV","cbm_plan":"CBM","packing_list":"PL","invoice_by_container":"IV/C"},"shipmentTracker":"Shipment tracker","chipTip":"{{doc}}: {{status}}","chipTipVersion":"{{doc}} v{{n}}: {{status}}","invoiceNo":"Inv. {{number}}","combinedCount_one":"+{{count}} combined","combinedCount_other":"+{{count}} combined","matchedMember":"matched: {{ref}}"},"stage":"Documents","heroSub":"{{customer}} · buyer","facts":{"proforma":"Proforma","orderValue":"Order value","consignee":"Consignee","documents":"Documents","documentsPending":"{{count}} · {{pending}} pending customer"},"next":{"label":"Suggested next","allDone":"All documents are up to date.","review":"Review","nothingPending":"Nothing pending","issueInvoiceHint":"PI approved and contract in hand. Issue the commercial invoice for the deposit.","issueInvoice":"Issue invoice","contractHint":"Waiting on the signed sale contract from the customer.","openContract":"Open contract","piRevisionHint":"Customer asked for PI revisions. Edit the proforma invoice and resend.","editPi":"Edit PI","piSentHint":"Proforma invoice is with the customer. Log their response when it comes back — accept, revise, or reject.","logPiResponse":"Log PI response"},"groups":{"commercial":"Commercial","commercialSub":"buyer-facing — PI, contract, invoice","shipping":"Export & shipping","shippingSub":"from Export Documents — reused as-is"},"docGlyph":"DOC","notNumbered":"not created","kind":{"proforma_invoice":"Proforma invoice","sale_contract":"Sale contract","commercial_invoice":"Commercial invoice","cbm_plan":"CBM loading plan","packing_list":"Packing list","invoice_by_container":"Invoice by container"},"status":{"draft":"Draft","internal_review":"Internal review","sent":"Sent","accepted":"Approved","change_requested":"Changes requested","rejected":"Rejected","signed":"Signed","superseded":"Superseded"},"action":{"accepted":"Accepted","change_requested":"Requested changes","rejected":"Rejected","signed":"Signed","comment":"Comment"},"channel":{"portal":"Portal","email":"Email"},"activity":{"draft":"Draft ready. Send {{doc}} so the customer can respond.","sent":"Emailed to the customer. Awaiting their response.","done":"Approved by the customer.","revision":"Customer requested revisions — review their notes and resend.","rejected":"Customer rejected {{doc}} — see the response log.","export":{"cbm_plan":"Container loading plan — built and printed from Export Documents.","packing_list":"Carton-level list with the consignee address for customs — from Export Documents.","invoice_by_container":"Split the commercial invoice per container once loading is confirmed."}},"actions":{"open":"Open","edit":"Edit","send":"Email","review":"Review","close":"Close","cancel":"Cancel"},"edit":{"title":"Edit proforma invoice","from":"From","to":"To","attn":"Attn:","addContact":"Add contact from customer account…","shipTo":"Ship to / Consignee","no":"No.","date":"Date","poRef":"Customer P/O","etd":"ETD","destinationPort":"Destination port","colNo":"Row number","colDescription":"Description","colQty":"Total quantity","colPrice":"FOB price","colAmount":"Amount","removeLine":"Remove line","total":"Total:","addLine":"+ Add line","sayInWords":"Say in US: {{words}} dollars only.","payment":"Payment","clauses":"Terms & conditions","removeClause":"Remove term","addClause":"+ Add term","sellerSigner":"For the seller","buyerSigner":"For the buyer","signatureStamp":"Signature & company stamp","done":"Done","previewTitle":"Proforma invoice preview","preview":"Preview","backToEdit":"Back to edit","exportPdf":"Export PDF","colLot":"Lot number","colMaterial":"Material","colColor":"Color","colDim":"Dimension (mm)","colEtd":"ETD","colDest":"Destination port","colNote":"Note","addFromOrder":"Add line from this order…","sayInWordsVnd":"In words (VND): {{words}} dong only.","sayInWordsOther":"Total: {{amount}}."},"send":{"title":"Email {{doc}}","subject":"{{doc}} {{num}} — order {{so}}","body":"Dear {{customer}},\n\nPlease find attached the {{doc}} for order {{so}}.\n\nYou can review and respond to it online using the secure link below — no account needed.\n\nBest regards","logOnlyBanner":"This emails the customer a secure portal link where they can view and respond. A PDF is attached when one has been generated.","to":"To","cc":"Cc","recipientPlaceholder":"Add email, press Enter","pdfLanguage":"PDF language","langEn":"English","langVi":"Vietnamese","subjectLabel":"Subject","message":"Message","pdfAttached":"PDF · {{file}}","portalLinkLabel":"Secure link for the customer","portalLinkPending":"The portal link is created when you press {{action}}.","portalLinkNote":"Opens the secure customer portal where they can respond online. Their response records back on this order.","noteLabel":"Log note (optional)","notePlaceholder":"e.g. Sent from Outlook with the May price list","sentToast":"{{doc}} marked as sent — portal link ready","failed":"Send failed","linkCopied":"Portal link copied","copyLink":"Copy link","sendAndLog":"Send email","emailedToast":"{{doc}} emailed to {{to}}","linkOnlyToast":"{{doc}} sent — email isn't configured, so the portal link is ready to copy","redirectNotice":"Test system: emails go to {{redirect}}, not to {{to}}.","redirectNoticeNoTo":"Test system: emails go to {{redirect}}, not to the customer.","redirectedToast":"Sent — test system delivered it to {{redirect}} instead of {{to}}.","attachPi":"The generated proforma PDF is attached (when one exists), plus a secure portal link.","attachDoc":"A PDF of this document is generated and attached, plus a secure portal link.","attachLinkOnly":"Sent as a secure portal link — the customer views and responds online.","preview":"Preview","pdfKind":"PDF"},"review":{"title":"Review · {{doc}}","customerReview":"Customer review","currentVersion":"v{{version}} current","portalActivity":"Customer portal activity","notSentYet":"Not sent to the portal yet — email it to the customer to open their portal link.","awaitingPortal":"Sent — waiting on the customer to respond on the portal.","responded":"The customer has responded — see the response log below.","logReply":"Log an emailed reply","actionLabel":"Customer response","actorLabel":"Who replied","actorPlaceholder":"e.g. Mr. Sato — Purchasing Manager","noteLabel":"Note","notePlaceholder":"What did the customer say? (e.g. \"reduce chair qty to 350, keep price\")","noteRequired":"A note is required when logging a change request or rejection.","forkWarning":"Logging a change request forks a new version — v{{version}} becomes the active document.","logButton":"Log response","loggedToast":"Response captured on {{doc}}","logFailed":"Could not log the response","versionHistory":"Version history","noVersions":"No versions yet.","archived":"Archived","active":"Active","versionDefaultNote":"Revision opened from change request","activeVersionNote":"Current active document","responseLog":"Response log","noResponses":"No responses captured yet.","versionShort":"v{{version}}","done":"Done","quotedNote":"“{{note}}”"},"uploads":{"title":"Attachments","count":"{{count}} file(s) on this order","empty":"No files yet","dropTitle":"Drag files here, or click to upload","dropSub":"Customer PO, quotes, or anything tied to this order — visible to the whole team","modalTitle":"Add {{count}} file(s)","modalSub":"Give each file a clear title so the team knows what it is.","extFallback":"FILE","titleLabel":"Title","titlePlaceholder":"e.g. Signed customer PO","descLabel":"Description","descPlaceholder":"Optional — a short note about this file","addFiles":"Add {{count}} file(s)","uploadedToast":"{{count}} file(s) uploaded","uploadFailed":"Upload failed","confirmDelete":"Delete this file?","delete":"Delete","remove":"Remove","download":"Download","removedToast":"File removed","removeFailed":"Could not remove the file"},"merged":{"back":"← Back to order documents","loading":"Loading the documents…","creating":"Setting up this order's documents…","resolving":"Finding {{order}}…","notFound":"No order matches {{order}}.","notStartedTitle":"No documents yet","notStartedSub":"This order's documents have not been started. Someone who can edit documents opens them first.","loadFailedTitle":"The documents could not be loaded","loadFailedSub":"Reload the page. If it keeps failing, tell your administrator.","eyebrow":"Sales · Order documents","eyebrowAlt":"· Chứng từ đơn hàng","buyerRole":"buyer","customerPo":"Customer P/O","proformaAt":"Proforma at v{{version}}","openProforma":"Open proforma","openOrder":"Open sales order","printSet":"Print set","issue":"Issue documents","reissue":"Re-issue documents","sameAsBuyer":"Same as buyer","edited":"edited","editConsignee":"Edit","incotermEtd":"Incoterm · ETD","tabsLabel":"Documents","version":"v{{n}}","docsPill":{"draft":"Documents draft","in_progress":"Documents in progress","issued":"Documents issued","complete":"Documents complete","superseded":"Documents superseded","void":"Documents void"},"stage":{"soDraft":"SO draft","soPendingApproval":"SO pending approval","soApproved":"SO approved","soConfirmed":"SO confirmed","inProduction":"In production","shipped":"Shipped","delivered":"Delivered","invoiced":"Invoiced","closed":"Closed","cancelled":"Cancelled","piDraft":"PI draft","piConfirmed":"PI confirmed","piClosed":"PI closed","piCancelled":"PI cancelled","piInReview":"PI in review"},"tabs":{"pi":"Proforma invoice","piAlt":"Hóa đơn chiếu lệ","sc":"Sale contract","scAlt":"Hợp đồng mua bán","inv":"Invoice (customs)","invAlt":"Hóa đơn (hải quan)","cbm":"CBM worksheet","cbmAlt":"Kế hoạch CBM","invk":"Invoice (customer)","invkAlt":"Hóa đơn (khách hàng)","pkl":"Packing list","pklAlt":"Phiếu đóng gói"},"review":{"title":"Customer review","sentOn":"sent {{date}}","editCopy":"Edit PI copy","logReply":"Log reply","send":"Send","sendPi":"Send PI"},"summary":{"title":"Order documents","titleAlt":"Chứng từ đơn hàng","open":"Open documents →"},"crumbSales":"Sales","crumbDocs":"Order documents","crumbLabel":"Breadcrumb","unknownTitle":"This order could not be found","unknownSub":"The link may be wrong, or the proforma or sales order was deleted.","backToDocs":"Back to order documents","proformaAtConfirmed":"Proforma at v{{version}}, confirmed by {{by}} {{date}}","engineering":"Engineering","cbm":{"title":"Container plan (CBM)","titleAlt":"Kế hoạch container (CBM)","version":"v{{n}}","explainer":"Carton specification and the split across containers. Every other document reads its carton counts, weights and quantities from this table: edit here, not on the forms.","short_one":"{{count}} line short of order","short_other":"{{count}} lines short of order","over_one":"{{count}} line over the order","over_other":"{{count}} lines over the order","addContainer":"＋ Container","printSheet":"Print sheet","downloadPdf":"Download PDF","issue":"Issue CBM plan","issuedHint":"The CBM plan is issued.","issuedToast":"CBM plan issued","footnotePi":"Boxed cells are editable. Kg totals are carton count × kg per carton. Quantities come from proforma v{{n}}.","footnoteSo":"Boxed cells are editable. Kg totals are carton count × kg per carton. Quantities come from the sales order."},"retry":"Try again","superseded":{"reissueAllDone":"Documents re-issued as drafts with the new number. Issue the set when they are ready.","reissueAllFailed":"Could not re-issue the documents","reissuedToast":"Re-issued as a new draft version","reissueFailed":"Could not re-issue the document","reopenedOn":"Reopened for review {{date}}","issueBlocked":"Superseded documents are re-issued one by one after the PI is confirmed again","asideLabel":"Superseded documents"},"historyOpen":"History","void":{"banner":"This set is void because all its PIs were cancelled. Create a new set from a live PI."}},"sendPi":{"pdfLanguage":"PDF language","fromOrder":"from this order ({{pair}})","thisSendOnly":"Changing it here applies to this send only. The order keeps {{pair}}.","reviewTitle":"Customer review in the portal","reviewTitleAlt":"Khách hàng duyệt trên cổng","askReview":"Ask for a review","customerCan":"{{customer}} can:","actionApprove":"Approve","actionSign":"Sign","actionChanges":"Request changes (note required)","actionReject":"Reject","remindAfter":"Remind me if no response after","days_one":"{{count}} day","days_other":"{{count}} days","reviewNote":"The portal link is created when you press Send. The customer's answer records on this document and in Proformas.","customerSees":"What the customer sees","marksSent":"Sending marks {{doc}} v{{version}} as","title":"Send PI","titleAlt":"Gửi PI cho khách hàng","summary":"{{customer}} · PI v{{version}} · {{amount}}","summaryDoc":"{{customer}} · {{doc}} v{{version}}","intro":"This emails the customer a secure portal link where they can view the PI and respond. The PDF is attached.","subject":"Proforma invoice {{num}} — {{customer}}","greeting":"Dear {{name}},","bodyPo":"Please find attached our proforma invoice {{num}} for P/O {{po}}.\nYou can review it and respond online through the secure link below. No account needed.","bodyNoPo":"Please find attached our proforma invoice {{num}}.\nYou can review it and respond online through the secure link below. No account needed.","signoff":"Best regards,","send":"Send PI","piShort":"PI"},"drift":{"title":"Proforma changed since this copy","titleAlt":"Proforma đã thay đổi kể từ bản sao này","body_one":"This PI copy was taken from proforma v{{copy}} on {{copied}}. The proforma is now v{{now}}. {{count}} line differs:","body_other":"This PI copy was taken from proforma v{{copy}} on {{copied}}. The proforma is now v{{now}}. {{count}} lines differ:","colLine":"Line","colField":"Field","colCopy":"This copy","colProforma":"Proforma v{{version}}","fieldQty":"Qty","fieldPrice":"Unit price","fieldAdded":"Added on the proforma","fieldRemoved":"Removed from the proforma","termChanged":"Payment terms on the proforma: {{term}}","refreshExplain":"Refreshing takes lines, prices and payment terms from v{{version}}. Header edits made on this copy (consignee, ETD, port, clauses) are kept.","refreshForks":"This copy was already sent, so the refresh opens v{{next}} of this PI as a draft.","refreshDecided":"The customer already accepted, signed or rejected this copy, so it can no longer be refreshed. The differences stay listed for reference.","confirmTitle":"Refresh the sent PI copy?","confirmBody":"PI v{{current}} was already sent to the customer. Refreshing from proforma v{{version}} opens v{{next}} as a draft and retires the current portal link: the customer's link stops working until you send the PI again.","confirmCancel":"Keep as sent","refresh":"Refresh from proforma","keep":"Keep this copy","refreshed":"PI copy refreshed from the proforma.","failed":"Couldn't update the PI copy. Try again."},"copy":{"cellTip":"Proforma v{{version}}: {{value}}","versionSent":"v{{n}}","sentOn":"sent {{date}}","editHint":"Edit the copy with Edit PI copy. Edits change this copy only, never the proforma.","printsIn":"Prints in {{pair}}","print":"Print","edit":"Edit PI copy","send":"Send PI","asideLabel":"Document status","reviewTitle":"Customer review","reviewTitleAlt":"Khách hàng duyệt","versionCurrent":"v{{n}} current","reviewSent":"Sent through the portal on {{date}}. The customer can answer online; the answer records here.","reviewNotSent":"Not sent yet. Send PI emails the customer a portal link to review it.","logReply":"Log emailed reply","copyLink":"Copy portal link","linkCopied":"Portal link copied.","versionsTitle":"Versions","vLabel":"v{{n}}","versionCurrentRow":"Current · {{status}}","sourceTitle":"Copy source","copiedFrom":"Copied from","proformaAt":"Proforma v{{version}} · {{date}}","proformaNow":"Proforma now","number":"Number","openProforma":"Open proforma →","activityTitle":"Activity","team":"Team","noActivity":"No activity yet.","downloadPdf":"Download PDF","xlsx":"XLSX"},"combine":{"selectAll":"Select all shown","selectRow":"Select {{ref}} to combine","locked":{"shipped":"Invoice shipped — cannot be combined","cancelled":"Cancelled — cannot be combined","closed":"PI closed — cannot be combined","combined":"Already combined into {{ref}}","issued":"Documents issued — cannot be combined"},"barHint":"Tick the PIs and orders that ship together to combine them into one invoice, packing list and CBM plan.","pickMore":"Tick one more PI or order to combine.","checking":"Checking the selection…","previewFailed":"Could not check the selection","failed":"Could not combine the selection","selected":"Selected","quantity":"Quantity","pcs":"{{n}} pcs","cartons":"Cartons","volume":"Volume","m3":"{{n}} m³","value":"Invoice value","primary":"Primary (ticked first): {{ref}}","blockOn":"{{ref}}: {{reason}}","blockCurrency":"Different currencies ({{codes}}) cannot share one document set.","numberPreview":"Will be invoice","unnumbered":"Unnumbered — the customer has no short code","clear":"Clear","combine":"Combine into document set","warnTitle":"Combine anyway?","warnBody":"{{primary}} (ticked first) is the primary: its customer, parties and currency lead the combined documents. Check these differences:","warnCustomer":"Different customers: {{values}}","warnIncoterm":"Different incoterms: {{values}}","warnCurrency":"No currency set on: {{values}}","warnConfirm":"Combine anyway","success":"{{count}} PIs / orders combined into one document set","successNumbered":"{{count}} PIs / orders combined — invoice {{number}}","capped":"At most {{max}} can be combined at once.","lockedCombinedAnon":"Already combined into another document set","selectedBoth":"{{pis}} and {{orders}}","nPis_one":"{{count}} PI","nPis_other":"{{count}} PIs","nOrders_one":"{{count}} order","nOrders_other":"{{count}} orders","cartonsN":"{{n}} cartons","moreDetails":"Details","lessDetails":"Hide details"},"invoices":{"title":"Invoices","counts":"{{containers}} container(s) · {{invoices}} invoice(s)","assign":"Assign number","assigned":"Invoice number {{number}} assigned","assignedNone":"No invoice number to assign","assignFailed":"Could not assign the invoice number","loading":"Loading invoices…","loadFailed":"Could not load the invoices","retry":"Retry","col":{"invoice":"Invoice","invoiceDate":"Invoice date","contractDate":"Contract date","containers":"Containers","status":"Status","contractNo":"Contract no.","contractNoFull":"Contract number"},"number":"Invoice number","invoiceN":"Invoice {{n}}","notNumbered":"Unnumbered","nextPreview":"Next free:","status":{"draft":"Draft","issued":"Issued","superseded":"Superseded","cancelled":"Cancelled","shipped":"Shipped","reissue":"Superseded · re-issue"},"noShortCode":"This customer has no short code, so the invoice cannot be numbered yet. The documents keep printing the old reference.","openCustomer":"Open the customer","legacyIssued":"Issued before invoice numbering — it keeps printing {{ref}}.","shipmentRef":"Shipment reference","shipmentRefPlaceholder":"e.g. EXP-2026-0042","shipmentRefHint":"Optional note. The documents print it only while the set has no invoice number.","mergeLines":"Merge identical lines of different PIs","mergedPart":"PI {{ref}}: {{qty}}","mergedNote":"Merged (same product, size, material and price): {{list}}.","canMergeNote":"Can be merged (same product, size, material and price): {{list}}.","nothingToMerge":"No identical lines across the PIs of this set.","mergedPartSo":"{{ref}}: {{qty}}","saving":"Saving…","contractNoPlaceholder":"Invoice number","contractNoFailed":"Could not save the contract number."},"superseded":{"ack":"Mark as checked","renumberTitle":"Invoice number changed: issued documents are superseded","renumberTitleAlt":"Số invoice đã thay đổi: các chứng từ đã phát hành bị thay thế","renumberText_one":"{{reason}}. 1 document is marked Superseded and stays on file. Re-issue it to print the new number.","renumberText_other":"{{reason}}. {{count}} documents are marked Superseded and stay on file. Re-issue them to print the new number.","reissueAll":"Re-issue documents","bannerTitle":"PI reopened for review: issued documents are superseded","bannerTitleAlt":"PI đã mở lại để duyệt: các chứng từ đã phát hành bị thay thế","openProforma":"Open proforma","bannerBy":"Reopened by {{name}} on {{date}}.","bannerOn":"Reopened on {{date}}.","bannerReason":"Reason: “{{reason}}”.","bannerCount_one":"1 document is marked Superseded. It stays on file. Re-issue it after Engineering confirms the PI again.","bannerCount_other":"{{count}} documents are marked Superseded. They stay on file. Re-issue each one after Engineering confirms the PI again.","vLabel":"v{{n}}","fromOn":"{{status}} {{date}}","supersededOn":"superseded {{date}}","reissueAs":"Re-issue as v{{n}}","reissue":"Re-issue","readOnly":"Read only. Prints and downloads carry a SUPERSEDED stamp.","print":"Print","downloadPdf":"Download PDF","reissueBlocked":"Available after the PI is confirmed again","asideTitle":"Superseded documents","nextTitle":"Next steps","next1":"Engineering re-verifies the changed lines on the proforma.","next1InReview":"In review","next1Done":"Confirmed","next2":"The PI is confirmed again.","next2Done":"PI confirmed again as v{{n}}.","next3":"Refresh the PI copy here, then send it for portal review.","next4":"Re-issue the contract for signature, then the invoice, CBM worksheet and packing list.","activityTitle":"Activity","activityLine_one":"reopened the PI for review; 1 document superseded","activityLine_other":"reopened the PI for review; {{count}} documents superseded"},"steps":{"label":"Document steps","back":"‹ Back","next":"Next: {{step}} ›","details":{"title":"Details","sub":"invoices, numbers, parties, route, payment","routeTitle":"Route and payment","routeSub":"Printed on the contract, the invoices and the packing list.","pol":"Port of loading","pod":"Port of discharge","etd":"ETD","incoterm":"Incoterm","payment":"Payment","shipping":{"title":"Shipping","sub":"Booking, vessel, L/C and agent P/O are kept for logistics and the booking check. No document prints them yet. The sale contract prints the contract no. from the Invoices card.","bookingNo":"Booking no.","vesselVoyage":"Vessel / voyage","lcNo":"L/C no.","agentPo":"Agent P/O","addLc":"Add L/C no.","changed":"The booking no. or vessel changed after it was verified. Check them and mark the booking verified again.","verifiedBy":"Verified by {{name}} · {{date}}","unknownUser":"logistics","notVerified":"Not verified","notVerifiedYet":"Not verified yet","verify":"Mark booking verified","verifyNeedsBooking":"Booking can't be verified yet: there is no booking no. Enter the booking no. above first, then mark the booking verified.","lockedIssued":"This set is issued, so the booking can no longer be verified. Verify the booking before you issue the set.","verifiedToast":"Booking marked as verified.","verifyFailed":"Could not verify the booking."}},"containers":{"title":"Containers","sub":"{{count}} container(s)","differ":"{{count}} line(s) differ from PI","extras":"incl. {{count}} extra line(s)"},"documents":{"title":"View documents","sub":"contract, invoices, packing list, CBM","cbmSheet":"CBM sheet","cbmSheetAlt":"Shipping plan"},"check":{"title":"Check and issue","sub":"{{errors}} error(s) · {{warnings}} warning(s)","errorsOnly":"{{count}} error(s)","warningsOnly":"{{count}} warning(s)","ready":"ready","checking":"checking…"}},"precheck":{"title":"Pre-issue check","lead":"Runs every time you press Issue. Errors must be fixed. Warnings can be issued after you have read them.","errors":"Errors","warnings":"Warnings","passed":"Passed","badgeErrors":"{{count}} error(s) · issuing is blocked","badgeWarnings":"{{count}} warning(s) to review","badgeReady":"Ready to issue","issueAck":"I have checked the warnings · issue","issue":"Issue document set","reissue":"Re-issue document set","fixToIssue":"Fix the errors above to issue.","loading":"Checking the documents…","loadFailed":"The check could not run.","retry":"Run the check again","goTo":"Go to {{step}}","changed":"The documents changed since the check. Read the warnings again, then issue.","item":{"invoice_no_goods":"Invoice {{invoice}}: no goods are allocated to it.","invoice_number_duplicate":"Invoice {{invoice}}: number {{number}} is already used on another invoice.","contract_date_after_invoice":"Invoice {{invoice}}: contract date {{contract_date}} is after the invoice date {{date}}.","pieces_over_order":"PI {{ref}} · {{name}}: {{over}} pcs more than ordered.","gross_not_above_net":"{{name}}: gross weight per carton ({{gross}}) is not above net weight ({{net}}).","container_empty":"Container {{container}} is empty. Remove it or allocate goods.","consignee_name_missing":"Consignee name is missing.","notify_name_missing":"Notify party name is missing.","pod_missing":"Port of discharge is missing.","invoice_date_before_etd":"Invoice {{invoice}}: date {{date}} is {{days}} days before the ETD ({{etd}}).","invoice_date_after_etd":"Invoice {{invoice}}: date {{date}} is {{days}} days after the ETD ({{etd}}).","etd_missing":"The ETD is not filled in.","contract_date_not_pi_date":"Invoice {{invoice}}: contract date {{contract_date}} is not the date of PI {{refs}}.","pi_nothing_shipping":"PI {{ref}} is in this shipment but none of its goods ship.","container_seal_missing":"Container {{container}}: cont / seal number is not filled in.","customs_name_missing":"{{name}}: the Vietnamese customs name is empty. Set it under Product names.","customs_name_mismatch":"{{name}}: the customs name \"{{customs}}\" does not contain the document name. Check it under Product names.","invoice_unnumbered":"Invoice {{invoice}} has no number because the customer has no short code. It issues without a number.","invoice_number_unique":"Invoice {{invoice}}: number {{number}} has not been used before.","invoice_dates_fit":"Invoice {{invoice}}: date {{date}} fits the ETD and the contract.","pieces_within_order":"No line ships more than ordered.","weights_ok":"Every carton's gross weight is above its net weight.","parties_complete":"Consignee, notify party and port of discharge are filled in.","carton_dims_missing":"{{name}}: the carton's outer dimensions are not filled in.","lc_number_missing":"Payment is by L/C but the L/C number is empty.","agent_po_missing":"The agent P/O number is empty.","booking_not_verified":"The booking has not been verified by logistics.","booking_missing":"There is no booking number yet.","sample_list_not_confirmed":"{{count}} extra line(s) not confirmed by the customer yet. Send the sample list and mark it confirmed.","extra_line_customs_price_missing":"An extra line has no customs price. Customs needs a value even when the customer is not charged.","container_tight":"Container {{container}} ({{type}}) is tight: the load estimate could not place every carton with the carton allowance. A careful loading team may still fit them; confirm before issuing or move pieces.","container_does_not_fit":"The goods planned for container {{container}} ({{type}}) do not fit: too much volume or weight, or a carton is too big. Move pieces to another container or choose a larger one."},"issuedTitle":"Document set issued","issuedOn":"Issued on {{date}}.","reissueHint":"Re-issue only after a change: it stamps every document again."},"rowOrder":{"button":"⇅ Row order","titleInv":"Invoices & contract","titleInvDialog":"Row order on the invoices and the contract","titlePk":"Packing list & CBM sheet","lead":"Automatic order: in container I the lines follow the PI. From container II on, new goods come first, goods from a P/O that already led an earlier container come next, and split lines (already in an earlier container) go last. Move a row with the arrows to set your own order.","poHeader":"P/O","manual":"manual","split":"split","reset":"Reset to automatic","save":"Save","saved":"Row order saved","container":"Container {{roman}}","empty":"No rows","moveUp":"Move {{name}} up","moveDown":"Move {{name}} down","close":"Close","tabsLabel":"Row order group","poOrder":"P/O order","poEarlier":"Move P/O {{po}} earlier","poLater":"Move P/O {{po}} later"},"kd":{"toggle":"Show knock-down packages as separate rows","saving":"Saving…","count":"{{count}} knock-down line(s)","none":"No knock-down lines on this order","badgeAssembled":"Assembled","badgeKnockDown":"Knock-down · {{n}} packages"},"reconcile":{"title":"Customs vs customer invoice","hint":"On screen only — not printed.","container":"Container","containerN":"Container {{n}}","customs":"Customs","customer":"Customer","diff":"Difference","total":"Total"},"history":{"title":"Change history","sub":"Who changed this document set, and when.","loading":"Loading history…","loadFailed":"Could not load the history.","retry":"Retry","empty":"No changes recorded yet.","system":"System","field":{"ref":"reference","pi_number":"PI no.","sc_number":"sale contract no.","inv_date":"invoice date","pi_date":"PI date","sc_date":"contract date","etd":"ETD","pol":"port of loading","pod":"port of discharge","payment":"payment terms","payment_terms_note":"payment terms note","incoterm":"Incoterm","partial_shipment":"partial shipment","latest_shipment_note":"latest shipment note","principal_contract":"principal contract","principal_date":"principal contract date","contract_party":"contract party","signer_id":"signer","lang1":"document language 1","lang2":"document language 2","parties":"parties","bank":"bank","value_translations":"translations","tracker_note":"tracker note","needs_attention":"attention flag","merge_identical_lines":"merge identical lines","show_kd_packages":"knock-down packages","booking_no":"booking no.","vessel_voyage":"vessel / voyage","lc_number":"L/C no.","agent_po_no":"agent P/O no.","row_order":"row order","contract_number":"contract no."},"fieldsChanged":"Changed: {{fields}}","invoiceNo":"Invoice {{number}}","warningsCount_one":"Issued with {{count}} warning","warningsCount_other":"Issued with {{count}} warnings","newNumber":"New number {{number}}","bookingNo":"Booking {{number}}","otherChanged":"Other details changed","action":{"set":{"created":"Set created","updated":"Set edited","issued":"Set issued","reissued":"Set re-issued","combined":"Orders combined","uncombined":"Orders uncombined","shipped":"Set shipped"},"invoice":{"split":"Invoice split","renumbered":"Invoice renumbered"},"booking":{"verified":"Booking verified"}}},"blocked":{"send":{"accepted":"Already accepted by the customer, so it can't be sent again. To change it, reopen the proforma and re-issue a new version.","signed":"Already signed by the customer, so it can't be sent again. To change it, reopen the proforma and re-issue a new version.","rejected":"The customer rejected this version. Edit it back to a draft, then send the new version.","superseded":"This version was replaced by a newer one. Send the latest version instead."},"reply":{"notSent":"Send the document first; the customer's reply can be logged after it is sent.","commentOnly":"This document is {{status}}, so it is no longer waiting for a reply. You can only add a comment."}},"containerPlan":{"title":"Container plan check","titleAlt":"Kiểm tra xếp hàng","lead":"A quick estimate of whether each container's cartons fit by volume, weight and shape. It does not change the plan; use it to move pieces or pick a different container type before you issue.","loading":"Checking how the cartons fit…","loadFailed":"The container check could not load.","retry":"Try again","empty":"No containers to check yet. Add a container and split the pieces across it above.","noCartons":"No cartons placed in this container yet.","allowanceLabel":"Carton allowance (mm per side)","allowanceHint":"Added to every carton side for tape and bulging. 0 to 50 mm; 20 is usual.","allowanceInvalid":"Enter a whole number from 0 to 50.","payloadLabel":"Max payload (kg)","payloadHint":"Leave empty to use the type's payload ({{payload}} kg).","payloadInvalid":"Enter a weight of 0 kg or more, or leave it empty.","typeLabel":"Container type","container":"Container {{label}}","state":{"fits":"Fits","tight":"Tight · verify","does_not_fit":"Does not fit"},"volume":"Volume","weight":"Weight","cartons":"Cartons","gross":"Gross weight","net":"Net weight","floorRun":"Floor run","safeAllowance":"Safe allowance","volumeValue":"{{used}} / {{cap}} m³ · {{pct}}%","grossValue":"{{used}} / {{cap}} kg · {{pct}}%","floorValue":"{{used}} / {{cap}} m","safeValue":"+{{mm}} mm","safeNone":"none","okMessage":"All {{count}} cartons are placed with +{{allowance}} mm added to every carton side. They still fit up to +{{safe}} mm.","sideView":"Load estimate · side view, door on the right","sideViewLabel":"Side view of container {{label}} load","estimateNote":"Estimate only: cartons are stacked in rows from the front wall, heaviest and bulkiest first, lighter ones filling the space above and beside them, and may be turned on any side. The allowance covers tape, bulging and the carton supplier's tolerance.","legendItem":"{{name}} · {{dims}} · {{count}} ctn","leftTitle":"What did not fit","leftItem":"{{name}}: {{cartons}} carton(s) · {{pieces}} pcs","smallest":"The smallest container type that would hold this load: {{type}}.","smallestNone":"No single container type holds this load. Split it across more containers.","reasonsTitle":"What is wrong and what to do","reason":{"volume_over":"The load is {{over_m3}} m³ over what this container holds. Move some pieces to another container, or choose a bigger container type.","weight_over":"Gross weight {{gross}} kg is {{over}} kg over the {{payload}} kg payload. Remove about {{cartons_to_remove}} carton(s) or move them to another container.","carton_too_big":"These cartons are bigger than the inside of the container: {{names}}. Choose a bigger container type or correct the carton sizes on the worksheet.","cartons_left":"{{count}} carton(s) could not be placed with +{{allowance}} mm per side (everything fits up to +{{safe}} mm). Lower the carton allowance, move those cartons to another container, or choose a bigger type.","carton_dims_missing":"Some cartons have no outside size, so the plan cannot place them. Fill in the carton sizes on the worksheet (or the box on the product's BOM); the plan then updates.","unknown":"This container needs a closer look. Check the volume, weight and carton sizes, or move some pieces to another container."},"locked":"The documents are issued, so the container plan cannot be changed. Reopen the set to change it.","viewOnly":"You can see the plan but not change it. Ask someone with edit rights on export documents.","saveFailed":"The change could not be saved.","kgValue":"{{kg}} kg"},"holdback":{"title":"Left behind","titleAlt":"Hàng để lại","lead":"You decide how many pieces stay behind by splitting the pieces across the containers above. \"Suggested\" is what the load estimate could not place. Say why each line is short so the balance is handled correctly.","loading":"Working out what ships…","loadFailed":"The hold-back list could not load.","retry":"Try again","empty":"This set has no lines yet, so nothing can be held back.","noneBehind":"Everything ordered ships in this set. Nothing is left behind.","behindBadge":"{{count}} line(s) short","col":{"pi":"PI","item":"Item","ordered":"Ordered","suggested":"Suggested","leave":"Leave behind (pieces)","shipping":"Shipping now","valueLeft":"Value left ({{cur}})","valueShipping":"Value shipping ({{cur}})","reason":"Reason"},"suggestedHint":"Pieces the load estimate could not place in the container.","total":"Total","overOrder":"Over order by {{count}}. Reduce the pieces in the container plan above.","reasonFor":"Reason for {{name}}","reason":{"not_loaded":"Not fully loaded → balance to stock","customer_changed":"Customer changed quantity → revise PI"},"reasonHint":{"not_loaded":"The PI stays as it is. The balance goes to Undelivered stock when you issue.","customer_changed":"No balance is kept. Sales revises the quantity on the PI in Proformas; nothing changes on the PI from here."},"ledgerHint":"Lines marked \"Not fully loaded\" are recorded in Undelivered stock when you issue.","noteLabel":"Note for the record","mixedCurrency":"This set has orders in more than one currency, so the values are shown per line and not added up.","locked":"The documents are issued, so the reasons are locked. Reopen the set to change them.","viewOnly":"You can see what stays behind but not change it. Ask someone with edit rights on export documents.","saveFailed":"The reason could not be saved."},"extra":{"title":"Lines added outside the PI","sub":"Samples, products, parts or materials that travel in the container but are not on the PI. Customs declares every line. The cartons, CBM and gross weight of these lines are shown here and on the documents; the tracker's carton, CBM and gross totals do not include them yet.","empty":"No lines outside the PI yet.","add":"Add a line","addSamples":"Add samples","locked":"This set is issued — extra lines are read only.","markSent":"Mark as sent","markConfirmed":"Customer confirmed","container":"Container {{label}}","contTotals":"{{cartons}} carton(s) · {{net}} kg net · {{gross}} kg gross · {{cbm}} m³","col":{"kind":"Kind","description":"Name on documents","qty":"Quantity","unit":"Unit","customsPrice":"Customs price","treatment":"Customer invoice","cartons":"Cartons","size":"Carton length × width × height (cm)","net":"Net kg","gross":"Gross kg","confirm":"Customer"},"kind":{"sample":"Sample","product":"Product (BOM)","part":"BOM part","material":"Material"},"treatment":{"charge":"Charge the customer","foc":"Print, no charge (F.O.C)","hide":"Do not print"},"confirm":{"new":"Not sent","sent":"Sent","confirmed":"Confirmed"},"incl":"incl.","edit":"Edit","delete":"Delete","deleteTitle":"Delete this line?","deleteBody":"“{{name}}” will be removed from the documents.","summary":{"customs":"Added to the customs invoice","customer":"Added to the customer invoice and contract","difference":"Difference between the two"},"toast":{"saved":"Line saved.","deleted":"Line deleted.","added":"Samples added to the documents.","sent":"Sample list marked as sent.","confirmed":"Customer confirmation recorded.","reconfirm":"Changed after the customer confirmed: send the sample list again."},"err":{"failed":"Could not save the extra line.","qtyLeft":"Only {{left}} left to send for this sample. Lower the quantity.","locked":"This set is issued and cannot be changed. Reopen it first, or start a new set.","containerHasExtra":"This container still holds {{count}} extra line(s). Move or delete them first.","lockedVoid":"This set is void because all its PIs were cancelled. Create a new set from a live PI.","notFound":"This item no longer exists. Reload the page and try again.","sampleNotFound":"This line is not a delivered sample request of this customer. Reload the list and pick again.","badProduct":"This product cannot be used. Pick a product from the list."},"form":{"addTitle":"Add a line","editTitle":"Edit line","kind":"Kind","description":"Name on documents","customsName":"Customs name (Vietnamese)","customsNameHint":"Required for the customs declaration.","quantity":"Quantity","unit":"Unit","container":"Container","customsPrice":"Customs price (USD)","customerPrice":"Customer price (USD)","customerPriceHint":"Empty = same as customs.","treatment":"On the customer invoice","shared":"Packed inside another carton (printed “incl.”)","cartons":"Cartons","netKg":"Net weight (kg)","grossKg":"Gross weight (kg)","cartonL":"Carton L (cm)","cartonW":"Carton W (cm)","cartonH":"Carton H (cm)","required":"Required.","cancel":"Cancel","save":"Save","add":"Add to the documents"},"picker":{"title":"Add samples from sample requests","search":"Search by request number or sample name","loading":"Loading…","none":"No delivered sample requests with quantity left for this customer.","request":"Request","description":"Name on documents","left":"Left to send","qty":"Send this time","customsPrice":"Customs price (USD)","customerPrice":"Customer price (USD)","qtyOver":"Only {{left}} left to send.","qtyRequired":"Enter a quantity above zero.","priceRequired":"Enter the customs price — customs needs a value even when the customer is not charged.","packing":"Packing","packingHint":"Every ticked sample goes into the carton block typed here. Whole products are not packed automatically from their BOM carton.","container":"Container","cartons":"Cartons","shared":"Packed inside another carton","cartonL":"Carton L (cm)","cartonW":"Carton W (cm)","cartonH":"Carton H (cm)","netKg":"Net weight (kg)","grossKg":"Gross weight (kg)","cartonsRequired":"Enter the number of cartons for the parts and materials.","ticked":"{{count}} line(s) ticked.","cancel":"Cancel","add":"Add to the documents"},"sampleList":"Sample list","lockedVoid":"This set is void — extra lines are read only."},"samples":{"new":"New sample shipment","drawerTitle":"New sample shipment","drawerSub":"A document set with only goods outside the PI — no order, no proforma.","customerPlaceholder":"Choose the customer","titleLabel":"Title (optional)","create":"Create","cancel":"Cancel","createFailed":"Could not create the sample shipment."},"setKind":{"order":"Order","samples":"Samples"}},"planning":{"loading":"Loading planning…","plList":{"blurb":"Every confirmed PI enters production planning — pending confirmation, then material buying and production","tableTitle":"Planning list","count":"{{n}} / {{total}}","hint":"· click a row to see what still needs confirmation","empty":"No orders match this filter.","error":"Could not load the planning list"},"kpi":{"wait":"Awaiting confirmation","confirmed":"Confirmed","buying":"Buying / producing","due":"Due ≤ 14 days"},"plTabs":{"all":"All","wait":"Pending confirmation","confirmed":"Confirmed","buying":"Buying materials","producing":"In production"},"plFilters":{"allOwners":"All owners","searchPlaceholder":"Search PI, customer, PO, SKU…"},"etd":{"7":"≤ 7 days","14":"≤ 14 days","30":"≤ 30 days","label":"Filter by ETD","all":"All","over":"Overdue","range":"Range","from":"ETD from","to":"ETD to","clear":"✕ Clear"},"plCols":{"orderPi":"Order / PI","customer":"Customer","scope":"Scope","sku":"SKU","value":"Value","confirmation":"Confirmation","progress":"Progress","etd":"Delivery (ETD)","stage":"Production stage","owner":"Owner"},"plCells":{"products_one":"{{count}} product","products_other":"{{count}} products","pcs_one":"{{count}} pc","pcs_other":"{{count}} pcs","skuExtra":"+{{n}}","ratio":"{{n}}/{{total}}","pct":"{{pct}}%","overdue_one":"Overdue {{count}}d","overdue_other":"Overdue {{count}}d","today":"Today","inDays_one":"in {{count}}d","inDays_other":"in {{count}}d"},"plStage":{"wait":"Pending confirmation","confirmed":"Confirmed","buying":"Buying materials","producing":"In production"},"plFlow":{"wait":"Pending","confirmed":"Confirmed","buying":"Buying","producing":"Producing"},"item":{"quantity":"Quantity","wood_type":"Wood type","colour_paint":"Colour / paint","design_bom":"Design / BOM","carton":"Carton","packaging_procedure":"Packaging procedure","label":"Label","fabric_upholstery":"Fabric / upholstery","hardware_fittings":"Hardware / fittings","finish_sample":"Finish sample","shipping_marks":"Shipping marks"},"expanded":{"confirmedTitle":"Confirmed","pendingTitle":"Not yet confirmed","noneConfirmed":"No items confirmed yet.","allConfirmed":"All items confirmed.","confirmBtn":"Confirm","fromDocument":"from document","untick":"Untick","untickTitle":"Untick {{item}}?","untickMessage":"The item goes back to “not yet confirmed” and the order cannot advance until it is confirmed again.","untickDocumentMessage":"This item was ticked automatically from an uploaded document. Unticking overrides that signal until you confirm it again.","advanceWait":"Confirm order & start buying materials","readyToProcure":"All {{n}}/{{total}} items confirmed — ready to procure.","waitingAll":"Waiting for all items","stillUnconfirmed_one":"{{count}} item still unconfirmed.","stillUnconfirmed_other":"{{count}} items still unconfirmed.","advanceConfirmed":"Start buying materials","allItemsConfirmed":"All items confirmed.","inStageBefore":"Order is in the","inStageAfter":"stage.","openWorkspace":"Open planning workspace →","openDocuments":"Open documents →"},"plToast":{"confirmed":"Confirmed: {{item}} · {{pi}}","unticked":"Unticked: {{item}} · {{pi}}","advanced":"{{pi}} → buying materials","failed":"Could not update the planning list"},"stage":{"plan":"Plan","forecast":"Forecast","schedule":"Schedule"},"reviewStatus":{"draft":"With reviewer","in_engineering_review":"In engineering review","changes_requested":"Changes requested","engineering_approved":"Engineering approved","in_manager_review":"In manager review","approved_for_production":"Approved for production","manager_rejected":"Rejected by manager"},"reviewerStatus":{"pending":"Pending","approved":"Approved","changes_requested":"Changes requested","rejected":"Rejected"},"stats":{"inPlanning":"In planning","forecasting":"Forecasting","scheduling":"Scheduling","dueSoon":"Due ≤ 14 days"},"tabs":{"all":"All"},"cols":{"orderPi":"Order / PI","review":"Review","customer":"Customer","scope":"Scope","value":"Value","progress":"Progress","delivery":"Delivery","stage":"Stage","open":"Open"},"list":{"title":"Planning","subtitle":"materials & production planning across all orders","searchPlaceholder":"Search order, customer, PO…","poRef":"PO {{po}}","products_one":"{{count}} product","products_other":"{{count}} products","units_one":"{{count}} unit","units_other":"{{count}} units","pct":"{{pct}}%","overdue_one":"{{count}}d overdue","overdue_other":"{{count}}d overdue","inDays_one":"in {{count}}d","inDays_other":"in {{count}}d","planApproved":"✓ Plan approved","awaitingApproval":"Awaiting plan approval","waitingOn":"Waiting on {{name}}","open":"Open →","empty":"No orders have entered planning yet.","emptyFiltered":"No orders match this filter."},"workspace":{"resolving":"Finding order {{order}}…","notFound":"No sales order matches \"{{order}}\".","backToPicker":"Choose a different order","loadFailed":"Could not load the planning workspace","saveFailed":"Could not save the change","noPlanTitle":"This order is not in planning yet","noPlanSub":"Enter it into planning to review the BOM and run the approval chain.","piClosedTitle":"Planning is closed for this PI","piClosedBody":"This PI is closed, so its plan is read-only. If work must continue, reopen the PI first; otherwise plan from a confirmed PI.","createPlan":"Enter into planning","back":"← Back to Planning","crumbOrders":"Orders","crumbPlanning":"Planning","stageBadge":"Planning","fromOrder":"from {{so}}","heroProductItem":"{{name}} ×{{qty}}","heroLine_one":"{{customer}} · {{count}} product","heroLine_other":"{{customer}} · {{count}} products","heroBlurb":"PI approved and deposit paid. Review the bill of materials, confirm each product's documents, and run the engineering & manager approval before sourcing vendors."},"facts":{"delivery":"Delivery","deliverySub":"customer due date","materials":"Materials","materialsSub_one":"{{count}} short of stock","materialsSub_other":"{{count}} short of stock","customerPo":"Customer PO","piValue":"PI value","linesInPlan":"Lines in plan","linesInPlanSub_one":"across {{count}} vendor","linesInPlanSub_other":"across {{count}} vendors"},"rail":{"reviewBom":"Review BOM","engineer":"Eng: {{name}}","engineeringReview":"Engineering review","managerReview":"Manager review"},"banner":{"kicker":"BOM status","title":{"draft":"Preparing for review","changes_requested":"Changes requested — back with the preparer","manager_rejected":"Rejected by manager — back with the preparer","in_engineering_review":"In engineering review","engineering_approved":"Engineering approved","in_manager_review":"In manager review","approved_for_production":"Approved for production"},"body":{"draft":"Confirm each product's documents, then request engineering approval.","changes_requested":"Update the BOM and resubmit.","manager_rejected":"Update the BOM and resubmit.","in_engineering_review":"Engineering reviewers are checking the BOM.","engineering_approved":"Engineering approved by all reviewers. Awaiting manager sign-off for production.","in_manager_review":"Engineering approved by all reviewers. Awaiting manager sign-off for production.","approved_for_production":"Cleared to source vendors and raise purchase orders."},"inEngineeringResubmitted":"In engineering review (resubmitted)","sentBackBody":"Sent back by {{name}}: “{{note}}”. Update the BOM and resubmit.","engineeringBody":"{{n}} of {{total}} engineers approved.","noNote":"no note"},"reviewBom":{"title":"Review BOM & routing","subtitle":"{{confirmed}} of {{total}} products confirmed — expand each to review its BOM, routing and attachments","expandAll":"Expand all","collapseAll":"Collapse all","noProducts":"No engineering BOMs are linked to this order yet.","noProductsHint":"Create or link an engineering BOM for each product on the order first, then come back to review and confirm them here.","noProductsCta":"Go to Engineering BOM →","cardSub":"BOM · routing · attachments","cardSubCollapsed":"BOM · routing · attachments — click to expand","confirmedPill":"Confirmed","awaitingPill":"Awaiting confirmation","viewDocuments":"View documents","reviewDocuments":"Review documents →","qty":"×{{qty}}","actionConfirmed":"Documents for this product are confirmed.","actionAwaiting":"Review this product's attachments, then confirm they are ready.","goToDocuments":"Go to documents","markConfirmed":"Mark confirmed","markAwaiting":"Mark as awaiting","frameTitle":"BOM & Routing — {{product}}"},"dock":{"actingOnBehalf":"Assigned to {{name}}. You are reviewing on their behalf.","title":"Engineering & manager approval","confirmFirst":"Confirm every product's documents to begin approval","sentBack":"Changes requested — update the BOM and resubmit","readyToRequest":"Ready to request engineering approval","assignToBegin":"Assign engineering reviewers to begin","engProgress":"{{n}} of {{total}} engineers approved","awaitingManager":"Engineering approved — awaiting manager sign-off","approved":"Approved for production","gateBody":"Confirm every product's documents above to request engineering approval.","sentBackBy":"Sent back by {{name}}","quotedNote":"“{{note}}”","noNote":"(no note)","assignLabel":"Assign engineering reviewers — pick one or more","noStaff":"No engineering staff available.","requestApproval":"Request engineering approval →","resubmit":"Resubmit to engineering →","you":"You","engineeringRole":"Engineering","managerRole":"Manager","commentPlaceholder":"Add your comments — required to reject / request changes. Sent back to the preparer and kept in the log.","requestChanges":"Request changes","approve":"Approve","theirTask":"Their task — waiting on {{name}}. Visible to you, but only {{name}} can action it.","notePrefix":"{{name}}:","engApprovedAll_one":"✓ Engineering approved by {{total}} reviewer","engApprovedAll_other":"✓ Engineering approved by all {{total}} reviewers","managerOnly":"Awaiting manager sign-off — only a manager can action this step.","managerCommentPlaceholder":"Add feedback — required to reject. Sent back to the preparer and kept in the log.","managerReject":"Reject — request revisions","approveForProduction":"Approve for production","approvedTitle":"Approved for production","approvedSub":"Ready to source vendors and raise purchase orders.","cleared":"✓ Cleared for production"},"toast":{"selectEngineer":"Select at least one engineer","selectToResubmit":"Select engineers to resubmit to","commentRequired":"Add feedback describing the change","feedbackRequired":"Add feedback for the revision","docsConfirmed":"Documents confirmed","movedToAwaiting":"Moved back to awaiting","sentToEngineering_one":"Sent to engineering — {{count}} reviewer","sentToEngineering_other":"Sent to engineering — {{count}} reviewers","resubmitted":"Resubmitted to engineering","reviewApproved":"Approval recorded","sentBackToPreparer":"Sent back to the preparer — products reset to unconfirmed","approvedForProduction":"Approved for production","addedToPlan":"Added to the purchase plan","removedFromPlan":"Removed from the purchase plan","handedOff":"Order request sent to Purchasing","vendor":{"send_rfq":"RFQ sent — awaiting quote","record_quote":"Quote recorded","approve":"Purchase order approved & issued"}},"log":{"onBehalfOf":"on behalf of {{name}}","title":"Interaction log","unknownActor":"Unknown user","quotedComment":" — “{{comment}}”","roleFallback":"User","system":"System","role":{"Sales":"Sales","Preparer":"Preparer","Engineering":"Engineering","Manager":"Manager"},"action":{"created":"entered the order into planning","requested_review":"requested engineering approval","resubmitted":"resubmitted after changes","approved":"approved the BOM","engineering_approved":"— engineering approved by all reviewers","requested_changes":"requested changes","rejected":"rejected the BOM","approved_for_production":"approved for production","manager_rejected":"rejected — requested revisions"}},"source":{"title":"Source & price vendors","unlockedSub":"Plan approved — pick who supplies each material and raise purchase orders.","coverage":"Material coverage →","coverageSub":"required vs. available across the order","vendors":"Compare vendors →","vendorsSub":"prices & lead times per material","purchaseOrders":"Purchase orders →","purchaseOrdersSub":"raise and track POs to vendors","locked":"Unlocks after the manager approves the plan for production.","viewSub":"Pick who supplies each material — split one material across several vendors, or send several materials to one vendor.","noMaterials":"No materials to source for this order yet.","need":"Need","coveredByStock":"covered by stock","noVendors":"No vendors on file for this material.","agreedPrice":"agreed price","priceByQuote":"price by quote","quote":"quote","quotePending":"quote pending","leadDays":"{{days}}d lead","addToPlan":"+ Add to plan","inPlanRemove":"✓ In plan — remove","planTitle":"Purchase plan","planGrouped":"grouped by vendor","planEmpty":"No vendors picked yet. Add materials on the left — one material can go to several vendors, and a vendor can carry several materials.","statusDraft":"Draft","qtyLabel":"Quantity","removeLine":"Remove","subtotal":"Subtotal","subtotalExclQuote":"Subtotal (excl. quote items)","longestLeadInTime":"Longest lead {{days}}d → arrives ~{{date}} · in time","longestLeadLate":"Longest lead {{days}}d → arrives ~{{date}} · after the delivery date","uncostedTitle":"Not costed yet","uncostedSub":"These products don’t have a finalized BOM yet, so their materials can’t be sourced:","buildBom":"Finalize BOM →","altChip":"Alt: {{sku}}","altNote":"Note: {{note}}","useAlt":"Use alternative","useBom":"Use BOM material","buyingAlt":"Buying {{sku}} instead of the BOM material","alternateFor":"Alternate for {{sku}}"},"orders":{"title":"Purchase orders","sub":"send RFQs, capture quotes, approve — then hand to Purchasing","empty":"No vendors in the purchase plan yet. Add materials in Source & price vendors first.","status":{"draft":"Draft","rfq":"RFQ sent","quoted":"Quote in","approved":"PO approved"},"sendRfq":"Send RFQ for quote","recordQuote":"Record quote","approveIssue":"Approve & issue PO","issued":"✓ Issued — on order","rfqTitle":"Request for quote","recordTitle":"Record quote","materialsCount":"materials","materialsOnRequest":"Materials on this request","enterQuoted":"Enter the prices they quoted","quotedPrice":"Quoted price","sendToVendor":"Send to vendor","saveQuote":"Save quote","cancel":"Cancel","handoffTitle":"Hand off to Purchasing","handoffReadySub":"Once vendors and quantities are approved, send the request to Purchasing to raise the POs and receive against inventory.","handoffSentSub":"Sent. Purchasing will issue the POs, book stock against this order, and track receipts into inventory.","handoffSend":"Send order request →","handoffSent":"✓ Sent to Purchasing"}},"undelivered":{"title":"Undelivered stock","titleAlt":"Hàng chưa giao","sub":"Goods that were ordered and produced but not loaded, now held in the warehouse. Each line keeps its PI, what was shipped and when, on which invoice, what is still owed, how much space it takes and why it stayed, until it goes on a new PI.","back":"Back to export documents","openOverview":"Export overview","cards":{"lines":"Lines owed","pieces":"Pieces owed","volume":"Owed volume","value":"Value owed","customers":"Customers","inStock":"In stock (finished goods)"},"unit":{"m3":"{{n}} m³","pcs":"{{n}} pcs","ctn":"{{n}} ctn","kg":"{{n}} kg"},"flow":{"title":"How a balance is cleared","pick":"Pick what the customer still has in our stock","send":"Send the statement to the customer","confirm":"Customer confirms","newPi":"Create the new PI","docs":"Make the document set"},"suggestions":{"title":"Suggestions","none":"No suggestions yet: no customer has a balance owed.","kind":{"ready_to_ship":"Ready to ship","ship_with_open_pi":"Ship with an open PI","waiting_long":"Waiting long","building_up":"Building up"},"text":{"ready_to_ship":"{{pieces}} pcs in stock take {{volume}} m³ ({{pct}}% of a 20ft GP). Enough for a container of their own.","ship_with_open_pi":"{{pieces}} pcs ({{volume}} m³) fit in the free space of PI {{pi}}, which has {{free}} m³ left in its container. Ship them together and clear the balance.","waiting_long":"{{pieces}} pcs have waited {{days}} days. Only {{pct}}% of a 20ft GP, not enough for a container. Ask the customer: ship with their next order, or send as a part load?","building_up":"{{pieces}} pcs, {{volume}} m³: {{pct}}% of a 20ft GP. About {{short}} m³ more before it is worth a container. Waiting {{days}} days."},"action":{"ready_to_ship":"Review and create PI","ship_with_open_pi":"Review these lines","waiting_long":"Open customer statement","building_up":"Select these lines"},"pct20":"20ft GP {{pct}}%"},"ledger":"Stock ledger","filters":{"customer":"Customer","allCustomers":"All customers","status":"Status","search":"Search","searchPlaceholder":"PI, P/O, item, invoice, note","min":"Owed at least","from":"Shipped from","to":"Shipped to","reset":"Clear filters"},"status":{"owed":"Owed","moved":"Moved to new PI","closed":"Closed","all":"All"},"confirm":{"new":"Not sent","sent":"Sent · waiting","confirmed":"Customer confirmed"},"reason":{"not_loaded":"Not fully loaded"},"col":{"select":"Select","customer":"Customer","pi":"PI","item":"Item","ordered":"Ordered","shipped":"Shipped","owed":"Owed","inStock":"In stock","value":"Value","shippedOn":"Shipped on","why":"Why / note","status":"Status","owedCartons":"Owed cartons / m³"},"selectAll":"Select all owed lines","selectRow":"Select {{name}}","poLabel":"P/O {{po}}","invoiceLabel":"Invoice {{no}}","newPiLabel":"PI {{pi}}","age":"{{days}} days waiting","selected":{"title":"Selected {{count}} line(s)","pieces":"Pieces","cartons":"Cartons","volume":"Volume","gross":"Gross","value":"Value","smallest":"Smallest container that fits","noneFits":"More than one container","pctOf":"{{type}} {{pct}}%"},"selectHint":"Tick the lines the customer agreed to receive, then open the statement or create a new PI.","actions":{"statement":"Customer statement","markSent":"Mark as sent to the customer","markConfirmed":"Customer confirmed","newPi":"Create new PI from selection"},"blocked":{"none_picked":"Tick at least one owed line first.","mixed_customers":"The selection has more than one customer. A statement and a PI are for one customer: filter by customer, then select.","mixed_currencies":"These lines are in {{currencies}}, but a new PI has only one currency, so it can't be created. Select lines of one currency, or make one PI per currency (“?” = no currency recorded on the original PI).","no_permission":"You can view undelivered stock but not change it. Ask someone with edit rights on export documents.","no_create_permission":"Creating a PI needs permission to create sales documents. Ask a sales manager to do this step.","not_sent":"Mark the statement as sent first, then mark it confirmed when the customer agrees.","not_confirmed":"The customer has not confirmed yet. Send the statement, mark it confirmed, then create the PI.","already_sent":"The statement is already marked as sent. Mark it confirmed once the customer agrees.","already_confirmed":"The customer already confirmed. Create the new PI."},"stepHint":{"new":"Export this statement and send it to the customer, then mark it as sent.","sent":"Sent. Waiting for the customer to confirm.","confirmed":"The customer confirmed. Create the new PI."},"statement":{"title":"Delivery balance statement","to":"To: {{name}}","date":"Date: {{date}}","intro":"The following goods were ordered and produced but not loaded on the shipments below. They are held in our warehouse for you. Please confirm so that we can issue a new Proforma Invoice and arrange shipment.","back":"Back to list","print":"Print","exportCsv":"Export CSV","nothingSent":"Nothing is e-mailed from here. Export or print the statement and send it yourself, then mark it as sent.","col":{"no":"No.","noFull":"Row number","pi":"PI no.","piFull":"PI number","description":"Description of goods","ordered":"Ordered","delivered":"Delivered","invoice":"Invoice no.","invoiceFull":"Invoice number","shippedOn":"Shipped on","balance":"Balance (pcs)","balanceFull":"Balance (pieces)","cartons":"Cartons","volume":"Volume (m³)","unitPrice":"Unit price","amount":"Amount"},"total":"Total","loading":"Preparing the statement…","loadFailed":"The statement could not be prepared."},"toast":{"sent":"Marked as sent to the customer.","confirmed":"Marked as confirmed by the customer.","newPi":"PI {{pi}} created as a draft from {{count}} line(s). Continue in Proformas: confirm it with the customer, plan containers, issue documents.","openPi":"Open PI","failed":"The action could not be completed."},"loading":"Loading the stock ledger…","loadFailed":"The undelivered stock could not load.","retry":"Try again","empty":"No undelivered stock. When a shipment is issued with pieces left behind (not fully loaded), the balance appears here.","emptyFiltered":"No lines match these filters. Clear the filters to see everything.","noAccess":"You do not have access to export documents. Ask an administrator for view access.","balances":{"title":"Balance by PI","ordered":"Ordered","shipped":"Shipped","owed":"Owed"},"banner":"PI {{pi}} was created as a draft from undelivered stock. It now follows the normal process in Proformas: confirm it with the customer, plan containers, issue documents.","inStockTitle":"Product stock in FG warehouses (same on every line of this product): on hand {{onHand}} · available to ship {{available}}","noFgWarehouse":"Set a Finished Goods warehouse in Settings › Locations › Warehouses to see stock on hand.","noFgWarehouseLink":"Open warehouse settings"},"exportOverview":{"title":"Export overview","titleAlt":"Tổng quan xuất khẩu","sub":"What the proforma invoices and shipments say: the open order book, what ships soon, what shipped, what was delivered in full, and what needs attention. Values are shown per currency and are never added across currencies.","loading":"Loading the overview…","loadFailed":"The export overview could not load.","retry":"Try again","noAccess":"You do not have access to export documents. Ask an administrator for view access.","noCurrency":"No currency","tiles":{"book":"Open order book","bookSub_one":"{{count}} PI not shipped yet","bookSub_other":"{{count}} PIs not shipped yet","next":"Shipping in the next 30 days","nextSub_one":"{{count}} PI by ETD","nextSub_other":"{{count}} PIs by ETD","pastEtd_one":"{{count}} past ETD","pastEtd_other":"{{count}} past ETD","shipped":"Shipped on export invoices (last {{days}} days)","shippedRule":"Counts export invoices marked shipped. A delivery note on its own is not counted here; it is counted as shipped in the overall shipped totals.","shipments_one":"{{count}} shipment","shipments_other":"{{count}} shipments","containers_one":"{{count}} container","containers_other":"{{count}} containers","full":"Delivered in full","pct":"{{pct}}%","fullSub":"{{pieces}} pcs left behind","fullNone":"No shipments in the last {{days}} days yet — the rate shows once something ships.","inStock":"{{value}} still in stock"},"byCustomer":{"title":"Order value by customer","shipped":"Shipped","open":"Open","empty":"No data yet."},"byMonth":{"title":"Open order value by ETD month","pis_one":"{{count}} PI","pis_other":"{{count}} PIs","noEtd":"No ETD","empty":"No open PIs.","thousands":"{{n}}k"},"attention":{"title":"Needs attention","empty":"Nothing needs attention.","open":"Open","seeSuggestions":"See suggestions","kind":{"past_etd":"Past ETD","etd_soon":"ETD soon","no_etd":"No ETD","no_lines":"No line items","stock":"Stock"},"text":{"past_etd_one":"{{who}}: ETD {{etd}} passed {{count}} day ago and it is not shipped. Issue the documents or move the ETD.","past_etd_other":"{{who}}: ETD {{etd}} passed {{count}} days ago and it is not shipped. Issue the documents or move the ETD.","etd_soon_one":"{{who}}: ships in {{count}} day ({{etd}}). Plan containers and issue documents.","etd_soon_other":"{{who}}: ships in {{count}} days ({{etd}}). Plan containers and issue documents.","no_etd":"{{who}}: no ETD set. Set the ETD on the PI.","no_lines":"{{who}}: the proforma has no line items yet. Add the items on the PI."},"stockText_one":"{{count}} suggestion from Undelivered stock: {{kinds}}.","stockText_other":"{{count}} suggestions from Undelivered stock: {{kinds}}."},"suggestionKind":{"ready_to_ship":"ready to ship","ship_with_open_pi":"ship with an open PI","waiting_long":"waiting long","building_up":"building up"}}},"purchasing":{"boughtFor":{"title":"Bought for","loading":"Loading the PIs this order is bought for…","error":"Could not load the PIs this order is bought for.","empty":"Not linked to a PI. Orders created from Forecast or from Material requirements for a PI are linked automatically.","wholePi":"Bought for the whole PI (created before line links).","qty":"{{qty}} {{unit}}"},"piOrders":{"title":"Purchase orders","count_one":"{{count}} order","count_other":"{{count}} orders","loading":"Loading purchase orders…","error":"Could not load the purchase orders of this PI.","empty":"No purchase order is bought for this PI yet. Create them from Purchasing › Forecast or Material requirements.","colPo":"PO","colVendor":"Supplier","colExpected":"Required delivery","colTotal":"Total","lines_one":"{{count}} line","lines_other":"{{count}} lines"},"substitutionReason":{"availability":"Availability","cost":"Cost","other":"Other"},"alternateGrade":{"unitMismatchIncoming":"Not counted: {{qty}} {{unit}} of {{sku}} on order — its unit does not convert into this material's. Add a unit conversion so it counts.","unitMismatchReceived":"Not counted: {{qty}} {{unit}} of {{sku}} received — its unit does not convert into this material's. Add a unit conversion so it counts.","action":"Order alternate grade","changeAction":"Change alternate","dialogTitle":"Order alternate grade","dialogIntro":"Order a sibling grade (same type and size) instead of the specified material. Quantity and unit stay the same.","specifiedLabel":"Specified material","gradeValue":"Grade {{grade}}","lastPriceValue":"Last price {{price}}","colMaterial":"Material","colGrade":"Grade","colStock":"On hand","colLastPrice":"Last purchase","colBestOffer":"Best offer","colDiff":"Difference versus specified","pctValue":"{{pct}}%","current":"Ordered now","loading":"Loading sibling grades…","loadError":"The alternate grades could not be loaded.","retry":"Retry","emptyTitle":"No sibling grades","emptyBody":"No active material has the same type and size with a different grade.","selectRequired":"Choose the grade to order.","reasonLabel":"Reason","reasonPlaceholder":"Choose a reason","reasonRequired":"Choose why you are ordering an alternate grade.","noteLabel":"Note (optional)","notePlaceholder":"e.g. 1C out of stock until next month","noteCount":"{{count}}/{{max}}","internalOnlyHint":"Internal only: customers and the vendor never see this swap. Production cost follows the material actually bought.","save":"Order this grade","cancel":"Cancel","badge":"Alternate for {{sku}} · {{reason}}","alternateFor":"Alternate for {{sku}}","costDiff":"Internal cost vs specified: {{delta}}","costDiffPct":"Internal cost vs specified: {{delta}} ({{pct}}%)","costDiffUnknown":"Internal cost difference unknown","undo":"Undo alternate","undoTitle":"Undo the alternate grade?","undoMessage":"The line goes back to {{sku}}, and the reason and note are cleared.","undoConfirm":"Undo alternate","appliedDraft":"The line now orders {{sku}}. Save the request to keep it.","applied":"The line now orders {{sku}} instead of {{specified}}.","undoneDraft":"The line is back to {{sku}}. Save the request to keep it.","undone":"The line is back to {{sku}}.","colSelect":"Select","unitPriceLabel":"Unit price ({{currency}})","unitPriceHint":"Prefilled from this grade's last purchase or best offer. Check it before saving.","unitPriceKeptHint":"This grade has no price in {{currency}}, so the current unit price is kept.","unitPriceRequired":"Enter a unit price of 0 or more.","undoPriceCheck":"The specified grade has no last purchase price, so the current unit price was kept. Check the price.","notSignedIn":"Your session has expired. Sign in again.","specifyTitle":"Alternative for purchasing","specifyIntro":"Pick a sibling grade (same type and size) that purchasing may buy instead of the BOM material. The BOM still lists the main material first.","specifySave":"Set alternative","specifyNotePlaceholder":"e.g. 2C is fine for hidden parts","bomMaterialLabel":"BOM material","stockLine":"{{available}} {{unit}} in stock · {{incoming}} on order","coversInStock":"No purchase needed","coversInStockHint":"The alternate's free stock covers this shortage. Consider using the alternative instead of buying; check the stock is not needed for other work first.","coversOnOrder":"Covered once received","coversOnOrderHint":"The alternate's free stock plus its open purchase orders cover this shortage.","claimedLine":"{{claimed}} counted for lines above","otherUnit":"Different unit","otherUnitHint":"This alternate is stocked in {{unit}}, not the material's unit, so its stock is not compared with the shortage.","appliedPick":"The line now orders {{sku}}. It is saved when you create the document.","bomAlternativeTag":"BOM alternative","otherUnitRowHint":"Counted in {{unit}}, not {{specifiedUnit}}.","otherUnitSelected":"{{sku}} is counted in {{unit}}, not {{specifiedUnit}}. The quantity stays as entered, so check it before you order.","priceFromOffer":"The line price comes from the vendor offer for the grade you pick.","priceFromPreferredVendor":"The draft PO uses this grade's preferred vendor and price. Without one, it goes to the draft purchase request.","priceFromQuote":"Vendors quote their price for the grade you pick.","priceFromCatalog":"The unit cost comes from this vendor's catalog price for the grade. You can still edit it on the line.","noPricedOffer":"No priced vendor offer","notInVendorCatalog":"Not in this vendor's catalog","alreadyOnOrder":"Already a line on this order","changeShort":"Change","undoShort":"Undo"},"title":"Purchasing","description":"Manage purchase orders and vendor relationships","supplierClaims":{"title":"Supplier Claims","description":"Confirmed supplier returns awaiting a claim (exchange, credit, or debit).","emptyTitle":"No pending claims","emptyDescription":"Claims appear here when the warehouse confirms a return to a supplier.","returnNumber":"Return","lineCount":"Lines","confirmedDate":"Confirmed"},"purchaseOrders":"Purchase Orders","vendors":"Vendors","newPO":"New PO","poVendorFirstHint":"Pick the vendor first — the order draws lines from their catalogue.","created":"Purchase order created.","totalPOs":"Total POs","pendingApproval":"Pending Approval","activeVendors":"Active Vendors","totalSpend":"Total Spend","managePOs":"View and manage all purchase orders","manageVendors":"View and manage vendor database","searchPlaceholder":"Search by PO number or vendor...","allStatuses":"All Statuses","recentPOs":"Recent Purchase Orders","noPOs":"No purchase orders found","viewAllPOs":"View All POs","poNumber":"PO number","vendor":"Vendor","date":"Date","total":"Total","showing":"Showing","of":"of","statusLabels":{"draft":"Draft","pending_approval":"Pending Approval","pending_tier_a":"Pending Tier A Approval","pending_tier_b":"Pending Tier B Approval","approved":"Approved","sent":"Sent to Supplier","partially_received":"Partially Received","received":"Received","cancelled":"Cancelled"},"goodsReceipts":"Goods Receipts","downloadForm":"Download form","goodsReceiptsDescription":"Track incoming stock from purchase orders","grnNumber":"GRN number","receiptDate":"Receipt Date","noGoodsReceipts":"No goods receipts yet","noGoodsReceiptsDescription":"Receipts appear here when purchase orders are partially or fully received.","addVendor":"Add Vendor","editVendor":"Edit Vendor","searchVendors":"Search by code, name, or tax ID...","noVendors":"No vendors found","vendorCode":"Vendor Code","vendorName":"Vendor Name","nameVietnamese":"Name (Vietnamese)","type":"Type","contact":"Contact","email":"Email","phone":"Phone","taxId":"Tax ID","address":"Address","paymentTerms":"Payment Terms (days)","vendorTypeLabels":{"company":"Company","individual":"Individual"},"vendorStatusLabels":{"active":"Active","inactive":"Inactive","blocked":"Blocked","pending":"Pending"},"loadError":"Could not load vendors.","saveError":"Could not save vendor.","deleteError":"Could not delete vendor.","toasts":{"vendorCreated":"Vendor created.","vendorUpdated":"Vendor updated.","vendorDeleted":"Vendor deleted."},"requests":{"title":"Purchase Requests","bomAlternative":{"suggestion":"BOM alternative: {{sku}}","use":"Use alternative","notFound":"{{sku}} is no longer an alternate grade of this material."},"description":"Create and track purchase requisitions","newRequest":"New Request","searchPlaceholder":"Search requests...","allStatuses":"All Statuses","requestNumber":"Request number","requestDate":"Request Date","requiredDate":"Required By Date","colEstimatedTotal":"Estimated total","department":"Department","departmentPlaceholder":"e.g. Manufacturing, Warehouse","urgency":"Urgency","notes":"Notes / Justification","notesPlaceholder":"Explain why these items are needed...","requestDetails":"Request Details","items":"Items","addItem":"Add Item","itemDescription":"Item Description","itemDescPlaceholder":"Enter item name or description","product":"Product","selectProduct":"Select a product","productRequired":"Select a product for each line item","quantity":"Quantity","estimatedPrice":"Est. Price","cancel":"Cancel","createRequest":"Create Request","creating":"Creating...","newRequestTitle":"New Purchase Request","newRequestDesc":"Create a new purchase requisition","urgencyLabels":{"low":"Low","normal":"Normal","high":"High","urgent":"Urgent","critical":"Critical"},"statusLabels":{"draft":"Draft","pending":"Pending Approval","approved":"Approved","rejected":"Rejected","converted":"Converted to PO","cancelled":"Cancelled"},"emptyTitle":"No purchase requests yet","emptyDescription":"Purchase requests capture what teams need before a purchase order is raised. Submit one to begin the approval flow.","helpIntro":"Purchase requests capture internal demand before it becomes a purchase order. Review and approve them here, then convert approved ones to orders.","helpStep1":"Search or filter requests by status.","helpStep2":"Select New request to record what is needed and why.","helpStep3":"Approve a request to allow it to be converted into a purchase order.","helpTip1":"Only approved requests can be converted into purchase orders.","submitRequest":"Submit for Approval","saveDraft":"Save Draft","createdSuccess":"Purchase request created","submittedSuccess":"Purchase request submitted for approval","approvedSuccess":"Purchase request approved","rejectedSuccess":"Purchase request rejected","atLeastOneLine":"Add at least one line item","lineNeedsUnit":"Line {{n}}: choose a unit for this item, or clear the line.","approve":"Approve","reject":"Reject","convertToPO":"Convert to PO","downloadForm":"Download form","rejectReasonLabel":"Rejection reason","rejectReasonPlaceholder":"Explain why this request is being rejected...","rejectReasonRequired":"A rejection reason is required","confirmReject":"Confirm rejection","rejectionReason":"Rejection reason","noLines":"No line items","lineTotal":"Line total","total":"Total","approvalHistory":"Approval history","approvalActions":{"approved":"Approved","rejected":"Rejected","forwarded":"Forwarded"},"backToList":"Back to requests","dnmvtSections":"Purchase Details","selectDepartment":"Select department","departmentOptions":{"go":"Wood","son":"Paint","lap_rap":"Assembly","dong_goi":"Packaging","kinh_doanh":"Sales","ke_toan":"Accounting","hanh_chinh":"Administration"},"purpose":"Purchase Purpose","selectPurpose":"Select purpose","purposeOptions":{"san_xuat":"Production (PI/WO)","ccdc":"Tools & Equipment","vpp":"Office Supplies","khac":"Other"},"receivingDepartment":"Receiving Department","unplannedReason":"Unplanned Purchase Reason","selectReason":"Select reason","unplannedReasonOptions":{"ngoai_pi":"Arises outside PI","hong_mat":"Damaged/lost — replenishment needed","thay_doi_thiet_ke":"Design change","sl_tang":"Quantity increase","khac":"Other"},"unplannedReasonDetail":"Reason Detail","materialType":"Material Type","selectMaterialType":"Select material type","materialTypeOptions":{"nvl":"Raw Material","ccdc":"Tools & Equipment","vpp":"Office Supplies","khac":"Other"},"drawerNewTitle":"New purchase request","drawerSubtitle":"Purchase requisition · VHT-PURCH-BM05","docNote":"Departments must submit at least 3 working days ahead · Purchasing receives & processes","docTitle":"PURCHASE REQUISITION","formCodeLabel":"Form code","formCode":"VHT-PURCH-BM05","formCompany":"VAN HUU THINH CO., LTD","requestNoLabel":"Request no.","sectionATitle":"General information","sectionBTitle":"Reason for unplanned / off-forecast purchase","sectionCTitle":"Requested material details","sectionDTitle":"Attach photos / reference documents","sectionETitle":"Special notes / urgency reason (if any)","sectionFTitle":"Approval","requester":"Requester","autoTag":"auto","createdDate":"Created date","requestType":"Request type","typeNormal":"Normal","typeUrgent":"Urgent","costCode":"Cost code / Budget","costCodePlaceholder":"e.g. PROD-Q3 / CC-01","linkedRef":"Linked PI / WO","linkedRefPlaceholder":"leave blank if not applicable","preferredSupplier":"Preferred supplier (if known)","selectSupplier":"— select supplier —","reasonDetailPlaceholder":"Describe the reason in detail…","colNo":"No.","colNoFull":"Row number","colItemType":"Item type","colMaterialCode":"Material code (system)","colName":"Material name / Spec","colUom":"UoM","colUomFull":"Unit of measure","colUnitPrice":"Est. unit price (VND)","colUnitPriceFull":"Estimated unit price (VND)","colAmount":"Amount (VND)","colSupplier":"Suggested supplier","colSupplierFull":"Suggested supplier","selectMaterial":"Search material code or name…","nameSpecPlaceholder":"name / spec","addMaterialLine":"+ Add material line","estimatedTotalRow":"Estimated total","deleteLineTitle":"Delete this material line?","deleteLineMessage":"This line will be removed from the request.","lineRemoved":"Material line removed","dropHint":"+ Drag & drop or click to add photos / documents","dropTypes":"JPG / PNG / PDF","captionPlaceholder":"caption…","specialNotesPlaceholder":"Enter urgency reason, special supplier requirements, or extra notes…","approvalInfo":"Role-based electronic approval — each level signs off digitally in the app. The printed PDF shows a hand-signature box for each level.","firstApprover":"First approver","selectApprover":"— select approver —","nextSigner":"Next signer","stagePending":"Pending","exportPdf":"Export PDF","exportExcel":"Export Excel","confirmSubmitTitle":"Submit this purchase request?","confirmSubmitMessage":"The request will be sent for approval.","approverRequired":"Select an approver first","footerVersion":"PR-PURCH-005 · VHT-PURCH-BM05 · Version 01 · Effective 01/2026","signInstruction":"(Sign & print full name)","dateLine":"Date __/__/__","summaryRequests":"Requests","draftSaved":"Draft saved","roleLabels":{"requester":"Requester","dept_head":"Department head","director":"Director"},"itemTypeOptions":{"nvl":"Material","ccdc":"Tools","vpp":"Office supplies","khac":"Other"},"noCodeYet":"(No code yet — enter manually)","noCodeYetShort":"(No code)","materialSearchHint":"Type a code or name to search all materials.","materialPickerLabel":"Material for line {{n}}","preferredSupplierPlaceholder":"supplier name (if known)","signedBy":"Signed by {{name}}","signedOnBehalf":"{{actor}} on behalf of {{assignee}}","actingOnBehalf":"Assigned to {{name}}. You are approving on their behalf.","stageSubmitted":"Submitted","rejectedBy":"Rejected by {{name}}","rejectedOnBehalf":"{{actor}} rejected on behalf of {{assignee}}","rejectedReason":"· {{reason}}","rfqBuilder":{"requestQuotes":"Request quotes","requestQuotesCount_one":"Request quotes ({{count}})","requestQuotesCount_other":"Request quotes ({{count}})","selectedCount_one":"{{count}} request selected","selectedCount_other":"{{count}} requests selected","clearSelection":"Clear","selectColumn":"Select","selectRequest":"Select {{number}}","selectOnlyApproved":"Only approved requests can go out for quotes","selectCap":"Select up to {{max}} requests","title":"Request quotes","subtitle":"Send approved request lines to vendors for quotation","defaultTitle":"Quotes for {{numbers}}","fieldTitle":"RFQ title","fieldDeadline":"Quote by","fieldNeededBy":"Needed by","fieldVendors":"Vendors to invite","vendorsHint":"Each vendor gets the RFQ and quotes their own price.","vendorsDraftOnly":"You can save this RFQ as a draft. Sending it to vendors needs the RFQ send permission.","titleRequired":"Enter a title.","deadlinePast":"Pick today or a later date.","linesHeading_one":"{{count}} line to quote","linesHeading_other":"{{count}} lines to quote","colInclude":"Include","colRequest":"Request","colMaterial":"Material","colOpen":"Open quantity","colQty":"Quantity to quote","colTargetPrice":"Estimated price","lineNo":"Line {{n}}","includeLine":"Include line {{line}} of {{number}}","qtyFor":"Quantity to quote for line {{line}} of {{number}}","qtyMax":"Enter a quantity up to {{max}}","qtyInvalid":"Enter a quantity above 0, with up to 4 decimals","manualHint":"Resolve to a catalog material first","fullyQuoted":"Already out for quotation or ordered","otherUnit":"Counted in another unit than the request line","empty":"No open lines to quote on the selected requests.","skipped":"Skipped (not approved): {{numbers}}","loading":"Loading request lines","loadError":"The request lines could not be loaded.","retry":"Retry","summary":"{{lines}} from {{requests}}","summaryLines_one":"{{count}} line","summaryLines_other":"{{count}} lines","summaryRequests_one":"{{count}} request","summaryRequests_other":"{{count}} requests","needLine":"Select at least one line.","fixQty":"Fix the quantities marked in red.","needVendor":"Pick at least one vendor.","cancel":"Cancel","createAndSend":"Create & send","saveDraft":"Save draft RFQ","sentToast_one":"{{no}} sent to {{count}} vendor","sentToast_other":"{{no}} sent to {{count}} vendors","draftToast":"{{no}} saved as a draft","sendFailed":"{{no}} was created as a draft but could not be sent","createFailed":"The RFQ could not be created","openRfq":"Open RFQ"}},"form":{"createPO":"Create PO","newPODescription":"Create a new purchase order"},"approvalReason":"Reason (optional)","auditChainFailed":"Audit chain verification failed.","poActionsTitle":"Actions","submitForApproval":"Submit for approval","submitNoLinesHint":"Add at least one line before submitting for approval.","submitSuccess":"Purchase order submitted for approval.","approvePo":"Approve","approveSuccess":"Purchase order approved.","rejectPo":"Reject","rejectSuccess":"Purchase order rejected.","rejectReasonRequiredHint":"A reason is required to reject.","sendToSupplier":"Send to supplier","sendSuccess":"Purchase order sent to supplier.","grnStatusLabels":{"draft":"Draft","posted":"Received","cancelled":"Cancelled"},"grnSearchPlaceholder":"Search GRN, vendor...","grnNoReceipts":"No goods receipts yet","grnNoReceiptsDesc":"Goods receipts are created when purchase orders are fulfilled.","grnVendor":"Vendor","grnPoNumber":"PO No.","grnPoNumberFull":"PO number","grnReceiptDate":"Receipt Date","colTotalValue":"Total value","grnAllStatuses":"All Statuses","grnDetailTitle":"Goods Receipt {{number}}","grnLinesTitle":"Received Lines","grnPost":"Post Receipt","grnCancel":"Cancel Receipt","grnCancelReason":"Cancellation reason","grnCancelConfirm":"Confirm Cancel","grnPosted":"Goods receipt posted","grnCancelled":"Goods receipt cancelled","grnOrderedQty":"Ordered quantity","grnReceivedQty":"Received quantity","grnUnitPrice":"Unit Price","grnLineTotal":"Line Total","grnNotFound":"Goods receipt not found","grnWarehouse":"Warehouse","grnNotes":"Notes","grnProduct":"Product","grnUom":"Unit of measure","grnCreatedAt":"Created","grnUpdatedAt":"Updated","grnNoLines":"No lines on this receipt","grnUserShortId":"Operator ID","idn":{"title":"Incoming schedule","description":"Warehouse incoming delivery schedule","newNotice":"New notice","noticeNumber":"Notice number","poReference":"PO reference","expectedDate":"Expected date","lines":"Lines","empty":"No incoming deliveries","emptyDescription":"Inbound delivery notices will appear here once created.","markArrived":"Mark arrived","cancel":"Cancel","statusLabels":{"scheduled":"Scheduled","arrived":"Arrived","received":"Received","cancelled":"Cancelled"},"selectPo":"Select a Purchase Order","searchPoPlaceholder":"Search by PO number or vendor...","noPoResults":"No eligible purchase orders found.","noLines":"No open lines on this purchase order.","orderedQty":"Ordered","receivedQty":"Received","expectedQty":"Expected qty","expectedQtyFull":"Expected quantity","noPoSelected":"Search and select a purchase order above to begin.","submit":"Create notice","submitting":"Creating...","createSuccess":"Inbound delivery notice created.","lineNumber":"Line number","product":"Product","uom":"Unit of measure","vendor":"Vendor","warehouse":"Warehouse","notes":"Notes","notFound":"Notice not found","notFoundDescription":"This inbound delivery notice does not exist or may have been removed.","markArrivedSuccess":"Notice marked as arrived.","cancelSuccess":"Notice has been cancelled."},"vendorDrawer":{"titleNew":"New supplier","titleEdit":"Edit supplier","close":"Close","discard":"Discard","saveDraft":"Save draft","saveAndActivate":"Save & activate","save":"Save","saving":"Saving…","saved":"Saved","saveFailed":"Save failed","restoreDraftQuestion":"Restore unsaved draft?","restoreDraftYes":"Restore","activated":"Activated","activateFailed":"Could not activate"},"vendorSections":{"identity":"Identity","primaryContact":"Primary contact","locations":"Locations","additionalContacts":"Additional contacts","commercial":"Commercial","catalog":"Catalog","certifications":"Certifications","banking":"Banking","documents":"Documents"},"vendorFields":{"name":"Supplier name","nameVi":"Name (Vietnamese)","shortName":"Short name","supplierKind":"Supplier kind","tier":"Tier","vendorTypeLegacy":"Legacy classification","country":"Country","taxId":"Tax ID","website":"Website","industry":"Industry","selectIndustry":"Select industry…","leadTimeDaysDefault":"Default lead time (days)","moqDefault":"Default MOQ","paymentTermDays":"Payment terms (days)","incotermsDefault":"Default incoterms","currency":"Currency","currencyHelper":"Quotations and invoices default to this currency.","timezone":"Time zone","timezoneHelper":"Used for delivery dates and scheduling.","localePref":"Locale preference","localePrefHelper":"Drives outbound document language.","fxLockTerms":"FX-lock terms","capacityIndicator":"Capacity indicator","factoryAuditStatus":"Factory audit status","lastAuditDate":"Last audit date","assignedInternalOwner":"Internal owner","defaultPaymentTerm":"Default payment term","defaultPaymentTermCompany":"— use company default —"},"supplierKindLabels":{"manufacturer":"Manufacturer","trader":"Trader","distributor":"Distributor","agent":"Agent","broker":"Broker"},"tierLabels":{"strategic":"Strategic","preferred":"Preferred","approved":"Approved","conditional":"Conditional","oneOff":"One-off"},"auditStatusLabels":{"never":"Never audited","scheduled":"Scheduled","passed":"Passed","failed":"Failed","overdue":"Overdue"},"vendorLocations":{"delete":"Delete","label":"Label","labelPlaceholder":"Main warehouse","primaryBilling":"Primary billing","primaryShipping":"Primary shipping","assignedContact":"Assigned contact","openingHours":"Opening hours","notes":"Notes","emptyBody":"No locations yet — add a billing or shipping address.","addShipping":"+ Shipping address","addFacility":"+ Factory","addWarehouse":"+ Warehouse","types":{"billing":"Billing","shipping":"Shipping","facility":"Facility","hq":"HQ","warehouse":"Warehouse"},"openingHoursPlaceholder":"Mon-Fri 8:00-17:00"},"vendorContacts":{"addSalesRep":"+ Sales rep","addArContact":"+ AR contact","addQaContact":"+ QA contact","emptyTitle":"No additional contacts","emptyBody":"Add roles like sales, AR, QA who own this relationship."},"vendorBanking":{"add":"+ Bank account","emptyTitle":"No bank account yet","emptyBody":"Add payment instructions before issuing the first PO."},"vendorDocuments":{"drop":"Drop files here or click to upload","emptyBody":"Attach the business license, NDA, or product catalogue.","internalNote":"Internal note"},"catalog":{"add":"Add","addFromCatalog":"+ Add","createNewProduct":"Create new product","empty":"No products mapped to this supplier yet.","searchPlaceholder":"Search product by SKU or name…","vendorSku":"Vendor SKU","vendorPartName":"Vendor part name","lastQuotedPrice":"Last quoted price","lastQuotedAt":"Last quoted on","moq":"MOQ","leadTimeDays":"Lead time (days)","packagingUom":"Packaging UoM","preferred":"Preferred supplier","makePreferred":"Mark preferred","isPreferredChip":"Preferred","demoteWarning":"Promoting will demote the current preferred supplier for this product.","deleteOffering":"Delete offering","currency":"Currency","packagingUomPlaceholder":"EA / BOX / PALLET","notes":"Notes","skuCodePlaceholder":"SKU / code","productNamePlaceholder":"Product name","uomPlaceholder":"UOM (EA)","cancel":"Cancel"},"cert":{"add":"Add","kind":"Kind","code":"Certificate code","issuedBy":"Issued by","issuedAt":"Issued on","expiresAt":"Expires on","documentUrl":"Document URL","statusActive":"Active","statusExpired":"Expired","statusSuspended":"Suspended","statusPending":"Pending","expiringSoon":"Expiring < 90d","expired":"Expired","kindIso9001":"ISO 9001","kindIso14001":"ISO 14001","kindFsc":"FSC","kindBsci":"BSCI","kindSa8000":"SA8000","kindReach":"REACH","kindRohs":"RoHS","kindOther":"Other","empty":"No certifications recorded.","deleteCertification":"Delete certification","status":"Status","notes":"Notes"},"ordersDescription":"Create, approve, and track purchase orders to your vendors.","ordersEmptyTitle":"No purchase orders yet","ordersEmptyDescription":"Purchase orders record what you buy from vendors. Create one to start procuring materials.","helpIntro":"The Purchasing overview summarizes your purchase orders, spend, and vendors. Use it as the entry point to procurement screens.","helpStep1":"Review the stat cards for open purchase orders and pending approvals.","helpStep2":"Search or filter the recent purchase orders by status.","helpStep3":"Open Purchase Orders or Vendors from the quick links.","helpStep4":"Select New PO to start a purchase order.","helpTip1":"Total spend counts only approved, ordered, and received purchase orders.","ordersHelpIntro":"This list holds every purchase order with its vendor, date, status, and total. Manage procurement from draft through receipt here.","ordersHelpStep1":"Search by number or vendor, or filter by status.","ordersHelpStep2":"Select New PO to create a purchase order in the side drawer.","ordersHelpStep3":"Click a purchase order number to open its detail.","ordersHelpStep4":"Track status to know which orders await approval or receipt.","ordersHelpTip1":"A purchase order must be approved before it can be sent to the vendor.","receiptsHelpIntro":"Goods receipts record what physically arrived against each purchase order. Posting a receipt updates inventory on hand.","receiptsHelpStep1":"Search by number or filter receipts by status.","receiptsHelpStep2":"Click a goods receipt to review its lines and quantities.","receiptsHelpStep3":"Check the linked purchase order to reconcile ordered against received.","receiptsHelpStep4":"Post a draft receipt to commit the received stock.","receiptsHelpTip1":"A posted goods receipt cannot be edited, so verify quantities before posting.","poLineProduct":"Product","poLineQty":"Quantity","poLineUnitPrice":"Unit price","poLineTotal":"Total","vendorMultiSelect":{"placeholder":"Search vendors by name or code…","addAnother":"Add another vendor…","selected":"Selected vendors","remove":"Remove {{name}}"},"requiredDelivery":"Required delivery (material need)"},"production":{"title":"Production","workOrders":"Work Orders","bom":"Bill of Materials","schedule":"Schedule","workCenter":"Work Center","startDate":"Start Date","endDate":"End Date","quantity":"Quantity","status":{"planned":"Planned","inProgress":"In Progress","completed":"Completed","onHold":"On Hold"},"productionOrders":{"title":"Production Orders","description":"Create and manage production work orders","newOrder":"New Production Order","searchPlaceholder":"Search production orders...","allStatuses":"All Statuses","planned":"Planned","inProgress":"In Progress","completedToday":"Completed Today","delayed":"Delayed","unknownProduct":"Unknown Product","viewBOMs":"View BOMs","statusLabels":{"draft":"Draft","planned":"Planned","released":"Released","in_progress":"In Progress","completed":"Completed","cancelled":"Cancelled"},"columns":{"product":"Product","plannedQty":"Planned quantity","status":"Status"},"emptyTitle":"No production orders yet","emptyDescription":"Production orders schedule manufacturing against a bill of materials. Create one from a BOM to begin.","helpIntro":"Work orders track each production job from planning through completion. Release them to the floor and follow their progress here.","helpStep1":"Search by number or filter by status to find a work order.","helpStep2":"Select New order to create a job for a product and quantity.","helpStep3":"Click a work order to view its details and update its status.","helpStep4":"Watch planned start and end dates to keep the schedule on track.","helpTip1":"A work order needs an active bill of materials before it can be released."},"form":{"createBOM":"Create BOM","newBOMDescription":"Define materials required for a product","createWorkOrder":"Create Work Order","newWorkOrderDescription":"Schedule production for a product","woProductHint":"Search a finished good or sub-assembly by code or name. Its operations come from the product's BOM routing."},"workOrderCreated":"Work order created successfully"},"accounting":{"title":"Accounting","invoices":"Invoices","payments":"Payments","expenses":"Expenses","reports":"Reports","generalLedger":"General Ledger","accountsReceivable":"Accounts Receivable","accountsPayable":"Accounts Payable","description":"Coming in Slice 7 — Finance + Costing.","hubDescription":"Accounts payable and vendor bill management.","helpIntro":"The accounting module is not wired up yet. Chart of accounts, journal entries, GL postings, and Vietnamese e-invoice integration ship together in a later release.","helpStep1":"Check back after the Finance and Costing slice ships for invoices, payments, and the general ledger.","helpStep2":"In the meantime, use the Reports hub for the financial data that is already available.","underConstruction":"Module under construction","underConstructionDesc":"Chart of accounts, journal entries, GL postings, and Vietnamese e-invoice integration ship together in Slice 7. The schema lives today (accounts table is seeded) but the UI isn’t wired yet.","bills":{"navTitle":"Vendor Bills","navDescription":"Review and approve vendor invoices with 3-way match.","title":"Vendor Bills","description":"Vendor invoices with 3-way match against purchase orders and goods receipts.","colBillNumber":"Bill number","colVendor":"Vendor","colBillDate":"Bill Date","colTotalAmount":"Total Amount","colMatchStatus":"Match Status","empty":"No vendor bills","emptyDesc":"Vendor bills created from goods receipts will appear here.","statusLabels":{"draft":"Draft","pending":"Pending","approved":"Approved","partial":"Partial","paid":"Paid","cancelled":"Cancelled"},"matchStatusLabels":{"unmatched":"Unmatched","matched":"Matched","variance":"Variance"}},"match":{"billNumber":"Bill Number","vendorInvoice":"Vendor Invoice","vendor":"Vendor","po":"Purchase Order","grn":"Goods Receipt","reconciliationTitle":"3-Way Match Reconciliation","notMatchedHint":"Not matched yet — run match to see per-line variances","colLine":"Line","colDescription":"Description","colBilledQty":"Billed quantity","colReceivedQty":"Received quantity","colQtyVariance":"Quantity Variance","colBilledPrice":"Billed Price","colOrderedPrice":"Ordered Price","colPriceVariance":"Price Variance","colLineTotal":"Line Total","runMatch":"Run Match","running":"Running...","approve":"Approve","approving":"Approving...","approveBlockedVariance":"Resolve variances before approving","approveBlockedTerminal":"Bill is already processed","matchSuccessTitle":"Match complete","matchSuccessDesc":"Bill matched successfully","matchVarianceTitle":"Variances detected","matchVarianceDesc":"Review and resolve line variances before approving","approveSuccessTitle":"Bill approved","approveSuccessDesc":"Bill {{number}} has been approved","matchErrorTitle":"Match failed","approveErrorTitle":"Approve failed"}},"settings":{"config":{"breadcrumb":"Settings","comingSoon":"This page is being built. Configuration tools land here soon.","categories":{"title":"Categories","description":"The classification masters the whole app references — product and vendor categories, customer types, material groups, units and departments."},"skuStandards":{"title":"SKU Standards","description":"Company-wide coding rules the system uses to auto-generate SKUs for customers, suppliers, employees and products."},"paymentTerms":{"title":"Payment Terms","description":"Payment terms offered to customers or accepted from suppliers, plus the company bank accounts printed on documents."},"forms":{"title":"Forms","description":"Define the fields captured when adding each material type."},"formulas":{"title":"Formulas","description":"The paint-colour formula collection and the raw-wood price book."}},"docNumbering":{"breadcrumb":"Settings","kicker":"Document numbering","skuNotice":"PI numbers built from the customer short code (NN/YY . COMPANY - CODE) are now set under Settings › SKU Standards › Documents. The Proforma row below only applies to customers without a short code.","movedToSku":"PI short-code format: moved to SKU Standards.","movedToSkuLink":"Open SKU Standards › Documents","skuNoticeLink":"Open SKU Standards › Documents","title":"Document numbering","intro":"Set the number format for each document type. The sequence resets automatically at the start of each period (year, month, or day).","colDocType":"Document type","colPrefix":"Prefix","colPeriod":"Reset period","colPad":"Digits","colSample":"Sample","customized":"Customized","loading":"Loading…","save":"Save","reset":"Reset to default","cancel":"Cancel","confirmResetTitle":"Reset {{type}} numbering?","confirmResetBody":"This removes your custom format and restores the built-in default. Existing documents keep their numbers.","period":{"year":"Yearly","month":"Monthly","day":"Daily","none":"Never (continuous)"},"docType":{"grn_receipt":"Goods Receipt Note","grn_posted":"Goods Receipt (posted)","idn_notice":"Inbound Delivery Notice","lot":"Lot","material_issue":"Goods Issue Note","material_return":"Material Return","material_feedback":"Material Feedback","return_to_supplier":"Return to Supplier","btp_lot":"Semi-finished Lot","pick_ticket":"Pick Ticket","proforma":"Proforma Invoice","export_doc_set":"Export Document Set","shipment":"Shipment","price_adjustment":"Price Adjustment","transfer_order":"Warehouse Transfer","adjustment":"Stock Adjustment","putaway_task":"Putaway Task","pallet_slip":"Pallet Slip","workflow_task":"Workflow Task","bom_header":"Bill of Materials","sample_request":"Sample Request","forecast_buy":"Consolidated Buy (Forecast)","delivery_note":"Delivery Note","payment_request":"Payment Request (Cash Flow)"},"toast":{"saved":"{{type}} numbering saved","resetDone":"{{type}} numbering reset to default","saveError":"Could not save the numbering format","loadError":"Could not load document numbering settings","prefixRequired":"Prefix is required"}},"purchasingApprovals":{"breadcrumb":"Settings","kicker":"Purchasing approvals","title":"Purchasing approvals","intro":"Assign a head to each department. A new purchase request from that department goes to its head for the first approval. A department without a head uses the default approver for the role.","colDepartment":"Department","colHead":"Department head","selectHead":"— select head —","fallbackHint":"No head assigned — the role default approver applies","ineligibleHint":"No longer an eligible approver — the role default approver applies","loading":"Loading…","save":"Save","saving":"Saving…","discard":"Discard changes","unsaved":"You have unsaved changes","retry":"Retry","noAccess":"Assigning department heads needs the permission to manage settings modules and to view purchase requests. Ask an administrator for access.","empty":{"title":"No eligible approvers yet","body":"Department heads are picked from active users who can approve purchase requests. Give a role the purchase request approval permission, then come back."},"toast":{"saved":"Department heads saved","saveError":"Could not save department heads","loadError":"Could not load purchasing approval settings","approversLoadError":"Could not load the list of eligible approvers"}},"paymentTerms":{"breadcrumb":"Settings","kicker":"Payment Terms","title":"Payment terms & bank accounts","intro":"One list for every payment term the company offers or accepts. <a>Proformas</a>, <a>sales contracts</a>, invoices, <a>purchase orders</a> and <a>contact records</a> pick from here instead of typing terms by hand, and the bank block printed on documents comes from the account marked default for that currency.","newTerm":"＋ New term","tabs":{"customer":"Customer terms","supplier":"Supplier terms","banks":"Bank accounts"},"kind":{"customer":"customer","supplier":"supplier","both":"shared"},"table":{"term":"Term","method":"Method","split":"Split","balanceDue":"Balance due","usedBy":"Used by","status":"Status","edit":"Edit","duplicate":"Duplicate","isDefault":"Default for {{kind}}s","makeDefault":"Make default","empty":"No {{kind}} terms yet.","search":"Search terms…","setDefault":"Set as default","delete":"Delete"},"status":{"active":"Active","retired":"Retired","closed":"Closed"},"footnote":{"customer":"Click a row to edit. The starred term is preselected on new proformas and sales contracts; a contact can carry its own default that overrides it.","supplier":"Click a row to edit. The starred term is preselected on new purchase orders; a contact can carry its own default that overrides it.","banks":"One default per currency. The default account's block is printed on the PI, sales contract and commercial invoice in that currency."},"method":{"T/T":"T/T","L/C":"L/C","Bank transfer":"Bank transfer","Cash":"Cash"},"trigger":{"none":"No balance (paid in full up front)","before-shipment":"Balance before shipment","bl-copy":"Balance against B/L copy","days-after-bl":"Balance N days after B/L date","days-after-invoice":"Balance N days after invoice","on-delivery":"Balance on delivery","lc":"Letter of credit"},"appliesTo":{"customer":"Customers (PI, contract, invoice)","supplier":"Suppliers (PO)","both":"Both"},"currency":{"USD":"USD","VND":"VND","EUR":"EUR","JPY":"JPY"},"bank":{"isDefault":"Default for {{currency}}","makeDefault":"Make default for {{currency}}","bank":"Bank","account":"Account","swift":"SWIFT","currency":"Currency","status":"Status","empty":"No bank accounts yet.","add":"＋ Add bank account","kickerNew":"New bank account","kickerEdit":"Edit bank account","untitled":"Untitled account","save":"Save account","bankBranch":"Bank & branch","bankPlaceholder":"Vietcombank — Binh Duong branch","address":"Bank address","holder":"Account holder","accountNumber":"Account number","swiftBic":"SWIFT / BIC","search":"Search bank accounts…","setDefault":"Set as default","confirmDelete":"Delete “{{name}}”?","confirmDeleteBody":"The account is removed from the pickers. Documents already issued keep the bank details they were printed with."},"drawer":{"kickerNew":"New payment term","kickerEdit":"Edit payment term","untitled":"Untitled term","save":"Save term","cancel":"Cancel","delete":"Delete","name":"Term name","namePlaceholder":"e.g. 30% deposit · 70% before shipment","method":"Method","appliesTo":"Applies to","deposit":"Deposit %","balanceDue":"Balance due","days":"Days (for N-day triggers)","status":"Status","statusActive":"Active — selectable on new documents","statusRetired":"Retired — kept for existing contracts","note":"Internal note","notePlaceholder":"When to use this term","preview":"Schedule preview","printsAs":"Prints as: “{{text}}”","inUseTitle":"In use","inUseBody":"by {{names}}. Changing the split here does not alter signed contracts — they keep the wording they were issued with.","confirmDelete":"Delete “{{name}}”?","confirmDeleteBody":"The term is removed from every picker. Documents that already carry its wording are not changed."},"rail":{"printTitle":"What documents will print","newPi":"New PI / contract","newPo":"New PO","usdBlock":"USD bank block","vndBlock":"VND bank block","previewLabel":"Preview of the payment clause on a USD PI:","clausePrefix":"Payment:","usedTitle":"Where terms are used","links":{"proformas":"Proformas (PI)","salesContract":"Sales contract","exportDocs":"Invoice & shipping docs","purchaseOrders":"Purchase orders","contacts":"Contacts","poPayments":"PO Payments & Deposits"},"hints":{"proformas":"term picker on the PI header","salesContract":"payment article + bank block","exportDocs":"inherits from the order","purchaseOrders":"supplier terms","contacts":"per-customer / vendor default","poPayments":"milestones follow the split"}},"toast":{"saved":"Saved “{{name}}”","nowDefault":"“{{name}}” is now the default {{kind}} term","inUse":"Term is in use — retire it instead of deleting","deleted":"Term deleted","bankSaved":"Bank account saved","bankNowDefault":"{{bank}} is now the default {{currency}} account","nameRequired":"Give the term a name","bankNameRequired":"Enter the bank name","saveError":"Could not save. Please try again.","loadError":"Could not load payment terms.","bankDeleted":"Bank account deleted"}},"docTemplates":{"breadcrumb":"Settings","title":"Document Templates","intro":"Layouts for the documents we send out. Each document type has one <b>default</b>. A <b>shared</b> template or a <b>customer</b> template inherits from it and only stores what it changes. <b>Assignments</b> decides which template each customer gets.","denied":{"title":"No access to document templates","body":"Ask an administrator for the Document Templates permission."},"tabs":{"templates":"Templates","assignments":"Assignments","signatures":"Signatures"},"docGroups":{"sales":"Sales","purchasing":"Purchasing","production":"Production"},"docTypeBar":{"label":"Document types","comingSoon":"coming soon","comingSoonHint":"This document does not print from a template yet."},"docType":{"qt":"Quotation","pi":"Proforma invoice","ci":"Commercial invoice","pl":"Packing list","dn":"Delivery note","co":"Certificate of origin","po":"Purchase order","pe":"Production estimate"},"tree":{"label":"Templates of this document","builtOn":"↳ {{name}}","assigned_one":"{{count}} assigned","assigned_other":"{{count}} assigned","new":"+ New template"},"kind":{"default":"Default","shared":"Shared","customer":"Customer"},"kindTemplate":{"default":"Default template","shared":"Shared template","customer":"Customer template"},"kindPlural":{"shared":"Shared","customer":"Customer","vendor":"Vendor"},"blocks":{"company":"From (our company)","billto":"To (customer)","shipto":"Ship-to / consignee","title":"Document title","intro":"Opening letter","docinfo":"Document no. & date","items":"Line items table","images":"Product images","totals":"Total in words","terms":"Payment, bank & shipping","notes":"Notes / terms text","sign":"Signature / stamp"},"info":{"nameLabel":"Template name","defaultName":"Default · {{doc}}","defaultHint":"Used by every customer without an assignment. Every other {{doc}} template inherits from it.","defaultHintVendor":"Used by every vendor without an assignment. Every other {{doc}} template inherits from it.","defaultHintInternal":"Every {{doc}} prints with it: an internal document, never assigned to a customer, with this one template. Change the layout here.","resetDefault":"Reset to default layout","resetDefaultHint":"Replaces this layout with the latest built-in one. Customer templates and assignments stay.","inherits":"Inherits {{chain}}.","assigned_one":"Assigned to {{count}} customer.","assigned_other":"Assigned to {{count}} customers.","assignedVendor_one":"Assigned to {{count}} vendor.","assignedVendor_other":"Assigned to {{count}} vendors.","customized_one":"{{count}} customized","customized_other":"{{count}} customized","added_one":"{{count}} added","added_other":"{{count}} added","hidden_one":"{{count}} hidden","hidden_other":"{{count}} hidden","hiddenList":"Hidden blocks","restore":"Restore","manageAssignments":"Manage assignments →","delete":"Delete template","vendorTemplate":"Vendor template"},"preview":{"with":"Preview with","sample":"Sample data"},"actions":{"retry":"Retry","cancel":"Cancel"},"errors":{"loadTree":"Could not load the templates.","loadTemplate":"Could not load this template.","loadPi":"Could not load that PI. Showing sample data.","invalidTitle":"The template was not saved"},"newTemplate":{"title":"New template","shared":"Shared by several customers","sharedHint":"Name it, then assign customers in Assignments.","customer":"For one customer","customerHint":"Named after the customer and assigned to them right away.","customerNoAccess":"Needs access to Contacts to pick a customer.","name":"Name","namePlaceholder":"e.g. EU retailers","nameRequired":"Name the shared template.","customerLabel":"Customer","customerRequired":"Pick a customer.","customerHasOwn":"This customer already has its own template.","sharedVendor":"Shared by several vendors","sharedVendorHint":"Name it, then assign vendors in Assignments.","vendor":"For one vendor","vendorHint":"Named after the vendor and assigned to them right away.","vendorNoAccess":"Needs access to Vendors to pick a vendor.","vendorLabel":"Vendor","vendorRequired":"Pick a vendor.","vendorHasOwn":"This vendor already has its own template.","base":"Based on","baseHint":"The new template inherits this one and only stores what it changes.","create":"Create"},"assign":{"customer":"Customer","hiddenParty":"Customer","selectLabelDoc":"{{doc}} — template for {{party}}","ownTemplate":"Own template","newOwn":"+ Own template…","openInBuilder":"Open in builder","notSetUp":"{{doc}} · not set up","changed":"{{party}} → {{template}}","failed":"Could not change the assignment.","noDirectory":"You can't see the customer directory, so only customers with an assignment are listed.","loadError":"Could not load customers.","search":"Search customers","emptyCustomers":"No customers match.","emptyAssignments":"No customer has a template assigned yet.","vendors":"Vendors","vendor":"Vendor","hiddenVendor":"Vendor","noVendorDirectory":"You can't see the vendor directory, so only vendors with an assignment are listed.","vendorLoadError":"Could not load vendors.","searchVendors":"Search vendors","emptyVendors":"No vendors match.","emptyVendorAssignments":"No vendor has a template assigned yet.","howPicked":"<b>How a template is picked.</b> When someone prints a document, keenERP uses the template assigned to that customer or vendor here. Customers and vendors without an assignment get the default. An issued document keeps the layout it was issued with."},"unsaved":{"title":"Discard unsaved changes?","body":"This template has changes that are not saved yet.","discard":"Discard changes","keep":"Keep editing"},"toast":{"sharedCreated":"Created “{{name}}”. Assign customers in Assignments.","ownCreated":"{{name}} now uses its own template","createFailed":"Could not create the template.","deleted":"Deleted “{{name}}”","inUse":"This template is still in use.","inUseCounts":"This template is still used by {{templates}} and {{assignments}}. Move or clear them first.","inUseTemplates_one":"{{count}} template","inUseTemplates_other":"{{count}} templates","inUseAssignments_one":"{{count}} assignment","inUseAssignments_other":"{{count}} assignments","reset":"Default layout reset to the latest built-in layout","resetFailed":"Could not reset the layout. Reload the template and try again.","deleteFailed":"Could not delete the template.","saved":"Saved “{{name}}”","saveFailed":"Could not save the template."},"delete":{"title":"Delete “{{name}}”?","body":"Customers assigned to it must be moved first. This cannot be undone.","confirm":"Delete template"},"reset":{"title":"Reset to the default layout?","body":"Replaces this default layout with the latest built-in layout (e.g. the BÁO GIÁ form). Your customer templates and assignments stay, and templates built on this default pick up the new layout (apart from the changes they made themselves). Documents already sent are not changed.","unsaved":"Unsaved edits to this template will be lost.","confirm":"Reset layout"},"modes":{"label":"View","edit":"Edit","preview":"Preview","clean":"Clean","editHint":"Arrange blocks and edit their options","previewHint":"The printed sheet, with missing translations marked","cleanHint":"Exactly as the document prints","readOnly":"View only. You can't change templates."},"palette":{"title":"Blocks","hint":"Drag onto a zone, or click to add it to its usual zone","placed":"{{block}} (already on the template)"},"zones":{"header":"Header","parties":"Parties","opening":"Opening","body":"Body","totals":"Totals & terms","footer":"Footer"},"canvas":{"blockLabel":"{{block}} block","dropHere":"Drop blocks here"},"status":{"inherited":"Inherited","overridden":"Customized","added":"Added"},"widths":{"full":"Full","twothird":"Two thirds","half":"Half","third":"One third"},"align":{"left":"Left","center":"Centre","right":"Right"},"lang":{"none":"English only","vi":"Vietnamese","ja":"Japanese"},"operands":{"qty":"Quantity","price":"Unit price","cbm_per_pc":"CBM per pc","nw_per_pc":"N.W. per pc","gw_per_pc":"G.W. per pc","pcs":"Pcs per carton"},"fields":{"company":{"address":"Address","contact":"Tel & fax","tax":"Tax code","logo":"Logo","attn":"Attention (signer)"},"billto":{"address":"Address","contact":"Tel & fax","attn":"Attention"},"shipto":{"address":"Address","contact":"Tel & fax"},"intro":{"thanks":"Thank-you line","ref":"Customer reference","revised":"Revised date","confirm":"Confirmation line","article":"Article line"},"docinfo":{"no":"No.","date":"Date","ref":"Customer reference"},"totals":{"total":"Total","words":"Amount in words"},"terms":{"payment":"Payment","bankname":"Bank name","account":"Account no.","swift":"SWIFT","bankaddr":"Bank address","beneficiary":"Beneficiary","pol":"Port of loading","partial":"Partial shipment","bankdetail":"Bank's detail","incoterm":"Incoterm","dest":"Destination","notes":"Document notes"}},"inspector":{"label":"Block options","pickHint":"Click a block on the page to edit it.","zoneLine":"{{zone}} zone · drag on the page to move","appliesToAll":"Applies to every template that inherits it.","inherited":"Inherited from {{parent}}. Editing it here makes a copy for {{name}} only.","customized":"Customized for {{name}}. Changes to this block in {{parent}} no longer reach it.","added":"Added for {{name}} only.","useParent":"Use {{parent}} version","hide":"Hide on this template","remove":"Remove block","done":"Done","position":"Position","moveUp":"Move up","moveDown":"Move down","zone":"Zone","heading":"Heading","secondLanguage":"{{lang}} for “{{text}}”","width":"Width","titleText":"Title text","alignment":"Alignment","refWording":"Reference wording","refOption":"According to your {{ref}}","showOnDocument":"Show on document","totalsHint":"Switches to quantity totals when the line items table has pricing off.","text":"Text","textL2":"Text in {{lang}}","layout":"Layout","perRow":"Images per row","caption":"Caption (item code, name, colour, quantity)","imagesNewPage":"Start on a new page","imagesShowMissing":"Show lines without a photo","options":"Options","signBoth":"Signature box for the customer too","signBothVendor":"Signature box for the vendor too","signStamp":"Company stamp area","table":"Table"},"items":{"pricing":"Show pricing","pricingHint":"Off hides price and amount, packing-list style","groupBy":"Group rows by","group":{"none":"No grouping","po":"P/O No.","prod":"Product name"},"subtotals":"Subtotal per group","style":"Table style","styles":{"grid":"Grid lines","minimal":"Minimal"},"columns_one":"Columns · {{count}}","columns_other":"Columns · {{count}}","columnName":"column “{{name}}”","moveLeft":"Move “{{name}}” left","moveRight":"Move “{{name}}” right","header":"Header of “{{name}}”","headerL2":"{{lang}} header of “{{name}}”","headerL2Placeholder":"{{lang}} header","hiddenNoPricing":"Hidden while pricing is off","width":"Width of “{{name}}”","widthPct":"%","widthPctValue":"Width of “{{name}}” in %","align":"Alignment of “{{name}}”","alignAuto":"Auto","merge":"⇕ Merge","mergeHint":"Merge repeated values into one tall cell","remove":"Remove {{name}}","delete":"Delete {{name}}","addColumn":"Add a column","addNamed":"+ {{name}}","allShown":"All columns are on the table.","splitQty":"Split quantity","splitQtyChipHint":"Replaces the Quantity column: each line prints two rows (shipment / container 1 and 2).","qtyChipHint":"Replaces the split quantity column with the plain total.","splitQtyHint":"Two rows per line, labelled below. A line without a split prints its total.","splitLabel":"Row {{n}} label of “{{name}}”","splitLabelVi":"Row {{n}} Vietnamese label of “{{name}}”","calculated":"Calculated column","calcName":"Header of the calculated column","calcNamePlaceholder":"Header, e.g. Total CBM","calcNameRequired":"Give the column a header.","calcA":"First value","calcOp":"Operation","calcB":"Second value","calcDecimals":"Decimals","decimals_one":"{{count}} dp","decimals_other":"{{count}} dp","calcAdd":"Add","formula":"ƒ {{a}} {{op}} {{b}}"},"setup":{"label":"Template settings","page":"Page","orientation":"Orientation","orient":{"portrait":"Portrait","landscape":"Landscape"},"paper":"Paper","letter":"Letter","accent":"Accent","accentNone":"No accent (the sheet's own colours)","accentSwatch":"Accent {{colour}}","docNumber":"Document no.","numberingLink":"Settings › SKU Standards","numberingHint":"Numbering is set in SKU Standards, never in a template.","language":"Language","secondLanguage":"Second language","labelStyle":"Bilingual labels","stacked":"Stacked","inline":"Inline ( / )","translations":"Translations · {{lang}}","missing_one":"{{count}} missing","missing_other":"{{count}} missing","complete":"Complete","translationOf":"{{lang}} for “{{text}}”","missingPlaceholder":"Missing","customized":"Customized ·","useParent":"use {{parent}}","fromParent":"From {{parent}}"},"notice":{"onlyIn":"{{block}} can only go in {{zones}}","alreadyOn":"{{block}} is already on this template, so it is selected.","restored":"{{block}} restored from {{name}}","or":"or"},"conflict":{"title":"This template was changed by someone else","reload":"Reload template","body":"Someone saved a newer version while you were editing. Reload to see their changes (your unsaved changes are lost), or keep your changes and overwrite their version when you save.","keep":"Keep mine, overwrite on save","kept":"Your changes are kept. Saving now replaces the newer version."},"saveBar":{"note":"Changes apply to documents printed after you save. Issued documents keep their layout."},"signatures":{"intro":"Who signs each document, in print order. Our company's blocks are signed by a user, anyone in a role, a company signer, the document's own person or someone chosen on each document; the other party's blocks by the vendor or customer. A document type you have not changed uses the built-in blocks.","docTypes":"Document types","sourceBuiltin":"Built-in blocks. Saving creates your company's version.","sourceSaved":"Your company's blocks · version {{version}}","loading":"Loading signature blocks…","loadError":"Could not load the signature blocks.","retry":"Retry","empty":{"title":"No signature blocks","body":"This document is not signed. Add a block to print one.","bodyReadOnly":"This document prints no signature blocks."},"colBlock":"Block (English / Vietnamese)","colSide":"Side","colSigner":"Signed by","colRequired":"Required","optional":"Optional","colActions":"Actions","labelEn":"Label in English","labelVi":"Label in Vietnamese","pickUser":"Choose a user","pickRole":"Choose a role","pickSigner":"Company signer","signerPerDocument":"Chosen on each document","signerDeleted":"This signer was deleted — pick another.","signerNotAllowedOption":"{{name}} — does not sign this document","signerNotAllowed":"{{name}} no longer signs {{document}}. Pick another signer, or ask an admin to add {{document}} to their documents in Admin › Company settings › Signers.","pickActor":"Choose who","kindHint":{"user":"Always this user.","role":"Any member of the role can sign.","signer":"A signer from Company › Seal & signatures.","document_actor":"The person who submitted, sent or owns the document.","counterparty":"The vendor or customer the document is for.","pick":"Picked on the document itself, not here."},"moveUp":"Move {{name}} up","moveDown":"Move {{name}} down","remove":"Remove {{name}}","internalFirst":"Our company signs first","internalFirstHint":"The other party is asked to sign only after every block of ours is signed.","anyOrder":"Both sides may sign in any order.","add":"Add block","unsaved":{"title":"Discard your changes?","body":"The signature blocks of this document type have unsaved changes.","discard":"Discard","keep":"Keep editing"},"toast":{"saved":"Signature blocks saved for {{doc}}.","stale":"Someone else saved these blocks. Your changes are kept: discard them or reapply them on the latest version.","saveFailed":"Could not save the signature blocks."},"invalid":{"labels":"Every block needs a label in English and in Vietnamese.","user":"Choose the user of every “A specific user” block.","role":"Choose the role of every “Anyone in a role” block.","actor":"Choose who signs every “The document's own person” block.","signer":"A company signer fixed on a block no longer signs this document — pick another signer."},"laterNote":"Only the purchase order prints from these blocks for now. The other documents use them from a later update, so they cannot be edited yet.","maxBlocks":"At most {{max}} blocks fit the printed signature row.","conflict":{"body":"Someone else saved version {{version}} of these blocks while you were editing. Discard your changes, or reapply them on the latest version and review before saving.","discard":"Discard my changes","reapply":"Reapply on latest"}}},"title":"Settings","description":"Manage your account and preferences","roles":{"title":"Roles & Permissions","description":"Manage access control for your team members.","createRole":"Create Role","system":"System","noDescription":"No description","permissionsCount":"{{count}} permissions","view":"View","edit":"Edit","clone":"Clone","delete":"Delete","editTitle":"Edit Role: {{name}}","createTitle":"Create New Role","roleNameLabel":"Role Name","roleNamePlaceholder":"e.g. Sales Manager","descriptionLabel":"Description","descriptionPlaceholder":"What can this role do?","permissionsSelected":"Permissions — {{count}} selected","cancel":"Cancel","saving":"Saving...","saveChanges":"Save Changes","deleteTitle":"Delete \"{{name}}\"?","assignedUsers":"{{count}} user(s) currently assigned to this role.","mustReassign":"These users must be reassigned to another role before this role can be deleted.","reassignTo":"Reassign users to","selectRole":"Select a role...","systemTag":"(System)","deleting":"Deleting...","reassignDelete":"Reassign & Delete","copyOf":"Copy of {{name}}","modules":{"products":"Products","inventory":"Inventory","warehouse":"Warehouse","purchasing":"Purchasing","sales":"Sales","production":"Production","finance":"Finance","accounting":"Accounting","hr":"HR","settings":"Settings","maintenance":"Maintenance","orders":"Orders"},"actions":{"view":"View","create":"Create","edit":"Edit","delete":"Delete","manage":"Manage"},"toasts":{"loadError":"Failed to load roles","cloneError":"Failed to clone role","loadRoleError":"Failed to load role","saveError":"Failed to save role","deleteError":"Failed to delete role","updatedTitle":"Role updated","updatedDesc":"{{name}} permissions saved","createdTitle":"Role created","createdDesc":"{{name}} is ready to assign","deletedTitle":"Role deleted","deletedDesc":"{{name}} has been removed","reassignedDesc":"Users reassigned and {{name}} removed"},"helpIntro":"Create and edit roles that bundle permissions into one assignable set for your team.","helpStep1":"Click Create role and give it a name.","helpStep2":"Select permissions by module and action.","helpStep3":"Clone an existing role to reuse its permissions.","helpTip1":"Deleting a role that has users prompts you to reassign them first."},"hub":{"billing":"Billing","billingDesc":"View your subscription and invoices","team":"Team","teamDesc":"Manage team members and access","company":"Company","companyDesc":"Update company information"},"billing":{"title":"Billing","description":"Manage your subscription and view invoices","currentPlan":"Current Plan","plan":"Plan","billed":"Billed","perMonth":"per month","perYear":"per year","nextInvoice":"Next invoice","noSubscription":"No Active Subscription","noSubscriptionDesc":"Please contact our sales team to configure your plan.","usage":"Usage","users":"Users","storageUsed":"Storage Used","modulesActive":"Modules Active","invoices":"Invoices","noInvoices":"No invoices yet.","invoiceNumber":"Invoice number","period":"Period","status":"Status","total":"Total","dueDate":"Due Date","statusLabels":{"paid":"Paid","sent":"Sent","draft":"Draft","overdue":"Overdue","cancelled":"Cancelled"},"upgradeTitle":"Need to upgrade or change your plan?","upgradeDesc":"Contact our sales team for customized pricing and module configuration.","contactSales":"Contact Sales","download":"Download","helpIntro":"Review your current plan, usage, and past invoices for the workspace.","helpStep1":"Check the current plan and what it includes.","helpStep2":"Review usage for users and storage against your limits.","helpStep3":"Download an invoice from the invoices list.","helpTip1":"Contact sales to change your plan or add modules."},"team":{"title":"Team","description":"Manage team members and access","emptyTitle":"No team members yet","emptyDescription":"Invite teammates so they can sign in and collaborate in this workspace.","inviteMember":"+ Invite Member","totalMembers":"Total Members","active":"Active","pendingInvite":"Pending Invite","tableHeaders":{"member":"Member","role":"Role","status":"Status","joined":"Joined","actions":"Actions","email":"Email"},"owner":"Owner","statusActive":"Active","statusInactive":"Inactive","edit":"Edit","inviteModal":{"title":"Invite Team Member","email":"Email Address","emailPlaceholder":"colleague@company.com","role":"Role","selectRole":"Select a role...","cancel":"Cancel","sending":"Sending...","sendInvitation":"Send Invitation","firstName":"First Name","firstNamePlaceholder":"First name","lastName":"Last Name","lastNamePlaceholder":"Last name"},"roleDescriptions":{"admin":"Full access to all features","manager":"Manage team and operations","user":"Standard access","viewer":"Read-only access"},"toasts":{"invitationSent":"Invitation Sent","invitationSentDesc":"An invitation email has been sent to {{email}}","settingsSaved":"Settings Saved","companySettingsUpdated":"Company settings have been updated.","roleUpdated":"Role updated","roleUpdatedDesc":"{{name}}'s role has been updated","userDeactivated":"User deactivated","userDeactivatedDesc":"{{name}} has been deactivated"},"noRole":"No role","searchPlaceholder":"Search members...","editRole":"Edit role","deactivate":"Deactivate","confirmDeactivate":"Deactivate {{name}}? They will lose access.","editModal":{"title":"Assign Role: {{name}}","role":"Role","noRole":"No role assigned","cancel":"Cancel","save":"Save"},"helpIntro":"Manage the members of your team and the role assigned to each one.","helpStep1":"Click Invite member to add someone by email.","helpStep2":"Search the member list to find a person.","helpStep3":"Use the row actions to change a role or deactivate a member.","helpTip1":"The account owner cannot be deactivated."},"company":{"title":"Company Settings","description":"Manage your company information","basicInfo":"Basic Information","companyName":"Company Name","taxId":"Tax ID (MST)","industry":"Industry","industryPlaceholder":"Manufacturing","address":"Address","addressPlaceholder":"123 Main Street...","regional":"Regional Settings","timezone":"Timezone","tzHoChiMinh":"Asia/Ho_Chi_Minh (GMT+7)","tzBangkok":"Asia/Bangkok (GMT+7)","tzSingapore":"Asia/Singapore (GMT+8)","locale":"Locale","localeVi":"Vietnamese (vi-VN)","localeEn":"English (en-US)","contact":"Contact Emails","billingEmail":"Billing Email","technicalEmail":"Technical Email","saving":"Saving...","saveChanges":"Save Changes","toasts":{"companySettingsUpdated":"Your company settings have been updated.","settingsSaved":"Settings saved"},"helpIntro":"Update the company details, regional defaults, and contact emails used across the workspace.","helpStep1":"Edit the basic information fields such as name and tax ID.","helpStep2":"Set the timezone and locale under Regional.","helpStep3":"Enter billing and technical contact emails.","helpStep4":"Click Save changes to apply."},"delegations":{"title":"Approval Delegations","description":"Designate someone to act on your behalf during a defined time window.","newDelegation":"New Delegation","tabs":{"outgoing":"Outgoing","incoming":"Incoming"},"empty":{"outgoing":"You haven't delegated to anyone yet.","incoming":"Nobody has delegated their authority to you."},"emptyTitle":{"outgoing":"No delegations granted","incoming":"No delegations received"},"to":"Delegated to","from":"From","reason":"Reason","status":{"active":"Active","scheduled":"Scheduled","expired":"Expired","revoked":"Revoked"},"actions":{"revoke":"Revoke"},"revokeConfirm":"Revoke this delegation? The delegate will lose access immediately.","form":{"delegate":"Delegate (the person who will act for you)","delegatePlaceholder":"Choose a user…","start":"Effective from","end":"Effective until","reason":"Reason (optional)","reasonPlaceholder":"e.g. Vacation 5–12 May","create":"Create Delegation"},"toasts":{"created":"Delegation created.","revoked":"Delegation revoked."},"banner":{"text":"You are currently acting on behalf of another user via an active delegation.","dismiss":"Dismiss"},"helpIntro":"Delegate your access to another user for a set period, and review delegations granted to you.","helpStep1":"Click New delegation and pick the user to delegate to.","helpStep2":"Set the start and end dates for the delegation.","helpStep3":"Switch between the outgoing and incoming tabs to review each side.","helpStep4":"Revoke an outgoing delegation early if it is no longer needed."},"helpIntro":"This hub links to every workspace setting, grouped by area.","helpStep1":"Pick a card to open that settings area.","helpStep2":"Return here any time to switch to another area.","categories":{"title":"Categories","description":"The classification masters the whole app references — product and vendor categories, customer types, material categories (group → type, each type carrying its own grade set for material SKUs), and departments. Each list also owns a code format.","breadcrumb":"Settings","comingSoon":"Coming soon","deptManagedInHr":"Managed in HR — editing requires HR access","materialOptionsNote":"Units of measure and material spec lists are managed in","materialOptionsLink":"Settings › Material Options","previewName":"Sample","confirmDelete":"Delete \"{{name}}\"? This cannot be undone.","confirmDeleteGroup":"Remove \"{{name}}\" and its {{count}} material types? This cannot be undone.","material":{"title":"Material categories","groupsCount":"{{count}} groups","typesCount":"{{count}} types","manualCodes":"✎ Manual codes","allGroups":"All groups","skuSeg":"SKU segment","gradingBasis":"Grading basis","grades":"Grades","missing":"missing","ungraded":"ungraded","level3":"LEVEL 3","noGradingBasis":"no grading basis","skuSlot":"SKU slot {{slot}}","editGrades":"Edit grades →","gradeCode":"Code","gradeValue":"Value","gradeMeaning":"Meaning","gradeSku":"SKU","noGradesKpc":"No grades — SKU uses KPC","rule":"RULE","loading":"Loading…","formatNote":"Codes above are the app keys. The SKU segment on each row (GO, OAK) and each type's grades (01C, FAS…) feed the material SKU 05.l1.l2.l3.001 defined in","formatNoteLink":"SKU Standards › 05 · Material","formatNoteEnd":".","moveToMachines":"Move to Machines & Tools"},"import":{"button":"Import","export":"Export","exportFailed":"Could not export the categories. Try again.","exportedToast":"Exported {{count}} rows","title":"Import material categories","sub":"Add or update groups, types and grades from one Excel sheet. Nothing is ever deleted.","downloadTemplate":"Download template","downloadExport":"Download current categories","downloadFailed":"Could not download the file. Try again.","file":"Excel file (.xlsx)","chooseFile":"Choose file","noFileChosen":"No file chosen","hintRows":"One row per grade. Repeat the group and type columns on every row of the same type. A type without grades is one row with the grade columns blank.","hintMode":"New codes are added and existing codes are updated. Nothing is deleted, and nothing is deactivated unless the Status column says Inactive. Blank cells keep the current value. A code that was deleted earlier is restored with the data from the file. The English names are optional — the Vietnamese name is used when the English one is blank.","hintExport":"Tip: download the current categories, edit the file and import it back.","cancel":"Cancel","done":"Done","previewBtn":"Preview","commitBtn":"Import","previewFailed":"Could not read the file. Check it and try again.","commitFailed":"The import did not finish. Nothing was saved — try again.","toastDone":"Categories imported","col":{"level":"Level","code":"Code","name":"Name","status":"Status","details":"Details"},"count":{"errors":"Errors"},"level":{"group":"Group (L1)","type":"Type (L2)","grade":"Grade (L3)"},"status":{"new":"New","changed":"Changed","restored":"Restored","unchanged":"Unchanged"},"field":{"name":"name","nameVi":"Vietnamese name","skuSegment":"SKU segment","gradingBasis":"grading basis","meaning":"meaning","status":"status"},"changedFields":"Changes: {{fields}}","inParent":"in {{parent}}","rowsNote":"{{rows}} rows read · {{errors}} rows will be skipped.","emptyFile":"No rows were found in the sheet.","nothing":"Nothing to import — the file has no new or changed categories.","warningsTitle":"Please note","errorsHead":"{{count}} rows have problems and will be skipped","errorRow":"Row {{row}}:","downloadErrors":"Download rows with errors ({{count}})","downloadErrorsHint":"Fix them in Excel, then import the file again.","showUnchanged":"Show {{count}} unchanged","truncated":"Only the first lines are listed.","resultHead":"Import finished","resultLine":"Added {{cg}} groups, {{ct}} types, {{cl}} grades · updated {{ug}} groups, {{ut}} types, {{ul}} grades · restored {{rg}} groups, {{rt}} types, {{rl}} grades · skipped {{skipped}} rows with problems."},"lists":{"product":"Product categories","productUsedBy":"Used by products","material":"Material categories","materialUsedBy":"Used by materials","uom":"Units of measure","uomUsedBy":"Used across the catalog","vendor":"Vendor categories","vendorUsedBy":"Used by vendors","vendorType":"Vendor types","vendorTypeUsedBy":"Used by vendors","customer":"Customer types","customerUsedBy":"Used by customers","dept":"Departments","deptUsedBy":"Used by departments","machines":"Machines & Tools","machinesUsedBy":"Used by machines"},"format":{"title":"Code format","subtitle":"Define how new codes are generated for this list.","modeManual":"Manual","modeAuto":"Auto","loading":"Loading…","manualHint":"Codes are entered manually for this list.","emptySegments":"No segments yet. Add one below.","addSegment":"Add segment","livePreview":"Live preview","previewEmpty":"(empty)","segText":"Text","segSep":"Separator","segAbbr":"Abbreviation","segSeq":"Sequence","segDate":"Date","segLegend":"Legend","segLookup":"Lookup","segVariant":"Variant","segCondseq":"Conditional Sequence","value":"Value","letters":"Letters","case":"Case","caseUpper":"UPPERCASE","caseLower":"lowercase","caseAs":"As typed","digits":"Digits","start":"Start","format":"Format","moveUp":"Move up","moveDown":"Move down","removeSegment":"Remove segment","loadError":"Could not load the code format.","saveError":"Could not save the code format.","incompleteHint":"Give every legend, lookup and variant segment a slot name — changes save automatically once they're filled.","nextCodePreview":"Next code preview","then":"Then","previewFor":"Preview for","formatStructure":"Format structure","formatStructureHint":"Drag to reorder · click a segment to edit","quickPresets":"Quick presets","presetAbbrNumber":"Abbr + number","presetPrefixNumber":"Prefix + number","presetAbbrOnly":"Abbr only","presetYearNumber":"Year + number","presetPrefixAbbrNumber":"Prefix + abbr + number","dragHandle":"Drag to reorder","seqScope":"Numbering","seqScopeEntity":"Restart per prefix (HA001, DH001)","seqScopeGlobal":"Continuous across all codes (001, 002, 003)"},"table":{"code":"Code","name":"Name","description":"Description","status":"Status","active":"Active","inactive":"Inactive","actions":"Actions","edit":"Edit","delete":"Delete","add":"Add","search":"Search…","empty":"No entries match your filters.","inUseCount":"{{count}} in use","unused":"Unused","parent":"Parent category","translationColumn":"Translation · {{locale}}","notTranslated":"— not translated —","translationsLabel":"Translations"},"drawer":{"addTitle":"Add entry","editTitle":"Edit entry","code":"Code","name":"Name","nameVi":"Vietnamese name","translationBlockTitle":"Translation","translatedName":"Name (translated)","translatedDesc":"Description (translated) — optional","translationHint":"Used by the app's i18n layer when the user's locale is set to this language. Leave blank to fall back to the default (English) value.","description":"Description","active":"Active","manualOverride":"Enter the code manually","cancel":"Cancel","save":"Save","required":"This field is required","parent":"Parent category","parentNone":"— Top level —","parentHint":"Leave as top level, or nest this under an existing category.","materialParentNone":"— none (material group) —","materialParentHint":"None = a material group (level 1). Pick a group to make this a material type (level 2).","skuSegment":"SKU segment","segHintGroup":"2 letters · SKU slot l1","segHintType":"3 chars · SKU slot l2","level3":"LEVEL 3","gradesTitle":"Grades for this type","gradesSlot":"· SKU slot l3","gradingBasis":"Grading basis","gradingBasisHint":"What the grades measure.","gradingBasisPlaceholder":"e.g. Plating / Surface finish","gradeCode":"Code","gradeValue":"Value","gradeMeaning":"Meaning","removeGrade":"Remove grade","noGrades":"No grades — the SKU will use KPC.","addGrade":"＋ Add grade","gradesHint":"3 characters each. Leave only KPC when the type is not graded.","segRequired":"Enter the SKU segment.","segDuplicate":"SKU segment {{seg}} is already used at this level.","gradeCodeRequired":"Every grade needs a code."},"toast":{"created":"Entry created.","updated":"Entry updated.","deleted":"Entry deleted.","saveError":"Could not save changes.","loadError":"Could not load entries."},"materialOptionsNoteEnd":".","machinesTools":{"formatTitle":"Code format","formatNote":"Machine codes (06.<TYPE>.<NNN>) are made in","formatLink":"Settings › SKU Standards › 06 Machine","formatNoteEnd":". The code of each type below is the TYPE part.","readOnly":"You can view machine types but not change them. To add or edit one, ask an administrator for the machine engineering permission."},"move":{"confirmTitle":"Move {{name}} to Machines & Tools?","body":"The group {{group}} and its {{count}} type(s) leave Material categories and become machine types.","willCreate":"New machine types: {{list}}.","willReuse":"Already in Machines & Tools, reused: {{list}}.","willRename":"Code already taken by a different type, saved under a new code: {{list}}.","confirmLabel":"Move","done":"Moved {{count}} types to Machines & Tools","error":"Could not move the group."}},"locations":{"title":"Warehouses & Bins","description":"The single source of truth for where stock lives. Receiving, transfers, pick lists and the stock ledger all read this list.","breadcrumb":"Settings · Master data · Locations","tabs":{"warehouses":"Warehouses","bins":"Bins & Zones","categoryDefaults":"Category defaults"},"warehouses":{"cardTitle":"Warehouses","addWarehouse":"＋ Add warehouse","noWarehouses":"No warehouses yet.","table":{"code":"Code","name":"Name","address":"Address","bins":"Bins","status":"Status","actions":"Actions","type":"Type"},"status":{"archived":"Archived","activeDot":"● Active"},"actions":{"edit":"Edit","archive":"Archive","restore":"Restore"},"toast":{"created":"Warehouse created.","updated":"Warehouse updated.","archived":"Warehouse archived.","restored":"Warehouse restored.","saveError":"Could not save the warehouse."},"drawer":{"addTitle":"New warehouse","editTitle":"Edit warehouse","code":"Warehouse code","codePlaceholder":"WH-…","name":"Name (English)","namePlaceholder":"Main Warehouse","nameVi":"Name (Tiếng Việt)","nameViPlaceholder":"Kho Chính","addressSection":"Address","address":"Street / building","addressPlaceholder":"e.g. Đường Mạc Đĩnh Chi, KP.10","city":"City / district","cityPlaceholder":"Biên Hòa","province":"Province","country":"Country","isActive":"Active — available for receiving & transfers","isDefault":"Default warehouse","required":"This field is required.","cancel":"Cancel","save":"Save changes","ward":"Ward (Phường/Xã)","wardPlaceholder":"P. An Bình","countryValue":"Vietnam","addressPreviewTitle":"Standardized address","addressPreviewEmpty":"Fill the fields above to preview the standardized address","create":"Create warehouse","addSub":"Create a stock location","warehouseType":"Warehouse type","warehouseTypeHint":"Used to find finished goods, raw materials, packaging and samples"},"countSuffix":"· {{count}}","types":{"finished_goods":"Finished goods","raw_materials":"Raw materials","packaging":"Packaging","sample":"Sample","other":"Other"}},"bins":{"noWarehousesTitle":"No warehouses yet","addBin":"＋ Add bin","table":{"nameVi":"Name (Vietnamese)","code":"Bin code","type":"Type","status":"Status","zone":"Zone","capacity":"Capacity","actions":"Actions"},"status":{"inactive":"Inactive","activeDot":"● Active"},"toast":{"binCreated":"Bin created.","binSaveError":"Could not save the bin.","binUpdated":"Bin updated.","binRemoved":"Bin removed.","binRemoveError":"Could not remove the bin."},"binDrawer":{"nameVi":"Name (Vietnamese)","nameViHelp":"Shown instead of the bin code on Vietnamese pages. Leave blank to show the code.","addTitle":"New bin","code":"Bin code","codePlaceholder":"A01-R02-S03-B01","locationType":"Bin type","isActive":"Active","required":"This field is required.","cancel":"Cancel","save":"Save changes","editTitle":"Edit bin","warehouse":"Warehouse","zone":"Zone","newZoneOption":"＋ New zone…","newZoneCode":"New zone code","newZoneCodePlaceholder":"A","newZoneHint":"The zone is created as a storage zone named after its code.","newZoneRequired":"Enter a code for the new zone.","capacity":"Capacity","capacityPlaceholder":"48 pallet","create":"Create bin"},"chipBinCount":"{{count}} bins","noBinsInWarehouse":"No bins in this warehouse yet","actions":{"edit":"Edit","remove":"Remove"},"countSuffix":"· {{count}} bins"},"categoryDefaults":{"hint":"Set a default warehouse and bin for each product category. New stock in that category is put away there unless a more specific rule applies.","table":{"category":"Category","warehouse":"Warehouse","bin":"Bin"},"noBinsOption":"No bins in this warehouse","noWarehousesTitle":"No warehouses yet","noCategoriesTitle":"No product categories yet","toast":{"saved":"Default location saved.","saveError":"Could not save the default location."},"cardTitle":"Default location by material category"},"viewOnlyNote":"View-only — you need warehouse edit access to make changes."},"sku":{"title":"SKU Standards","description":"Company-wide coding rules the system uses to auto-generate codes for customers, suppliers, employees and products.","comingSoonTab":"Coming soon","comingSoonTabLabel":"Materials · Machines · Docs","tabs":{"customer":"Customer","supplier":"Supplier","employee":"Employee","product":"Product","material":"Material","documents":"Documents","machine":"Machine"},"docs":{"presets":{"standard":"Standard (company and customer)","customerYearSeq":"Customer · year · number","seqYearCustomer":"Number / year · customer"},"slots":{"company":"company","customer":"customer"},"types":{"proforma":{"title":"Proforma Invoice (PI)","help":"The number a new PI gets for a customer that has a short code. Default: NN/YY . COMPANY - CODE, numbered per customer and year."}},"noteSlots":"Slots: company = the primary company's short name (skipped when empty), customer = the customer's short code, YY = issue year, sequence = counted from the numbers already issued.","noteFallback":"Customers without a short code keep the plain PI-YYYY-NNNN number set under Document numbering.","noteChange":"Existing PI numbers are never changed. If you change the shape mid-year, numbers in the old shape are not counted and the new shape starts again at its first number.","otherTypes":"Other document types are still set under","otherTypesLink":"Document numbering"},"segType":{"legend":"Legend","lookup":"Lookup","variant":"Variant","condseq":"Conditional Sequence","slot":"Slot","source":"Source","sourceVendor":"Vendor category","sourceCustomerType":"Customer type","sourceEmployeeGroup":"Employee group","sourceProductType":"Product type","sourceMaterialL1":"Material categories · groups (l1)","sourceMaterialL2":"Material categories · types (l2)","sourceMaterialL3":"Material categories · type grades (l3)","sourceCompanyCode":"Company code (primary company)","sourceCustomerCode":"Customer code (short code)","start":"Start","len":"Length","charSlot":"Char slot","versionSlot":"Version slot","slotLocked":"This slot is fixed by the system and can't be renamed.","sampleChar":"Sample letter","sampleCharHint":"Samples are coded with this letter (e.g. S01). When a sample is finalised as the official BOM it takes the next normal letter (S01 → A01), and new variants never get this letter. Leave blank for no sample rule.","digits":"Digits","on":"On slot","cases":"Cases","default":"Default digits","addCase":"Add case","sourceMachineType":"Machine types"},"material":{"generator":"Generator","resolveSlots":"Resolve the slots","source":"Source · Settings › Categories › Material categories","group":"Material group","type":"Material type","grade":"Grade","nextCode":"Next code preview","previewNote":"Material records are minted on the material intake form using this format; this panel previews the result.","loadError":"Could not load material categories."},"legends":{"vendorIndustry":"Vendor industries","employeeGroup":"Employee groups","productType":"Product types","variantChar":"Variant characteristics","deleteBlocked":"Can’t delete — {{count}} record(s) still use this value. Reassign them first."},"registry":{"code":"Code","name":"Name","vendorType":"Vendor type","status":"Status","statusActive":"Active","statusDisabled":"Disabled","productType":"Product type","customerType":"Customer type","empty":"No entries found."},"gen":{"badge":"Generator","title":"Generate code","nextCode":"Next code","addToRegistry":"Add to registry","adding":"Adding…","added":"Added {{code}}","selectPlaceholder":"Select…","versionHint":"Enter exactly {{digits}} digits.","versionError":"Version must be exactly {{digits}} digits.","previewOnlyNote":"Codes are minted on the record’s own create screen using this rule — this panel previews the next code only.","errorNoPermission":"You do not have permission to create entities.","errorConflict":"Code already in use or format not configured.","errorGeneric":"Failed to create entity. Please try again.","supplier":{"name":"Supplier name","industry":"Industry","abbrev":"Abbreviation (2 chars)"},"employee":{"firstName":"First name","lastName":"Last name","group":"Employee group"},"product":{"name":"Product name","customer":"Customer","type":"Product type","variant":"Variant","version":"Version","uom":"Unit of measure"},"customer":{"name":"Customer name","abbrev":"Abbreviation"}},"previewCode":"Generated code","slotLabels":{"ind":"Industry","cust":"Customer","ptype":"Product type","vchar":"Variant","vver":"Version","group":"Group","type":"Machine type"},"machine":{"generator":"Preview","resolveSlots":"Pick a machine type","type":"Machine type","nextCode":"Next code","previewNote":"Machines get their code on Manufacturing › Machines (or on import); this preview reserves nothing.","manageTypes":"Manage machine types","noTypes":"No machine types yet — add them in Manufacturing › Machines › Machine types.","loadError":"The machine types couldn't be loaded."}},"forms":{"title":"Material Forms","description":"Configure the custom fields shown when creating materials in each category.","addField":"Add field","sharedWith":"This form is shared with: {{names}}. Changes here apply to them too.","required":"Required","showInList":"Show in list","feedsPricing":"Feeds pricing","fieldLabel":"Field label","fieldUnit":"Unit","dropdownOptions":"Dropdown options","gradeValues":"Grade values","thicknessValues":"Thickness values","addOption":"Add option","livePreview":"Live preview","addMaterialPrefix":"Add material — {{name}}","cancel":"Cancel","createMaterial":"Create material","customFields":"Custom fields","requiredCustom":"Please fill in all required custom fields.","save":"Save","saved":"Form saved","saveError":"Could not save the form","fieldCount_one":"{{count}} field","fieldCount_other":"{{count}} fields","editorHeading":"{{name}} fields","editorSubtitle":"Drag to reorder · these become the Add-material form.","pricingNote":"Pricing-linked fields feed pricing matrices & BOM costing.","addMaterialLabel":"Add material —","loading":"Loading material forms…","loadError":"Could not load the material forms. Check your connection and try again.","emptyCategories":"No material categories found. Create categories in Settings → Categories first.","fieldType":{"text":"Text","number":"Number","currency":"Currency","select":"Dropdown","dimension":"Dimension (L×W×H)","thickness":"Thickness","grade":"Grade","vendor":"Vendor & price"},"fieldTypeLabel":"Type","copyFrom":"Copy from","copyFromPlaceholder":"Copy fields from…","copyOverwriteTitle":"Replace current fields?","copyOverwriteBody":"This replaces the fields you're editing with {{name}}'s field set. Unsaved changes will be lost.","copyOverwriteConfirm":"Replace","copied":"Copied {{count}} fields from {{name}}","cloneToNew":"Clone to new category…","cloneTitle":"Clone form to new category","cloneSubtitle":"Creates a new category pre-filled with {{name}}'s fields.","cloneNameEn":"Name (English)","cloneNameVi":"Name (Vietnamese)","cloneCode":"Code","cloneParent":"Parent category","cloneParentNone":"None (top-level)","cloneConfirm":"Create & clone","cloneErrName":"Name is required","cloneErrCode":"Code is required","cloneCreated":"Created {{name}} with {{count}} fields","cloneError":"Could not clone form","fieldLabelVi":"Name (VI)","fieldLabelEn":"Name (EN)"},"formulas":{"title":"Formulas","breadcrumb":"Settings","description":"The paint-colour formula collection and the raw-wood price book. Product BOMs and orders pull from these.","tabPaints":"Paint Colours","tabWood":"Wood Pricing","tabConsumption":"Consumption","consumption":{"title":"Material consumption formulas","bom":{"title":"Consumption formulas","qtyByFormula":"Worked out by the material's consumption formula when the BOM is saved. Change the cut size or pieces in the Consumption formulas panel.","count":"{{count}} formula lines","note":"These lines take their quantity from the material's formula, worked out when the BOM is saved. Fix every red item before submitting.","dirtyNote":"You have unsaved changes: save the BOM to recompute the quantities and refresh the checks.","recalc":"Recalculate","recalcHint":"Work every formula line out again with the current Consumption settings.","recalcDirty":"Save your changes first, then recalculate.","checksError":"The consumption checks could not be loaded. Save the BOM again or reload the page.","blockTitle":"Must be fixed before this BOM can be submitted or approved","warnTitle":"Check these","infoTitle":"For information","openSettings":"Open Consumption settings","colPart":"Part","colInputs":"Formula inputs","colQty":"Quantity per product","fixed":"Fixed per order","fixedNote":"Set quantity per order, not multiplied by the product quantity.","fieldCutLength":"Cut length (mm)","fieldCutWidth":"Cut width (mm)","fieldPartWidth":"Part width (mm)","fieldPieces":"Pieces / product","fieldSegments":"Segments / product","fieldEdges":"Edges × part qty","fieldBars":"Bars / product","fieldCutSheets":"Cut sheets / product","fieldEdgeLength":"Edge length (mm)","fieldBoardThickness":"Board thickness (mm)","unitM":"m","unitSqft":"sqft","unitCutSheet":"cut sheets","unitSheet":"sheets","rolls":"= {{rolls}} rolls at {{perRoll}} m per roll · veneer width {{width}} mm","buyZero":"Customer supplied: buy 0","notComputed":"Not computed yet (typed {{qty}})","r06What":"{{line}}: no cut size entered","r06Why":"Material {{sku}} uses a consumption formula, so its quantity cannot be typed by hand.","r06Fix":"Enter {{fields}} on this line, then save.","r04What":"{{line}}: cut size still empty","r04Why":"The typed quantity is used for now because the transition setting allows it (awaiting VHT).","r04Fix":"Enter {{fields}} so the formula works the quantity out.","r07What":"{{line}}: the cut is wider than the roll","r07Why":"The cut width {{width}} mm is more than the {{roll}} mm roll of {{sku}}.","r07Fix":"Check the cut width, or pick a material code with a wider roll.","r08What":"{{line}}: material {{sku}} is missing a formula parameter","r08Why":"Its roll width, waste factor or quantity per order is empty on the material and on its type default.","r08Fix":"Set it on the material (Materials › Consumption formula) or in Consumption settings.","r08PvcWhat":"{{line}}: PVC roll width {{roll}} mm is not a known width","r08PvcWhy":"Known PVC widths are {{allowed}} mm, each with its own material code.","r08PvcFix":"Check the roll width on material {{sku}}.","r09What":"{{line}}: veneer width {{entered}} mm does not match the board","r09Why":"Veneer width should be {{expected}} mm (board thickness + allowance).","r09Fix":"Clear the cut width on this line; the system works the veneer width out from the board thickness.","r11What":"{{line}}: the formula gives a different figure from the old typed quantity","r11Why":"Typed {{typed}}, formula {{computed}}. The BOM's figure is now the standard.","r11Fix":"Check the cut size if the difference is unexpected.","r05What":"{{line}}: customer supplied","r05Why":"The requirement is worked out and printed for the customer, but nothing is bought.","r02What":"{{line}}: the formula cannot work out a quantity","r02Why":"A shared constant is missing or 0.","r02Fix":"Check the values in Consumption settings.","r02FoamWhat":"{{line}}: the foam piece is larger than the purchase sheet","r02FoamWhy":"The cut size does not fit on the sheet size set in Consumption settings.","r02FoamFix":"Check the cut size on this line or the foam sheet size in Consumption settings."},"matTitle":"Consumption formula","matEdit":"Edit","matCancel":"Cancel","matSaved":"Consumption settings for this material saved. BOMs use them the next time they are saved or recalculated.","matSaveError":"The consumption settings for this material were not saved. Check the values and try again.","matLoadError":"The consumption settings for this material could not be loaded. Close and reopen the drawer to try again.","matType":"Material type","matNoType":"No formula (BOM quantity is typed)","matNone":"Not set","matFromMaterial":"(this material)","matFromType":"(type default)","matYes":"Yes","matNo":"No","matFixedPerOrder":"Fixed per order","matFixedQty":"Quantity per order","matDefaultPlaceholder":"Type default","matHelp":"The type picks the formula a BOM uses for this material. Leave roll width and waste empty to use the type default from Settings › Formulas › Consumption.","matSuppliedHelp":"The customer sends this material: the requirement is still worked out and printed, but nothing is bought.","matFixedHelp":"A set quantity per order (e.g. industrial petrol 10 kg), never multiplied by the product quantity.","desc":"How the BOM works out each material's quantity per product from its type (VHT spec BOM → Dự trù v2). Every material of one type uses one formula; the roll width and waste factor below are the type defaults, and a material record can override them. A saved BOM keeps its figures until it is saved again or recalculated.","readOnly":"View only: changing these needs the Formulas edit permission. Ask an administrator.","loadError":"The consumption settings could not be loaded. Check your connection and try again.","retry":"Try again","saved":"Consumption settings saved. BOMs pick them up when they are saved or recalculated.","saveError":"The consumption settings were not saved. Check the values and try again.","constantsRequired":"Every shared constant needs a value. Fill in the empty box, then save.","save":"Save","saveNote":"Changes apply to a BOM the next time it is saved or recalculated; confirmed PIs keep their figures.","mm":"mm","cSqft":"Square feet per m²","cSqftUnit":"sqft / m²","cMetresPerRoll":"Veneer roll","cMetresPerRollUnit":"m per roll","cVeneerPlus":"Veneer width = board +","cEdgeStripPlus":"Edge strip bar = part width +","cFixedPerOrder":"Fixed per order (petrol)","cFixedPerOrderUnit":"kg per order","typesTitle":"Defaults by material type","typesDesc":"Roll width and waste factor each type starts with. Leave a box empty only if the type does not use it — a formula that needs it will stop the BOM (rule R08).","colType":"Material type","colFormula":"Formula","colUnit":"Unit","colRollWidth":"Roll width (mm)","colWaste":"Waste factor","colCustomerSupplied":"Customer supplied","notUsed":"—","typePVC":"PVC","typePU":"PU leatherette","typeVAI_BOC":"Upholstery fabric","typeVAI_LOT":"Lining fabric (polyester / velvet)","typeVAI_KD":"Non-woven fabric","typeLUOI":"Plastic mesh","typeDA_BO":"Cowhide leather","typeDAY_BUN":"Cord / elastic / strap / tape / PE","typeVENEER":"Edge veneer","typePHONG_BIEN":"Edge strip (phong biên)","typeMUT":"Foam","typePVC_KC":"PVC, customer supplied","formulaRoll":"Length ÷ pieces across the roll × pieces × waste","formulaLeather":"Width × length in sqft × pieces × waste","formulaCord":"Length × segments × waste","formulaVeneer":"Edge length × edges × waste; rolls = metres ÷ m per roll","formulaEdgeStrip":"(Part width + bar allowance) × bars × waste","formulaFoam":"Cut sheets per product","unitM":"metre","unitSqft":"sqft","unitCutSheet":"cut sheet","awaitingVht":"Awaiting VHT confirmation","specQuestion":"Spec open question #{{n}}","openTitle":"Open points awaiting VHT","openDesc":"VHT has not answered these yet. Each is set to the spec's current assumption; change it here once VHT confirms.","op3Label":"Allow hand-typed quantities during the transition (T11)","op3Help":"Off (spec assumption): Technical enters the real cut size in the BOM, and a line on a formula material without one cannot be submitted (rule R06). On: the typed quantity is used for now and the line shows a warning (rule R04).","op4Label":"Other PVC roll widths (mm)","op4Help":"PVC also comes in these widths, each as its own material code. A PVC code with any other width is flagged. Separate widths with commas.","op6Label":"How foam is bought","op6CutSheets":"Count cut sheets only","op6FullSheet":"Convert to full purchase sheets","op6SheetLength":"Sheet length (mm)","op6SheetWidth":"Sheet width (mm)","op6Help":"Spec assumption: the requirement counts cut sheets per product. With full sheets, the cut pieces are fitted into the sheet size to give purchase sheets.","op7Label":"Turn a cut that is wider than the roll","op7Help":"Off (spec assumption): a cut wider than the roll stops the BOM (rule R07). On: the cut length is laid across the roll instead, if it fits."},"paintTitle":"Paint Formulas","paintBreadcrumb":"Products","paintDescription":"The paint-colour formula collection. Product BOMs and orders pull from these.","woodComingSoon":"Coming soon","listTitle":"Paint colours","colCode":"Code","colName":"Name","colClient":"Main client","colSystem":"System","colGroups":"Groups","colCostM2":"₫/m²","unassigned":"Unassigned","addColour":"Add colour","edit":"Edit","delete":"Delete","editTitle":"Edit {{code}}","view":"View","viewTitle":"View {{code}}","editNotFound":"Formula {{code}} was not found. Pick it from the list.","newTitle":"New paint colour","backToList":"Back to list","fieldCode":"Colour code","fieldName":"Display name","fieldClient":"Main client (reference)","clientHint":"Reference only — any customer’s products can use this colour.","fieldSubstrate":"Wood / substrate","fieldRefSurface":"Reference surface m²","fieldColour":"Swatch colour","clearColour":"Clear","invalidColour":"Colour must be a hex value like #8a5a3b.","mixingFormula":"Mixing formula","mixingHint":"grouped by process step · ratio by weight","addStep":"Add process step","processStep":"Process step","stepPlaceholder":"e.g. WIPING","gramPerM2":"Gram hh/m²","klHhLabel":"Total mix factor","products":{"title":"Products using this process","howBom":"From the BOM: pick this process for a part in the BOM's Painting tab and the product shows up here (Linked from BOM).","howHere":"From here: find a product, tick the parts painted with this process and save — the BOM updates (Added on this formula). Enter each step's rate (g/m²) on the product's row; open ▸ product to see each paint.","addPlaceholder":"Search products by SKU or name…","addTitle":"Add {{sku}} · {{name}}","editTitle":"Edit parts — {{sku}} · {{name}}","panelHint":"Parts come from the BOM. Tick the parts painted with {{code}}.","panelEmpty":"This product has no painted parts (wood or panel lines) in its BOM yet.","partsError":"Couldn't load this product's parts.","finishNote":"A finish of {{sku}}: its parts are the family BOM's; the process is saved on this finish's own parts.","bomLocked":"The BOM is approved — open a new version on the BOM page to change it.","colPart":"Part","colMaterial":"Material","colSize":"Thickness × Width × Length","colQty":"Pieces / 1 product","colPartArea":"Area (m² / 1 product)","colCurrent":"Process assigned now","unassigned":"not assigned","movesTo":"{{from}} → moves to {{to}}","saveParts":"Save — update BOM","partsTotal":{"label":"Total (ticked parts)"},"ownRate":{"title":"Own rate per part","hint":"Optional. Leave a box empty to use the product rate for that step. Saved with “Save — update BOM”.","colUnit":"Unit","unitM2":"g/m²","unitPiece":"g/piece","unitAria":"Unit of the own rate for {{part}}","rateAria":"{{part}}: own rate for {{step}} ({{unit}})","tag":"own rate","saveError":"Couldn't save the own rates. Each rate must be between 0 and 100,000, and the BOM must still be open for changes — fix the rate or open a new BOM version, then try again."},"cancel":"Cancel","loadError":"Couldn't load the products using this process.","retry":"Retry","colSku":"SKU","colProduct":"Product","colSource":"Source","colParts":"Parts · area (m² / 1 product)","colArea":"Total area (m² / 1 product)","colRate":"product rate (g/m²) → g mixture / 1 product","colTotal":"Total g / 1 product","empty":"No products yet.","detailHint":"Click to see each paint","surfaceTyped":"Uses the typed surface (imported) until its parts are saved here.","surfaceShare":"Uses a share of the BOM surface (no parts assigned).","surfaceDesign":"Uses the BOM surface (no parts assigned).","linkBom":"Linked from BOM","linkAdded":"Added on this formula","noParts":"No parts yet","rateLabel":"{{step}} rate for {{sku}} (g/m²)","enter":"enter","noRate":"no rate","grams":"{{g}} g","editParts":"Edit parts","remove":"Remove","removeTitle":"Remove {{sku}} from this process?","removeBody":"Clears {{code}} on every part of the product and drops its {{code}} recipe with its rates. If {{code}} is the product's main finish, the recipe stays (change it on the BOM page).","removeConfirm":"Remove product","removed":"Removed from this process","removedKeptMain":"Parts cleared. {{code}} stays the product's main finish — change it on the BOM page.","saved":"BOM updated","saveError":"Couldn't update the BOM","rateError":"Couldn't save the rate","pendingSave":"Saved with the formula.","footnote":"Areas come from the part sizes in the BOM, never typed. Grams / 1 product include any per-part rate.","detailTitle":"{{name}} — each paint for 1 product","dStep":"Step","dRate":"Product rate (g/m²)","dMix":"g mixture / 1 product","dPaint":"Paint","dRatio":"Ratio","dMixFactor":"Total mix factor","dGrams":"g / 1 product","byMaterial":"By paint material (1 product):","loadMore":"Load more ({{shown}} of {{total}})","lockedPrimary":"Follows the product's main finish — change it on the BOM page.","lockedInherited":"Inherited from the family BOM — change it on the family's BOM page.","addLabel":"Add product","viewParts_one":"View {{count}} part","viewParts_other":"View {{count}} parts","hideParts_one":"Hide {{count}} part","hideParts_other":"Hide {{count}} parts","savedPartial_one":"BOM updated, but {{count}} part stays on this process: it follows the product's main finish or the family BOM. Change it on the BOM page.","savedPartial_other":"BOM updated, but {{count}} parts stay on this process: they follow the product's main finish or the family BOM. Change them on the BOM page.","colActions":"Actions","colSelect":"Select","dRatioFactor":"Ratio ÷ 100","notLinked":{"title":"Not linked yet","hint":"These products name {{code}} in their BOM paint text but are not linked to it.","locked":"Will link when the BOM is revised — the BOM is approved, so it was not changed. Open a new version on the BOM page to link it now.","ambiguous":"Not linked — the paint text matches more than one formula ({{codes}}). Write the exact code on the BOM part.","parts_one":"{{count}} part","parts_other":"{{count}} parts","bomText":"BOM paint text"}},"totalKghhLabel":"Total kg/batch","component":"Component","addComponent":"Component","newMaterial":"New material…","selectMaterial":"— select —","customName":"Custom name…","colRatio":"Ratio","colSlKg":"Quantity (kg)","colPriceKg":"₫/kg","colTotal":"Total","noSteps":"No process steps yet","costPerM2":"Cost / m²","totalAtRef":"Total @ ref","atRefSurface":"At {{surf}} m² reference surface","cancel":"Cancel","save":"Save colour","saved":"Colour saved","saveError":"Could not save the colour","removed":"Colour removed","deleteTitle":"Delete formula {{code}}?","deleteUsed":"Used by {{count}} products. They re-link if this code is created again.","deleteUsedOne":"Used by 1 product. It re-links if this code is created again.","deleteUnused":"No product uses this formula.","deleteConfirm":"Delete formula","keepOne":"Keep at least one","enterCode":"Enter a colour code","enterName":"Enter a name","codeExists":"Code already exists","woodTitle":"Raw wood price book","woodDesc":"Price per m³ by thickness (QC) and species/grade. Each species keeps its native currency; BOMs read this grid by material + rough thickness.","woodFx":"FX rate ₫/USD","woodRoughFactor":"Rough factor","woodRoughHint":"×{{factor}} converts finished volume to rough","woodThickness":"Thickness","woodMm":"mm","woodAddThickness":"Add thickness","woodAddSpecies":"Add species","woodNewSpecies":"New species","woodRemoveSpecies":"Remove species","woodRemoveThickness":"Remove thickness","woodRename":"Rename","woodToggleCurrency":"Toggle native currency","woodHistory":"Price history","woodAddNote":"Add note","woodHistoryDate":"Date","woodHistoryWho":"Who","woodHistoryNote":"Note","woodInSync":"Matches entered source prices","woodDriftChip":"{{count}} source price updates","woodDriftChipOne":"{{count}} source price update","woodReview":"Review","woodHide":"Hide","woodDriftTitle":"Pricing updates from the source of truth","woodDriftSubtitle":"Latest vendor quotes / receipts differ from the matrix — apply to revise, or keep the current price.","woodColSpeciesQc":"Species · QC","woodColMatrix":"Matrix","woodColSource":"Source","woodColFrom":"From","woodApply":"Apply","woodKeep":"Keep","woodApplyAll":"Apply all {{count}}","woodClose":"Close","woodSave":"Save price book","woodSaved":"Price book saved","woodSaveError":"Could not save the price book","woodSpeciesAdded":"Species added","woodPriceRevised":"Price revised from source","woodPriceKept":"Kept matrix price","woodAllApplied":"All updates applied","woodKeepOneThickness":"Keep at least one thickness","woodKeepOneSpecies":"Keep at least one species","woodEmpty":"No species yet — add one to start the price book.","woodAddSpeciesGrade":"Species / grade","woodAddThicknessQc":"Thickness (QC)","woodFillThickness":"Fill thicknesses from materials","woodFillThicknessHint":"Adds, as new rows, the thicknesses of the materials each linked column prices. Existing rows and prices are kept.","woodThicknessAdded_one":"Added {{count}} thickness from {{type}}","woodThicknessAdded_other":"Added {{count}} thicknesses from {{type}}","woodThicknessUpToDate":"Thicknesses already up to date for {{type}}","woodThicknessNone":"No thicknesses found on {{type}} materials — add rows by hand","woodThicknessNoLink":"No column is linked to a wood type yet. Pick a wood type on a column first — its thickness rows come from that type's materials.","woodThicknessBlocked":"You need the Formulas edit permission to change thickness rows. Ask an administrator for access.","woodThicknessFailed":"Couldn't read the material thicknesses. Check your connection and try again.","woodThicknessAllTypes":"the linked wood types","woodQcThickness":"QC · thickness","woodAddFromMaster":"Add from Wood Species master","woodPickHint":"Pick a material — its price seeds the column, then adjust per thickness.","woodBlankColumn":"Blank custom column","woodPickSearch":"Search code, name or grade…","woodPickNone":"No materials match.","woodPickGrade":"Grade","woodPickNoGrade":"Ungraded","woodLogChange":"Log change","woodColBy":"By","woodColChangeNote":"Change note","woodColDate":"Date","woodFxPerUsd":"/ USD","woodFinishedToRough":"finished→rough","woodSourceTitle":"Source-of-truth prices","woodSourceHint":"Latest vendor quote / receipt price per species + thickness. Manual entry until the purchasing feed lands; the matrix diffs against these.","woodSourceAdd":"Add source price","woodSourceEmpty":"No source prices yet — add one to drive a matrix comparison.","woodColVendor":"Vendor","woodColDoc":"Document","woodSourcePrice":"Source price","woodSourceDel":"Remove source price","woodGradeLower":"▼ grade","woodGradeStd":"grade","woodGradeLowerHint":"Toggle lower grade (2C / B0) — tints the column","woodKindBoard":"board","woodKindLumber":"lumber","woodBoardHint":"Sheet goods (plywood, MDF): rough m³ = finished × factor like lumber, then nested into whole sheets for purchasing","woodBoardThickness":"Board T","woodOversizeW":"Over W","woodOversizeL":"Over L","woodRoughDimsHint":"Rough-stock geometry: board thickness and per-axis oversize. Picking this species auto-fills a wood BOM line's raw dimensions.","clientPlaceholder":"Search customers…","unlinked":"Unlinked","unlinkedHint":"Not linked to a material-master record — pick a material from the list to link it","woodLinkedTitle":"Linked to the material master — BOM lines resolve this species by product, not by name","woodLinkedChip":"linked","fieldSheen":"Sheen","sheenPlaceholder":"e.g. Satin 30%","fieldAppliesTo":"Applies to","appliesToNone":"Not set","appliesTo":{"all_surfaces":"All surfaces","large_surfaces":"Large surfaces","fittings":"Fittings"},"fieldUsedOn":"Used on (products)","usedOnPlaceholder":"Search finished products…","usedOnRemove":"Remove {{name}}","fieldNote":"Shop note","notePlaceholder":"The instruction that travels with this finish","colSku":"SKU","table":{"chemical":"Chemical","kgPerUnit":"Kg / unit","costPerUnit":"₫ / unit","coatWeight":"{{value}} g/m²","gramsPerUnit":"{{value}} g / unit","total":"Total","ratioFactor":"Ratio ÷ 100","gPerProduct":"g / 1 product"},"imp":{"importBtn":"Import","title":"Import paint colours","sub":"Load colours and their mixing formulas from an Excel workbook, one row per component.","downloadTemplate":"Download template","downloadSample":"Download sample","exportLibrary":"Export current library","downloadFailed":"Could not download the file","file":"Workbook (.xlsx)","chooseFile":"Choose file","noFileChosen":"No file chosen","hintRows":"One row per component. Code, name, customer, colour, substrate, system, sheen, reference surface, applies to and note describe the colour: repeat them on each row, or leave them blank below the first.","hintMatch":"Codes match the library ignoring case, spaces and hyphens; the library's spelling is kept. A new code that products already use in another spelling takes their spelling, so they link at once.","hintExport":"To update in bulk: export the current library, edit it, then import it again.","previewBtn":"Preview","previewFailed":"Could not read the workbook","count":{"formulas":"Colours","new":"New","changed":"Changed","unchanged":"Unchanged","invalid":"Errors","incomplete":"Incomplete"},"status":{"new":"New","changed":"Changed","unchanged":"Unchanged","invalid":"Error","incomplete":"Incomplete"},"col":{"code":"Code","name":"Name","status":"Status","products":"Products","details":"Details"},"matchLibrary":"File: {{file}}. The library's spelling is kept.","matchProducts":"File: {{file}}. Saved as products already write it.","changedFields":"Changed: {{fields}}","field":{"name":"name","customer":"customer","colour":"colour","substrate":"substrate","system":"system","sheen":"sheen","refSurface":"reference surface","steps":"steps","stepRate":"coat weight (g/m²)","components":"components","ratios":"ratios","prices":"prices","appliesTo":"applies to","note":"note"},"productsNote":"Products: for a new colour, the products whose paint already names its code (they link when it is imported); otherwise, the products using the colour.","showUnchanged_one":"Show {{count}} unchanged colour","showUnchanged_other":"Show {{count}} unchanged colours","emptyFile":"The workbook has no colour rows.","truncated":"Only the first 1,000 colours are listed. Import still handles every colour in the file.","affectedTitle_one":"Updating changes the computed paint of {{count}} product","affectedTitle_other":"Updating changes the computed paint of {{count}} products","affectedBody":"Changed colours are already used by products. With “Add and update”, their paint consumption and cost follow the new formula. Approved BOMs keep their frozen numbers.","mode":"Colours already in the library","modeSkip":"Add new only","modeSkipHint":"Changed colours stay as they are in the library.","modeUpdate":"Add and update","modeUpdateHint":"Changed colours are overwritten with the file's formula. Blank Note / Applies to cells keep the library's value; used-on links stay as they are.","downloadErrors_one":"Download the colour with errors","downloadErrors_other":"Download the {{count}} colours with errors","downloadErrorsHint":"Colours with errors are skipped. Fix their rows (see the Error column) and import again.","commitBtn":"Import","commitFailed":"Import failed","confirmTitle_one":"Update {{count}} colour?","confirmTitle_other":"Update {{count}} colours?","confirmBody_one":"The computed paint of {{count}} product will change. Approved BOMs keep their frozen numbers.","confirmBody_other":"The computed paint of {{count}} products will change. Approved BOMs keep their frozen numbers.","confirmUpdate":"Update","resultHead":"Result","resultLine":"Created {{created}} · updated {{updated}} · unchanged {{unchanged}} · changed but kept {{skipped}} · errors {{invalid}}","toastDone":"Imported: {{created}} new, {{updated}} updated","done":"Done","customerLinked":"Linked to customer {{name}}","hintIncomplete":"Blank Step g/m² or Ratio cells do not block a colour: it imports as Incomplete and can be completed later in the formula editor.","incompleteNote":"Imports as Incomplete. Complete it later in the editor:","products":{"title":"Products using these colours","hintSheet":"A “Products” sheet fills part 2 of a colour: which products use it, their rate per step, the parts ticked and each part’s own rate. Products need a BOM. The BOM’s own Painting tab keeps working as before.","sheetNote":"One line per colour on one product. “Add and update” treats the listed parts as the full set for that colour; rates and own rates that are not listed stay as they are.","count":{"products":"Product lines","new":"New","changed":"Changed","unchanged":"Unchanged","blocked":"Skipped","invalid":"Errors"},"col":{"code":"Colour","sku":"Product","status":"Status","details":"Details"},"status":{"new":"New","changed":"Changed","unchanged":"Unchanged","invalid":"Error","blocked":"Skipped"},"change":{"rates":"product rates","parts_ticked":"parts ticked","parts_unticked":"parts unticked","own_rates":"own part rates"},"changedFields":"Changed: {{fields}}","ticks":"Ticks: {{parts}}","unticks":"Unticks: {{parts}}","skippedReason":"Not imported: {{reason}}","showUnchanged_one":"Show {{count}} unchanged product line","showUnchanged_other":"Show {{count}} unchanged product lines","truncated":"Only the first 1,000 product lines are listed. Import still handles every line in the file.","modeHint":"For products: “Add and update” also changes products already on a colour. Products whose BOM is approved are skipped either way — open a revision first.","downloadErrors_one":"Download the {{count}} line with errors","downloadErrors_other":"Download the {{count}} lines with errors","downloadErrorsHint":"Lines with errors are skipped. Fix their rows (see the Error column) and import again.","resultHead":"Products","resultLine":"Created {{created}} · updated {{updated}} · unchanged {{unchanged}} · changed but kept {{skipped}} · skipped {{blocked}} · errors {{invalid}}"}},"colStatus":"Status","incomplete":"Incomplete","complete":"Complete","incompleteHint":"g/m² or ratio missing. Complete it in the editor.","missingPlaceholder":"Missing","incompleteBanner":{"title":"This formula is incomplete","body":"Blank values count as 0 kg in costing and paint demand until they are filled in.","saveHint":"You can save it as it is and complete it later.","gram":"{{step}}: g/m² missing","ratio":"{{step}} · {{component}}: ratio missing"},"woodKerf":"Saw kerf","woodKerfHint":"between board parts when nesting a sheet","woodBuy":"Buy ×","woodBuyHint":"Buying allowance: purchasing buys rough m³ × this. Blank = the species default (cao su / beech / thông ×1.23; oak / walnut / ash / acacia ×1.3; boards ×1.0). A PI can override it.","woodBuyAria":"Buying allowance for {{species}}","woodBuyOwn":"set here","woodBuySource":{"species":"set here","board":"board default","keyword":"species default","none":"no default (×1)"},"woodTypeLink":{"type":"Wood type","grade":"Grade","none":"Not linked","allGrades":"All grades","hint":"This column prices every material of this type (and grade, if set) in BOMs and pricing worksheets. A grade column wins over an all-grades column. Pick a family (all thicknesses) to price every thickness of a species; a column linked to the exact type wins over a family column.","familyOption":"{{name}} — all thicknesses ({{code}}·)","familyChip":"{{code}} · all thicknesses","familyGroup":"Families — all thicknesses","typeAria":"Wood type for {{species}}","gradeAria":"Grade for {{species}}"},"worksheetMaterials":{"title":"Default worksheet materials","desc":"Added with this quantity per product to every new pricing worksheet (Table 2 · Consumables), priced from the material. Each worksheet can still change or remove them. Existing worksheets are not changed.","colMaterial":"Material","colQty":"Qty per product","colUnit":"Unit","empty":"No default materials yet.","missing":"deleted","qtyAria":"Quantity of {{material}}","remove":"Remove","add":"Add material","addPlaceholder":"Search consumables…","note":"Applies to worksheets created after saving.","save":"Save","saved":"Default materials saved","saveError":"Could not save the default materials","loadError":"Could not load the default materials.","retry":"Retry","duplicate":"This material is already in the list.","qtyRequired":"Every material needs a quantity above 0."}},"inventoryAlerts":{"breadcrumb":"Settings · Inventory Alerts","title":"Inventory Alerts","intro":"Every alert shown on the Stock Summary dashboard and across the warehouse ledgers is driven by the thresholds set here. Category defaults apply org-wide; a warehouse can still set a per-item override in its ledger. Saving applies immediately everywhere the policy is read.","ceilings":{"title":"Budget ceiling per warehouse","subtitle":"· value threshold","hint":"When a warehouse's stock value exceeds its ceiling, the dashboard and alerts flag it.","noWarehouses":"No warehouses yet.","inputLabel":"Ceiling for {{warehouse}}","millions":"tr","millionsTitle":"triệu (million)","approxTy":"≈ {{value}} tỷ"},"sensitivity":{"title":"Alert sensitivity","warnBand":"Warn band","warnBandHint":"Show an amber “approaching” warning once a warehouse reaches this % of its ceiling.","dataQuality":"Data-quality flags","flagMissingPrice":"Flag missing price","flagMissingPriceHint":"Items with no unit cost can't be valued","flagDepleted":"Flag depleted stock","flagDepletedHint":"Nothing left on hand, or everything on hand is reserved"},"notifications":{"title":"Notifications","recipients":"Recipients","noRecipients":"No recipients yet — add staff or a role below","addPlaceholder":"Add a staff member or role…","add":"Add","addRole":"+ {{role}}","removeRecipient":"Remove {{name}}","channel":"Channel","frequency":"Frequency","zaloHint":"Zalo is not connected yet — alerts fall back to in-app only.","deliveryNote":"Delivery preferences are saved with the policy. Digest delivery is coming soon; alerts are always visible on the Stock Summary dashboard."},"channelLabels":{"email":"Email","zalo":"Zalo","inapp":"In-app only"},"freqLabels":{"immediate":"Immediate","daily":"Daily digest","weekly":"Weekly digest"},"roles":{"warehouseManager":"Warehouse manager","purchasingLead":"Purchasing lead","accounting":"Accounting","productionPlanner":"Production planner"},"dataSync":{"title":"Data & sync","itemsWithStock":"Items with stock","totalValue":"Total stock value","warehouses":"Warehouses","source":"Source","sourceValue":"Goods receipt & issue module","asOf":"As of","lastEditedBy":"Policy last edited by"},"footer":{"unsaved":"● Unsaved changes","lastEdited":"Last edited by {{name}} · {{date}}","reset":"Reset to defaults","save":"Save & apply","saving":"Saving…"},"toast":{"saved":"Alert policy saved — applied across Stock Summary & ledgers","saveError":"Could not save the alert policy"}},"materialOptions":{"valuesHint":"Vietnamese values are stored on materials verbatim — the EN label is display-only.","empty":"No values in this list yet.","colValueVi":"Value (VI)","colLabelEn":"EN label","colActive":"Active","remove":"Remove","add":"Add","labelPlaceholder":"EN label (optional)","newValuePlaceholder":"New Vietnamese value…","toastSaved":"Saved","toastAdded":"Value added","toastRemoved":"Value removed","groups":{"shared":"Shared","wood":"Wood & board","hardware":"Hardware","packaging":"Packaging","paint":"Paint & finishing","abrasives":"Abrasives","glue":"Glue & chemicals","fabric":"Fabric & foam","unclaimed":"Unclaimed"},"lists":{"UNIT":"Units of measure","GO_NHOM":"Wood group","GO_LOAI":"Species / type","GO_XX":"Origin","GO_XULY":"Treatment","GO_CL":"Quality grade","GO_PT":"Emission class","GO_CN":"Certification","HW_NHOM":"Hardware group","HW_VL":"Hardware material","HW_MAU":"Colour / finish","BAO_LOAI":"Packaging type","BAO_CL":"Packaging material","BAO_LOP":"Plies","SON_CD":"Process stage","SON_HE":"Paint system","NHAM_LOAI":"Abrasive type","NHAM_VL":"Backing material","NHAM_HAT":"Grit (P)","KEO_LOAI":"Glue type","KEO_GOC":"Chemical base","VAI_LOAI":"Fabric & foam type"},"colIndex":"Row number","colSubCode":"Sub-code","colInUse":"In use","toastRenamed":"Renamed on {{n}} materials — stored values were rewritten.","toastSubConfirmed":"Sub-code confirmed","toastMerged":"Moved {{n}} materials to \"{{target}}\".","unitSync":{"button":"Sync units","buttonTitle":"Match this list with the units of measure used by materials, stock and purchasing","confirmTitle":"Sync this list with units of measure?","confirmMessage":"Every value here gets a matching unit of measure (created if missing), and every unit of measure missing from the list is added to it. Ambiguous matches are reported, never guessed. Safe to run again.","confirmLabel":"Sync units","toastDone":"Units synced — {{created}} created, {{updated}} updated, {{added}} values added, {{matched}} matched.","toastConflicts":"{{n}} value(s) match more than one unit and were skipped: {{values}}"},"removeGuard":"Used by {{n}} materials — deactivate instead","addFooterNote":"New values appear in every screen that reads {{key}}.","rail":{"newList":"＋ New list","searchPlaceholder":"Search lists…","customBadge":"CUSTOM","activeCountTitle":"{{n}} active values","unclaimedHint":"Needs a name & owner","noMatches":"No lists match your search."},"header":{"activeOf":"Active {{active}}/{{total}}","editList":"Edit list","claimList":"Name & assign","usedByLine":"Used by {{used}}","activeLabel":"Active","noPairInferred":"No pair · inferred"},"info":{"unclaimed":"This list arrived from an import and has no owner yet. Claim it to name it and put it into service — stored material values are never rewritten.","subCode":"This list drives the material code. Each value needs an MH-QĐ-02 sub-code — a value with none generates codes under the fallback {{fallback}}, which silently buries it in “Khác”.","default":"Vietnamese values are stored on materials verbatim — the EN label is display-only. Deactivating hides a value from new entries without touching existing records.","ordered":"The order of this list is meaningful — it is the sequence downstream screens follow. Drag a row to reposition it."},"errors":{"blankValue":"Value cannot be blank.","duplicateValue":"\"{{value}}\" already exists in this list.","subCodeFormat":"Sub-code must be two letters, a dot, then three characters (e.g. GO.KHA)."},"subCode":{"inferredChip":"inferred","confirmTitle":"Click to confirm this sub-code","pairTitle":"Pair used by the code generator","noPairTitle":"No pair — the code generator falls back to {{fallback}}"},"merge":{"action":"Merge…","selectTarget":"Merge into…","confirm":"Merge","cancel":"Cancel","into":"into","note":"{{n}} materials → “{{target}}”","actionTitle":"In use by {{n}} materials — fold it into another value"},"drawer":{"titleNew":"New option list","titleClaim":"Claim imported list","titleEdit":"Edit list","close":"Close","claimBanner":"Imported list {{key}} — the key and its values are read-only. Give it a name and owner to put it into service.","nameLabel":"List name","namePlaceholder":"e.g. Veneer sheet type","groupLabel":"Owned by group","keyLabel":"Key","autoChip":"Auto","usedByLabel":"Used by","usedByPlaceholder":"e.g. Material master — Wood tab","noteLabel":"Note","starterValuesPlaceholder":"One Vietnamese value per line — EN label after a comma\nXuôi thớ, Straight grain\nNgược thớ, Cross grain","cancel":"Cancel","createList":"Create list","putIntoService":"Put into service","saveChanges":"Save changes","nameRequired":"Enter a list name.","toastCreated":"List \"{{name}}\" created","toastClaimed":"\"{{name}}\" put into service","toastUpdated":"List \"{{name}}\" saved","subNew":"A dropdown the material screens can read from.","subClaim":"Put {{key}} into service.","subEdit":"Renaming is safe — screens reference the key, not the name.","notePlaceholder":"Anything the build needs to know…","starterValuesTitle":"Starter values","valuesTitle":"Values","starterValuesHint":"Vietnamese is the stored value; the EN label is display-only. You can add more values in the table afterwards."},"pageBreadcrumb":"Settings · Material Options","pageTitle":"Material options","pageDescription":"Every dropdown the material master, vendor materials and BOM pickers read from — sub-groups, specs and units, sourced from the NVL MASTER workbook's DANH MỤC lists. Vietnamese is the stored value; the EN label is display-only.","toastReordered":"Order updated","toastAddedSub":"“{{value}}” added — set its sub-code or it generates under {{fallback}}.","reorderHandleLabel":"Move “{{value}}” — drag, or press Arrow Up/Down","removeConfirm":{"prompt":"Remove “{{value}}”?","confirm":"Yes, remove"}},"currencies":{"names":{"VND":"Vietnamese Dong","USD":"US Dollar","EUR":"Euro","CNY":"Chinese Yuan","JPY":"Japanese Yen"},"breadcrumb":"Settings","kicker":"Currencies","title":"Currencies","intro":"The VND rate of each currency. Confirming a PI freezes the rate of its currency on the PI, so its invoices and e-invoices keep that rate even when it changes here later. Your company's secondary currency uses the Reference FX rate in Admin › Company Settings › Localization instead.","colCurrency":"Currency","colRate":"VND per 1 unit","colUpdated":"Rate updated","colPis":"Used when a PI is confirmed","rateAria":"VND rate for 1 {{code}}","baseRate":"1 (base currency)","pisVnd":"VND PIs need no rate.","pisTable":"A PI in {{code}} freezes this rate.","pisCompany":"A PI in {{code}} freezes the Company Settings rate ({{rate}} VND), not this one.","pisCompanyEmpty":"A PI in {{code}} freezes the Company Settings rate, which is empty — enter it in Admin › Company Settings › Localization before confirming {{code}} PIs.","invalid":"Enter a rate above 1, up to 6 decimals.","loading":"Loading currencies…","empty":"No active currencies yet.","save":"Save rates","saving":"Saving…","discard":"Discard","unsaved":"{{count}} unsaved change(s)","saved":"{{count}} rate(s) saved","saveError":"The rates could not be saved. Try again.","loadError":"The currencies could not be loaded.","retry":"Retry","noAccess":"You cannot open the currency list. Ask an administrator for access.","readOnly":"Read only. Only Admin › Company Settings admins (Manage Company permission) can change these rates. To change a rate, ask one of them — before confirming a PI in that currency, since the PI keeps the rate it was confirmed with."},"production":{"breadcrumb":"Settings","kicker":"Production","title":"Production settings","intro":"Rules the production board applies when PI lines are sent to production.","allowanceLabel":"Over-production allowance","allowanceHint":"How far above a PI line's ordered quantity \"Send to production\" and \"Create batch & produce\" may go. 0 means never above the ordered quantity.","allowanceExample":"With {{pct}}%, a line ordered {{ordered}} can be sent up to {{cap}}.","allowanceExampleNone":"With 0%, a line ordered {{ordered}} can be sent up to {{ordered}} (no extra).","invalid":"Enter a number from 0 to 100, with at most two decimals.","loading":"Loading…","save":"Save","saving":"Saving…","discard":"Discard changes","unsaved":"You have unsaved changes","retry":"Retry","noAccess":"Changing production settings needs the permission to manage settings modules. Ask an administrator for access.","toast":{"saved":"Production settings saved","saveError":"Could not save production settings","loadError":"Could not load production settings"}}},"logistics":{"shipments":{"crumb":"Operate · Logistics","title":"Logistics &","titleAccent":"shipments","subtitle":"End-to-end shipment lifecycle — booking, carrier & B/L, ports & ETD/ETA, in-transit tracking, documents and proof of delivery. Shipments are created from FG Dispatches (one shipment can consolidate several dispatches / PIs) and inherit the customer's shipping profile.","newShipment":"New shipment","newTemplate":"New template","templatesHint":"Templates are managed here — open one to edit its field mapping","views":{"ships":"Shipments","docs":"Document templates"},"kpi":{"inTransit":"In transit","inTransitSub":"on the water","bookingReady":"Booking / ready","bookingReadySub":"awaiting departure","delivered":"Delivered","deliveredSub":"POD confirmed","delayed":"Delayed / exceptions","needsAttention":"needs attention","onSchedule":"all on schedule"},"filters":{"all":"All","open":"Open","transit":"In transit","delayed":"Delayed","delivered":"Delivered"},"searchPlaceholder":"Search shipment, customer, carrier, B/L, port…","clickToExpand":"click a row to expand","table":{"shipment":"Shipment","customerPi":"Customer / PI","closing":"Closing time","qty":"Container quantity","route":"Route","agent":"Agent","carrier":"Carrier","etdEta":"ETD / ETA","etd":"ETD","eta":"ETA","booking":"Booking","value":"Value","status":"Status","docs":"Documents","note":"Note"},"pending":"pending","etdLine":"ETD {{date}}","etaLine":"ETA {{date}}","docsCount":"{{done}}/{{total}}","stage":{"booking":"Booking","ready_to_ship":"Ready to ship","departed":"Departed","in_transit":"In transit","arrived":"Arrived","delivered":"Delivered"},"stageDelayed":"{{stage}} · delayed","docKind":{"packing":"Packing list","invoice":"Commercial invoice","bol":"Bill of lading","coo":"Certificate of origin","pod":"Proof of delivery"},"docName":{"packing":"Packing List","invoice":"Commercial Invoice","bol":"Bill of Lading","coo":"Certificate of Origin","pod":"Proof of Delivery"},"docDesc":{"packing":"Carton-level pack detail with quantities, cartons, volume (CBM) and net / gross weights.","invoice":"Priced invoice with HS codes, Incoterm, amounts and bank / remittance details.","bol":"Carrier B/L draft — shipper, consignee, notify party, vessel, container & seal, freight terms.","coo":"Form B/CO — origin declaration (Vietnam), HS codes, origin criterion and transport route.","pod":"Delivery receipt — consignee, delivery date, items received, condition and signature block."},"timeline":{"bk":"BK {{ref}}"},"detail":{"routeCarrier":"Route & carrier","from":"From","to":"To","carrier":"Carrier","incotermMode":"Incoterm · Mode","bl":"B/L","container":"Container","cargo_one":"Cargo · {{count}} dispatch","cargo_other":"Cargo · {{count}} dispatches","qtyCtn":"{{qty}} · {{cartons}} ctn","qtyCtnCbm":"{{qty}} · {{cartons}} ctn · {{cbm}} CBM","total":"Total","unitsCbm":"{{units}} units · {{cbm}} CBM","docs":"Docs","docsReady":"{{done}}/{{total}} ready","openShipment":"Open shipment →"},"footer_one":"{{count}} shipment","footer_other":"{{count}} shipments","emptyTitle":"No shipments match","drawer":{"fallbackTitle":"Shipment","lifecycle":"Lifecycle","routeDocs":"Route, carrier & documents","booking":"Booking","etd":"ETD","eta":"ETA","atd":"ATD","podDate":"POD date","activity":"Activity log","close":"Close","clearDelay":"Clear delay","advance":"Advance → {{stage}}","printDocs":"Print docs","advancedToast":"{{shp}} → {{stage}}","delayClearedToast":"{{shp}} delay cleared","actionFailed":"Action failed"},"newDrawer":{"title":"New shipment","sub":"Consolidate one or more FG dispatches into a shipment","info":"Pick the customer — their ready (picked) dispatches load below. Select those to consolidate; the route, carrier & incoterm come from the customer's shipping profile.","customer":"Customer *","selectPlaceholder":"— Select a customer —","readyDispatches":"Ready dispatches","empty":"Select a customer to load their ready dispatches.","lineSummary":"{{name}} {{sku}} · {{qty}} units","cancel":"Cancel","create":"Create shipment","selectCustomerToast":"Select a customer","selectDispatchToast":"Select at least one dispatch","createdToast":"{{shp}} created","createFailed":"Could not create shipment"},"docs":{"intro":"Standardised export document templates. Each is auto-filled from the shipment, customer and product records — no re-keying — then printed or saved as PDF to share with the shipper, carrier or customer.","format":"A4 · Portrait","active":"Active","draft":"Draft","fieldsSuffix":"ERP fields","generatedSuffix":"generated","open":"Open →","matrixTitle":"Document status by shipment","matrixSub":"Click any cell to generate & print that document, filled from ERP data.","cellGenerated":"Generated — click to reprint","cellGenerate":"Generate {{name}}","formatLandscape":"A4 · Landscape"},"tpl":{"activeTitle":"Active template","draftTitle":"Draft — not in use","setDraft":"Set draft","activate":"Activate","mapping":"ERP field mapping — {{count}} fields auto-filled","generateFor":"Generate for a shipment · {{done}} of {{total}} done","generated":"Generated","notYet":"Not yet","preview":"Preview →","previewPrint":"Preview & print","activatedToast":"{{name}} activated","draftToast":"{{name}} set to draft","toggleFailed":"Could not update template","rowSub":"{{pis}} · {{port}}"},"fieldLabels":{"exporter":"Exporter / shipper","consignee":"Consignee","shipment_bl":"Shipment & B/L no.","ports":"Ports (load → discharge)","marks_numbers":"Marks & numbers","line_items":"Line items","totals":"Totals — qty · cartons · CBM · kg","invoice_no_date":"Invoice no. & date","incoterm":"Incoterm","pi_reference":"PI reference","line_items_price":"Line items + unit price","hs_codes":"HS codes","total_currency":"Total & currency","bank_details":"Bank details","shipper":"Shipper","notify_party":"Notify party","carrier_vessel":"Carrier / vessel","container_seal":"Container & seal no.","goods_description":"Description of goods","packages_gross_cbm":"Packages · gross · CBM","freight_terms":"Freight terms","country_origin":"Country of origin","transport_route":"Transport & route","items_hs":"Item description + HS","origin_criterion":"Origin criterion","gross_weight":"Gross weight","invoice_reference":"Invoice reference","delivery_address":"Delivery address","delivered_date":"Delivered date","carrier":"Carrier","items_received":"Items received","condition_signature":"Condition & signature"},"sourceLabels":{"company_profile":"Company profile","customer_address":"Customer · address","shipment_record":"Shipment record","container_carton":"Container / carton","dispatch_lines":"FG dispatch lines","computed":"Computed","auto_from_shipment":"Auto from shipment","dispatch_pi":"Dispatch · PI","price_list":"BOM / price list","product_master":"Product master","incoterm":"Incoterm","fixed_vietnam":"Fixed · Vietnam","fixed_wo":"Fixed · WO","shipment_pod":"Shipment · POD","manual":"Manual on delivery"},"print":{"sub":"{{shp}} · {{customer}} · fields auto-filled from ERP","changeShipment":"Change shipment","printSave":"Print / Save PDF","previewingToast":"Previewing {{shp}} · {{customer}}","generateFailed":"Could not generate the document","loading":"Preparing document…","ref":"Ref {{ref}}","blMeta":"B/L {{bl}}","bookingMeta":"Booking {{ref}}","draft":"DRAFT","deliveredOn":"Delivered {{date}}","pendingDelivery":"Pending delivery","coMeta":"{{tax}} · Tel {{phone}} · {{email}}","consignee":"Consignee","attn":"Attn {{contact}} · {{phone}}","portLoading":"Port of loading","portDischarge":"Port of discharge","carrier":"Carrier","incoterm":"Incoterm","freight":"Freight","freightPrepaid":"Prepaid","freightCollect":"Collect","etd":"ETD","eta":"ETA","packages":"Packages","cartonsCount":"{{count}} cartons","measurement":"Measurement","cbmValue":"{{cbm}} CBM","colQty":"Quantity","colCartons":"Cartons","colItem":"Item","colCode":"Code","colGoodsDesc":"Description of goods","shipper":"Shipper","notifyParty":"Notify party","containerSeal":"Container & seal","goodsLine":"{{qty}} × {{name}} (HS {{hs}})","grossWeightLine":"Gross weight: {{kg}} kg · {{cartons}} cartons · {{cbm}} CBM","bolNote":"SHIPPED on board in apparent good order and condition. Number of original B/L: THREE (3). Freight payable as per Incoterm {{incoterm}}.","deliveredTo":"Delivered to","carrierRef":"Carrier / reference","carrierRefValue":"B/L {{bl}} · {{container}}","deliveryDate":"Delivery date","status":"Status","conditionReceipt":"Condition on receipt","conditionText":"Goods received in apparent good order and condition, unless noted here: __________________________________________","signReceivedBy":"Received by (name)","signSignature":"Signature","signDate":"Date"}},"tracking":{"title":"Tracking","description":"Monitor shipping bookings, vessel routes, and the latest shipment events.","newBooking":"New Booking","emptyTitle":"No shipping bookings yet","emptyDescription":"Tracking shows shipping bookings with their vessel routes and live shipment status. Create a booking to start tracking shipments.","showing":"Showing {{count}} of {{total}}","cols":{"reference":"Booking number","voyage":"Voyage","route":"Route","etd":"ETD","eta":"ETA","containers":"Containers","lastEvent":"Last Event"},"searchPlaceholder":"Search bookings…","status":{"draft":"Draft","confirmed":"Confirmed","in_transit":"In transit","arrived":"Arrived","delivered":"Delivered","cancelled":"Cancelled"},"helpIntro":"Track shipping bookings and their latest shipment status.","helpStep1":"Search by booking reference or filter the list to find a shipment.","helpStep2":"Review the route, dates, and last event for each booking.","helpStep3":"Click New booking to create a shipping booking.","helpTip1":"Superseded events are hidden, so the status shown is the live state."},"newBooking":{"title":"New Shipping Booking","subtitle":"Attach a booking reference to a sales-order shipment + optional vessel schedule","submit":"Create Booking","submitting":"Creating…","cancel":"Cancel","fields":{"shipmentId":"Sales Order Shipment ID","vesselId":"Vessel Schedule ID (optional)","reference":"Carrier Booking Reference","date":"Booking Date","notes":"Notes"}},"errors":{"generic":"Something went wrong; please retry"},"providerDrawer":{"titleNew":"New logistics provider","titleEdit":"Edit logistics provider","close":"Close","discard":"Discard","saveDraft":"Save draft","saveAndActivate":"Save & activate","save":"Save","saving":"Saving…","saved":"Saved","saveFailed":"Save failed","restoreDraftQuestion":"Restore unsaved draft?","restoreDraftYes":"Restore"},"providerSections":{"identity":"Identity","primaryContact":"Primary contact","locations":"Locations","additionalContacts":"Additional contacts","commercial":"Commercial","lanes":"Lanes & rates","certifications":"Certifications","banking":"Banking","documents":"Documents"},"providerFields":{"name":"Provider name","nameVi":"Name (Vietnamese)","shortName":"Short name","providerKind":"Provider kind","modesSupported":"Transport modes","tier":"Tier","country":"Country","taxId":"Tax ID","website":"Website","incotermHandling":"Incoterms handled","customsId":"Customs ID","bondNumber":"Bond number","insuranceCoverageMax":"Insurance coverage max","insuranceCurrencyCode":"Insurance currency","serviceLanesSummary":"Service lanes summary","paymentTermDays":"Payment terms (days)","assignedInternalOwner":"Internal owner","codePreview":"Code preview","codePreviewHint":"Auto-generated from country + kind on save"},"providerKindLabels":{"freightForwarder":"Freight forwarder","customsBroker":"Customs broker","trucker":"Trucker","warehouse":"Warehouse","courier":"Courier","shippingLine":"Shipping line","airlineConsolidator":"Airline consolidator"},"modeLabels":{"sea":"Sea","air":"Air","land":"Land","rail":"Rail","multimodal":"Multimodal"},"serviceLevelLabels":{"standard":"Standard","express":"Express","economy":"Economy","premium":"Premium"},"frequencyLabels":{"daily":"Daily","weekly":"Weekly","biweekly":"Biweekly","monthly":"Monthly","onDemand":"On demand"},"containerTypeLabels":{"c20gp":"20'GP","c40gp":"40'GP","c40hc":"40'HC","c45hc":"45'HC","lcl":"LCL","airKg":"Air (kg)","truckLoad":"Truck load","perShipment":"Per shipment"},"rateKindLabels":{"allIn":"All-in","base":"Base","fuelSurcharge":"Fuel surcharge","bunkerAdj":"Bunker adj.","security":"Security","handling":"Handling","customs":"Customs","other":"Other"},"rateBasisLabels":{"perContainer":"Per container","perKg":"Per kg","perCbm":"Per CBM","perShipment":"Per shipment","percent":"Percent"},"lanes":{"add":"Add lane","empty":"No lanes yet — add an origin→destination pair.","originCountry":"Origin country","originPort":"Origin port","destinationCountry":"Destination country","destinationPort":"Destination port","transitTimeDays":"Transit (days)","frequency":"Frequency","addRate":"Add rate","ratesHeading":"Rates","effectiveWindow":"Effective","openEnded":"open"},"cert":{"add":"Add","kind":"Kind","code":"Certificate code","issuedBy":"Issued by","issuedAt":"Issued on","expiresAt":"Expires on","documentUrl":"Document URL","statusActive":"Active","statusExpired":"Expired","statusSuspended":"Suspended","statusPending":"Pending","expiringSoon":"Expiring soon","expired":"Expired","empty":"No certifications yet.","kindCtpat":"C-TPAT","kindAeo":"AEO","kindFiata":"FIATA","kindIataIosa":"IATA IOSA","kindIataCass":"IATA CASS","kindWco":"WCO","kindIso9001":"ISO 9001","kindIso14001":"ISO 14001","kindIso28000":"ISO 28000","kindIso28001":"ISO 28001","kindGdp":"GDP","kindOther":"Other"},"providersList":{"title":"Logistics Providers","description":"Manage the carriers, freight forwarders, customs brokers, and warehouses you ship through.","countSingular":"{{n}} provider","countPlural":"{{n}} providers","viewMap":"View Map","bulkImport":"Bulk Import","addProvider":"+ Add Provider","columns":"Columns","columnsHeading":"Visible columns","selectAll":"Select all on this page","deselectAll":"Deselect all on this page","sortAsc":"Sort ascending","sortDesc":"Sort descending","code":"Code","name":"Name","providerKind":"Provider Kind","mode":"Mode","modes":"Modes","tier":"Tier","country":"Country","currency":"Currency","lanesCount":"Lanes","created":"Created","relativeJustNow":"just now","relativeMinutes":"{{n}}m ago","relativeHours":"{{n}}h ago","relativeDays":"{{n}}d ago","relativeWeeks":"{{n}}w ago","relativeMonths":"{{n}}mo ago","relativeYears":"{{n}}y ago","bulkSelected":"{{n}} selected","exportCsv":"Export CSV","bulkStatusChange":"Change Status","bulkDelete":"Delete","rowsPerPage":"Rows per page","page":"Page","of":"of","prev":"Prev","next":"Next","searchPlaceholder":"Search by code, name, or tax ID…","allStatuses":"All statuses","allKinds":"All kinds","allModes":"All modes","allTiers":"All tiers","statusDraft":"Draft","statusActive":"Active","statusArchived":"Archived","emptyTitle":"No logistics providers yet","emptyDescription":"Logistics providers are the carriers and forwarders you ship through. Add your first provider to start booking shipments.","loadError":"Failed to load logistics providers","deleteError":"Failed to delete provider","toastDeleted":"Logistics provider deleted","confirmDeleteProvider":"Are you sure you want to delete this logistics provider? This action cannot be undone.","helpIntro":"Manage logistics providers and carriers used for shipments.","helpStep1":"Search or filter by kind, mode, tier, and status to find a provider.","helpStep2":"Select a provider to view or edit its details.","helpStep3":"Click Add provider to register a new carrier.","helpTip1":"Select rows to export the chosen providers to CSV."},"drawer":{"certification":{"deleteAria":"Delete certification","status":"Status"},"lane":{"collapseAria":"Collapse lane","expandAria":"Expand lane","deleteAria":"Delete lane","rateCount_one":"{{count}} rate","rateCount_other":"{{count}} rates","mode":"Mode","serviceLevel":"Service level","transitMin":"Transit min (d)","transitMax":"Transit max (d)","incoterm":"Incoterm","noRates":"No rates yet."},"rate":{"deleteAria":"Delete rate","kind":"Kind","basis":"Basis","container":"Container","amount":"Amount","currency":"Currency","from":"From","to":"To","minCharge":"Min charge"}},"exportDocs":{"loading":"Loading export documents…","createFailed":"Could not create the export document set","saveFailed":"Could not save the change","issuedToast":"Document set issued — PI, contract, invoices and packing list stamped.","containerRemovedToast":"Container removed — its pieces moved into the remaining container.","noSetTitle":"No export document set yet","noSetSub":"This sales order has no export document set. Create one to start the CBM worksheet and the six printable documents.","createSet":"Create export document set","backToTracker":"Back to export documents","eyebrow":"Logistics · Export documents","shipmentTitle":"Shipment {{ref}}","statusDraft":"Draft","statusIssued":"Issued","headMeta":"from {{order}} · P/O {{po}} · {{count}} × {{type}}","shortBadge":"⚠ {{count}} line(s) short of order","issueSet":"Issue document set","reissueSet":"Re-issue set","combined":{"title":"Combined set — {{count}} orders","sub":"One proforma, invoice and packing list cover every order below. Each line keeps its own PI reference.","piRefs":"PIs {{refs}}","primary":"Primary","colSo":"Sales order","colPi":"PI","colCustomer":"Customer","colCurrency":"Currency","uncombine":"Un-combine","uncombineAll":"Un-combine all","uncombineTitle":"Remove {{ref}} from this set?","uncombineBody":"{{ref}} gets its own export document set back, as it was before combining. Its lines and cartons leave this set — carton edits made to its lines while combined are discarded.","uncombineAllTitle":"Split every order out of this set?","uncombineAllBody":"Each secondary order gets its own export document set back, as it was before combining. Only {{ref}} stays here — carton edits made to the other orders' lines while combined are discarded.","uncombined":"{{ref}} removed from the combined set","uncombinedAll":"Combined set split back into separate orders","failed":"Could not change the combined set","mixedCurrency":"These orders use different currencies — check prices and totals before issuing.","mixedCustomer":"These orders belong to different customers — check the parties before issuing.","redirecting":"Opening the combined document set…","colKind":"Type","kindPi":"PI","kindSo":"Order","colIncoterm":"Incoterm","voidLocked":"This set is void, so its orders cannot be un-combined."},"stats":{"buyer":"Buyer","consignee":"Consignee","route":"Route","etd":"ETD","ordered":"Ordered","shipping":"Shipping","cartons":"Cartons","volume":"Volume","gross":"Gross","invoiceValue":"Invoice value","pcs":"{{count}} pcs","m3":"{{vol}} m³","kg":"{{kg}} kg"},"tabs":{"orderDocs":"Order docs","shippingDocs":"Shipping docs","pi":"Proforma Invoice","piSub":"Order confirmation & price","sc":"Sale Contract","scSubBilingual":"Bilingual {{lang1}} / {{lang2}}","scSubSingle":"{{lang1}} only","inv":"Invoice (customs)","invSub":"Consolidated","cbm":"CBM plan","cbmSub":"Carton spec & container split","invk":"Invoice (customer)","invkSub":"Split per cont / seal","pkl":"Packing List","pklSub":"Cartons & weights"},"picker":{"resolving":"Looking up order {{order}}…","notFound":"No sales order matches \"{{order}}\"."},"docBar":{"orderDocTag":"Order document","orderDocText":"Part of the sales-order flow for {{order}} — approval and signature are tracked in the order's Order documents. This is the printable rendering.","openOrder":"Open the order →","signedBy":"Signed by","signerOption":"{{name}} — {{role}}","signerOptionDeleted":"{{name}} — {{role}} (deleted)","signerOptionNotAllowed":"{{name}} — {{role}} (no longer signs export documents)","dottedHint":"Dotted fields are editable","exportPdf":"Export PDF","openProforma":"Open proforma"},"pi":{"note":"Addressed to {{buyer}}, who places the order and pays; ship-to is {{consignee}}. Ordered quantities and prices, before the CBM plan trims anything. Value {{value}}.","buyerAddressBlank":"Buyer address is blank."},"inv":{"note":"Quantities and carton counts come straight from the CBM plan — {{qty}} pcs, not the {{ordered}} ordered. Each carton type prints its own line with its own count; quantity, price and amount span the item."},"invk":{"note":"Same goods and the same total, sectioned per container with its cont / seal number. Customs in some destinations want the per-container breakdown; the consolidated invoice is the one sent for payment."},"pkl":{"note":"The only document carrying weights. Net and gross per carton are held on the CBM plan; the totals here are carton count × per-carton weight, split the same way as the containers."},"cbmp":{"title":"Shipping plan — printable","note":"The CBM plan as a landscape sheet, in the same form as the other export documents. Everything reads from the worksheet — change a split there, not here.","backToWorksheet":"← Back to worksheet"},"sc":{"primaryLanguage":"Primary language","secondaryLanguage":"Secondary","noneSingle":"None — single language","swap":"⇄ Swap","draftWarning":"⚠ {{langs}} is a working draft — have the customer's counsel review before signing","switchesTogether":"Every clause, heading and table label switches together.","buyer":"Buyer","buyerSignatory":"Buyer signatory","noneOnFile":"— none on file —","chooseSignatory":"— choose a signatory —","buyerSetToast":"Buyer set to {{name}} — details filled from Contacts.","signatoryToast":"Buyer signatory set to {{name}}.","pickerHint":"Picking a buyer fills their address & contacts from Contacts.","setSecondaryFirst":"Set a secondary language first.","readsFirstToast":"Contract now reads {{lang}} first.","noteBilingual":"Printed {{lang1}} over {{lang2}}. The commodity table matches the invoice — one line per carton type, quantity and price spanning the item.","noteSingle":"Printed {{lang1}} only. The commodity table matches the invoice — one line per carton type, quantity and price spanning the item."},"cbm":{"title":"Container plan (CBM)","sub":"Carton specification and the split across containers. Every other document reads its carton counts, weights and quantities from this table: edit here, not on the forms.","printSheet":"Print sheet","addContainer":"＋ Container","colNum":"#","colItem":"Item","colOrderQty":"Order qty","colCarton":"Carton","colSpec":"Carton spec (mm)","colPcsPerCarton":"Pcs / carton","colPiecesByContainer":"Pieces by container","colDiff":"Diff.","colCartonsByContainer":"Cartons by container","colVolume":"Volume m³","colInside":"Inside","colOutside":"Outside","colTotal":"Total","colPerCarton":"/ carton","totalRow":"TOTAL","colKgPerCarton":"Kg / carton","colNet":"Net","colGross":"Gross","dimL":"Outer length (mm)","dimW":"Outer width (mm)","dimH":"Outer height (mm)"},"containers":{"title":"Container {{label}}","sealType":"seal {{seal}} · {{type}}","cartons":"{{count}} cartons","volume":"{{vol}} / {{cap}} m³","pctFull":"{{pct}}% full","removeTitle":"Remove this container — its pieces move to {{other}}","schematicTitle":"Fill schematic — side elevation","floorRun":"floor run {{pct}}% of 12.03 m","blockTitle":"{{count}} cartons, {{cols}} column(s) × {{across}} across × {{high}} high","schematicNote":"Schematic only — cartons drawn to relative floor run and stack height, not a stow plan.","remove":"Remove","cont":"Cont","seal":"seal","fillAria":"{{pct}} percent full"},"parties":{"title":"Parties","inheritedFrom":"inherited from {{order}}","explainer":"{{buyer}} places the order and is invoiced. The goods ship to {{consignee}}, their client, at {{port}} — the ship-to account chosen on the order. Both print on the export documents; customs reads the consignee.","explainerDirect":"Buyer and consignee are the same company — a direct shipment.","contractSignedWith":"Contract signed with","counterpartyBuyer":"{{name}} — buyer","counterpartyConsignee":"{{name}} — consignee","counterpartyToast":"Contract counterparty set to {{name}}.","role":{"seller":"Seller / Shipper","buyer":"Buyer","consignee":"Consignee / Ship to","notify":"Notify party"},"note":{"seller":"Us — exporter of record","buyer":"Our client — places the order and pays","consignee":"Buyer's client — receives the goods at destination","notify":"Alerted on arrival — usually the consignee"},"lockedCompany":"🔒 company record","lockedFromOrder":"🔒 from {{order}}","telFaxTax":"Tel {{tel}} · Fax {{fax}} · Tax {{tax}}","telFax":"Tel {{tel}} · Fax {{fax}}","noAddressOnFile":"No address on file — add it on their record in Contacts.","contactPerson":"Contact person — signs and is addressed on the PI","nobodyOnFile":"Nobody on file at {{name}}. Add someone in Contacts.","chooseContact":"— choose a contact —","contactToast":"{{name}} set as the buyer's contact.","sameAsConsignee":"Same as consignee","find":"⌕ Find","gapAddress":"Address is required on the bill of lading and customs entry","gapContact":"A contact person is needed for the signature block","searchPlaceholder":"Search…","pickScope":"The buyer, or a ship-to account under {{buyer}}","pickScopeNotify":"The buyer, or a ship-to account under {{buyer}} · plus freight agents","directRowNote":"The buyer receives the goods — direct shipment","directRowNoteNoAddr":"The buyer receives the goods — direct shipment · no address on file","kindDirect":"direct","kindShipTo":"ship-to","kindAgent":"agent","noAddress":"no address","noShipToAccounts":"{{buyer}} has no ship-to accounts — they receive the goods directly. Add one on their record in Contacts.","noMatch":"No account matches that search.","pickedToast":"{{name}} filled in as {{role}}.","pickedNoAddressToast":"{{name}} has no address on file — add it in Contacts.","phName":"Company name","phAddr":"Full address as it must appear on the B/L","phTel":"Tel","phFax":"Fax","phRep":"Contact person","phRepRole":"Title","titleAlt":"Các bên","consigneeShipTo":"Consignee / ship to","sameAsBuyerDefault":"Same as buyer (default)","differentConsignee":"Different consignee for this order","consigneePrints":"Prints on the PI, invoices and packing list. Customs reads the consignee."},"short":{"title":"Shipping differs from the order","sub":"{{count}} line(s) · the proforma keeps the ordered figure, the invoice bills what ships","close":"Close","ordered":"Ordered","shipping":"Shipping","difference":"Difference","valueNotBilled":"Value not billed","footnote":"The proforma invoice was issued against the order and still shows {{orderQty}} pcs at {{piAmount}}. The commercial invoice, contract and packing list all bill the shipped figure — {{qty}} pcs at {{amount}}. Nothing here forces them to agree; the shortfall is carried to the next shipment or credited.","balance":"Balance to next shipment","balanceToast":"Shortfall carried to the next shipment on this order."},"docKind":{"sc":"Sales Contract","pi":"Proforma Invoice","iv":"Commercial Invoice","pl":"Packing List","cbm":"CBM plan / container split","bl":"Bill of Lading","co":"Certificate of Origin","fum":"Fumigation certificate"},"docStatus":{"not_started":"Not started","in_progress":"In progress","issued":"Issued","superseded":"Superseded"},"tracker":{"eyebrow":"Sales · Documents","title":"Export documents","sub":"One row per PI. Track which export documents have been issued, their status, and shipment details. Click a row to see each document.","kpi":{"total":"Total PIs","draft":"Draft","in_progress":"In progress","issued":"Issued","complete":"Complete / shipped"},"filter":{"all":"All","draft":"Draft","in_progress":"In progress","issued":"Issued","complete":"Complete","void":"Void"},"overall":{"draft":"Draft","in_progress":"In progress","issued":"Issued","complete":"Complete","void":"Void"},"search":"Search PI, customer code / name, port…","col":{"pi":"PI","code":"Customer code","customer":"Customer","incoterm":"Incoterm","route":"Route","etd":"ETD","cont":"Container / cartons","cbm":"CBM (m³)","kg":"Weight (kg)","docs":"Document set","status":"Status","note":"Note"},"cartons":"{{count}} cartons","needsAttention":"Needs attention","empty":"No PI matches this search.","loadFailed":"Could not load export documents","openWorkspace":"Open document workspace for {{pi}}","combine":{"hint":"Tick two or more PIs to combine them into one invoice and document set","selected":"{{count}} PI(s) selected","clear":"Clear","button":"⧉ Combine selected","buttonN":"⧉ Combine {{count}} PIs","pending":"Combining…","selectAll":"Select all shown","selectRow":"Select {{pi}}","locked":"Locked — this set is issued and can no longer be combined","confirmTitle":"Combine {{count}} PIs into one document set?","confirmBody":"{{refs}} will share one proforma, invoice, packing list and sale contract — every line, material and cost of each PI is carried over.","primaryNote":"{{pi}} (ticked first) is the primary: its header, parties and containers are kept.","mixedWarning":"⚠ The selected PIs have different customers or currencies — check the combined documents carefully.","nestedBlocked":"{{refs}} is already a combined set — tick it first to add more PIs to it, or un-combine it first.","confirm":"Combine","success":"{{count}} PIs combined into one document set"},"combinedChip":"Combined","moreRefs":"+{{count}}","etdRange":"ETD","etdFrom":"ETD from","etdTo":"ETD to","exportCsv":"Export CSV","csv":{"pi":"PI refs","so":"SO refs","code":"Customer code","customer":"Customer","incoterm":"Incoterm","route":"Route","etd":"ETD","containers":"Containers","cartons":"Cartons","cbm":"CBM (m³)","kg":"Gross weight (kg)","status":"Status"},"legend":{"documents":"Documents:","colours":"Colours:","issued":"Issued","inProgress":"In progress / draft","notStarted":"Not started"},"detail":{"customer":"Customer","salesOrder":"Sales order","incoterm":"Incoterm","route":"Route","etd":"ETD","container":"Container","cartons":"Cartons","cbm":"CBM","weight":"Weight","setTitle":"Export document set","open":"Open documents →","issuedOn":"Issued {{date}}","preparing":"Being prepared","none":"—","issuedDate":"Issued on","save":"Save","cancel":"Cancel","note":"Note","notePlaceholder":"Add a tracker note…","attention":"Needs attention","saved":"Saved","saveFailed":"Could not save the change"},"invoiceNo":"Inv. {{number}}","samplesTag":"Samples"},"customsMissing":{"title":"Customs name missing","body":"These products have no Vietnamese customs name yet. The documents still print — add the name on the BOM Product names tab before the customs declaration.","openNames":"Open the product names of {{sku}}"},"cbmLinePi":"PI {{ref}}","sampleList":{"title":"Sample list for confirmation","note":"Goods added outside the PI, for the customer to confirm before the documents are issued.","back":"← Back to containers"}}},"planning":{"title":"Planning Board","backSchedule":"Back-schedule","runningBackSchedule":"Scheduling…","shortCircuited":"No change — replay short-circuited","opsScheduled":"{{count}} operations scheduled","gantt":{"title":"Timeline — {{wo}}","cargoReadyMarker":"Cargo-ready","unknownMachine":"Unassigned machine","machineLabel":"Machine: {{machine}}","crdAbbr":"CRD","opTitle":"{{name}} • {{minutes}} min"},"audit":{"title":"Schedule audit","open":"Open audit","close":"Close","tabCurrent":"This run","tabHistory":"History","runMeta":"Run metadata","algorithmVersion":"Algorithm version","cargoReadyDate":"Cargo-ready date","shortCircuited":"Short-circuited","inputsDigest":"Inputs digest","operations":"{{count}} operations","opsCount":"{{count}} ops","noOps":"No operations in this run.","historyTitle":"Past schedule runs","historyLoading":"Loading…","historyEmpty":"No persisted runs yet.","historyLoadError":"Could not load schedule history."},"cascadePreview":"Preview cascade","cascadeApply":"Apply cascade","cascadeDiffTitle":"Cascade preview","cascadeUnchanged":"no change","cascadeUnknownWo":"Unknown work order","cascadeOpsChanged":"{{count}} ops re-scheduled","cascadeApplied":"Cascade applied to {{count}} work orders","setupBlockerTitle":"Scheduler not ready","listError":"Failed to load work orders","columns":{"woNumber":"Work order number","product":"Product","cargoReady":"Cargo Ready","status":"Status","actions":"Actions"},"errors":{"generic":"Something went wrong; please retry"},"a11y":{"selectRow":"Select work order for cascade preview"},"description":"Run the back-scheduler against open work orders and apply cascade re-schedules","emptyTitle":"No work orders to plan","emptyDescription":"The planning board back-schedules open work orders. Create a work order to run the scheduler against it.","helpIntro":"The planning board back schedules work orders against your calendar so operations finish by their cargo ready date. Use it to sequence the floor.","helpStep1":"Select Back schedule on a work order to compute its operation timeline.","helpStep2":"Tick several work orders, then select Preview cascade to see downstream effects.","helpStep3":"Select Apply cascade to commit the previewed schedule changes.","helpStep4":"Open the audit drawer on a row to inspect how dates were derived.","helpTip1":"If scheduling is unavailable, set up the default calendar and policy first."},"manufacturing":{"title":"Manufacturing","description":"Manage production processes, BOMs, and shop floor operations","workOrders":"Work Orders","newWorkOrder":"New Work Order","searchWO":"Search by WO number or product...","allStatuses":"All Statuses","noWorkOrders":"No work orders found","woNumber":"WO number","product":"Product","quantity":"Quantity","priority":"Priority","schedule":"Schedule","showing":"Showing","of":"of","woStatusLabels":{"draft":"Draft","planned":"Planned","released":"Released","in_progress":"In Progress","completed":"Completed","cancelled":"Cancelled"},"modules":{"bom":"Bill of Materials","bomDesc":"Define product structures, components, and manufacturing recipes","workOrders":"Work Orders","workOrdersDesc":"Production scheduling and shop floor execution","qualityControl":"Quality Control","qualityControlDesc":"Inspection checkpoints and quality assurance","mrp":"MRP","mrpDesc":"Material Requirements Planning and procurement suggestions","comingSoon":"Coming Soon"},"bom":{"title":"Bill of Materials","description":"Manage manufacturing recipes and product structures","newBom":"New BOM","allStatuses":"All statuses","allTypes":"All types","showing":"Showing","of":"of","boms":"BOMs","tryAgain":"Try again","tableHeaders":{"code":"BOM code","productVersion":"Product / Version","type":"Type","status":"Status","lines":"Lines","materialCost":"Material Cost","actions":"Actions"},"version":"Version","typeLabels":{"manufacturing":"Manufacturing","phantom":"Phantom","kit":"Kit"},"statusLabels":{"draft":"Draft","active":"Active","obsolete":"Obsolete"},"previous":"Previous","next":"Next","page":"Page","detail":{"title":"Bill of Materials","backToList":"Back to BOMs","version":"Version","status":"Status","piReference":"PI Ref","monthPlan":"Month Plan","clientCode":"Client Code","totalCost":"Total Cost","lineCount":"Line Count","empty":"No lines","activate":"Activate BOM","activating":"Activating…","activated":"BOM activated — materials can now be sourced","activateFailed":"Could not activate the BOM","publishedFromDesign":"Published from the product's design BOM (version {{version}}) when it was approved: it is rebuilt there, so it can't be edited here.","openDesign":"Open the design BOM"},"tab":{"overview":"Overview","wood":"Wood","sheet_stock":"Sheet Stock","packaging":"Packaging","paint":"Paint","paint_calc":"Paint Calc"},"col":{"stt":"Row number","componentName":"Component Name","detailName":"Detail Name","specFinish":"Finish Spec","specRaw":"Raw Spec","pcsPerSp":"Pieces / product","qtyNeeded":"Quantity needed","m3":"M³","m2":"M²","material":"Material","notes":"Notes","sheetType":"Sheet Type","thickWidthLength":"Thickness × Width × Length","uom":"Unit of measure","quantity":"Quantity","stockQty":"Stock quantity","productName":"Product Name","packagingMaterial":"Packaging Material","dimensionsLWH":"Length × width × height","qtyPerBox":"Quantity per box","paintName":"Paint Name","kgPerM2":"Kg / m²","total":"Total","process":"Process","description":"Description","mixingRatio":"Mixing Ratio","kgHhPerM2":"Mixture kg / m²","totalM2":"Total m²","totalKghh":"Total mixture kg","sequence":"Sequence","category":"Category","componentSku":"SKU","unitCost":"Unit Cost","extendedCost":"Extended","usageRate":"Usage rate"},"productionOrders":{"unknownProduct":"Unknown product"},"emptyTitle":"No BOMs yet","emptyDescription":"Bills of materials define the components and quantities for each product. Create your first BOM to start building work orders.","helpIntro":"Bills of materials list the components and quantities needed to build each product. They feed work orders and material planning.","helpStep1":"Filter by status or type to find the bill of materials you need.","helpStep2":"Select New BOM to define components and quantities for a product.","helpStep3":"Click a row to review its lines and material cost.","helpStep4":"Set a BOM to active once it is ready for production use.","helpTip1":"A BOM marked obsolete stays for history but cannot be used on new work orders.","rowActions":{"copy":"Copy","activate":"Activate","delete":"Delete","alreadyActive":"This is already the active version of the product.","publishedFromDesign":"This BOM is published from a design BOM, so it can't be changed here. Edit the design BOM — approving it rebuilds this one.","activateConfirmTitle":"Activate version {{version}}?","activateConfirmBody":"It becomes the product's active BOM and any other active version is marked obsolete.","activated":"{{sku}} version {{version}} is now the active BOM.","copied":"Copied to draft version {{version}}.","deleteConfirmTitle":"Delete BOM {{sku}} version {{version}}?","deleteConfirmBody":"The BOM and its lines are removed from the lists. This can't be undone from here.","deleted":"BOM version {{version}} deleted.","actionError":"The action could not be completed. Nothing was changed — try again."},"copyDrawer":{"kicker":"Copy BOM","title":"{{sku}} · version {{version}}","intro":"Creates a draft with the same lines. Give the copy a new version label.","versionLabel":"New version","versionPlaceholder":"e.g. 2.0","versionRequired":"Enter a version for the copy.","versionTooLong":"Use at most {{max}} characters for the version.","versionExists":"Version {{version}} already exists for this product — pick another label.","save":"Create copy","cancel":"Cancel"}},"woDescription":"Schedule and track production work orders on the shop floor.","woEmptyTitle":"No work orders yet","woEmptyDescription":"Work orders track what gets produced on the shop floor. Create one to release production against a bill of materials.","helpIntro":"The Manufacturing workspace links your bills of materials, work orders, and planning tools. Start here to reach each production surface.","helpStep1":"Open Bills of Materials to define what each product is built from.","helpStep2":"Use Work Orders to release and track jobs on the shop floor.","helpStep3":"Open a module card to jump to its detailed screen.","woHelpIntro":"This list shows every work order with its product, quantity, priority, and schedule. Use it to manage shop floor jobs.","woHelpStep1":"Search by number or filter by status to narrow the list.","woHelpStep2":"Select New work order to create a job from a product bill of materials.","woHelpStep3":"Click a work order number to open its detail and progress.","woHelpStep4":"Review priority and schedule columns to plan the day.","woHelpTip1":"Lower priority numbers are more urgent, so priority 1 jobs come first.","pickList":{"generate":"Generate pick list","regenerate":"Regenerate pick list","title":"Component requirements","required":"Required","available":"Available","short":"Short","shortBadge":"Short","ok":"OK","generated":"Pick list generated with {{count}} components","viewList":"View pick list","empty":"No components required for this work order","productionBadge":"Production","actualMaterialCost":"Actual material cost"},"materialReturn":{"title":"Return materials","workOrderPlaceholder":"Work order ID","workOrderLabel":"Work order","loadIssued":"Load issued materials","loadIssuedHint":"Enter a work order ID to load its issued materials.","sku":"SKU","name":"Name","issuedQty":"Issued","returnQty":"Return quantity","submit":"Submit return","submitted":"Return {{number}} submitted","qrToken":"QR token: {{token}}","woodDetails":"Wood details (optional)","condition":"Condition","isPlaned":"Planed","remainingDims":"Remaining dimensions","supplierOriginal":"Original supplier","supplierRemaining":"Remaining-stock supplier","supplierMismatch":"Remaining-stock supplier differs from the original supplier"},"btpReuse":{"title":"Semi-finished reuse","description":"Meet a new order from in-stock semi-finished pallets before making new.","product":"Product","selectProduct":"Select a product…","colorFinish":"Colour / finish","quantity":"Quantity","suggest":"Suggest reuse","productColorRequired":"Select a product and enter a colour.","requested":"Requested","useFromBtp":"Use from semi-finished stock","makeNew":"Make new","btpCode":"Lot code","stage":"Stage","reinspectDue":"Re-inspect by","noBtpAvailable":"No in-stock semi-finished lot matches — make the full quantity new.","workOrderOptional":"Work order (optional)","noWorkOrder":"No work order","approveReserve":"Approve & reserve","reservedSuccess":"Reserved {{count}} pallet(s).","reservedTitle":"Reserved pallets","issue":"Issue","issued":"Issued","issuedSuccess":"Issued pallet {{code}}."},"productionEstimate":{"open":"Print production estimate","title":"Production estimate · {{number}}","print":"Print","loadError":"Could not load the production estimate. Try again.","source":"Template: {{template}} · BOM version {{version}}","defaultTemplate":"Default","noBom":"This product has no BOM yet: the estimate prints without parts."}},"ops":{"title":"Staff Portal","dashboard":"Dashboard","tenants":"Tenants","invoices":"Invoices","staff":"Staff","support":"Support","settings":"Settings","invoiceSettings":"Invoice Settings","logout":"Logout","nav":{"operate":"Operate","team":"Team","system":"System"},"common":{"loading":"Loading...","saving":"Saving...","creating":"Creating...","updating":"Updating...","back":"Back","cancel":"Cancel","save":"Save","create":"Create","update":"Update","delete":"Delete","edit":"Edit","view":"View","search":"Search","filter":"Filter","status":"Status","actions":"Actions","all":"All","active":"Active","inactive":"Inactive","yes":"Yes","no":"No","notFound":"Not Found","backToList":"Back to List","noData":"No data available","next":"Next","done":"Done","name":"Name","email":"Email","phone":"Phone","firstName":"First Name","lastName":"Last Name","pending":"Pending","suspended":"Suspended","cancelled":"Cancelled","checking":"Checking"},"tenantList":{"title":"Tenants","description":"Manage customer accounts and subscriptions","newTenant":"New Tenant","searchPlaceholder":"Search by name or slug...","allStatuses":"All Statuses","noTenants":"No tenants found","noTenantsDesc":"Get started by creating your first tenant","company":"Company","plan":"Plan","users":"Users","storage":"Storage","created":"Created"},"tenantDetails":{"title":"Tenant Details","overview":"Overview","subscription":"Subscription","invoices":"Invoices","companyInfo":"Company Info","contacts":"Contacts","usage":"Usage","contract":"Contract","taxId":"Tax ID (MST)","industry":"Industry","address":"Address","timezone":"Timezone","billing":"Billing","technical":"Technical","users":"Users","storage":"Storage","startDate":"Start Date","endDate":"End Date","autoRenewal":"Auto-Renewal","suspend":"Suspend","activate":"Activate","statusUpdated":"Status Updated","tenantNowStatus":"Tenant is now {{status}}","notFound":"Tenant Not Found","backToList":"Back to List","activateAccount":"✓ Activate Account","reactivate":"Reactivate","editPlan":"Edit Plan","cancelSubscription":"Cancel Subscription","configureSubscription":"Configure Subscription","noSubscription":"No subscription configured yet.","plan":"{{tier}} Plan","billed":"Billed {{cycle}}","perMonth":"per month","perQuarter":"per quarter","perYear":"per year","nextBillingDate":"Next Billing Date","monthlyRate":"Monthly Rate","maxUsers":"Max Users","maxStorage":"Max Storage","enabledModules":"Enabled Modules","confirmSuspend":"Suspend this subscription? The tenant will be locked out immediately.","confirmCancel":"Cancel this subscription? It will remain active until {{date}} and will not renew.","cancellationScheduledText":"⚠️ Cancellation scheduled — subscription will not renew after","cancellationServiceActive":"Service remains active until the end of the current billing period.","subscriptionCancelledText":"Subscription cancelled","subscriptionSuspendedText":"Subscription suspended on {{date}}","suspensionNotice":"Tenant users are locked out and will see a suspension notice on login.","createInvoice":"+ Create Invoice","noInvoicesYet":"No invoices yet.","enterSuspensionReason":"Enter suspension reason:","activateModal":{"title":"Activate Tenant","description":"Activating this tenant will:","changeStatus":"Change status to Active","startBilling":"Start subscription billing","markInvoicePaid":"Mark pending invoice as Paid","provisionDb":"Provision tenant database (if needed)","bankTransferRef":"Bank Transfer Reference (optional)","notes":"Notes (optional)","sendWelcome":"Send welcome email","notifyFinance":"Notify finance contact","activating":"Activating..."},"confirmSuspendMessage":"Are you sure you want to suspend this tenant? They will immediately lose access to the platform.","confirmCancelMessage":"Are you sure you want to cancel this subscription? The tenant will retain access until the end of the current billing period.","suspensionReasonPlaceholder":"Enter reason for suspension...","resetOwnerPassword":"Reset owner password","resetOwnerPasswordTitle":"Reset owner password","resetOwnerPasswordConfirm":"This generates a fresh temporary password for the tenant's account owner. The customer will need to use the new password and change it on first login. The old password stops working immediately. Continue?"},"tenantNew":{"title":"New Tenant","description":"Create a new customer account","steps":{"company":"Company","finance":"Finance","subscription":"Subscription","review":"Review"},"companyAndAdmin":"Company & Account Owner","companyInfo":"Company Information","companyName":"Company Name","taxId":"Tax ID (MST)","industry":"Industry","selectIndustry":"Select industry...","website":"Website","companyPhone":"Company Phone","addressLine1":"Address Line 1","addressLine2":"Address Line 2 (Optional)","city":"City","province":"Province / State","postalCode":"Postal Code","country":"Country","deploymentType":"Deployment Type","deployment":"Deployment","deploymentDatabase":"Separate Database","deploymentSchema":"Shared Database (Schema)","deploymentDatabaseDesc":"Isolated database for maximum security and performance","deploymentSchemaDesc":"Lower cost, shared infrastructure","included":"Included","deploymentFee":"Deployment Fee (One-time)","oneTime":"one-time","implementationFee":"Implementation Fee (One-time)","implementationFeeDesc":"Covers project setup, data migration, training, and go-live support","paymentSummary":"Payment Summary","recurringSubscription":"Recurring Subscription","billedAs":"Billed","oneTimeFees":"One-time Fees (First Invoice Only)","totalOneTime":"Total One-time Fees","firstPaymentTotal":"First Payment Total","firstPaymentNote":"Includes first month subscription + all one-time fees. Subsequent invoices will only include the recurring subscription.","prefix":"Title","prefixes":{"mr":"Mr.","ms":"Ms.","mrs":"Mrs.","dr":"Dr."},"firstName":"First Name","lastName":"Last Name","email":"Email","phone":"Phone","jobTitle":"Job Title","accountOwner":"Account Owner","accountOwnerDesc":"This user will be the primary administrator for the tenant.","financeContact":"Finance Contact","financeContactDesc":"This person will receive invoices and payment notifications.","sameAsOwner":"Same as Account Owner","sameAsOwnerDesc":"Use the account owner's information for invoices","subdomain":"Subdomain","subdomainAvailable":"Available!","trySuggestions":"Try one of these","customPricing":"Custom Pricing","additionalDiscount":"Additional Discount","discountApprovalRequired":"Discounts over 30% require approval","finalPrice":"Final Price","pricingNotes":"Pricing Notes","pricingNotesPlaceholder":"e.g., Special arrangement for strategic partner","reviewSubmission":"Review & Submit","pendingPaymentNotice":"Account will be created in Pending Payment status","pendingPaymentNoticeDesc":"Welcome emails will not be sent until payment is verified and the account is manually activated.","subscriptionStartNote":"Subscription will start once the initial payment is received. Welcome emails will be sent after payment verification.","createTenant":"Create Tenant","tenantCreated":"Tenant Created","tenantCreatedDesc":"{{name}} has been created successfully."},"credentials":{"title":"Account Created Successfully","loginUrl":"Login URL","email":"Email","tempPassword":"Temporary Password","warning":"Please save these credentials before closing. The password will not be shown again. Share these with the client securely.","copyAll":"Copy All"},"industries":{"manufacturing_mechanical":"Mechanical Manufacturing","manufacturing_electronics":"Electronics Manufacturing","manufacturing_food":"Food Manufacturing","textile":"Textile & Apparel","wood_furniture":"Wood & Furniture","plastics_packaging":"Plastics & Packaging","construction":"Construction","agriculture":"Agriculture","other":"Other"},"subscription":{"subscription":"Subscription","title":"Subscription","plan":"Plan","manageSubscription":"Manage Subscription","configureSubscription":"Configure Subscription","selectPlan":"Select Plan","selectModules":"Select Modules","modules":"Modules","billingCycle":"Billing Cycle","customDiscount":"Custom Discount","summary":"Summary","tiers":{"starter":"Starter","starterDesc":"Perfect for small businesses just getting started","professional":"Professional","professionalDesc":"For growing businesses with more complex needs","enterprise":"Enterprise","enterpriseDesc":"Full-featured solution for large organizations"},"cycles":{"monthly":"Monthly","quarterly":"Quarterly","yearly":"Yearly"},"maxUsers":"Max Users","maxStorage":"Max Storage","perMonth":"per month","discount":"Discount","discountPercent":"Discount Percentage (%)","maxDiscount":"Max 50%. Combined with cycle discount:","basePrice":"Base Price","total":"Total","popular":"Popular","default":"Default","noSubscription":"No subscription configured yet.","configureNow":"Configure Subscription","enabledModules":"Enabled Modules","billedCycle":"Billed {{cycle}}","subscriptionUpdated":"Subscription Updated","subscriptionUpdatedDesc":"The subscription has been configured successfully.","core":"Core","base":"Base","users":"users","storage":"storage"},"modules":{"core":"Core ERP","coreDesc":"Essential ERP features","accounting":"Accounting","accountingDesc":"General ledger, AP/AR","inventory":"Inventory","inventoryDesc":"Stock management","purchasing":"Purchasing","purchasingDesc":"POs, Suppliers","sales":"Sales","salesDesc":"Orders, Quotations","production":"Production","productionDesc":"BOM, Work orders","qc":"Quality Control","qcDesc":"Inspections","maintenance":"Maintenance","maintenanceDesc":"Assets, Work orders","hr":"Human Resources","hrDesc":"Employees, Payroll","crm":"CRM","crmDesc":"Customer management","reports":"Reports","reportsDesc":"Analytics, Dashboards","manufacturing":"Manufacturing","manufacturingDesc":"Production, BOM, Work orders","products":"Products","productsDesc":"Catalog, SKUs, variants, categories.","warehouse":"Warehouse","warehouseDesc":"Multi-location stock, zones, bin locations.","finance":"Finance","financeDesc":"AP/AR, banking, cash flow."},"invoiceList":{"title":"Invoices","description":"Manage customer invoices and payments","newInvoice":"New Invoice","searchPlaceholder":"Search invoices...","allStatuses":"All Statuses","noInvoices":"No invoices found","invoiceNumber":"Invoice number","tenant":"Tenant","period":"Period","total":"Total","dueDate":"Due Date","status":"Status","filterAll":"All Status","draft":"Draft","sent":"Sent","paid":"Paid","overdue":"Overdue","cancelled":"Cancelled","noInvoicesDesc":"Create your first invoice","createInvoice":"+ Create Invoice","markPaid":"Mark Paid","viewInvoice":"View","unknown":"Unknown","enterBankRef":"Enter bank transfer reference:","manageBilling":"Manage customer billing","bankRefPlaceholder":"e.g. VCB-2024-001234","markAsPaid":"Mark as Paid"},"staffList":{"title":"Staff Management","description":"Manage internal team members and access","addStaff":"Add Staff","searchPlaceholder":"Search by name or email...","allStatus":"All Status","noStaff":"No staff members","noStaffDesc":"Get started by adding your first team member","teamMember":"Team Member","role":"Role","emailColumn":"Email","lastLogin":"Last Login","roles":{"super_admin":"Super Admin","sales":"Sales","support":"Support","billing":"Billing","viewer":"Viewer"},"manageDesc":"Manage internal staff and their access roles","noStaffYet":"No Staff Members Yet","addFirstMember":"Add your first team member to get started","edit":"Edit","never":"Never"},"staffForm":{"newStaff":"Add New Staff Member","editStaff":"Edit Staff Member","email":"Email","password":"Password","firstName":"First Name","lastName":"Last Name","role":"Role","roleDesc":{"super_admin":"Full access to all features and staff management","sales":"Manage tenants and subscriptions","support":"View tenants and handle support tickets","billing":"Manage invoices and payments","viewer":"Read-only access to view data"},"staffCreated":"Staff member created successfully","staffUpdated":"Staff member updated successfully","accessRole":"Access Role","activeStatus":"Active","inactiveStatus":"Inactive","resetPassword":"Reset Password","deactivate":"Deactivate","confirmDeactivate":"Are you sure you want to deactivate this staff member?","newPassword":"New Password","minChars":"Minimum 8 characters","passwordMinLength":"Password must be at least 8 characters","resetting":"Resetting...","createStaffMember":"Create Staff Member","creating":"Creating...","emailAddress":"Email Address","initialPassword":"Initial Password","createAccountDesc":"Create a new account for an internal team member","notFoundDesc":"The requested staff member could not be found.","backToStaff":"Back to Staff","confirmDeactivateMessage":"Are you sure you want to deactivate this staff member? They will lose access to the ops portal."},"login":{"title":"Staff Portal","subtitle":"Sign in to access the ops dashboard","email":"Email","password":"Password","signIn":"Sign In","signingIn":"Signing in...","invalidCredentials":"Invalid email or password","portalTitle":"KeenERP Staff Portal","portalSubtitle":"Internal Operations Access","signInButton":"Sign in to Portal","footerNotice":"This portal is for authorized KeenERP staff only."},"errors":{"loadFailed":"Failed to load data","saveFailed":"Failed to save","createFailed":"Failed to create","updateFailed":"Failed to update","deleteFailed":"Failed to delete","validationError":"Validation Error","unexpectedError":"An unexpected error occurred","activationFailed":"Failed to activate tenant","suspendFailed":"Failed to suspend subscription","reactivateFailed":"Failed to reactivate","cancelFailed":"Failed to schedule cancellation","ownerPasswordResetFailed":"Failed to reset owner password."},"invoiceSettingsPage":{"title":"Invoice Settings","description":"Configure company info, bank details, and payment instructions for invoices","saving":"Saving...","saveChanges":"Save Changes","settingsNotFound":"Settings Not Found","settingsNotFoundDesc":"Unable to load invoice settings.","tabs":{"company":"Company Info","bank":"Bank Account","payment":"Payment Instructions"},"company":{"title":"Company Information","nameEn":"Company Name (English)","nameVi":"Company Name (Vietnamese)","addressLine1":"Address Line 1","addressLine2":"Address Line 2","city":"City","province":"Province / State","postalCode":"Postal Code","country":"Country","taxId":"Tax ID (MST)","phone":"Phone","email":"Email","website":"Website","countries":{"VN":"Vietnam","US":"United States","SG":"Singapore","JP":"Japan","KR":"South Korea","TH":"Thailand","MY":"Malaysia","ID":"Indonesia","PH":"Philippines","AU":"Australia"}},"defaults":{"title":"Invoice Defaults","prefix":"Invoice Prefix","currency":"Currency","vatRate":"VAT Rate (%)","paymentTerms":"Payment Terms","immediate":"Immediate","net15":"Net 15","net30":"Net 30","net45":"Net 45","net60":"Net 60"},"bank":{"title":"Bank Account Details","description":"This bank account will be printed on invoices for customer payments.","bankName":"Bank Name","branch":"Branch","accountNumber":"Account Number *","accountHolder":"Account Holder Name *","swiftCode":"SWIFT Code (International)"},"vietqr":{"title":"VietQR Payment QR Code","description":"Enable VietQR to add scannable payment QR codes to invoices. Customers can scan with their banking app.","enable":"Enable VietQR on invoices","selectBank":"Bank for VietQR *","selectBankPlaceholder":"Select bank...","previewQr":"Preview QR:"},"paymentInstructions":{"title":"Payment Instructions","description":"These instructions will be printed on invoices to guide customers on how to pay.","english":"English","vietnamese":"Vietnamese"},"footer":{"title":"Invoice Footer","description":"Add custom notes or terms at the bottom of invoices.","english":"English","vietnamese":"Vietnamese"}},"invoiceDetail":{"notFound":"Invoice not found","backToInvoices":"← Back to Invoices","sendInvoice":"Send Invoice","markAsPaid":"Mark as Paid","recordPayment":"Record Payment","enterBankRef":"Enter bank transfer reference:","confirmCancel":"Are you sure you want to cancel this invoice?","issueDate":"Issue Date","dueDate":"Due Date","billingPeriod":"Billing Period","paymentTerms":"Payment Terms","lineItems":"Line Items","description":"Description","qty":"Qty","unitPrice":"Unit Price","amount":"Amount","subtotal":"Subtotal","discount":"Discount","total":"Total","paymentStatus":"Payment Status","paymentReceived":"✓ Payment received","paidDate":"Paid Date","amountPaid":"Amount Paid","bankReference":"Bank Reference","invoiceCancelled":"This invoice has been cancelled.","paymentOverdue":"⚠️ Payment overdue","awaitingPayment":"Awaiting payment","draftNotSent":"Draft — not yet sent","sent":"Sent","vietqrPayment":"VietQR Payment","notes":"Notes","created":"Created","confirmCancelMessage":"Are you sure you want to cancel this invoice? This action cannot be undone.","bankRefPlaceholder":"e.g. VCB-2024-001234","cancel":"Cancel Invoice"},"invoiceNew":{"title":"New Invoice","description":"Create a billing invoice for a tenant","invoiceDetails":"Invoice Details","tenant":"Tenant *","selectTenant":"Select tenant...","periodStart":"Period Start *","periodEnd":"Period End *","paymentTerms":"Payment Terms","vatRate":"VAT Rate (%)","lineItems":"Line Items","addItem":"+ Add Item","descriptionCol":"Description","qty":"Quantity","unitPrice":"Unit Price","amount":"Amount","discountPercent":"Discount %","discountAmount":"Discount Amount","subtotal":"Subtotal:","discount":"Discount:","total":"Total:","notes":"Notes (optional)","createInvoice":"Create Invoice","fillRequired":"Please fill required fields","immediate":"Immediate","net15":"Net 15","net30":"Net 30","net45":"Net 45","net60":"Net 60","itemDescription":"Description","notesOptional":"Notes (optional)","notesPlaceholder":"Add a note for this invoice","serviceDescription":"Service description"},"staffRoles":{"VIEWER":{"label":"Viewer","description":"Read-only access to all data"},"SUPPORT":{"label":"Support","description":"View data, reset user passwords"},"BILLING":{"label":"Billing","description":"Manage subscriptions and invoices"},"SALES":{"label":"Sales","description":"Create and manage tenants"},"SUPER_ADMIN":{"label":"Super Admin","description":"Full access to everything"}},"dashboardPage":{"title":"Staff Dashboard","description":"Manage tenants, subscriptions, and invoices","totalTenants":"Total Tenants","active":"Active","pendingInvoices":"Pending Invoices","mrr":"MRR (VND)","quickActions":"Quick Actions","createNewTenant":"Create New Tenant","onboardCustomer":"Onboard a new customer","createInvoice":"Create Invoice","generateBilling":"Generate billing for a tenant","recentTenants":"Recent Tenants","noTenantsYet":"No tenants yet. Create your first one!"},"settingsPage":{"title":"System Settings","description":"Manage your ops portal configuration","invoiceSettings":"Invoice Settings","invoiceSettingsDesc":"Company info, bank details, VietQR, and payment instructions for invoices","staffManagement":"Staff Management","staffManagementDesc":"Manage staff accounts, roles, and permissions"},"toasts":{"statusUpdated":"Status Updated","statusUpdatedDesc":"Tenant status changed to {{status}}","tenantActivated":"Tenant Activated","tenantActivatedDesc":"{{name}} has been activated successfully","subscriptionSuspended":"Subscription Suspended","subscriptionReactivated":"Subscription Reactivated","cancellationScheduled":"Cancellation scheduled for {{date}}","cancellationEndOfPeriod":"the end of the current period","invoicePaid":"Invoice Paid","invoiceSent":"Invoice Sent","invoiceCancelled":"Invoice Cancelled","invoiceCreated":"Invoice Created","invoiceCreatedDesc":"Invoice {{number}} created successfully","settingsSaved":"Settings Saved","settingsSavedDesc":"Invoice settings have been updated","staffDeactivated":"Staff Deactivated","staffUpdated":"Staff Updated","passwordReset":"Password reset for {{email}}","invitationSent":"Invitation Sent","invitationSentDesc":"An invitation email has been sent","invoiceMarkedPaid":"Invoice Marked as Paid","ownerPasswordReset":"Owner password reset","ownerPasswordResetDesc":"New temp password generated for {{email}}."},"cancel":"Cancel"},"staff":{"title":"Staff Portal","tenants":"Tenants","invoices":"Invoices","support":"Support"},"validation":{"required":"This field is required","email":"Please enter a valid email","minLength":"Must be at least {{min}} characters","maxLength":"Must be at most {{max}} characters","passwordMismatch":"Passwords do not match"},"hr":{"title":"Human Resources","description":"Manage employees, departments, attendance, and payroll","hubHelpIntro":"The HR hub links every people-management area in one place. Pick a module to get started.","hubHelpStep1":"Open Employees to add staff and keep their records current.","hubHelpStep2":"Use Departments to group employees by function.","hubHelpStep3":"Track Attendance and review Leave requests for your team.","hubHelpTip1":"Modules marked Coming Soon are not enabled yet for your deployment.","employeesHelpIntro":"The employee directory lists everyone who works at your company. Search, filter, and open a profile from here.","employeesHelpStep1":"Click Add Employee to create a new staff record.","employeesHelpStep2":"Filter by department or status to narrow the list.","employeesHelpStep3":"Click any row to open the full employee profile.","employeesHelpTip1":"The summary cards count active, probation, and on-leave employees.","departmentsHelpIntro":"Departments group employees by function so you can organize and report on your team.","departmentsHelpStep1":"Review the list of existing departments and their codes.","departmentsHelpStep2":"Check the active status badge to see which departments are in use.","departmentsHelpTip1":"Each department shows its Vietnamese name when one is set.","attendanceHelpIntro":"Attendance shows clock-ins, clock-outs, and working hours for your team.","attendanceHelpStep1":"Use the clock in or clock out button to record today's attendance.","attendanceHelpStep2":"Review the attendance log for past working days.","attendanceHelpStep3":"Check the summary cards for total days worked and hours.","attendanceHelpTip1":"Overtime hours are tracked separately from regular hours.","leaveHelpIntro":"Leave requests let staff request time off and managers approve or reject it.","leaveHelpStep1":"Click Request Leave to submit a new time-off request.","leaveHelpStep2":"Pick a leave type, date range, and add a reason.","leaveHelpStep3":"Filter by status to find pending, approved, or rejected requests.","leaveHelpTip1":"Your available leave balance appears in the summary cards.","lateArrivalHelpIntro":"Track and submit requests for late arrivals and early departures.","lateArrivalHelpStep1":"Click New Request to submit a late arrival.","lateArrivalHelpStep2":"Enter the date, expected arrival time, and a reason.","lateArrivalHelpStep3":"Filter by status to review pending or approved requests.","comingSoon":"Coming Soon","employeesDescription":"Browse and manage the people who work at your company.","departmentsDescription":"Organize your company into departments and view their details.","departmentsEmptyTitle":"No departments yet","departmentsEmptyDescription":"Departments group employees by function. Add one to start organizing your team.","attendanceDescription":"Track clock-ins, clock-outs, and working hours for your team.","hoursValue":"{{hours}}h","daysWorked":"Days Worked","clockInLabel":"Clock In: {{time}}","clockOutLabel":"Clock Out: {{time}}","clockingIn":"Clocking In...","clockingOut":"Clocking Out...","notClockedInToday":"You haven't clocked in today.","leaveDescription":"Review, approve, and submit employee leave requests.","lateArrivalDescription":"Review and submit requests for late arrivals and early departures.","columns":"Columns","employees":"Employees","departments":"Departments","attendance":"Attendance","leave":{"lateArrivals":{"title":"Late Arrivals & Early Departures","description":"Manage late arrival and early departure requests","createRequest":"New Request","pending":"Pending","approved":"Approved","lateArrivals":"Late Arrivals","earlyDepartures":"Early Departures","noRequests":"No requests found","requestNumber":"Request #","employee":"Employee","type":"Type","date":"Date","time":"Time","statusLabel":"Status","approve":"Approve","reject":"Reject","requestType":"Request Type","expectedArrival":"Expected Arrival Time","expectedDeparture":"Expected Departure Time","hours":"Hours","reason":"Reason","reasonPlaceholder":"Enter reason for the request...","types":{"lateArrival":"Late Arrival","earlyDeparture":"Early Departure","timeOff":"Time Off"},"status":{"pending":"Pending","approved":"Approved","rejected":"Rejected"},"filter":{"all":"All","pending":"Pending","approved":"Approved","rejected":"Rejected"}},"reports":{"title":"Leave Reports","description":"Generate and view leave reports","helpIntro":"Leave reports summarize time off by employee or by leave type over a date range.","helpStep1":"Choose By Employee or By Leave Type.","helpStep2":"Set a start and end date for the report.","helpStep3":"Click Generate Report to view the results.","helpTip1":"Use Export to download the generated report.","reportType":"Report Type","emptyTitle":"No report yet","byEmployee":"By Employee","byType":"By Leave Type","generate":"Generate Report","startDate":"Start Date","endDate":"End Date","department":"Department","leaveType":"Leave Type","employeeName":"Employee","totalDays":"Total Days","lateCount":"Late Count","earlyCount":"Early Count","totalRequests":"Total Requests","pendingRequests":"Pending","approvedRequests":"Approved","rejectedRequests":"Rejected","noData":"No data for selected period"},"balance":{"title":"Leave Balance","days":"days","used":"Used","pending":"Pending","available":"Available"}},"positions":"Positions","totalEmployees":"Total Employees","activeEmployees":"Active Employees","onLeave":"On Leave","pendingRequests":"Pending Requests","employeeDirectory":"Employee Directory","searchEmployees":"Search employees...","allDepartments":"All Departments","allStatuses":"All Statuses","noEmployees":"No employees found","viewProfile":"View Profile","employeeCode":"Employee Code","fullName":"Full Name","position":"Position","department":"Department","email":"Email","phone":"Phone","hireDate":"Hire Date","status":"Status","addEmployee":"Add Employee","editEmployee":"Edit Employee","clockIn":"Clock In","clockOut":"Clock Out","clockedIn":"Clocked In","clockedOut":"Clocked Out","todayAttendance":"Today's Attendance","myAttendance":"My Attendance","attendanceLog":"Attendance Log","regularHours":"Regular Hours","overtimeHours":"Overtime Hours","lateMinutes":"Late (min)","leaveRequests":"Leave Requests","requestLeave":"Request Leave","leaveBalance":"Leave Balance","leaveType":"Leave Type","startDate":"Start Date","endDate":"End Date","totalDays":"Total Days","reason":"Reason","approve":"Approve","reject":"Reject","noLeaveRequests":"No leave requests found","submitRequest":"Submit Request","selectLeaveType":"Select leave type...","halfDay":"Half day","leaveReasonPlaceholder":"Provide a reason for your leave request...","daysUsed":"Days Used","requestNumber":"Request number","lateArrival":"Late Arrival","expectedArrivalTime":"Expected Arrival Time","requestLateArrival":"Request Late Arrival","lateArrivalsEmptyTitle":"No late arrival requests","lateArrivalsEmptyDescription":"Late arrival and early departure requests appear here. Submit a request to record when you expect to arrive late or leave early.","lateArrivalReasonPlaceholder":"Reason for late arrival...","overtime":"Overtime Requests","overtimeDescription":"Manage overtime work requests and approvals","createOvertimeRequest":"Create Overtime Request","noOvertimeRequests":"No overtime requests found","overtimeType":"Overtime Type","rateMultiplier":"Rate Multiplier","overtimeReasonPlaceholder":"Reason for overtime work...","employeeAccepted":"Accepted","statusLabels":{"probation":"Probation","active":"Active","onLeave":"On Leave","terminated":"Terminated","suspended":"Suspended","pending":"Pending","approved":"Approved","rejected":"Rejected","cancelled":"Cancelled","on_leave":"On Leave"},"modules":{"employees":"Employees","employeesDesc":"Employee directory and profiles","departments":"Departments","departmentsDesc":"Organizational structure","attendance":"Attendance","attendanceDesc":"Time tracking and clock in/out","leave":"Leave Management","leaveDesc":"Leave requests and approvals","payroll":"Payroll","payrollDesc":"Salary processing and payslips"},"employeeDetail":{"documents":"Documents","hiredOn":"Hired","personalInfo":"Personal Information","employmentInfo":"Employment Information","bankingInfo":"Banking Information","insuranceTax":"Insurance & Tax","gender":"Gender","dateOfBirth":"Date of Birth","placeOfBirth":"Place of Birth","nationalId":"National ID","address":"Address","contractType":"Contract Type","contractEnd":"Contract End Date","dependents":"Dependents","bankName":"Bank Name","accountNumber":"Account Number","accountName":"Account Name","socialInsurance":"Social Insurance No.","healthInsurance":"Health Insurance No.","taxCode":"Tax Code","contractHistory":"Contract History","renewContract":"Renew Contract","noContracts":"No contract history recorded","contractNumber":"Contract No.","type":"Type","period":"Period","baseSalary":"Base Salary","department":"Department","status":"Status","renewal":"Renewal","indefinite":"Indefinite","renewalNum":"Renewal #{{num}}","reviewNotes":"Review Notes","vietnamWarning":"Vietnam Labor Code 2019: Next renewal must convert to indefinite-term contract.","renewModalTitle":"Renew Contract","renewModalDesc":"Create a new contract term for","vietnamComplianceWarning":"Vietnam Compliance Warning","vietnamComplianceDesc":"This is the 2nd renewal. Per Labor Code 2019, Art. 20, the next contract must be indefinite-term.","contractTypeLabel":"Contract Type","selectType":"Select...","typeIndefinite":"Indefinite","typeFixed":"Fixed-term (12-36 months)","typeSeasonal":"Seasonal","typePartTime":"Part-time","startDate":"Start Date","endDate":"End Date","baseSalaryVnd":"Base Salary (VND)","reviewNotesLabel":"Review Notes","reviewNotesPlaceholder":"Performance review notes, salary justification...","cancel":"Cancel","renewing":"Renewing...","statusActive":"Active","statusRenewed":"Renewed","statusExpired":"Expired","statusTerminated":"Terminated"},"documents":{"title":"Documents","completionStatus":"Document Completion","requiredCompleted":"required documents uploaded","complete":"Complete","incomplete":"Incomplete","required":"Required","optional":"Optional","documentNo":"Document No.","issueDate":"Issue Date","expiryDate":"Expiry Date","noDocument":"No document uploaded","upload":"Upload","view":"View","replace":"Replace","uploadDocument":"Upload Document","uploadDescription":"Upload a document file (PDF, JPG, PNG)","dropHere":"Drop file here or click to browse","cancel":"Cancel","types":{"id_card":"ID Card / CCCD","contract":"Labor Contract","diploma":"Diploma / Certificate","si_book":"Social Insurance Book","health_cert":"Health Certificate","photo":"Profile Photo"}},"employeeForm":{"personalInfo":"Personal Information","employmentInfo":"Employment Information","bankingTax":"Banking & Tax Information","firstName":"First Name","lastName":"Last Name","gender":"Gender","selectGender":"Select gender","male":"Male","female":"Female","other":"Other","dateOfBirth":"Date of Birth","nationalId":"National ID","address":{"title":"Address","street":"Street Address","streetPlaceholder":"House number, street name","ward":"Ward / Commune","wardPlaceholder":"Phường / Xã","district":"District","districtPlaceholder":"Quận / Huyện","city":"City / Province","cityPlaceholder":"Tỉnh / Thành phố","country":"Country","countries":{"vn":"Vietnam","us":"United States","sg":"Singapore","jp":"Japan","kr":"South Korea","cn":"China","th":"Thailand","my":"Malaysia","id":"Indonesia","ph":"Philippines"}},"selectDepartment":"Select department","selectPosition":"Select position","employeeGroup":"Employee Group","selectGroup":"Select group","contractType":"Contract Type","baseSalary":"Base Salary","dependents":"Number of Dependents","bankName":"Bank Name","accountNumber":"Account Number","accountName":"Account Name","taxCode":"Tax Code","socialInsurance":"Social Insurance No.","healthInsurance":"Health Insurance No.","cancel":"Cancel","createEmployee":"Create Employee","prefix":"Title","selectPrefix":"—","prefixes":{"mr":"Mr.","ms":"Ms.","mrs":"Mrs.","dr":"Dr."},"contractTypes":{"permanent":"Permanent","fixedTerm":"Fixed Term","seasonal":"Seasonal","probation":"Probation"},"errors":{"required":"This field is required","invalidEmail":"Invalid email address","submitFailed":"Failed to create employee. Please try again.","updateFailed":"Failed to update employee. Please try again."},"saveChanges":"Save Changes"},"viewDetails":"View Details","cancel":"Cancel","create":"Create","attendancePeriods":{"title":"Attendance Periods","description":"Manage payroll periods and lock attendance records","helpIntro":"Periods group attendance records by date range so you can lock and finalize them before payroll.","helpStep1":"Click Create Period and set its name and date range.","helpStep2":"Lock an open period to freeze its records.","helpStep3":"Finalize a locked period once records are confirmed.","helpTip1":"Finalizing is permanent and cannot be undone.","createPeriod":"Create Period","periodName":"Period Name","dateRange":"Date Range","employees":"Employees","totalHours":"Total Hours","overtime":"Overtime","totalPeriods":"Total Periods","openPeriods":"Open Periods","lockedPeriods":"Locked Periods","finalizedPeriods":"Finalized Periods","emptyTitle":"No attendance periods yet","emptyDescription":"Periods group attendance records by date range so you can lock and finalize them. Create your first period to begin.","lock":"Lock","unlock":"Unlock","finalize":"Finalize","lockedBy":"Locked by","startDate":"Start Date","endDate":"End Date","confirmFinalize":"Are you sure you want to finalize this period? This action cannot be undone.","status":{"open":"Open","locked":"Locked","finalized":"Finalized"},"confirmFinalizeMessage":"Are you sure you want to finalize this period? Once finalized, attendance records cannot be modified.","loadError":"Failed to load attendance periods","lockError":"Failed to lock period","unlockError":"Failed to unlock period","finalizeError":"Failed to finalize period","createError":"Failed to create period","lockedByLabel":"Locked by: {{name}}","periodNamePlaceholder":"e.g., March 2026"},"attendanceCorrections":{"title":"Attendance Corrections","description":"Review and approve attendance correction requests","helpIntro":"Correction requests let employees fix a clock-in, clock-out, hours, or status. Review them here.","helpStep1":"Use the filter tabs to view pending, approved, or rejected requests.","helpStep2":"Compare the original and requested values before deciding.","helpStep3":"Click Approve, or Reject with a reason.","helpTip1":"A rejection reason is required when you reject a request.","pendingCount":"{{count}} pending","emptyTitle":"No correction requests","emptyDescription":"When employees ask to fix a clock-in, clock-out, or status, their requests show up here for review.","workDate":"Work Date","type":"Type","requested":"Requested","reason":"Reason","reviewedBy":"Reviewed by","rejectionReason":"Rejection Reason","rejectionReasonPlaceholder":"Enter the reason for rejection...","approve":"Approve","reject":"Reject","rejectCorrection":"Reject Correction","confirmReject":"Confirm Rejection","filter":{"all":"All","pending":"Pending","approved":"Approved","rejected":"Rejected"},"status":{"pending":"Pending","approved":"Approved","rejected":"Rejected"},"correctionTypes":{"clockIn":"Clock In Time","clockOut":"Clock Out Time","hours":"Working Hours","status":"Status"},"approveError":"Failed to approve correction request.","loadError":"Failed to load correction requests.","rejectError":"Failed to reject correction request."},"geofences":{"title":"Geofence Zones","description":"Manage location zones for attendance validation","helpIntro":"Geofence zones define where employees may clock in, validating attendance by location.","helpStep1":"Click Add Zone to create a location zone.","helpStep2":"Set the coordinates and radius for the zone.","helpStep3":"Enable strict mode or require a photo for tighter control.","helpTip1":"Toggle a zone inactive to stop validating against it without deleting it.","createZone":"Add Zone","totalZones":"Total Zones","activeZones":"Active Zones","strictZones":"Strict Zones","factories":"Factories","emptyTitle":"No geofence zones yet","emptyDescription":"Geofence zones define where employees can clock in. Add your first zone to start validating attendance by location.","loadError":"Failed to load geofence zones.","createError":"Failed to create zone.","zoneCode":"Zone Code","zoneType":"Zone Type","nameEn":"Name (English)","nameVi":"Name (Vietnamese)","latitude":"Latitude","longitude":"Longitude","radius":"Radius","radiusMeters":"Radius (m)","coordinates":"{{lat}}, {{lng}}","address":"Address","strictMode":"Strict Mode","requirePhoto":"Require Photo","strict":"Strict","flexible":"Flexible","photo":"Photo","active":"Active","inactive":"Inactive","confirmDelete":"Are you sure you want to delete this zone?","confirmDeleteMessage":"Are you sure you want to delete this geofence zone? This action cannot be undone.","photoRequired":"Photo Required"},"shifts":{"calendar":{"title":"Shift Calendar","description":"Weekly shift scheduling and management","assignShift":"Assign Shift","employee":"Employee","today":"Today","selectShift":"Select Shift","notes":"Notes","notesPlaceholder":"Add notes (overtime, special instructions)...","emptyTitle":"No employees yet","emptyDescription":"Add employees to start assigning weekly shifts.","selectEmployeePlaceholder":"Select employee...","date":"Date","helpIntro":"The shift calendar shows who is working which shift each day of the week. Assign shifts to employees directly from the grid.","helpStep1":"Use the arrows to move between weeks, or press Today to jump back to the current week.","helpStep2":"Click an empty cell or Assign shift to schedule an employee for a date.","helpStep3":"Pick the employee, date and shift in the dialog, then save to add it to the calendar.","helpTip1":"The colored legend at the top maps each shift to its time range so the grid stays readable."},"swap":{"title":"Shift Swaps","description":"Manage shift exchange requests","request":"Request Swap","pending":"Pending","approved":"Approved","requestNumber":"Request number","requester":"Requester","target":"Target","reason":"Reason","requestedOn":"Requested On","totalSwaps":"Total Swaps","noSwaps":"No swap requests found","searchPlaceholder":"Search swap requests…","approve":"Approve","reject":"Reject","status":{"pending_target":"Awaiting Partner","pending_manager":"Awaiting Manager","approved":"Approved","rejected":"Rejected","cancelled":"Cancelled"},"filter":{"all":"All","pending":"Pending","approved":"Approved","rejected":"Rejected"},"emptyTitle":"No swap requests","helpIntro":"Shift swaps let two employees trade their assigned shifts, with approval before the change takes effect.","helpStep1":"Use the filter tabs to focus on pending, approved or rejected swaps.","helpStep2":"Review the requester and target shifts side by side for each request.","helpStep3":"Approve or reject requests that are waiting on a manager decision."},"mySchedule":{"title":"My Schedule","description":"View your assigned shifts for the week.","shiftsThisWeek":"Shifts This Week","totalHours":"Total Hours","pendingSwaps":"Pending Swaps","today":"Today","swapPending":"Swap Pending","requestSwap":"Request Swap","emptyTitle":"No shifts this week","emptyDescription":"You have no shifts scheduled for this week.","helpIntro":"My schedule lists the shifts you are assigned to for the selected week.","helpStep1":"Use the week arrows to review past or upcoming shifts.","helpStep2":"Check the summary cards for your shift count, total hours and pending swaps.","helpStep3":"Use Request swap on any shift to ask a colleague to take it."}},"recruitment":{"jobs":{"title":"Job Requisitions","description":"Manage open positions and hiring requests","create":"New Requisition","openPositions":"Open Positions","totalApplicants":"Total Applicants","filled":"Filled","noJobs":"No job requisitions found","avgTimeToFill":"Avg. Time to Fill","days":"days","applicants":"applicants","positions":"positions","positionsFilled":"filled","filterAll":"All","filterOpen":"Open","filterFilled":"Filled","filterDraft":"Draft","searchPlaceholder":"Search requisitions...","detail":"Requisition Details","approve":"Approve & Open","hold":"Put On Hold","cancel":"Cancel Requisition","createTitle":"New Job Requisition","editTitle":"Edit Requisition","formTitle":"Job Title","formTitlePlaceholder":"e.g. Production Supervisor","formDepartment":"Department","formPosition":"Position (Optional)","formLocation":"Location","formLocationPlaceholder":"e.g. Ho Chi Minh City","formEmploymentType":"Employment Type","formPositionsRequested":"Positions Needed","formSalaryRange":"Salary Range","formSalaryMin":"Min","formSalaryMax":"Max","formDescription":"Job Description","formRequirements":"Requirements","formBenefits":"Benefits","formPriority":"Priority","formPriorityNormal":"Normal","formPriorityHigh":"High","formPriorityUrgent":"Urgent","formTargetDate":"Target Start Date","formInternalOnly":"Internal Only","formSubmit":"Create Requisition","formSave":"Save Changes","created":"Requisition created successfully","updated":"Requisition updated successfully","statusChanged":"Status updated successfully","emptyTitle":"No job requisitions","selectPlaceholder":"— Select —","salaryRangeVnd":"Salary Range (VND)","helpIntro":"Job postings are the open roles you are hiring for, each tracking its status and applicant count.","helpStep1":"Use Create to open a new job posting with department, location and salary range.","helpStep2":"Search and filter the list by status to find draft, open or filled roles.","helpStep3":"Move a posting through its lifecycle with Approve, Hold and Filled actions.","helpTip1":"Mark a posting internal only to limit it to current employees."},"applicants":{"title":"Applicants","description":"Track and manage job candidates","search":"Search applicants...","noApplicants":"No applicants found","add":"Add Applicant","addTitle":"Add New Applicant","formFirstName":"First Name","formLastName":"Last Name","formEmail":"Email Address","formPhone":"Phone Number","formRequisition":"Job Requisition","formSource":"Source","formCurrentCompany":"Current Company","formCurrentTitle":"Current Job Title","formYearsExperience":"Years of Experience","formExpectedSalary":"Expected Salary","formAvailableDate":"Available Start Date","formNotes":"Notes","formSubmit":"Add Applicant","created":"Applicant added successfully","stageChanged":"Stage updated successfully","moveStage":"Move Stage","pipeline":"Pipeline","emptyTitle":"No applicants","selectPlaceholder":"— Select —","cancel":"Cancel","currentRole":"{{title}} at {{company}}","helpIntro":"Applicants move through a hiring pipeline from new to hired, one stage at a time.","helpStep1":"Use Add to register a new applicant against an open job posting.","helpStep2":"Click a pipeline stage to filter applicants currently at that stage.","helpStep3":"Advance an applicant to the next stage, or mark them rejected, from the row actions.","helpTip1":"Use the email and phone icons to contact an applicant directly."},"stages":{"new":"New","screening":"Screening","phone_interview":"Phone Interview","technical_interview":"Technical Interview","final_interview":"Final Interview","reference_check":"Reference Check","offer":"Offer","hired":"Hired","rejected":"Rejected","withdrawn":"Withdrawn"},"sources":{"website":"Website","referral":"Referral","job_board":"Job Board","linkedin":"LinkedIn","agency":"Agency","university":"University","internal":"Internal","other":"Other"},"statuses":{"draft":"Draft","pending_approval":"Pending Approval","approved":"Approved","open":"Open","on_hold":"On Hold","filled":"Filled","cancelled":"Cancelled"},"employmentTypes":{"full_time":"Full-time","part_time":"Part-time","contract":"Contract","internship":"Internship","temporary":"Temporary"}},"payroll":{"title":"Payroll","description":"Process salaries and manage payslips","helpIntro":"Payroll periods cover one pay cycle each. Create a period, run payroll, then review the results.","helpStep1":"Click Create Period and choose its month and year.","helpStep2":"Run payroll on an open period to calculate salaries.","helpStep3":"Open a period to review payslips and totals.","helpTip1":"Use the year and status filters to find a specific period.","myPayslipsHelpIntro":"My Payslips shows your own salary history for the selected year.","myPayslipsHelpStep1":"Choose a year from the selector to load its payslips.","myPayslipsHelpStep2":"Open a payslip to see gross pay, deductions, and net salary.","myPayslipsHelpTip1":"Payslips appear only after payroll is run for a period.","periods":"Payroll Periods","createPeriod":"Create Period","createPeriodTitle":"Create Payroll Period","emptyTitle":"No payroll periods yet","emptyDescription":"A payroll period covers one pay cycle. Create your first period to run payroll and generate payslips.","periodCode":"Period Code","periodName":"Period Name","month":"Month","year":"Year","workingDays":"Working Days","paymentDate":"Payment Date","startDate":"Start Date","endDate":"End Date","notes":"Notes","totalGross":"Total Gross","totalNet":"Total Net","totalEmployerCost":"Total Employer Cost","employeesProcessed":"Employees Processed","pendingApproval":"Pending Approval","runPayroll":"Run Payroll","runPayrollConfirm":"This will calculate payroll for all active employees. Continue?","runPayrollSuccess":"Payroll calculated successfully","approve":"Approve","reject":"Reject","finalize":"Finalize","approveConfirm":"Approve this payroll period? This action cannot be undone.","rejectReason":"Rejection Reason","finalizeConfirm":"Finalize payroll? This permanently marks all payslips as paid.","approvedSuccess":"Payroll period approved","rejectedSuccess":"Payroll period rejected","finalizedSuccess":"Payroll period finalized","payslips":"Payslips","payslipDetail":"Payslip Detail","earnings":"Earnings","deductions":"Deductions","netSalary":"Net Salary","basicSalary":"Basic Salary","allowances":"Allowances","totalAllowances":"Total Allowances","overtimeHours":"Overtime Hours","overtimePay":"Overtime Pay","nightHours":"Night Shift Hours","nightPay":"Night Shift Pay","bonuses":"Bonuses","totalBonuses":"Total Bonuses","grossSalary":"Gross Salary","siBase":"SI Contribution Base","bhxhEmployee":"BHXH (Social Insurance) - Employee","bhytEmployee":"BHYT (Health Insurance) - Employee","bhtnEmployee":"BHTN (Unemployment Insurance) - Employee","totalSiEmployee":"Total Employee SI","pitDeductionPersonal":"PIT Personal Deduction","pitDeductionDependents":"PIT Dependent Deduction","numDependents":"Number of Dependents","taxableIncome":"Taxable Income","pitAmount":"Personal Income Tax (PIT)","totalDeductions":"Total Deductions","employerCosts":"Employer Costs","bhxhEmployer":"BHXH - Employer (17.5%)","bhytEmployer":"BHYT - Employer (3%)","bhtnEmployer":"BHTN - Employer (1%)","totalSiEmployer":"Total Employer SI","calculatedAt":"Calculated At","myPayslips":"My Payslips","myPayslipsDesc":"View your salary history","myPayslipsEmptyTitle":"No payslips yet","myPayslipsEmptyDescription":"Your payslips appear here once payroll is run for a period. Try selecting a different year.","noPayslips":"No payslips found","components":{"title":"Salary Components","description":"Configure earnings and deductions","helpIntro":"Salary components are the reusable earnings and deductions that make up a payslip.","helpStep1":"Click Create Component to add an earning or deduction.","helpStep2":"Set its calculation type and default amount.","helpStep3":"Mark whether it is taxable and subject to social insurance.","helpTip1":"System components are built in and cannot be removed.","create":"Create Component","code":"Code","name":"Name","nameVi":"Name (Vietnamese)","type":"Type","calculationType":"Calculation Type","defaultAmount":"Default Amount","defaultPercentage":"Default %","isTaxable":"Taxable","isSiApplicable":"SI Applicable","isSystem":"System","isActive":"Active","earning":"Earning","deduction":"Deduction","fixed":"Fixed Amount","percentage":"Percentage","formula":"Formula","emptyTitle":"No salary components yet","emptyDescription":"Salary components are the earnings and deductions that make up a payslip. Add your first component to start building payroll."},"periodStatuses":{"open":"Open","processing":"Processing","pending":"Pending Approval","approved":"Approved","finalized":"Finalized","cancelled":"Cancelled"},"itemStatuses":{"draft":"Draft","calculated":"Calculated","verified":"Verified","approved":"Approved","paid":"Paid","cancelled":"Cancelled"},"allStatuses":"All Statuses","viewPeriod":"View Period","employeeCode":"Code","employeeName":"Employee","department":"Department"},"onboarding":{"title":"Onboarding Dashboard","description":"Track new employee onboarding progress","inProgress":"In Progress","completed":"Completed","upcoming":"Upcoming","activeOnboarding":"Active Onboarding","noOnboarding":"No employees currently onboarding","emptyTitle":"No active onboarding","totalThisMonth":"Total This Month","taskCategories":"Task Categories","pendingTasks":"{{count}} pending tasks","tasksProgress":"{{completed}}/{{total}} tasks","buddy":"Buddy","startDate":"Start","statuses":{"not_started":"Not Started","in_progress":"In Progress","completed":"Completed","overdue":"Overdue"},"categories":{"documentation":"Documentation","it_setup":"IT Setup","training":"Training","introduction":"Introductions"},"helpIntro":"Onboarding tracks each new hire through their setup tasks until they are fully ready to work.","helpStep1":"Review the summary cards for in progress, completed and upcoming onboardings.","helpStep2":"Open a task category to see the documentation, IT setup, training and introduction tasks.","helpStep3":"Follow each employee progress bar to see how many tasks are done."},"reports":{"title":"HR Reports","description":"Generate and export HR reports for analysis and compliance","quickStats":"Quick Overview","quickStatsDescription":"Current workforce status at a glance","allReports":"All Reports","categories":{"general":"General","vietnam":"Vietnam","us":"US"},"stats":{"employees":"Employees","attendance":"Attendance","onLeave":"On Leave"},"helpIntro":"HR reports generate standard documents and statutory forms for Vietnam, the US and general use.","helpStep1":"Filter the templates by category to find the report you need.","helpStep2":"Choose a report and click the format button to generate and download it.","helpTip1":"Vietnam forms such as D02-TS and the PIT declaration follow local statutory layouts."},"settings":{"title":"HR Settings","description":"Configure departments, positions, holidays, and policies","quickStats":"Quick Overview","addDepartment":"Add Department","addPosition":"Add Position","modules":{"departments":{"title":"Departments","description":"Manage organizational structure and hierarchy"},"positions":{"title":"Positions & Titles","description":"Job titles with salary grades"},"holidays":{"title":"Holiday Calendar","description":"Company-wide holidays and observances"},"compensation":{"title":"Compensation Rules","description":"Overtime rates and shift differentials"},"leavePolicies":{"title":"Leave Policies","description":"Leave types and entitlements"},"schedules":{"title":"Work Schedules","description":"Shift templates and working hours"},"employeeOptions":{"title":"Employee Options","description":"Contract types, skill categories, and allowance types"}},"stats":{"departments":"Departments","positions":"Positions","holidays":"Holidays","shifts":"Shifts","salaryGrades":"Salary Grades","shiftTemplates":"Shift Templates","activeShifts":"Active Shifts","employeesScheduled":"Employees Scheduled","totalHolidays":"Total Holidays","recurring":"Recurring","paidHolidays":"Paid Holidays","leaveTypes":"Leave Types","annualEntitlement":"Annual Entitlement","maxCarryover":"Max Carryover","sickLeave":"Sick Leave"},"departments":{"topLevel":"Top Level","subDepartments":"Sub-departments","nameEn":"Name (EN)","vietnameseName":"Vietnamese Name","code":"Code","parentDepartment":"Parent Department","description":"Description","createDepartment":"Create Department","editDepartment":"Edit Department","searchPlaceholder":"Search departments...","emptyTitle":"No departments yet","emptyDescription":"Add your first department to build the organizational structure.","helpIntro":"Departments organize your company into a hierarchy that other HR records reference.","helpStep1":"Use Add department to create a department with a name, code and optional parent.","helpStep2":"Expand a department to see its sub departments in the tree.","helpStep3":"Edit or delete a department from the actions on each row."},"positions":{"searchPlaceholder":"Search positions...","allDepartments":"All Departments","position":"Position","department":"Department","salaryGrade":"Salary Grade","salaryRange":"Salary Range","employees":"Employees","positionNameEn":"Position Name (EN)","vietnameseName":"Vietnamese Name","code":"Code","minSalary":"Min Salary","maxSalary":"Max Salary","cancel":"Cancel","createPosition":"Create Position","emptyTitle":"No positions found","emptyDescription":"Click \"Add Position\" to create your first position.","salaryFrom":"From {{amount}}","salaryUpTo":"Up to {{amount}}","description":"Define job titles, levels, and salary ranges across the company.","helpIntro":"Positions are the job titles employees can hold, each with a level, grade and salary range.","helpStep1":"Use Add position to create a position with a title, code and level.","helpStep2":"Search the list to find a position by title or code.","helpStep3":"Click a row to edit it, or use the row actions to edit or delete.","helpTip1":"Set a salary range so it appears on the position and guides offers."},"schedules":{"addShift":"Add Shift","addShiftTemplate":"Add Shift Template","start":"Start","end":"End","working":"Working","minBreak":"{{minutes}} min break","employeeCount":"{{count}} employees","shiftNameEn":"Shift Name (EN)","vietnameseName":"Vietnamese Name","code":"Code","startTime":"Start Time","endTime":"End Time","breakDuration":"Break Duration (minutes)","color":"Color","colorAmber":"Amber (Morning)","colorOrange":"Orange (Afternoon)","colorIndigo":"Indigo (Night)","colorBlue":"Blue (Office)","nightShifts":"Night Shifts","nightShift":"Night Shift","editShift":"Edit Shift","breakLabel":"Break","cancel":"Cancel","description":"Create and manage shift templates and working hours.","emptyTitle":"No shifts configured","emptyDescription":"Add your first shift template to start scheduling.","helpIntro":"Schedules define the shift templates employees can be assigned, with their hours and break time.","helpStep1":"Use Add shift to create a shift template with start, end and break times.","helpStep2":"Mark a template as a night shift when it spans overnight hours.","helpStep3":"Edit or delete a shift template from the actions on each card.","helpTip1":"Working hours are calculated from the start, end and break you enter."},"holidays":{"addHoliday":"Add Holiday","list":"List","calendar":"Calendar","noHolidays":"No holidays","pay":"{{rate}}% Pay","recurring":"Recurring","nameEn":"Name (EN)","vietnameseName":"Vietnamese Name","date":"Date","compensationRate":"Compensation Rate","rateHoliday":"300% (Holiday)","rateWeekend":"200% (Weekend)","rateOvertime":"150% (Overtime)","recurringAnnual":"Recurring (Annual)","paidHoliday":"Paid Holiday","cancel":"Cancel","description":"Manage company-wide holidays and their pay rates.","helpIntro":"Holidays define the public holidays each year and the pay rate that applies when employees work them.","helpStep1":"Use the year arrows to view holidays for a different year.","helpStep2":"Switch between list and calendar views to suit how you want to scan them.","helpStep3":"Use Add holiday to record a new holiday with its date and pay rate.","helpTip1":"Mark a holiday recurring so it repeats automatically each year."},"leavePolicies":{"addLeaveType":"Add Leave Type","defaultDays":"Default Days","maxCarryover":"Max Carryover","accrual":"Accrual","accrualMonthly":"Monthly Accrual","accrualYearly":"Yearly Grant","accrualNone":"As Needed","paid":"Paid","unpaid":"Unpaid","requiresApproval":"Requires Approval","nameEn":"Name (EN)","vietnameseName":"Vietnamese Name","code":"Code","accrualType":"Accrual Type","paidLeave":"Paid Leave","cancel":"Cancel","days":"days","description":"Define leave types, entitlements, and accrual rules.","helpIntro":"Leave policies define the leave types employees can take, with their entitlement, carryover and accrual rules.","helpStep1":"Review each leave type card for its default days, carryover limit and accrual method.","helpStep2":"Use Add leave type to create a new policy with a name, code and rules.","helpStep3":"Edit or remove a leave type from the actions on each card.","helpTip1":"Mark whether a leave type is paid and whether it requires approval."},"compensation":{"saveChanges":"Save Changes","overtimeRates":"Overtime Rates (Vietnam Labor Code)","workType":"Work Type","dayRate":"Day Rate","nightRate":"Night Rate","weekdayOvertime":"Weekday Overtime","weekend":"Weekend","publicHoliday":"Public Holiday","nightShiftDifferential":"Night Shift Differential","startTime":"Start Time","endTime":"End Time","differential":"Differential","nightShiftDescription":"Workers receive an additional {{percent}}% of their normal hourly rate for hours worked between {{start}} and {{end}}.","regionalMinimumWages":"Regional Minimum Wages (2025)","minimumWagesDescription":"Minimum wages are set by the Vietnam Government and apply to social insurance contribution caps (20x minimum wage).","description":"Configure overtime rates, night-shift differentials, and regional minimum wages.","helpIntro":"Compensation rules define overtime rates, the night shift differential and regional minimum wages.","helpStep1":"Adjust the overtime percentages for weekday, weekend and public holiday work.","helpStep2":"Set the night shift window and its differential percentage.","helpStep3":"Save changes to apply the new rates to payroll calculations.","helpTip1":"Regional minimum wages follow the four Vietnam wage regions."},"settingsHubHelpIntro":"HR settings is the hub for the reference data that drives the HR module: departments, positions, holidays, pay rules and more.","settingsHubHelpStep1":"Pick a settings card to open and manage that area of configuration.","settingsHubHelpStep2":"Set up departments and positions first, since other records reference them.","settingsHubHelpTip1":"The quick stats show how many of each record currently exist."},"common":{"save":"Save","cancel":"Cancel","delete":"Delete","edit":"Edit","add":"Add","update":"Update","active":"Active","inactive":"Inactive","saved":"Saved","saveChanges":"Save Changes","addOption":"Add Option","editOption":"Edit Option","selectRole":"Select a role...","noneTopLevel":"None (Top Level)","confirmDeleteGeneric":"Are you sure you want to delete this item?","confirmDeleteRecord":"Delete this record?","failedToSave":"Failed to save. Please try again.","failedToCreate":"Failed to create. Please try again.","failedToUpdate":"Failed to update. Please try again.","failedToDelete":"Failed to delete. Please try again.","failedToGrantAccess":"Failed to grant access","failedToAdd":"Failed to add","confirmDeleteDepartment":"Are you sure you want to delete this department?","confirmDeletePosition":"Are you sure you want to delete this position?","confirmDeleteShift":"Are you sure you want to delete this shift?","positionLevels":{"intern":"Intern","junior":"Junior","mid":"Mid","senior":"Senior","lead":"Lead","manager":"Manager","director":"Director"},"educationDegrees":{"high_school":"High School","vocational":"Vocational","associate":"Associate","bachelor":"Bachelor","master":"Master","doctorate":"Doctorate","certificate":"Certificate","other":"Other"},"skillProficiency":{"beginner":"Beginner","intermediate":"Intermediate","advanced":"Advanced","expert":"Expert"},"placeholders":{"universityName":"University/School name","companyName":"Company name","jobTitle":"Software Engineer","responsibilities":"Key responsibilities...","skillCategory":"Technical","certificationName":"Certification name","searchDepartments":"Search departments...","optionalDescription":"Optional description..."},"loading":"Loading..."},"employeeOptionsPage":{"title":"Employee Options","description":"Manage dropdown options used across employee forms. Changes apply to all forms.","tabs":{"contract_types":"Contract Types","skill_categories":"Skill Categories","allowance_types":"Allowance Types","degree_types":"Degree Types"},"optionsConfigured":"{{count}} options configured","addOption":"Add Option","editOption":"Edit Option","value":"Value (system key)","valuePlaceholder":"e.g. full_time","labelEn":"Label (English)","labelVi":"Label (Vietnamese)","active":"Active","inactive":"Inactive","save":"Save","cancel":"Cancel","update":"Update","saveChanges":"Save Changes","saved":"Saved","deleteConfirm":"Delete \"{{name}}\"?","failedToSave":"Failed to save. Please try again.","breadcrumb":{"hr":"Human Resources","settings":"HR Settings","employeeOptions":"Employee Options"},"emptyTitle":"No options yet","emptyDescription":"Add an option to populate this employee form dropdown.","valueAutoHint":"(auto-generated if empty)","helpIntro":"Employee options manage the dropdown lists used across employee records, such as contract types and degrees.","helpStep1":"Switch tabs to choose which list of options you want to edit.","helpStep2":"Add, edit or reorder options, then toggle each one active or inactive.","helpStep3":"Click Save changes to persist your edits.","helpTip1":"Each option needs an English and a Vietnamese label so it displays in both locales."},"pending":"Pending","approved":"Approved","actions":"Actions","all":"All","attendanceDevices":{"gatewayBadge":{"devicesCount":"{{count}} devices","online":"Gateway online","stale":"Gateway stale","offline":"Gateway offline"}},"attendanceImport":{"helpIntro":"Import attendance punches from a Wise Eye or Ronald Jack Excel file in three steps.","helpStep1":"Upload the Excel file to generate a preview. Nothing is saved yet.","helpStep2":"Review the preview tallies and resolve any errors.","helpStep3":"Click Commit to write the accepted punches.","helpTip1":"Re-importing the same file is safe and skips duplicates.","commit":"Commit","commitDisabled":"Resolve all errors before committing.","description":"Import punches from a Wise Eye or Ronald Jack Excel file.","dropZone":"Drag and drop an Excel file here, or click to browse.","step":{"confirm":"Confirm","preview":"Preview","upload":"Upload"},"stepLabel":"{{n}}. {{label}}","strategyDetected":"Detected format: {{strategy}}","summary":{"accepted":"{{count}} accepted","duplicate":"{{count}} duplicate","errors":"{{count}} errors","unmapped":"{{count}} unmapped"},"title":"Import Attendance"},"attendancePunches":{"helpIntro":"The punch log is the raw clock-in and clock-out stream from attendance devices.","helpStep1":"Filter by device, employee, or time range to find a punch.","helpStep2":"Toggle mapped versus unmapped to spot punches with no employee.","helpTip1":"Use this log to debug why a clock-in did not appear in attendance.","columns":{"biometricId":"Biometric ID","device":"Device","employee":"Employee","punchAt":"Punch Time","punchType":"Punch Type","source":"Source"},"description":"Raw punch stream from attendance devices.","emptyTitle":"No punches yet","emptyDescription":"Punches appear here as soon as attendance devices send clock-in and clock-out events.","title":"Punch Log"},"balance":"Balance","days":"Days","delete":"Delete","loadError":"Failed to load employee.","loading":"Loading...","employee":"Employee","date":"Date","time":"Time","hours":"Hours","rate":"Rate","accept":"Accept","overtimeStatus":{"PENDING":"Pending","ACCEPTED":"Accepted","REJECTED":"Rejected","APPROVED":"Approved","CANCELLED":"Cancelled"},"leaveStatus":{"PENDING":"Pending","APPROVED":"Approved","REJECTED":"Rejected","CANCELLED":"Cancelled"},"total":"Total","createdAt":"Created","lateArrivalCreateError":"Failed to create late arrival request","leaveCreateError":"Failed to create leave request","lateArrivalStatus":{"PENDING":"Pending","APPROVED":"Approved","REJECTED":"Rejected"},"attendanceDate":"Date","noAttendanceRecords":"No attendance records found","attendanceStatus":{"CLOCKED_IN":"Clocked In","CLOCKED_OUT":"Clocked Out","ABSENT":"Absent","LEAVE":"On Leave","HOLIDAY":"Holiday","ADJUSTED":"Adjusted"},"overtimeForm":{"employee":"Employee","selectEmployeePlaceholder":"Select employee...","shift":"Shift","noShift":"No shift","date":"Date","start":"Start","end":"End","hours":"Hours","types":{"BEFORE_SHIFT":"Before Shift","AFTER_SHIFT":"After Shift","DAY_OFF":"Day Off / Weekend","HOLIDAY":"Holiday"},"rates":{"weekday":"1.5x (Weekday)","weekend":"2.0x (Weekend)","holiday":"3.0x (Holiday)"}},"overtimeHelpIntro":"Overtime requests track extra hours worked beyond a normal shift, including the rate multiplier that applies.","overtimeHelpStep1":"Use Create overtime request to log the employee, date, time range and hours.","overtimeHelpStep2":"The employee accepts or rejects the request before it goes to a manager.","overtimeHelpStep3":"A manager approves accepted requests so the hours flow into payroll.","overtimeHelpTip1":"Pick the rate multiplier that matches the day: weekday, weekend or holiday."},"profile":{"title":"My Profile","description":"Manage your personal information and account settings","personalInfo":"Personal Information","firstName":"First Name","lastName":"Last Name","phone":"Phone","email":"Email","saveProfile":"Save Profile","saving":"Saving...","language":"Language Preference","languageDescription":"Select your preferred language. This will change the interface language.","langEnglish":"English","langVietnamese":"Tiếng Việt","changePassword":"Change Password","passwordDescription":"Ensure your account is using a strong password for security.","currentPassword":"Current Password","newPassword":"New Password","confirmPassword":"Confirm New Password","minChars":"Minimum 8 characters","updatePassword":"Update Password","passwordMismatch":"New passwords do not match","passwordTooShort":"Password must be at least 8 characters","passwordChangeFailed":"Failed to change password","toasts":{"profileSaved":"Profile Updated","profileUpdated":"Your profile information has been saved.","passwordChanged":"Password Changed","passwordUpdated":"Your password has been updated successfully."},"helpIntro":"Update your personal profile, interface language, and account password.","helpStep1":"Edit your name and phone, then save the profile.","helpStep2":"Choose your interface language.","helpStep3":"Change your password under Change password.","helpTip1":"Your email address is fixed and cannot be edited here."},"pendingActivation":{"title":"Account Pending Activation","description":"Your account has been created but is not yet active. Please complete your payment to activate your account and unlock all features.","needHelp":"Need assistance?","contactInfo":"Contact your account manager or email","statusBadge":"Awaiting payment verification"},"notifications":{"title":"Notifications","markAllRead":"Mark all as read","noNotifications":"No notifications","viewAll":"View all notifications","missedClockIn":"Missed Clock-In","missedClockInMessage":"{{name}} has not clocked in for {{shift}} shift (scheduled {{time}})","leaveApproved":"Leave Approved","leaveRejected":"Leave Rejected","leaveRequested":"New Leave Request","attendanceCorrection":"Attendance Correction","system":"System Notification","events":{"accounting_bill_match_variance":{"title":"Bill {{bill_number}} has match variances","message":"{{line_count}} line(s) differ from the PO or receipt. Resolve them before approving."},"hr_attendance_missed_clock_in":{"title":"Missed clock-in: {{employee_name}}","message":"{{employee_name}} has not clocked in for the {{shift}} shift (scheduled {{time}})."},"inventory_btp_created":{"title":"Semi-finished surplus available — {{btp_code}}","message":"Surplus stock {{btp_code}} was captured and is available to planning."},"inventory_btp_reinspect_due":{"title":"Semi-finished lot {{btp_code}} re-inspection due in {{days}} day(s)","message":"Surplus lot {{btp_code}} is due for re-inspection on {{due_date}}."},"inventory_btp_reinspect_overdue":{"title":"Semi-finished lot {{btp_code}} re-inspection overdue","message":"Surplus lot {{btp_code}} passed its re-inspection date ({{due_date}})."},"inventory_grn_posted":{"title":"Receipt {{grn_number}} posted","message":"{{line_count}} line(s) received. Goods receipt {{grn_number}} is now posted."},"inventory_grn_qc_failed":{"title":"QC failed — {{grn_number}}","message":"A QC inspection on goods receipt {{grn_number}} failed. Open the receipt to review."},"inventory_inbound_delivery_scheduled":{"title":"Incoming delivery scheduled — {{notice_number}}","message":"Delivery {{notice_number}} for PO {{po_number}} is expected on {{expected_date}}."},"inventory_lot_expired":{"title":"Lot {{lot_number}} marked expired","message":"Inventory lot {{lot_number}} was manually marked expired."},"inventory_lot_expiring":{"title":"Lot {{lot_number}} expires in {{days}} day(s)","message":"Lot {{lot_number}} expires on {{expiry_date}}. Plan to use or move it."},"inventory_lot_quarantined":{"title":"Lot {{lot_number}} placed in quarantine","message":"Inventory lot {{lot_number}} was placed in quarantine."},"inventory_lot_released":{"title":"Lot {{lot_number}} released","message":"Inventory lot {{lot_number}} was released from quarantine."},"inventory_material_return_submitted":{"title":"Material return {{return_number}} submitted","message":"Material return {{return_number}} was submitted from production. Confirm the receipt."},"inventory_movement_reversed":{"title":"Stock movement reversed","message":"A stock movement was reversed with a compensating entry."},"inventory_putaway_shortfall":{"title":"Putaway closed short — {{ref}}","message":"Putaway task {{ref}} was closed short by {{quantity}}."},"inventory_reservation_drift_repaired":{"title":"Stock reservation drift repaired","message":"The reconciliation job repaired {{count}} reservation total(s) that had drifted."},"inventory_reservation_expired":{"title":"Stock reservations expired","message":"{{count}} of your stock reservation(s) expired and the stock was released."},"inventory_stock_count_variance_review":{"title":"Stock count {{count_number}} needs variance review","message":"Stock count {{count_number}} was completed with variances. Review and approve them."},"inventory_transfer_cancelled":{"title":"Transfer {{transfer_number}} cancelled","message":"Transfer order {{transfer_number}} was cancelled."},"inventory_transfer_in_transit":{"title":"Transfer {{transfer_number}} in transit","message":"Transfer order {{transfer_number}} has shipped and is in transit."},"inventory_transfer_picked":{"title":"Transfer {{transfer_number}} picked","message":"Transfer order {{transfer_number}} was picked and is ready to ship."},"inventory_transfer_received":{"title":"Transfer {{transfer_number}} received","message":"Transfer order {{transfer_number}} was received at the destination."},"production_bom_approved":{"title":"BOM {{sku}} approved","message":"The BOM for {{sku}} was approved."},"production_bom_revision_requested":{"title":"Revision requested on BOM {{sku}}","message":"The BOM for {{sku}} was sent back for changes. Open it to see the note."},"production_bom_submitted":{"title":"BOM {{sku}} needs approval","message":"The BOM for {{sku}} was submitted for approval."},"production_bom_approval_requested":{"title":"{{requester}} requested approval of BOM {{sku}}","message":"Open the BOM to approve it or send it back for changes."},"production_bom_pricing_requested":{"title":"BOM {{sku}} is ready for pricing","message":"Requested by {{requester}}. Open the BOM to add pricing."},"production_bom_final_requested":{"title":"BOM {{sku}} needs final approval","message":"Requested by {{requester}}. Open the BOM to give final approval or send it back."},"production_cost_recalculated":{"title":"Material cost recomputed — {{wo_number}}","message":"The actual material cost of work order {{wo_number}} changed significantly."},"production_material_shortage":{"title":"Material shortage — {{wo_number}}","message":"Work order {{wo_number}} is short of {{count}} component(s)."},"purchasing_asn_received":{"title":"Shipment notice received for PO {{po_number}}","message":"The supplier sent an advance shipment notice for PO {{po_number}}."},"purchasing_bank_change_requested":{"title":"Supplier bank-change request","message":"A supplier requested a change to their bank details. Review it before any payment."},"purchasing_order_approved":{"title":"PO {{po_number}} approved","message":"Purchase order {{po_number}} was approved."},"purchasing_order_late":{"title":"PO {{po_number}} is late","message":"Purchase order {{po_number}} was expected {{due_date}} and is not fully received."},"purchasing_order_rejected":{"title":"PO {{po_number}} rejected","message":"Purchase order {{po_number}} was returned to draft. Open it to see the reason."},"purchasing_order_submitted":{"title":"PO {{po_number}} needs approval","message":"Purchase order {{po_number}} was submitted for approval."},"purchasing_supplier_claim_pending":{"title":"Supplier claim pending — {{return_number}}","message":"Return {{return_number}} needs a claim to be pursued with the supplier."},"quality_supplier_return_raised":{"title":"Defect approved — prepare supplier return","message":"Defect report {{feedback_number}} was approved. Prepare the return to the supplier."},"sales_deal_escalated":{"title":"Deal {{ref}} escalated","message":"Held {{days}} day(s) against a {{sla_days}}-day SLA. Please review."},"sales_order_amended":{"title":"{{so_number}} amended (Amd {{version}})","message":"Sales order {{so_number}} was amended. Check the change before continuing work."},"sales_order_late":{"title":"{{so_number}} past delivery date","message":"Sales order {{so_number}} was due {{due_date}} and is not delivered yet."},"sales_proforma_confirmed":{"title":"PI {{pi_number}} confirmed","message":"Proforma invoice {{pi_number}} was confirmed and is ready to schedule."},"sales_proforma_late":{"title":"PI {{pi_number}} past ETD","message":"ETD {{due_date}} has passed and PI {{pi_number}} has not shipped."},"sales_proforma_revised":{"title":"PI {{pi_number}} revised (Rev {{version}})","message":"Changes: {{changes}}. Check the production schedule."},"sales_quotation_accepted":{"title":"Customer accepted {{quote_number}}","message":"The customer accepted quotation {{quote_number}}. Issue the order number to start the order."},"sales_quotation_approved":{"title":"Quotation {{quote_number}} approved","message":"Quotation {{quote_number}} was approved and can be sent to the customer."},"sales_quotation_changes_requested":{"title":"Changes requested on {{quote_number}}","message":"The approver sent quotation {{quote_number}} back for changes. Open it to see the note."},"sales_quotation_rejected":{"title":"Quotation {{quote_number}} rejected","message":"Quotation {{quote_number}} was closed as rejected."},"sales_quotation_revision_requested":{"title":"Customer asked to revise {{quote_number}}","message":"The customer asked for a revision of quotation {{quote_number}}. Open it to see their note."},"sales_quotation_submitted":{"title":"Quotation {{quote_number}} needs approval","message":"Quotation {{quote_number}} was submitted for approval."},"sales_quotation_submitted_self":{"title":"You submitted {{quote_number}} — you can approve it now","message":"You hold quotation approval rights, so quotation {{quote_number}} is waiting on you. Open it to approve or send it back."},"sales_sample_request_assigned":{"title":"Sample request {{sr_number}} assigned to you","message":"You are now responsible for sample request {{sr_number}}."},"sales_sample_request_created":{"title":"New sample request {{sr_number}}","message":"Sample request {{sr_number}} was created and is waiting to be accepted."},"workflow_subject_completed":{"title":"{{ref}} completed","message":"{{ref}} finished its approval workflow."},"workflow_subject_rejected":{"title":"{{ref}} rejected","message":"{{ref}} was rejected. Open it to see the reason."},"purchasing_rfq_supplier_quoted":{"title":"Quote received for RFQ {{rfq_number}}","message":"A supplier answered RFQ {{rfq_number}} with a quote. Open it to compare."},"purchasing_rfq_supplier_declined":{"title":"Supplier declined RFQ {{rfq_number}}","message":"A supplier will not quote on RFQ {{rfq_number}}. Open it to see the reason."},"purchasing_order_supplier_acknowledged":{"title":"Supplier acknowledged PO {{po_number}}","message":"The supplier has received purchase order {{po_number}}."},"purchasing_order_supplier_confirmed":{"title":"Supplier confirmed PO {{po_number}}","message":"The supplier accepted purchase order {{po_number}} as sent."},"purchasing_order_supplier_change_requested":{"title":"Changes requested on PO {{po_number}}","message":"The supplier asked for changes to purchase order {{po_number}}. Review them, then revise and resend."},"purchasing_order_supplier_rejected":{"title":"Supplier rejected PO {{po_number}}","message":"The supplier cannot accept purchase order {{po_number}}. Open it to see the reason."},"workflow_document_first_viewed":{"title":"{{ref}} was opened","message":"The recipient opened {{ref}} from the link you sent."},"workflow_task_assigned":{"title":"New task: {{ref}}","message":"{{ref}} is waiting for you ({{task_number}})."},"workflow_task_due_soon":{"title":"Due soon: {{ref}}","message":"Task {{task_number}} is due {{due_at}}."},"workflow_task_escalated":{"title":"Escalated to you: {{ref}}","message":"Task {{task_number}} is overdue ({{due_at}}) and was escalated to you."},"workflow_task_overdue":{"title":"Overdue: {{ref}}","message":"Task {{task_number}} passed its due time ({{due_at}})."},"sales_proforma_sent_to_engineering":{"title":"PI {{pi_number}} sent to technical","message":"Sales sent proforma invoice {{pi_number}} for the technical review. Open it to check each line."},"sales_proforma_returned_to_sales":{"title":"PI {{pi_number}} back to sales","message":"Proforma invoice {{pi_number}} came back from the technical review. Open it to see why, edit it, then send it to technical again."}},"legacyTypes":{"MISSED_CLOCK_IN":"Missed clock-in","LEAVE_APPROVED":"Leave approved","LEAVE_REJECTED":"Leave rejected","LEAVE_REQUESTED":"Leave requested","ATTENDANCE_CORRECTION":"Attendance correction","SYSTEM":"System notice","WO_RELEASED":"Work order released","WO_AT_RISK":"Work order at risk","VESSEL_ETD_CHANGED":"Vessel ETD changed","CASCADE_REQUIRES_REVIEW":"Schedule change needs review","SUBSTITUTE_PROPOSED":"Substitute proposed","PERIOD_TRANSFER_PROPOSED":"Period transfer proposed","MACHINE_DOWN_AFFECTING_WO":"Machine down affects a work order","SCHEDULE_PENDING_APPROVAL":"Schedule awaiting approval","SCHEDULE_APPROVED":"Schedule approved","SCHEDULE_REJECTED":"Schedule rejected","MATERIAL_SHORTAGE":"Material shortage","PRODUCTION_SHORTAGE":"Production shortage","SHIPMENT_BOOKED":"Shipment booked","CONTAINER_LOADED":"Container loaded","CONTAINER_GATE_IN":"Container gated in","CUSTOMS_CLEARED":"Customs cleared","BL_RECEIVED":"Bill of lading received","RFQ_AWARDED":"RFQ awarded","PO_PENDING_APPROVAL":"Purchase order awaiting approval","PO_APPROVED":"Purchase order approved","GRN_DISCREPANCY_FLAGGED":"Goods receipt discrepancy","SUPPLIER_RATING_PUBLISHED":"Supplier rating published","FORECAST_RUN_COMPLETED":"Forecast run completed","SUPPLIER_INVITATION_SENT":"Supplier invitation sent","SUPPLIER_QUOTE_SUBMITTED":"Supplier quote submitted","SUPPLIER_PO_ACKNOWLEDGED":"Supplier acknowledged the PO","SUPPLIER_ASN_RECEIVED":"Advance shipping notice received","SUPPLIER_BANK_CHANGE_REQUESTED":"Supplier bank change requested","SUPPLIER_BANK_CHANGE_APPROVED":"Supplier bank change approved","SUPPLIER_BANK_CHANGE_REJECTED":"Supplier bank change rejected","SUPPLIER_USER_INVITED":"Supplier user invited","CUSTOMER_ORDER_CONFIRMED":"Customer order confirmed","CUSTOMER_DELIVERY_SCHEDULED":"Customer delivery scheduled","CUSTOMER_INVOICE_SENT":"Customer invoice sent","CUSTOMER_USER_INVITED":"Customer user invited","STOCK_RESERVATION_DRIFT_DETECTED":"Stock reservation mismatch","RESERVATION_EXPIRED":"Reservation expired","INVENTORY_MOVEMENT_REVERSED":"Stock movement reversed","TRANSFER_ORDER_PICKED":"Transfer order picked","TRANSFER_ORDER_IN_TRANSIT":"Transfer order in transit","TRANSFER_ORDER_RECEIVED":"Transfer order received","TRANSFER_ORDER_CANCELLED":"Transfer order cancelled","LOT_QUARANTINED":"Lot quarantined","LOT_RELEASED":"Lot released","LOT_EXPIRED_MANUAL":"Lot marked expired","STOCK_COUNT_VARIANCE_REVIEW_REQUIRED":"Stock count variance needs review","LOT_EXPIRING_SOON":"Lot expiring soon","GRN_POSTED":"Goods receipt posted","PUTAWAY_TASK_ASSIGNED":"Putaway task assigned","PICK_LIST_READY":"Pick list ready","CYCLE_COUNT_DISCREPANCY":"Cycle count discrepancy","OVERAGE_PENDING_APPROVAL":"Overage awaiting approval","BOM_WAREHOUSE_REVIEW_PENDING":"BOM awaiting warehouse review","BILL_MATCH_VARIANCE":"Bill match variance","INBOUND_DELIVERY_SCHEDULED":"Inbound delivery scheduled","MATERIAL_RETURN_SUBMITTED":"Material return submitted","COST_RECALC_SIGNIFICANT":"Significant cost change","SUPPLIER_RETURN_RAISED":"Return to supplier raised","SUPPLIER_CLAIM_PENDING":"Supplier claim pending","BTP_CREATED":"Semi-finished surplus recorded","BTP_REINSPECT_DUE":"Re-inspection due","PUTAWAY_SHORTFALL":"Putaway closed short"},"page":{"title":"Notifications","description":"Everything that happened to your work — approvals waiting on you, alerts and updates.","preferences":"Notification settings","myTasks":"My tasks","markAllRead":"Mark all as read","allRead":"All notifications marked as read","viewLabel":"Show","views":{"all":"All","unread":"Unread","action":"Action required"},"filters":{"category":"Category","module":"Module","allCategories":"All categories","allModules":"All modules","from":"From date","to":"To date"},"categories":{"action":"Action required","info":"Updates"},"modules":{"inventory":"Inventory","purchasing":"Purchasing","production":"Production","sales":"Sales","accounting":"Accounting","quality":"Quality","hr":"HR","workflow":"Tasks & approvals"},"loadError":"Couldn't load notifications.","retry":"Try again","emptyTitle":"No notifications","emptyBody":"Nothing matches these filters.","emptyBodyNone":"You're all caught up — new notifications will show up here.","resolved":"Done","actionRequired":"Action required","markRead":"Mark read","dismiss":"Dismiss","range":"{{from}}–{{to}} of {{total}}","previous":"Previous","next":"Next"},"prefs":{"heading":"Notifications","subheading":"Choose where KeenERP tells you about your work. Changes apply to new notifications.","saved":"Notification settings saved","loadError":"Couldn't load your notification settings.","retry":"Try again","category":"Type","channels":{"in_app":"In app","email":"Email"},"categories":{"action":{"label":"Action required","hint":"Approvals and tasks waiting on you"},"info":{"label":"Updates","hint":"Status changes and alerts about records you follow"}},"toggleLabel":"{{category}} — {{channel}}","lockedHint":"Action items always appear in the app so approvals never get stuck.","emailNote":"Emails go to the address on your account, in your language setting.","save":"Save","reset":"Undo changes"}},"tasks":{"title":"My Tasks","priority":{"low":"Low","medium":"Medium","high":"High","urgent":"Urgent"},"columns":{"title":"Task","kind":"Kind","priority":"Priority","status":"Status","assignee":"Assignee","due":"Due","created":"Created"},"status":{"open":"Open","done":"Done","cancelled":"Cancelled"},"unassigned":"Unassigned","searchPlaceholder":"Search tasks…","empty":{"title":"Nothing on your plate","description":"Open tasks assigned to you will show up here as they're created."},"description":"Open work assigned to you across every workflow","helpIntro":"This list shows the open tasks assigned to you across every workflow, with their priority, status, and due date.","helpStep1":"Use the search box to filter the list by task title or kind.","helpStep2":"Click a task title to open the record it belongs to.","helpStep3":"Watch the Due column and priority to decide what to handle first.","helpTip1":"Tasks appear here automatically as workflows create work for you."},"reports":{"hub":{"title":"Reports","description":"Cross-module analytics and exports.","helpIntro":"This hub links to the report surfaces owned by each module. Pick a tile to open that module's reports.","helpStep1":"Click an available tile to open its reports in that module.","helpStep2":"Tiles marked coming soon are not available yet and will light up as those modules ship.","helpTip1":"Each module's reports live with that module, so bookmarks keep working as the hub grows.","soon":"coming soon","tiles":{"sales":"Sales","salesDesc":"Quotations, orders, customer revenue.","purchasing":"Purchasing","purchasingDesc":"POs, vendor spend, RFQ cycle times.","inventory":"Inventory","inventoryDesc":"Stock on hand, valuation, movement history.","hr":"HR","hrDesc":"Headcount, attendance, payroll summaries.","hrLeave":"Leave","hrLeaveDesc":"Leave balances and absence patterns.","finance":"Finance","financeDesc":"P&L, balance sheet, cash flow.","production":"Production","productionDesc":"MO throughput, OEE, scrap rate."}}},"rfq":{"title":"Requests for Quotation","description":"Track RFQ lifecycle and supplier quotes.","newRfq":"New RFQ","rfqNumber":"RFQ Number","rfqTitle":"Title","state":"State","requestDate":"Request Date","deadline":"Deadline","deliveryTarget":"Delivery Target","source":"Source","awardedVendor":"Awarded Vendor","awardReason":"Award Reason","stateLabels":{"DRAFT":"Draft","SENT":"Sent","QUOTING":"Quoting","COMPARING":"Comparing","AWARDED":"Awarded","CANCELLED":"Cancelled"},"sourceLabels":{"PI":"Production Intent","BOM":"Bill of Materials","FORECAST":"Forecast","MANUAL":"Manual"},"compare":{"title":"Compare Quotes","vendor":"Vendor","unitPrice":"Unit Price","lineTotal":"Line Total","leadTime":"Lead Time (days)","validUntil":"Valid Until","rank":"Rank"},"actions":{"send":"Send to Suppliers","award":"Award","cancel":"Cancel RFQ"},"awardModal":{"title":"Award RFQ","reasonLabel":"Award reason (required if not lowest price)","reasonPlaceholder":"Why is this vendor selected?","submit":"Confirm Award","vendorLabel":"Vendor","vendorPlaceholder":"Choose a vendor that quoted","noQuotedVendors":"No vendor has quoted on this RFQ yet.","quotesUnavailable":"You need access to compare quotes to see which vendors quoted.","reasonCount":"{{used}}/{{max}} characters"},"wizard":{"headerHint":"Create a draft RFQ. Add product lines after creation from the detail page.","linesHint":"Lines can be added on the RFQ detail page after creation. Detail page lands in PR11b.","incoterm":"Incoterm","deliveryAddress":"Delivery Address","submit":"Create Draft","titleRequired":"RFQ title is required.","created":"Created RFQ {{number}}"},"detail":{"headerSection":"Header","linesSection":"Lines","linesPlaceholder":"Lines table coming in PR11c. Add lines via API today.","actions":"Actions","sent":"RFQ sent to suppliers.","cancelled":"RFQ cancelled.","cancelReason":"Cancel reason (required)","cancelReasonRequired":"Cancel reason is required.","confirmCancel":"Confirm Cancel","addLine":"Add Line","confirmAddLine":"Add","lineProduct":"Material","lineQty":"Qty","lineQtyFull":"Quantity","lineUom":"Unit","lineDescription":"Description","lineFieldsRequired":"Material, quantity and unit are required.","lineQtyInvalid":"Qty must be a positive number.","lineAdded":"Line added.","lineDeleted":"Line deleted.","deleteLineConfirm":"Delete this line?","noLines":"No lines yet. Add one to send the RFQ.","awarded":"RFQ awarded.","awardFieldsRequired":"Vendor and award reason are required.","productPlaceholder":"Search by SKU or name","productSearchHint":"Type a SKU or name to search.","uomPlaceholder":"Choose a unit","vendorFallback":"Vendor {{id}}"},"countLabel":"{{count}} RFQ","loadError":"Failed to load requests for quotation.","searchPlaceholder":"Search RFQs…","emptyTitle":"No requests for quotation yet","emptyDescription":"Requests for quotation collect supplier quotes before you award a purchase. Create an RFQ to start sourcing.","helpIntro":"Requests for quotation collect vendor prices before you commit to a purchase. Send them out, compare responses, and award the best quote.","helpStep1":"Search to find an existing request for quotation.","helpStep2":"Select New RFQ to invite vendors to quote.","helpStep3":"Click a request to compare vendor responses.","helpStep4":"Award the winning quote to turn it into a purchase order.","helpTip1":"You can create a request for quotation from an existing purchase request.","sentCol":"Sent to vendor","sentChannel":{"EMAIL":"Email","PDF_DOWNLOAD":"PDF downloaded","ZALO":"Zalo","OTHER":"Other"}},"forecast":{"unknownProduct":"Unknown product","title":"Purchase Forecast","description":"Recent forecast runs and their inputs digest.","runAt":"Run At","horizon":"Horizon","algorithm":"Algorithm","policy":"Safety Policy","digest":"Digest","source":"Source","sourceManual":"Manual","sourceDemand":"Demand forecast","runFromDemand":"From demand forecast","runFromDemandError":"Could not run the forecast from demand data.","noDemandRunHint":"No demand forecast run exists yet. Run one on the Sales demand forecast board first.","goToDemandForecast":"Open demand forecast","policyLabels":{"per_product_minmax":"Per-product min/max","flat_pct":"Flat %","none":"None"},"chart":{"ariaLabel":"Demand forecast chart"},"loadError":"Could not load forecast runs.","emptyTitle":"No forecast runs yet","emptyDescription":"Forecast runs project future demand to drive purchasing. Runs appear here once the forecast job has executed.","helpIntro":"Forecast runs project future demand over a horizon to guide purchasing and safety stock. Each run records its inputs and algorithm.","helpStep1":"Review past forecast runs by run date and horizon.","helpStep2":"Check the algorithm and safety stock policy used for a run.","helpStep3":"Use the inputs digest to confirm which data a run was based on.","helpTip1":"Runs with the same inputs digest were computed from identical data."},"supplierRating":{"title":"Supplier Rating Leaderboard","description":"Latest published rating periods, ranked by weighted score.","noPeriods":"No rating periods published yet.","rank":"Rank","vendor":"Vendor","period":"Period","score":"Score","grade":"Grade","state":"State","stateLabels":{"computing":"Computing","draft_review":"Draft Review","published":"Published","disputed":"Disputed"},"publish":{"title":"Publish a Period","hint":"Paste a draft_review period UUID. Publish flips state to published and refreshes vendor.current_grade in one transaction.","placeholder":"period uuid","submit":"Publish","idRequired":"Period UUID is required.","success":"Published. Vendor grade now {{grade}}.","draftListTitle":"Awaiting Publish (draft_review)","publishing":"Publishing…"},"leaderboardTitle":"Published leaderboard","helpIntro":"Supplier ratings score vendors over a period and assign a grade. Review draft scores, publish them, and track the leaderboard here.","helpStep1":"Review draft rating periods awaiting publication.","helpStep2":"Publish a period to make its grades visible on the leaderboard.","helpStep3":"Read the leaderboard to compare vendor scores and grades.","helpStep4":"Use the publish field to release a specific period by its identifier.","helpTip1":"Only periods in draft review can be published."},"supplier_portal":{"title":"VHT Supplier Portal","logout":"Sign out","nav":{"dashboard":"Dashboard","rfqs":"RFQs","purchaseOrders":"Purchase Orders","asn":"Shipments","profile":"Profile"},"login":{"title":"Sign in to the supplier portal","subtitle":"Use the magic link sent to your inbox, or enter your password.","modeMagic":"Magic link","modePassword":"Password","tenantId":"Buyer ID","tenantIdPlaceholder":"lan","email":"Email","password":"Password","submitting":"Submitting…","sendMagicLink":"Send magic link","signIn":"Sign in","magicSentTitle":"Check your inbox","magicSentBody":"If your email is registered, a sign-in link is on its way.","errorGeneric":"Sign-in failed. Please check your details and try again."},"magicLink":{"signingIn":"Signing you in…","errorTitle":"Sign-in link invalid or expired","errorGeneric":"We couldn't sign you in with that link.","missingToken":"Sign-in link is missing the token.","backToLogin":"Back to sign in"},"dashboard":{"title":"Welcome back","subtitle":"Your active work with the buyer.","openRFQs":"Open RFQs","pendingAck":"Awaiting acknowledgement","totalPOs":"Total POs","recentRFQs":"Recent RFQs","viewAll":"View all","noRFQs":"No RFQs yet.","loadError":"Could not load your dashboard."},"rfqs":{"title":"Requests for Quotation","empty":"No RFQs yet.","loadError":"Could not load RFQs.","notFound":"RFQ not found.","backToList":"Back to RFQs","col":{"number":"Number","title":"Title","state":"State","deadline":"Deadline","requestDate":"Request date","deliveryTarget":"Delivery target","incoterm":"Incoterm","deliveryAddress":"Delivery address"},"quote":{"linesHeading":"Line items & your quote","noLines":"This RFQ has no line items.","colItem":"Item","colQty":"Quantity","colUnitPrice":"Unit price","colLeadTime":"Lead time (days)","colNotes":"Notes","pricePlaceholder":"0.00","leadTimePlaceholder":"days","quoteNumber":"Your quote number","validityUntil":"Valid until","overallLeadTime":"Overall lead time (days)","paymentTerms":"Payment terms","estimatedTotal":"Estimated total: {{total}}","submit":"Submit quote","resubmit":"Update quote","submitting":"Submitting…","submitSuccess":"Your quote has been submitted.","submitError":"Could not submit the quote.","alreadySubmitted":"You already submitted a quote — submitting again replaces it.","deadlinePassed":"The response deadline has passed — quotes are closed.","notAcceptingQuotes":"This RFQ is not accepting quotes.","awardedToYou":"Congratulations — this RFQ was awarded to you.","awardedToOther":"This RFQ has been awarded to another supplier."}},"pos":{"title":"Purchase Orders","empty":"No purchase orders yet.","loadError":"Could not load purchase orders.","notFound":"Purchase order not found.","backToList":"Back to purchase orders","acknowledge":"Acknowledge","acking":"Acknowledging…","ackError":"Could not acknowledge this PO.","acknowledgedAt":"Acknowledged at","linesPlaceholder":"Line items will appear here in the next release.","col":{"number":"Number","orderDate":"Order date","expected":"Expected","status":"Status","total":"Total","acknowledged":"Acknowledged","pending":"Pending"}},"profile":{"title":"Profile","subtitle":"Update your contact details and language preference.","email":"Email","role":"Role","fullName":"Full name","phone":"Phone","preferredLocale":"Preferred language","save":"Save changes","saving":"Saving…","saved":"Profile saved.","loadError":"Could not load your profile.","saveError":"Could not save your profile."},"asn":{"title":"Shipments","subtitle":"Submit advance shipping notices for purchase orders ready to receive.","create":"New shipment","empty":"No shipments yet.","loadError":"Could not load shipments.","backToList":"Back to shipments","col":{"number":"ASN","po":"PO","state":"State","shipment":"Shipped","eta":"ETA","carrier":"Carrier"},"form":{"title":"New shipment","subtitle":"Reference one of your active POs and list what's shipping.","po":"Purchase order","poPlaceholder":"Select a PO…","poRequired":"Please pick a PO before submitting.","asnNumberSupplier":"Your ASN number","shipmentDate":"Shipment date","eta":"Expected arrival","carrier":"Carrier","tracking":"Tracking number","notes":"Notes","lines":"Line items","addLine":"Add line","submit":"Submit shipment","submitting":"Submitting…","submitError":"Could not submit shipment.","line":{"poLineId":"PO line ID","qty":"Quantity","uomId":"UoM ID","lot":"Lot / batch"}}},"bankChange":{"title":"Bank-detail change","subtitle":"Submit a request to update your vendor bank account. Buyer staff will review.","backToProfile":"Back to profile","bankName":"Bank name","accountHolder":"Account holder","accountNumber":"Account number","swift":"SWIFT / BIC","branch":"Branch","notes":"Notes","notesPlaceholder":"Optional context for the buyer reviewer.","submit":"Submit request","submitting":"Submitting…","submitted":"Request submitted. The buyer team will review it.","submitError":"Could not submit your request.","history":"Pending requests","loadError":"Could not load past requests.","loading":"Loading…","empty":"No pending requests.","statusPending":"Pending review"}},"customer_portal":{"title":"VHT Customer Portal","logout":"Sign out","nav":{"dashboard":"Dashboard","orders":"Orders","deliveryNotes":"Deliveries","invoices":"Invoices","profile":"Profile"},"login":{"title":"Sign in to the customer portal","subtitle":"Use the magic link sent to your inbox, or enter your password.","modeMagic":"Magic link","modePassword":"Password","tenantId":"Supplier ID","tenantIdPlaceholder":"lan","email":"Email","password":"Password","submitting":"Submitting…","sendMagicLink":"Send magic link","signIn":"Sign in","magicSentTitle":"Check your inbox","magicSentBody":"If your email is registered, a sign-in link is on its way.","errorGeneric":"Sign-in failed. Please check your details and try again."},"magicLink":{"signingIn":"Signing you in…","errorTitle":"Sign-in link invalid or expired","errorGeneric":"We couldn't sign you in with that link.","missingToken":"Sign-in link is missing the token.","backToLogin":"Back to sign in"},"dashboard":{"title":"Welcome back","subtitle":"Your account snapshot.","openOrders":"Open orders","overdueInvoices":"Overdue invoices","outstanding":"Outstanding balance","recentOrders":"Recent orders","viewAll":"View all","noOrders":"No orders yet.","loadError":"Could not load your dashboard."},"orders":{"title":"Sales Orders","empty":"No orders yet.","loadError":"Could not load orders.","notFound":"Order not found.","backToList":"Back to orders","linesPlaceholder":"Line items will appear here in the next release.","col":{"number":"Number","date":"Order date","status":"Status","total":"Total","shipped":"Shipped"},"stage":{"quoting":"Being prepared","confirmed":"Confirmed","in_production":"In production","shipped":"Shipped","delivered":"Delivered","invoiced":"Invoiced","closed":"Closed","cancelled":"Cancelled"},"partiallyShipped":"Partially shipped – balance outstanding","shippedOf":"{{shipped}} of {{ordered}}"},"deliveryNotes":{"title":"Deliveries","empty":"No deliveries yet.","loadError":"Could not load deliveries.","notFound":"Delivery not found.","backToList":"Back to deliveries","col":{"number":"Number","date":"Delivery date","status":"Status","carrier":"Carrier","tracking":"Tracking"}},"invoices":{"title":"Invoices","empty":"No invoices yet.","loadError":"Could not load invoices.","notFound":"Invoice not found.","backToList":"Back to invoices","downloadPlaceholder":"PDF download will land in the next release.","col":{"number":"Number","date":"Invoice date","due":"Due date","status":"Status","total":"Total","paid":"Paid","balance":"Balance"}},"profile":{"title":"Profile","subtitle":"Update your contact details and language preference.","email":"Email","role":"Role","fullName":"Full name","phone":"Phone","preferredLocale":"Preferred language","save":"Save changes","saving":"Saving…","saved":"Profile saved.","loadError":"Could not load your profile.","saveError":"Could not save your profile."}},"demandForecast":{"title":"Demand Forecast","description":"Project per-product demand from sales-order history.","form":{"periodId":"Period UUID","modelKind":"Model","forceRecompute":"Force recompute","horizonSteps":"Horizon","evaluate":"Evaluate methods","evaluating":"Evaluating…","run":"Run forecast","kinds":{"naive":"Naive (last actual)","ema":"EMA (exponentially-weighted)","linear":"Linear trend"}},"result":{"title":"{{kind}} result","generatedAt":"Generated {{ts}}","cached":"Cached","digest":"Digest","sendToPurchase":"Send to purchase forecast","noLines":"No history available — no products predicted.","chartTitle":"Top 20 by predicted qty (with ±1σ band)","col":{"product":"Product","predicted":"Predicted","lo":"Lower bound (1σ)","hi":"Upper bound (1σ)","method":"Method"}},"recent":{"title":"Recent runs","load":"Load","lineCount":"{{count}} products"},"errors":{"generic":"Could not run forecast."},"accuracy":{"title":"Method accuracy (rolling-origin holdout)","best":"Best: {{method}}","select":"Use","col":{"method":"Method","rmse":"RMSE","mape":"MAPE","n":"Sample count"}},"helpIntro":"Generate demand forecasts to plan production and inventory.","helpStep1":"Enter a planning period and choose a forecast model.","helpStep2":"Click Run to generate predicted quantities per product.","helpStep3":"Use Evaluate to compare model accuracy and pick the best method.","helpStep4":"Load a recent run to review its results again.","helpTip1":"Running the same inputs returns the cached result unless you force recompute."},"mrp":{"title":"Material Requirements Planning","form":{"periodId":"Period UUID","horizonStart":"Horizon start","horizonEnd":"Horizon end","lotSizing":"Lot-sizing rule","periodDays":"Fixed-period days","forceRecompute":"Force recompute","demands":"Top-level demands","addDemand":"Add demand","productId":"Product UUID","qty":"Qty","requiredAt":"Required at","run":"Run MRP","rules":{"lot_for_lot":"Lot-for-lot","min_order_qty":"Min order qty","fixed_period":"Fixed period bucket"}},"result":{"title":"MRP run","generatedAt":"Generated {{ts}}","cached":"Cached","digest":"Digest","tabRequirements":"Requirements ({{count}})","tabPlannedOrders":"Planned orders ({{count}})","noRequirements":"No requirements generated.","noPlannedOrders":"No planned orders generated.","col":{"product":"Product","requiredAt":"Required at","releaseAt":"Release at","gross":"Gross","onHand":"On hand","safety":"Safety","net":"Net","qty":"Quantity","kind":"Kind","rule":"Rule","level":"Level"}},"recent":{"title":"Recent runs","load":"Load","reqCount":"{{count}} reqs","poCount":"{{count}} orders"},"errors":{"generic":"Could not run MRP."},"description":"Multi-level BOM rollup + lead-time + lot-sizing. Idempotent on inputs.","helpIntro":"Material requirements planning explodes demand through bills of materials to compute net requirements and planned orders. Run it to see what to make or buy.","helpStep1":"Set the planning period and horizon start and end dates.","helpStep2":"Add each top level demand with its product, quantity, and required date.","helpStep3":"Choose a lot sizing rule, then select Run to compute the plan.","helpStep4":"Review the requirements and planned orders tabs for the results.","helpTip1":"Runs are cached by their inputs, so enable force recompute to rerun with the same inputs."},"contact":{"address":{"country":"Country","searchLabel":"Search for an address","searchPlaceholder":"Start typing your address","cantFind":"Can't find your address? Enter manually","line1":"Street address","line2":"Apt / suite / floor","ward":"Ward","district":"District","city":"City","stateProvince":"State / province","postalCode":"Postal code","manualFallbackHint":"Autocomplete unavailable — enter the address manually."},"phone":{"countryLabel":"Country dial code","placeholder":"Phone number","invalid":"Enter a valid phone number for the selected country."}},"plm":{"revision":{"label":"Revision","major":"Major revision","minor":"Minor revision","history":"Revision history","status":{"draft":"Draft","active":"Active","obsolete":"Obsolete"}},"eco":{"title":"Engineering change order","reason":"Reason for change","priority":"Priority","actions":{"submit":"Submit for review","approve":"Approve","reject":"Reject","release":"Release"},"status":{"draft":"Draft","review":"In review","approved":"Approved","released":"Released","rejected":"Rejected"}},"ecn":{"label":"Engineering change notice","published":"Published","effectiveAt":"Effective at","affectedItems":"Affected items"},"whereUsed":{"boms":"BOMs","openOrders":"Open work orders","openPOs":"Open purchase orders","impactCount":"Impacted records"},"effectivity":{"scheduled":"Scheduled","active":"Active","countdownDays":"Days until effective"},"obsolete":{"label":"Obsolete","replacedBy":"Replaced by","drawdownRemaining":"Drawdown remaining","blockNew":"Block new usage"},"attachment":{"drawing":"Drawing","spec":"Specification","cert":"Certificate","upload":"Upload attachment","version":"Version"}},"tablet":{"appTitle":"Warehouse","station":"Station","operator":"Operator","online":"Online","offline":"Offline","exit":"Exit","language":"Tiếng Việt","pendingActions":"{{count}} queued","setStationTitle":"Name this station","setStationHelp":"This label identifies the device on the floor.","stationPlaceholder":"e.g. WH1-Receiving-01","saveStation":"Save station","menu":{"title":"What are you doing?","putaway":"Putaway","putawayHint":"Move received stock to a bin","pick":"Picking","pickHint":"Pick a list for production or shipping","cycleCount":"Cycle count","cycleCountHint":"Count stock in a zone"},"scan":{"prompt":"Scan or type","manualEntry":"Type instead","submit":"Go"},"common":{"back":"Back","confirm":"Confirm","cancel":"Cancel","retry":"Retry","loading":"Loading…","notFound":"Not found","queuedOffline":"Saved — will sync when online"},"putaway":{"title":"Putaway","enterTask":"Scan or enter putaway task","task":"Task {{id}}","qty":"Quantity: {{qty}}","suggested":"Suggested bin","scanDestination":"Scan destination bin","complete":"Complete putaway","completed":"Putaway completed","conflict":"This task changed — reload and try again"},"pick":{"title":"Picking","enterList":"Scan or enter pick list","list":"Pick list {{code}}","line":"Line {{n}}","requested":"Requested: {{qty}}","picked":"Picked","qtyPicked":"Qty picked","confirm":"Confirm pick","short":"Mark short","lineConfirmed":"Line confirmed","allDone":"All lines done","production":"Production","statusShort":"Short","shortQty":"Short: {{qty}}","shortNone":"Nothing to pick","shortNoneHint":"Bin empty? Mark the line short with 0 picked to see alternate grades in stock.","alternates":{"title":"Alternate grades in stock","hint":"The BOM material is short. You can issue stock that was ordered as its alternate grade.","loading":"Checking alternate stock…","empty":"No alternate-grade stock in this warehouse.","error":"Couldn't load alternate stock.","grade":"Grade {{grade}}","lot":"Lot {{lot}}","bin":"Bin {{bin}}","expires":"Exp. {{date}}","available":"Available: {{qty}} {{unit}}","pick":"Pick alternate","qty":"Quantity to issue","qtyHint":"Up to {{max}} {{unit}} from this lot and bin","confirm":"Confirm alternate","issued":"Alternate: {{sku}}","issuedUnknown":"Alternate grade issued","success":"Issued {{sku}} for this line","errors":{"insufficientStock":"Not enough stock in that lot. Enter a smaller quantity or pick another lot.","notAlternate":"That material is not an alternate for this line.","alreadyPicked":"This line was already picked. Reload the list.","qtyRequired":"Enter a quantity above zero.","unitMismatch":"That stock is held in a different unit from this line, so it can't be issued here.","qtyExceedsRequested":"You can issue at most this line's requested quantity. Enter a smaller quantity.","generic":"Couldn't issue the alternate. Try again."}}},"cycleCount":{"title":"Cycle count","enterSession":"Scan or enter count session","scanLocation":"Scan a location to count","addedLocations":"{{count}} locations added","start":"Start counting","countItem":"Count item","countedQty":"Counted quantity","record":"Record","recorded":"Recorded","blindNote":"Enter what you physically count"}},"sfm":{"home":{"title":"Shop Floor","subtitle":"Operator workspace for work orders, material scan, production, QC, and downtime.","shellNote":"Shell only. Login + work orders ship in PR-SFM.2 and PR-SFM.3."},"auth":{"title":"Operator login","enterUserId":"Operator ID","enterPin":"Enter PIN","login":"Sign in","logout":"Sign out","invalid":"Invalid operator ID or PIN.","locked":"PIN locked. Ask a supervisor to reset it.","ambiguous":"More than one user signs in as {{short_id}}, so this tablet can't tell them apart. Ask an admin to give each operator a unique login ID.","stationNotBound":"Station not bound","askSupervisor":"Ask a supervisor to bind this device to a workstation.","pairAgainTitle":"This tablet needs pairing again","pairAgainBody":"It was deactivated or re-paired in Settings › Shop-floor tablets, so nobody can sign in here. Ask an admin to re-pair it and scan the new QR code.","pinPad":{"backspace":"Backspace"}},"wo":{"title":"My work orders","empty":"No work orders to do at this tablet's work centre right now.","forbidden":{"title":"You can't open work orders on this tablet","body":"Your role doesn't include starting operations at a tablet. Ask your supervisor to add it to your role, then sign in again."},"due":"Due","qty":"Qty","product":"Product","status":{"draft":"Draft","planned":"Planned","released":"Released","in_progress":"In progress","completed":"Completed","cancelled":"Cancelled"}},"material":{"title":"Scan materials","scan":"Scanned code","manualEntry":"Use code","qty":"Quantity","lot":"Lot / batch","location":"Location","confirm":"Confirm issue","success":"Material issued","notInBom":"This part is not in the BOM for this work order","unknownProduct":"Unknown product code","scanAgain":"Recent scans","cameraDenied":"Camera access denied. Use manual entry below.","scannerUnavailable":"Scanner unavailable on this device. Use manual entry below.","enterCodeManually":"Enter code manually","downloadForm":"Download form"},"common":{"back":"Back","error":"Something went wrong","retry":"Retry","loading":"Working…"},"receipt":{"title":"Production receipt","qtyGood":"Good qty","qtyScrap":"Scrap qty","lot":"Lot / batch","location":"Location","confirm":"Confirm receipt","success":"Receipt confirmed","scrapPct":"Scrap %","scrapOverrideRequired":"Scrap exceeds 5%. Line Lead PIN co-sign required.","scrapOverrideTitle":"Line Lead override","leadUserId":"Line Lead ID","leadPin":"Line Lead PIN","scrapOverrideApplied":"Receipt confirmed with Line Lead override","scrapOverrideInvalid":"Line Lead PIN invalid or no permission","workOrderNotReceivable":"This work order cannot accept receipts in its current status","exceededThreshold":"Scrap exceeds threshold. Add Line Lead override and try again."},"qc":{"title":"QC inspection","workOrderLink":"View work order","empty":"No photos yet","photos":"Photos","addPhoto":"Take photo","addPhotoSuccess":"Photo attached","uploading":"Uploading…","uploadFailed":"Upload failed. Try again.","submit":"Submit inspection","submitted":"Inspection submitted","allItemsRequired":"Mark every item before submitting.","inspectionNotFound":"Inspection not found.","attachmentNotFound":"Attachment not found.","critical":"Critical","valuePlaceholder":"Measured value (optional)","notesPlaceholder":"Notes (optional)","overallNotesPlaceholder":"Overall inspector notes (optional)","noTemplateItems":"This inspection has no checklist items.","resultGroupLabel":"Result","attachmentsLabel":"Inspection photos","result":{"pass":"Pass","fail":"Fail","quarantine":"Quarantine"}},"downtime":{"title":"Log downtime","activeTitle":"Downtime in progress","start":"Start downtime","end":"End downtime","elapsed":"Elapsed","reason":"Reason","notes":"Notes","empty":"No reason codes configured. Ask your supervisor to set them up.","reasonNotFound":"That reason code is not available. Refresh and try again.","alreadyEnded":"This downtime event was already closed.","categories":{"mechanical":"Mechanical","electrical":"Electrical","material":"Material","quality":"Quality","setup":"Setup","admin":"Admin","other":"Other"}},"offline":{"banner":"Offline mode","pending":"{{count}} change(s) waiting to sync","syncing":"Syncing {{count}} change(s)…","synced":"All changes synced","failed":"Some changes failed to sync","retry":"Retry","offlineMode":"Working offline — changes will sync when reconnected"},"pair":{"working":"Pairing this tablet…","failedTitle":"This pairing link doesn't work","failedBody":"The link is incomplete or was copied wrong. Ask an admin to open Settings › Shop-floor tablets and pair this tablet again.","usedTitle":"This pairing code was already used or expired","usedBody":"Ask an admin to show a new one in Settings › Shop-floor tablets, then scan it on this tablet within 10 minutes.","errorTitle":"Couldn't pair this tablet","errorBody":"The server didn't answer. Check the tablet's Wi-Fi and try again.","rateLimitedTitle":"Pairing is paused for a moment","rateLimitedBody":"Too many pairing attempts were made from this tablet, so the server is blocking pairing for now. Wait a minute and scan the QR code again, or ask a supervisor to show a new code in Settings › Shop-floor tablets.","retry":"Try again"}},"quality":{"title":"Quality Control","description":"Quality inspection list","materialFeedback":{"defectReasons":{"SPEC_MISMATCH":"Spec mismatch","DAMAGED":"Damaged","WARPED":"Warped","WRONG_SPEC":"Wrong spec","OTHER":"Other"},"statusLabels":{"DRAFT":"Draft","APPROVED":"Approved","REJECTED":"Rejected","RETURNED":"Returned"},"title":"Material Feedback","description":"Report defective material for QC review and supplier return.","newFeedback":"New feedback","newFeedbackTitle":"New material feedback","newFeedbackDesc":"Record a defect against a material so QC can review it.","emptyTitle":"No feedback yet","emptyDescription":"Raise a defect report when material fails inspection.","feedbackNumber":"Number","defectReason":"Defect reason","quantity":"Quantity","raisedDate":"Raised","product":"Material","selectProduct":"Select a material…","productRequired":"Select a material first.","defectNotes":"Notes","defectNotesPlaceholder":"Describe the defect…","createFeedback":"Create feedback","createdSuccess":"Feedback created.","approve":"Approve","reject":"Reject","approvedSuccess":"Feedback approved.","rejectedSuccess":"Feedback rejected.","rejectReasonRequired":"Enter a reason.","rejectReasonLabel":"Rejection reason","rejectReasonPlaceholder":"Why is this rejected (e.g. fault is production's)…","confirmReject":"Confirm reject","backToList":"Back to list"},"helpIntro":"Quality control tracks every inspection raised against your work orders and incoming goods, with its type, status, and result.","helpStep1":"Use the search box to find inspections by number or work order.","helpStep2":"Filter by status to focus on what is pending or has failed.","helpStep3":"Click an inspection number to record its result and details.","helpTip1":"Inspections are created automatically when work orders are released.","searchPlaceholder":"Search inspections, work orders...","allStatuses":"All Statuses","allTypes":"All Types","noInspections":"No inspections yet","noInspectionsDesc":"Inspections are created automatically when work orders are released.","inspectionNumber":"Inspection number","columns":{"type":"Type","product":"Product","workOrder":"Work Order","plannedDate":"Planned Date","status":"Status","inspector":"Inspector"},"statusLabels":{"pending":"Pending","in_progress":"In Progress","passed":"Passed","failed":"Failed","cancelled":"Cancelled"},"typeLabels":{"incoming":"Incoming","in_process":"In Process","final":"Final","outgoing":"Outgoing"},"viewDetails":"View details","labelStation":{"title":"Pallet Labels & QR","subtitle":"Record the inspection result per component, then print the matching pallet label — Pass, Rework, Scrap or semi-finished. Each label carries a QR that auto-fills the ERP when scanned.","pickerPlaceholder":"Search production orders…","printAll":"Print all pass labels","printLabel":"Print label","close":"Close","emptyTitle":"Pick a production order","emptyDescription":"Search a production order above to open its component inspection grid.","banner":{"order":"Production order","product":"Product","stage":"Stage","customer":"Customer","shipDate":"Ship date","plannedQty":"Planned qty","qc":"QC"},"kpi":{"passed":"Total passed","rework":"Total rework","scrap":"Total scrap","surplus":"Total surplus → semi-finished"},"legend":{"title":"Label types:","pass":"✓ Pass — white slip","rework":"⚒ Rework — yellow slip","scrap":"✕ Scrap — void stamp","btp":"⬡ Semi-finished — temp warehouse","scanNote":"QR scan → ERP auto-fill"},"grid":{"component":"Component","spec":"Spec","required":"Req","requiredFull":"Required","made":"Made","passed":"Passed","rework":"Rework","scrap":"Scrap","surplus":"Surplus","print":"Print label"},"gridNote":"Rework = Made − Passed − Scrap. Surplus = (Passed + Rework) − order need. A label button is enabled only when its quantity is > 0.","btn":{"pass":"✓ Pass","rework":"⚒ Rework","scrap":"✕ Scrap","btp":"⬡ Semi-finished"},"label":{"writeIn":"","scanHint":"Scan to fill ERP","pass":{"tag":"PASS","desc":"QC PASSED"},"rework":{"tag":"REWORK","desc":"REWORK REQUIRED","reasonField":"Rework reason"},"scrap":{"tag":"SCRAP","desc":"SCRAPPED / VOIDED","reasonField":"Scrap reason","voidStamp":"VOID"},"btp":{"tag":"Semi-finished","desc":"SEMI-FINISHED · TEMP STORE","stageDone":"Stage done","recheckBy":"Re-check by"},"fields":{"printDate":"Print date","sku":"Product (SKU)","order":"Order","component":"Component","quantity":"Quantity","spec":"Spec","shipDate":"Ship date","qualityNote":"Quality note","stage":"Stage"},"sign":{"prepared":"Prepared by","qc":"QC / lead","store":"Storekeeper"},"qrDataTitle":"⌗ QR data — auto-filled on scan"},"breadcrumb":"Manufacturing · Quality","modalTitle":"{{tag}} label","modalTitleBatch":"{{count}} pass labels","toastSent":"Sent {{count}} label(s) to printer"},"btpCapture":{"title":"Semi-finished surplus capture","description":"Capture accepted semi-finished surplus from a QC inspection into pallets.","qcInspectionId":"QC inspection ID","qcInspectionIdPlaceholder":"Paste the QC inspection ID…","preview":"Preview surplus","noSurplus":"No surplus on this inspection.","product":"Product","passed":"Passed","rework":"Rework","needed":"Needed","surplus":"Surplus","acceptedQty":"Accepted quantity","colorFinish":"Colour / finish","condition":"Condition","captureLots":"Capture pallets","noLines":"Enter an accepted quantity and colour for at least one line.","capturedSuccess":"Captured {{count}} pallet(s).","capturedTitle":"Captured pallets","printLabel":"Print label","labelError":"Could not generate the label."}},"home":{"myApprovals":"My approvals waiting","quotesToFollowUp":"Quotes to follow up","myPipeline":"My pipeline","myQuotesThisWeek":"My quotes this week","myOrders":"My orders","myRecentActivity":"My recent activity","teamApprovals":"Team approvals","teamPipeline":"Team pipeline","topOfFunnel":"Top of funnel","myApprovalsQueue":"My approvals queue","todaysTasks":"Today's tasks","shiftStatus":"Shift status","markDone":"Mark done","startTask":"Start","receiving":"Receiving","picking":"Picking","transfers":"Transfers","stockCount":"Stock count","cash":"Cash","revenue":"Revenue","production":"Production","inventoryLevel":"Inventory","people":"People","noWorkYet":"No work yet — check back soon.","greeting":"Hello, {{name}}.","scope":{"my":"My","team":"Team","all":"All"}},"inbox":{"title":"My inbox","all":"All","approvals":"Approvals","followUp":"Follow up","rejected":"Needs revision","approved":"Ready to send","mentioned":"Mentioned","snooze":"Snooze","openQuote":"Open quote","reply":"Reply","empty":"Nothing here. Nice.","loading":"Loading inbox","approve":"Approve","reject":"Reject","approveTitle":"Approve with a note","rejectTitle":"Reject","reasonLabel":"Reason","approvedToast":"Approved","rejectedToast":"Rejected","open":"Open","kinds":{"approval":"Approval","quote":"Quote","mention":"Mention","task":"Task"}},"contacts":{"title":"Contacts","new":"New contact","mode":{"companies":"Companies","people":"People","ariaMode":"Contacts mode","peopleComingSoon":"People mode coming soon"},"people":{"addPerson":"Add person","modeHint":"Browse the humans, not the companies. Each person is tied to their company — click through to see the full company record.","errorLoad":"Failed to load people: {{message}}","loading":"Loading people…","showing":"Showing {{count}} of {{total}} people","searchPlaceholder":"Search by name, title, email, phone…","standalone":"Standalone","chip":{"companyType":"Company type","department":"Department","tag":"Tag","language":"Language"},"source":{"customer":"Customer","vendor":"Vendor","standalone":"Standalone"},"role":{"primary":"Primary","billing":"Billing","shipping":"Shipping","technical":"Technical"},"table":{"name":"Name","titleDept":"Title · Department","company":"Company","email":"Email","phone":"Phone","tags":"Tags","lang":"Language","lastContact":"Last contact","empty":"No people yet — add the first person to start the directory."},"wizard":{"eyebrow":"Add a new person","title":"New contact person","subtitleCompany":"Tied to a company — Title, Roles, and Department available.","subtitleStandalone":"Standalone — not tied to any company yet. Link one any time later.","subtitlePick":"Pick a company below, or save as a standalone contact.","close":"Close","whoTitle":"Who is this person?","salutation":"Salutation","salutationNone":"—","preferredName":"Preferred name (display)","preferredNamePh":"How they're called day-to-day","givenName":"Given name","givenNamePh":"e.g. Phương","middleName":"Middle name","middleNamePh":"e.g. Thị / Văn","familyName":"Family name","familyNamePh":"e.g. Nguyễn","displayNameVi":"Display name (VI)","displayNameViPh":"e.g. Nguyễn Phương","language":"Preferred language","workTitle":"Where do they work?","workSubtitle":"Optional — leave empty if this is a standalone contact (a freelancer or a lead).","company":"Company / organization","companySearchPh":"Search companies or paste a code…","standaloneToggle":"Standalone contact — no company yet","changeCompany":"Change","jobTitle":"Title","jobTitlePh":"e.g. Procurement Manager","department":"Department","roles":"Roles / tags","reachTitle":"How do we reach them?","email":"Email","emailPh":"name@company.com","phone":"Phone","phoneCode":"Country code","mobile":"Mobile","social":"Social & messaging","socialHint":"(LinkedIn, Zalo, WhatsApp, WeChat, Telegram, etc.)","socialKind":"Link type","socialOther":"Other","socialRemove":"Remove link","socialAdd":"Add another link","notesTitle":"Notes (optional)","notesPh":"How you met, who introduced them, anything to remember for next time…","footerCompany":"Will appear in {{company}}","footerStandalone":"Saving as standalone contact — no company link","saveClose":"Save & close","saveAddAnother":"Save & add another","saving":"Saving…","errorSave":"Failed to save person: {{message}}","saveFailed":"Save failed","departmentPlaceholder":"Select…","cancel":"Cancel","errGivenRequired":"Given name is required","errFamilyRepeats":"“{{family}}” is already part of the given name. Put only the first name in Given name and the surname in Family name — or leave Family name empty.","primaryLocked":"The first person of a company is always its primary contact. Add another person later and make them primary if needed.","seededFrom":"Filled in from the company record (“{{name}}”). Check the name split before you save.","errEmailRequired":"Email is required","errCompanyRequired":"Pick a company, or mark this person as a standalone contact"},"card":{"empty":"No people yet — add the first person to start the directory."}},"filter":{"all":"All","customer":"Customers","vendor":"Vendors","shipping":"Logistics"},"empty":{"title":"No contacts yet","body":"Add a customer, vendor, or logistics provider."},"form":{"company":{"name":"Company name","taxId":"Tax ID (MST)"},"person":{"firstName":"First name","lastName":"Last name"},"shared":{"phone":"Phone","email":"Email"}},"options":{"currency":{"VND":"VND ₫","USD":"USD $","EUR":"EUR €"},"salutation":{"Mr":"Mr.","Mrs":"Mrs.","Ms":"Ms.","Dr":"Dr.","Prof":"Prof.","Eng":"Eng."},"department":{"procurement":"Procurement","sales":"Sales","production":"Production","quality":"Quality","engineering":"Engineering","rnd":"R&D","logistics":"Logistics","warehouse":"Warehouse","finance":"Finance & Accounting","hr":"Human Resources","it":"IT","management":"Management"},"language":{"en":"English","vi":"Tiếng Việt"}},"edit":{"defaultTax":{"label":"Default tax","vat10":"VAT 10%","vat8":"VAT 8%","exempt":"Exempt","none":"None"},"discountTier":{"label":"Discount tier","placeholder":"e.g. tier2"},"banking":{"add":"Add bank","remove":"Remove","holder":"Account holder","bank":"Bank","branch":"Branch","account":"Account number","swift":"SWIFT"},"person":{"add":"Add person","edit":"Edit person","delete":"Delete person","confirmDelete":"Delete this person?","promotePrimary":"Set as primary","advanced":"Advanced","name":"Name","salutation":"Salutation","givenName":"Given name","familyName":"Family name","displayNameVi":{"label":"Display name (Vietnamese)","help":"Optional — overrides display in Vietnamese documents"},"title":"Title","email":"Email","phone":"Phone"},"document":{"upload":"Upload document","uploading":"Uploading…","delete":"Delete document","fileTooLarge":"File is too large","uploadFailed":"Upload failed","category":{"contract":"Contract","proforma":"Proforma invoice","catalogue":"Catalogue","biz_license":"Business license","email_agreement":"Email agreement","tax_cert":"Tax certificate","bank_letter":"Bank confirmation letter","id_card":"ID card","other":"Other"},"deleteFailed":"Delete failed","confirmDelete":"Remove this document?","title":"Documents on file","subtitle":"Contracts, certificates, tax documents — anything legal or compliance-related.","loading":"Loading documents…","empty":"No documents yet. Upload one below.","validUntil":"valid until {{date}}","chooseFile":"+ Choose file","noFileSelected":"No file selected","categoryLabel":"Category","descriptionLabel":"Description","descriptionPlaceholder":"e.g. Signed master agreement","effectiveDateLabel":"Effective date","expiryDateLabel":"Expiry date","effectiveOn":"effective {{date}}"},"save":{"success":"Saved","partialFailure":"Some changes did not save: {{tabs}}","failed":"Save failed: {{message}}"},"tabs":{"ariaLabel":"Edit sections","identity":"Identity","locations":"Locations","commercial":"Commercial & banking","people":"People","documents":"Documents"},"actions":{"save":"Save","saving":"Saving…","saveChanges":"Save changes","cancel":"Cancel"},"create":{"eyebrow":"New contact","save":"Create contact","created":"Contact created. Add locations, people, and documents, then save.","tabLocked":"This tab unlocks after the contact is created. Fill in the identity first, then press “Create contact” — you can add {{tab}} right after."},"drawer":{"ariaLabel":"Edit contact — {{name}}","eyebrow":"Edit · {{code}}","close":"Close edit drawer","lastEdited":"Last edited ·","lastEditedAt":"Last edited {{when}}","lastEditedBy":"Last edited {{when}} by {{name}}","unsavedChanges":"Unsaved changes"},"identity":{"localName":"Local name (Vietnamese)","shortName":"Short name","shortNamePlaceholder":"e.g. Northwind","contactType":"Contact type","type":{"customer":"Customer","vendor":"Vendor","shipping":"Shipping","service":"Service","outsourcer":"Outsourcer"},"subtype":"Subtype","subtypeOption":{"direct":"Direct B2B","distributor":"Distributor","retailer":"Retailer","oem":"OEM"},"subtypeHint":"Determines pricing tier and tax handling","segment":"Segment","segmentOption":{"sme":"SME","enterprise":"Enterprise","individual":"Individual"},"country":"Country","countryPlaceholder":"Choose country","countryRequired":"Choose the country before saving.","selectPlaceholder":"— Select —","taxIdHint":"VAT/MST · required for VN registered companies","currency":"Currency","code":"Code","codeAuto":"(auto)","codeLocked":"(locked after creation)","website":"Website","primaryContact":"Primary contact","primaryContactSubtitle":"The default person we reach out to at this company.","department":"Department","departmentPlaceholder":"e.g. Procurement","phoneHint":"Auto-formatted to E.164 standard","mobile":"Mobile","fax":"Fax","preferredLanguage":"Preferred language","shortCode":"PI short code","shortCodePlaceholder":"e.g. ABC","shortCodeHint":"Printed in the proforma invoice number (NN/YY . company - CODE). Letters, digits, . _ - (max 16).","shortCodeInvalid":"Use letters, digits, '.', '_' or '-' only, starting with a letter or digit (max 16).","docLanguage":"Document language","docLanguageSubtitle":"Main and second language of this customer's printed documents (PI, contract, invoices, packing list)","docLanguageCountryDefault":"Use the country default (Japan: EN + JA, otherwise EN + VI)","invoiceFormat":{"label":"Invoice number format","codeSample":"CODE","help":"Blank = the default. Tokens: {{tokens}}.","example":"Example:","problem":{"tooLong":"The invoice number format can be at most 60 characters.","noSeq":"The invoice number format must contain {{seq}}.","unknownToken":"Unknown token in the invoice number format — use only {{tokens}}.","duplicateToken":"{{company}} and {{code}} may each appear only once in the invoice number format.","printedTooLong":"With a long company name or short code, this format could print more than 60 characters. Shorten it.","seqWidth":"{{seqN}} pads to 1–9 digits only (e.g. {{example}})."},"companyMissing":"The company short name is not set (Company settings), so {{company}} prints nothing and its separators stay. Set it there, or leave {{company}} out of the format."},"invoiceSeries":{"label":"Invoice numbers already used in {{year}}","loading":"Loading the invoice numbers…","loadFailed":"Could not load the invoice numbers","save":"Save","saved":"Invoice numbers saved","saveFailed":"Could not save the invoice numbers","hint":"Numbers 1–{{n}} were used outside the app. The next invoice gets {{next}}.","hintNone":"No numbers used outside the app. The next invoice gets {{next}}."}},"commercial":{"terms":"Commercial terms","paymentTerms":"Payment terms","paymentTermsOption":{"net30":"Net 30","net60":"Net 60","cod":"COD","prepay":"Prepayment"},"creditLimit":"Credit limit","creditLimitHint":"In VND · used to flag oversized orders","discountTierHint":"Free-form label, e.g. tier2, vip, distributor","salesOwner":"Default sales owner","salesOwnerValue":"Owner: {{owner}}","salesOwnerUnset":"Not assigned","banking":"Banking","bankingSubtitle":"Required for vendors. Optional for customers.","banksEmpty":"No bank accounts on file. Use the button below to add one.","bankHolderPlaceholder":"Holder name as on bank record","bankNamePlaceholder":"e.g. Vietcombank","bankBranchPlaceholder":"e.g. HCM Branch","defaultPaymentTerm":"Default payment term","defaultPaymentTermCompany":"— use company default —"},"location":{"empty":"No addresses yet.","addAddress":"+ Add address","subtitle":"Address(es) we ship to, bill to, or visit. One billing address is required.","addressN":"Address {{n}}","add":"+ Add","uses":"Uses","useOption":{"billing":"Billing","shipping":"Shipping","facility":"Facility"},"defaultAddress":"Default address","markDefault":"Mark as default for this contact","selectCountry":"— Select a country","findAddress":"Find address","findAddressHint":"· autocomplete · restricted to","findAddressPlaceholder":"Start typing an address…","poweredByGoogle":"Powered by Google · scoped to","enterManually":"Enter manually →","streetAddress":"Street address","line2":"Apt / suite / floor","line2Placeholder":"Suite 5A","ward":"Ward","district":"District","city":"City","postalCode":"Postal code","stateProvince":"State / province","openingHours":"Opening hours","notes":"Notes","notesPlaceholder":"Loading dock at back, ask for reception…","removeAddress":"Remove this address","vendorEditOnly":"Only people who can edit vendors can change a vendor's addresses. Ask an admin for vendor edit rights."},"people":{"primary":"Primary","makePrimary":"Make primary","editPerson":"Edit person","removePerson":"Remove person","confirmRemove":"Remove {{name}}?","title":"People at this company","subtitle":"The humans we talk to. One is marked Primary — that's the default we reach out to.","loading":"Loading people…","empty":"No people on file yet. Add the first contact below.","pendingChanges_one":"{{count}} pending change — it applies on Save.","pendingChanges_other":"{{count}} pending changes — they apply on Save.","addAnother":"Add another person","addAnotherDesc":"A technical contact, a finance contact, a backup — anyone you might need to reach.","tipLabel":"Tip:","tipBody":"tag a person as Billing or Shipping and they'll automatically receive invoices and shipping notifications."},"docs":{"kind":{"contract":"Contract","proforma":"Proforma","quotation":"Quotation","catalogue":"Catalogue","biz_license":"Business license","email_agreement":"Email agreement","tax_cert":"Tax certificate","bank_letter":"Bank letter","id_card":"ID card","other":"Other"}}},"add":{"eyebrow":"Add a new contact","title":"Let's get started","subtitle":"Two minutes — we just need the basics. You can fill in the rest later.","close":"Close add-contact wizard","typeSection":"What kind of contact?","typeSectionHint":"Pick a type — we'll only show you the fields that matter for that kind.","typeDesc":{"customer":"Companies that buy from us. Direct, distributor, retailer, OEM.","vendor":"Companies we buy raw materials, components, or services from.","shipping":"Carriers, freight forwarders, logistics partners.","service":"Accounting, legal, marketing, consulting agencies.","outsourcer":"Workshops or co-ops we send work to: carving, finishing, packaging."},"quickStart":"Quick start — basic info","quickStartHint":"Just 4 fields. You can flesh out the rest later in the edit drawer.","taxIdOptional":"(optional now, can add later)","codeHint":"Code will be auto-generated as <c>{{code}}</c> once you save. After that, you can add contacts, locations, banking, and commercial terms.","skuLabel":"Customer SKU code","skuAbbrevLabel":"Company abbreviation","skuHint":"The prefix and sequence are set by the system. Edit the {{n}} letters taken from the company name before you save — the code is locked once the customer is created.","skuAbbrevIncomplete":"Enter exactly {{n}} letters (A–Z) for the abbreviation.","skuEmptyPartNote":"Parts shown as “—” have no value for new customers, so they are left out of the code.","vendorCategoryLabel":"Vendor category","vendorTypeLabel":"Vendor type","skuVendorLabel":"SKU code","skuVendorHint":"Auto-generated from your SKU Standards format when you save — the preview updates as you type the company name.","savingAs":"Saving as <b>{{type}}</b>","saveClose":"Save & close","saveDetails":"Save & add details","errorCreate":"Could not create the contact: {{message}}","subtypeOption":{"vendor":{"manufacturer":"Manufacturer","trader":"Trader","distributor":"Distributor","agent":"Agent","broker":"Broker"},"shipping":{"carrier":"Carrier","forwarder":"Freight forwarder","courier":"Courier / express","customs":"Customs broker"},"service":{"accounting":"Accounting & tax","legal":"Legal","marketing":"Marketing & design","consulting":"Consulting","it":"IT & software"},"outsourcer":{"carving":"Carving","finishing":"Finishing","packaging":"Packaging","assembly":"Assembly"}}},"page":{"crumb":"People / Contacts","subtitle":"Customers, vendors, shipping, services, outsourcers — every business partner in one place.","bulkImport":"Bulk import","bulkImportTitle":"Import companies from a CSV or Excel file","addContact":"Add contact","addContactTitle":"Open the add-contact wizard","modeHint":"Browse business partners (companies). People search ships next.","errorLoad":"Failed to load contacts: {{message}}","loading":"Loading contacts…","showing":"Showing {{count}} of {{total}} contacts"},"import":{"eyebrow":"Bulk import","title":"Bulk import contacts","subtitle":"Upload a CSV or Excel file of customers and vendors. Every row goes through the same checks as a manual create — codes, defaults and duplicates included.","vendorTitle":"Import vendors","vendorSubtitle":"Upload a CSV or Excel file of vendors. Every row goes through the same checks as a manual create — codes, business type, defaults and duplicates included.","close":"Close","templateTitle":"1 · Get the template","templateHint":"Header + example rows, plus an Instructions sheet listing every column, its allowed values and an example.","templateBtn":"Download CSV template","templateBtnXlsx":"Download Excel template","templateError":"Could not download the template. Please try again.","fileTitle":"2 · Choose your file","fileHint":"CSV (UTF-8) or Excel (.xlsx), up to 2 MB / 1,000 rows.","dropHint":"Drop a CSV or Excel file here, or pick one below.","browse":"Choose file","changeFile":"Choose a different file","previewTitle":"Preview","previewCount":"Showing {{shown}} of {{total}} rows","resultTitle":"Import finished","resultCreated":"{{count}} created","resultCreatedTypes":"Added to Settings → Customer types: {{names}}","resultCreatedVendorTypes":"Added to Settings → Vendor types: {{names}}","resultCreatedVendorCategories":"Added to Settings → Vendor categories: {{names}}","resultCreatedTerms":"Added to Settings → Payment terms: {{names}}","resultFailed":"{{count}} failed","col":{"row":"Row","field":"Column","message":"Problem"},"footerIdle":"No file selected yet","cancel":"Cancel","done":"Done","importing":"Importing…","importBtn":"Import {{count}} rows","error":{"invalid_type":"Type must be \"customer\" or \"vendor\"","missing_required":"A required value is missing","invalid_subtype":"Unknown subtype","invalid_value":"Invalid value","duplicate_code":"This code already exists","invalid_currency":"Unknown currency code","no_code_format":"No code given and no auto-code format is configured","create_failed":"This row could not be created","address_failed":"Company was created but its address could not be saved","duplicate_tax_code":"A company with this tax code already exists","duplicate_email":"A company with this email already exists","duplicate_name":"A company with this name already exists in this country","duplicate_in_file":"This row repeats an earlier row in the file","vendor_type_unknown":"Unknown vendor type — you do not have permission to add a new one","vendor_category_unknown":"Unknown vendor category — you do not have permission to add a new one","vendor_category_required":"Vendor category is required to generate the code — fill the column or supply a code","update_failed":"The existing company could not be updated","invalid_code_format":"The code does not match the customer code format","abbrev_taken":"Another customer already uses this abbreviation","code_locked":"A customer's code cannot be changed after it is created","code_not_permitted":"Only Sales can issue customer codes: leave the code column blank and it is assigned on import"},"errorDetail":{"duplicate_code":"Code {{value}} already exists ({{name}})","duplicate_tax_code":"A company with tax code {{value}} already exists as {{code}} ({{name}})","duplicate_email":"A company with email {{value}} already exists as {{code}} ({{name}})","duplicate_name":"A company named {{value}} already exists in this country as {{code}}","duplicate_in_file":"{{value}} repeats an earlier row in the file ({{name}})"},"fileError":{"invalid_content_type":"Please choose a .csv or .xlsx file","legacy_xls":"Old Excel files (.xls) can't be imported. Open the file in Excel, choose Save As › Excel Workbook (.xlsx), then upload it again.","file_too_large":"The file is larger than 2 MB","too_many_rows":"The file has more than 1,000 data rows — split it and retry","empty_file":"The file has no data rows","missing_header":"The header row must include the \"type\" and \"name\" columns","invalid_encoding":"The file must be UTF-8 encoded","read_failed":"Could not read the file — please try again","request_failed":"Import failed — please try again"},"resultUpdated":"{{count}} updated","resultSkipped":"{{count}} skipped","check":{"title":"Check before import","running":"Checking rows…","summary":{"create":"{{count}} new","duplicate":"{{count}} already exist","invalid":"{{count}} invalid"},"modeLabel":"Rows that already exist","newCustomerTypes":"{{count}} new customer type(s) will be added to Settings: {{names}}","newVendorTypes":"{{count}} new vendor type(s) will be added to Settings › Vendor types: {{names}}","newVendorCategories":"{{count}} new vendor category(ies) will be added to Settings › Vendor categories: {{names}}","newPaymentTerms":"{{count}} new payment term(s) will be added to Settings: {{names}}","mode":{"skip":"Skip them (leave existing records unchanged)","update":"Update them with the values in this file"},"col":{"name":"Name","status":"Status","detail":"Detail"},"status":{"create":"New","duplicate":"Exists","invalid":"Invalid"},"field":{"code":"code (SKU)","tax_code":"tax code","email":"email","name":"name"},"matches":"Same {{field}} as {{code}} · {{name}}","truncated":"Only the first 500 rows needing attention are listed."}},"toolbar":{"searchPlaceholder":"Search by name, code, tax ID, email…","searchAria":"Search contacts","chip":{"status":"Status","country":"Country","owner":"Owner","currency":"Currency"},"filter":{"clear":"Clear","empty":"No options"},"viewMode":"View mode","viewTable":"Table","viewCards":"Cards"},"tabs":{"ariaFilter":"Filter by contact type","all":"All contacts","customer":"Customers","vendor":"Vendors","shipping":"Shipping","service":"Services","outsourcer":"Outsourcers"},"table":{"code":"Code","name":"Name","type":"Type","subtypeCategory":"Subtype / Category","location":"Location","status":"Status","lastActivity":"Last activity","owner":"Owner","actions":"Actions","selectAll":"Select all","selectRow":"Select {{name}}","editRow":"Edit {{name}}","edit":"Edit","delete":"Delete","empty":"No contacts match the current filters.","moneyCredit":"Credit limit","moneyPaymentTerms":"Payment terms","moneyService":"Service","searchPlaceholder":"Search by name, code, tax ID, email…","sortBy":"Sort by {{column}}","sortedAsc":"{{column}}, ascending","sortedDesc":"{{column}}, descending","notSet":"not set","notSetTitle":"This field has no value yet","thinChip":"Thin","thinTitle":"No owner, address or activity yet — can't carry a quote","unassignedChip":"Unassigned","unassignedTitle":"No owner assigned","incompleteChip":"Incomplete","incompleteTitle":"Missing: {{fields}}"},"delete":{"confirmTitle":"Delete contact","confirmBody":"Delete {{name}}? This removes it from your contacts directory.","confirmButton":"Delete","cancel":"Cancel","success":"{{name}} was deleted","error":"Failed to delete contact"},"card":{"empty":"No contacts match the current filters."},"status":{"active":"Active","incomplete":"Incomplete","inactive":"Inactive","onhold":"On hold","blocked":"Locked"},"lock":{"bannerTitle":"Locked — view only","bannerBody":"Locked by {{name}} on {{date}}: {{reason}}. No new documents or changes for this customer; documents already open keep running.","bannerBodyUnknown":"This customer is locked. No new documents or changes; documents already open keep running.","someone":"an admin","askAdmin":"Ask an admin to unlock it.","lockButton":"Lock","unlockButton":"Unlock","dialogTitle":"Lock {{name}}?","dialogBody":"The customer becomes view only: no new quotes, PIs, orders, samples, worksheets or other documents, and no edits. Documents already open keep running to the end. You can unlock it later.","reasonLabel":"Reason (required)","reasonPlaceholder":"e.g. stopped ordering","confirmLock":"Lock customer","unlockTitle":"Unlock {{name}}?","unlockBody":"The customer becomes active again and can take new documents.","confirmUnlock":"Unlock customer","cancel":"Cancel","lockedToast":"{{name}} is locked — view only.","unlockedToast":"{{name}} is unlocked.","failed":"Could not change the lock. Try again.","viewOnly":"Locked — view only"},"type":{"customer":"Customer","vendor":"Vendor","shipping":"Shipping","service":"Service","outsourcer":"Outsourcer"},"detail":{"header":{"dialogLabel":"Contact detail — {{name}}","eyebrow":"{{type}} detail","emailAction":"Email","callAction":"Call","editAction":"Edit contact","editButton":"Edit","editDisabledTooltip":"Edit drawer ships in PR3","closeAction":"Close"},"stats":{"openQuotes":"Open quotes","lifetimeRevenue":"Lifetime revenue","creditUsed":"Credit used","lastContact":"Last contact"},"activity":{"title":"Recent activity","empty":"No recent activity for this contact yet.","loading":"Loading activity…","kind":{"quote_created":"Quote {{number}} created","quote_sent":"Quote {{number}} sent","quote_confirmed":"Quote {{number}} confirmed","order_created":"Order {{number}} created","order_fulfilled":"Order {{number}} fulfilled","product_order_started":"New product order {{number}} started for this customer","po_created":"Purchase order {{number}} created","po_sent":"Purchase order {{number}} sent","po_received":"Purchase order {{number}} received"}},"relativeJustNow":"just now","relativeMinutes":"{{n}}m ago","relativeHours":"{{n}}h ago","relativeDays":"{{n}}d ago","relativeWeeks":"{{n}}w ago","locations":{"title":"Locations","countOnFile_one":"{{count}} address on file","countOnFile_other":"{{count}} addresses on file","loading":"Loading addresses…","empty":"No addresses on file. Add one via Edit → Locations.","defaultLabel":"Address","primaryBadge":"Primary"},"primaryContact":{"title":"Primary contact","loading":"Loading…","empty":"No people on file for this contact yet. Add one via Edit → People.","primaryBadge":"Primary"},"footer":{"loadError":"Some sections failed to load: {{message}}","lastEdited":"Last edited {{time}}","openFullRecord":"Open full record","openWorkspace":"⤢ Open in full workspace","newQuote":"+ New quote","newPo":"+ New PO"}},"draft":{"restored":"Draft restored — your unsaved entry was brought back.","dismiss":"Dismiss draft-restored note","savedJustNow":"Auto-saved as draft · just now","savedSecondsAgo":"Auto-saved as draft · {{n}}s ago","savedMinutesAgo":"Auto-saved as draft · {{n}}m ago"},"typePlural":{"customer":"Customers","vendor":"Vendors","shipping":"Shipping","service":"Services","outsourcer":"Outsourcers"},"lander":{"eyebrow":{"customers":"Customer directory · {{count}} relationships","partners":"Supply partner directory · {{count}} relationships","all":"Contact directory · {{count}} relationships"},"headline":{"customers":"Find a customer, go straight to work.","partners":"Find a supply partner, go straight to work.","all":"Find a contact, go straight to work."},"sub":{"customers":"Search by name, code or city and open the record — orders, quotes, products, paint colours and history, side by side.","partners":"Pick a type, search by name, code or city, and open the record — materials, quotes, purchase orders, contracts and history, side by side.","all":"Pick a type or search by name, code or city, and open the record — the full table is one click away."},"chipAll":"All","searchPlaceholder":{"customers":"Search customers by name, code or city…","partners":"Search partners by name, code or city…","all":"Search contacts by name, code or city…"},"resultsAll":{"customers":"All customers","partners":"All partners","all":"All contacts"},"noMatch":"No contacts match “{{q}}”.","openList":"Open list →","blurb":{"customer":"OEM, distributors & retail buyers","vendor":"Materials, freight, services & outsourcing","shipping":"Freight forwarders & carriers","service":"Accounting, audit & pro services","outsourcer":"Finishing & specialist workshops"},"newThisWeek":"New this week","added":"{{count}} added","newBadge":"New","jumpBackIn":"Jump back in","recentlyViewed":"recently viewed","acrossAll":"across all contacts","createCta":"New contact","addedWhen":"added {{when}}","recentActivity":"Recent activity","empty":{"noneTitle":"No contacts yet","noneBody":"Add your first customer, vendor, carrier, service provider or outsourcer and this page fills up with what needs your attention.","quietTitle":"Nothing new to show","quietBody":"No contacts were added this week, you have not opened a record yet, and no quotes, orders or purchase orders have been recorded. Pick a type above to browse the directory."},"segBlurb":{"generic":"Customers in this segment.","unclassified":"No segment set yet."},"needsAttention":{"title":"Needs attention","thin":{"label":"Thin records","why":"Name and code only — no people, address, owner or activity, cannot carry a quote yet."},"unassigned":{"label":"Unassigned","why":"Nobody owns these partners, so nothing chases them."}},"noMatchCreate":"Add \"{{q}}\" as a new contact","searching":"Searching…"},"directory":{"backToContacts":"Contacts","backToLanding":"Back to the contacts landing","listModeAria":"List display mode","table":"Table","workspace":"Workspace","workspaceHint":"Our existing Contacts screen — list plus record tabs.","tableHint":"The directory table — every contact in one grid.","title":"Directory","sub":"terms, credit, open orders & balances — click a row for detail","vendorKindLabel":"Vendor type","vendorKind":{"all":"All","materials":"Materials","shipping":"Shipping","service":"Services","outsourcer":"Outsourcers"},"searchPlaceholder":"Search by name, code or city…","records":"{{count}} records","recordOne":"1 record","loadingFigures":"Loading figures…","errorFigures":"Could not load account figures.","col":{"contact":"Contact","segment":"Segment","location":"Location","status":"Status","terms":"Terms","receivableLimit":"Receivable / limit","payableLimit":"Payable / limit","openPis":"Open PIs","openPos":"Open POs","ytdValue":"Year to date value","lastTxn":"Last transaction","notes":"Notes"},"ofLimit":"of {{limit}}","overdueLine":"{{amount}} · {{days}}d overdue","expandedTitlePi":"PIs this year","expandedTitlePo":"POs this year","expandedReceivable":"Receivable {{balance}} of {{limit}}","expandedPayable":"Payable {{balance}} of {{limit}}","doc":{"no":"Number","status":"Status","date":"Date","detail":"Detail","value":"Value"},"noDocsPi":"No PIs recorded this year.","noDocsPo":"No POs recorded this year.","openRecordCustomer":"Open customer record →","openRecordVendor":"Open vendor record →","emptyCustomer":"No customers yet.","emptyVendor":"No vendors yet.","emptyCustomerQ":"No customers match “{{q}}”.","emptyVendorQ":"No vendors match “{{q}}”.","expandedReceivableNone":"Receivable —","expandedPayableNone":"Payable —","filter":{"balance":{"overdue":"Overdue","nearLimit":"Over 85% of limit","withBalance":"Has a balance"},"open":{"open":"Has open orders","none":"No open orders"}}},"split":{"listTitle":{"customers":"Customers","partners":"Supply partners","all":"Contacts"},"searchPlaceholder":{"customers":"Search customers…","partners":"Search partners…","all":"Search contacts…"},"allTypes":"All types","nTypes":"{{count}} types selected","noMatch":"No contacts match.","collapseList":"Collapse list","expandList":"Expand list","backToContacts":"Contacts","edit":"Edit","stat":{"openQuotes":"Open quotes","openPos":"Open POs","lifetimeRevenue":"Lifetime revenue","lifetimeSpend":"Lifetime spend","creditUsed":"Credit used","lastContact":"Last contact","openPis":"Open PIs"},"tab":{"overview":"Overview","products":"Products & BOM","paints":"Paint colours","orders":"Orders & invoices","shipTo":"Ship-to accounts","materials":"Supplied materials","rfqs":"Requests for quote","purchaseOrders":"Purchase orders","payables":"Payables","shipments":"Shipments","lanes":"Lanes & rates","invoices":"Invoices","engagements":"Engagements","workorders":"Work orders","capabilities":"Capabilities","billing":"Billing","comms":"Communications","people":"People","docs":"Documents","history":"History"},"overview":{"detailsTitle":"{{type}} details","legalName":"Legal name","localName":"Local name","code":"Code","type":"Type","country":"Country","countryNotChosen":"Not chosen yet","city":"City","currency":"Currency","terms":"Payment terms","primaryContact":"Primary contact","primaryBadge":"Primary","noPeople":"No people recorded yet.","contactOnRecord":"From the company record — add them under People to manage.","recentOrders":"Recent orders","recentActivity":"Recent activity","noActivity":"No commercial documents yet.","viewAll":"View all →","quickActions":"Quick actions","taxId":"Tax ID","recentPos":"Recent purchase orders","viewAllPos":"View all purchase orders →","locations":"Locations","locationDefaultLabel":"Address","noLocations":"No addresses on file yet."},"comms":{"title":"Communication log","sub":"Commercial documents exchanged with {{name}}.","empty":"Nothing logged yet.","derivedNote":"This log is derived from quotes, orders and POs. Manually logged calls and emails arrive in a later update.","logButton":"＋ Log","direction":{"inbound":"↓ Inbound","outbound":"↑ Outbound"}},"people":{"title":"People at this company","sub":"The humans we talk to. Click a person for full details; one is marked Primary.","empty":"No people recorded yet.","addPerson":"＋ Add person"},"docs":{"title":"Documents on file","sub":"Contracts, certificates, tax documents — upload new files or remove existing ones.","uploadTitle":"＋ Upload a document","uploadHint":"Click to browse or drop a PDF, JPG or PNG (up to 10 MB)","remove":"Remove document","selectedFile":"Selected: {{name}}","nameLabel":"Document name","namePlaceholder":"e.g. Supply contract 2026","effectiveLabel":"Effective from","expiryLabel":"Valid until","validUntil":"Valid until {{date}}","cancel":"Cancel","confirmUpload":"Upload","uploading":"Uploading…"},"history":{"title":"History & versions","empty":"No history yet.","lastEdited":"Record last edited {{when}}."},"staged":{"title":"This tab is on its way","sub":"The full panel for this tab ships in the next Contacts update. The data behind it is already live elsewhere in the app."},"logComm":{"title":"Log a communication","sub":"Record an email, call or message with {{name}}.","channel":"Channel","channelLabel":{"email":"Email","call":"Call","message":"Message"},"direction":"Direction","directionLabel":{"outbound":"↑ Outbound","inbound":"↓ Inbound"},"loggedBy":"Logged by","currentUser":"current user","summary":"Summary","summaryPlaceholder":"What was discussed…","footNote":"Adds to the communication log","cancel":"Cancel","logIt":"Log it","error":"Could not save the entry. Try again."},"orders":{"title":"Order & invoice history · {{count}}","sub":"Most recent first.","newQuote":"＋ New quote","searchPlaceholder":"Search by number…","allStatuses":"All statuses","reset":"↺ Reset","empty":"No records match.","colNo":"Number","colDate":"Date","colAmount":"Amount","colStatus":"Status","view":"View →","colInvoice":"Invoice","invoicePending":"Pending no.","colType":"Type","typeOrder":"Order","typeInvoice":"Invoice","approve":"✓ Approve","approving":"Approving…","approvedToast":"{{no}} approved — ready to send","approveError":"Could not approve {{no}}","newOrder":"New order"},"orderDetail":{"customer":"Customer","date":"Date","amount":"Amount","status":"Status","terms":"Terms","kindSalesOrder":"Sales order","close":"Close","lines":"Line items","noLines":"Line-item detail not captured for this historical record."},"paints":{"title":"Paint colours","sub":"Every colour in the paint library — {{name}}’s own listed first. Any customer can use any colour; click a row to open its formula.","newColour":"＋ New colour","empty":"No paint formulas yet — add the first colour.","drawerNewTitle":"New paint colour — {{name}}","drawerEditTitle":"Paint formula · {{code}}","drawerNewSub":"Add a colour for {{name}}","drawerEditSub":"Paint formula · {{code}}","edit":"Edit","viewOnlyHint":"View only. Click Edit to change this formula.","noSwatch":"No colour recorded for this formula","searchPlaceholder":"Search name, SKU or material…","allMaterials":"All materials","colGroup":"Group","groupOwn":"This customer’s colours","groupAll":"Other colours","colSku":"SKU","colName":"Name","colMaterial":"Material","colSheen":"Sheen","colAppliesTo":"Applies to","colUsedOn":"Used on","colNote":"Note","notSet":"not set","noMatch":"No colours match your search and filter.","versionChip":"v{{n}}","olderCount":"+{{n}} older","toggleVersions":"Show older versions of {{code}}","copy":"Copy","copying":"Copying…","newVersion":"New version","versioning":"Creating…","colActions":"Actions","copyName":"{{name}} (copy)","copyTitle":"Copy paint colour","copyDesc":"Duplicate “{{name}}” under a new SKU. The copy starts unlinked from products.","copyCodeLabel":"New SKU / code","copyCodePlaceholder":"e.g. NA1-COPY","copyCancel":"Cancel","copyConfirm":"Create copy","copyDone":"Colour copied · {{code}}","copyError":"Couldn’t copy the colour — try again.","newVersionDone":"New version created · {{code}}","newVersionError":"Couldn’t create the new version — try again.","codeExists":"Code {{code}} already exists — pick another.","appliesTo":{"all_surfaces":"All surfaces","large_surfaces":"Large surfaces","fittings":"Fittings"}},"products":{"title":"Products & BOM","sub":"Finished goods produced for this customer. Expand for the bill of materials.","newProduct":"＋ New product","filterPlaceholder":"Filter by product, SKU or material…","empty":"No products for this customer yet.","bomPill":"BOM {{v}} · {{status}}","noBom":"No BOM","noBomYet":"No bill of materials yet — create one from the BOM workspace.","openBom":"Open v{{v}} →","newProductStackTitle":"New product — create BOM","newProductStackSub":"A new product is a new bill of materials for {{name}}","bomStackTitle":"Bill of materials · v{{v}}","openDesignBom":"Open design BOM","createOrder":"Create order","orderCreating":"Creating…","copyBom":"Copy BOM","copyingBom":"Copying…","copyBomDone":"BOM copied to a new product","copyBomError":"Could not copy the BOM","newVersion":"New version","versioning":"Versioning…","newVersionDone":"New BOM version created — the previous version is now read-only","newVersionError":"Could not create a new version","edit":"Edit","delete":"Delete","deleting":"Deleting…","deleteConfirmTitle":"Delete this product?","deleteConfirmBody":"“{{name}}” will be deleted only if nothing uses it: no BOM, order, stock or price list. If it is in use, you can archive it instead.","deleteConfirm":"Delete product","deleteDone":"“{{name}}” deleted","deleteError":"Could not delete the product","orderCreated":"Order {{number}} created from this product","orderStackTitle":"Order {{number}}","orderCreateError":"Could not create the order","bomStatus":{"draft":"BOM · Draft","pending":"BOM · Pending approval","revision":"BOM · In revision","approved":"BOM · Approved","priced":"BOM · Priced","final":"BOM · Final"},"lifecycle":"BOM lifecycle · step {{n}} of {{total}}","colMaterial":"Material","colQty":"Quantity","checkStock":"Check stock","checkStockTitle":"Material stock","allStatuses":"All statuses","noMatch":"No products match.","draftInProgress":"Draft · in progress","colRef":"Reference","bomVersionsTitle":"BOM versions","versionCount_one":"{{count}} version","versionCount_other":"{{count}} versions","versionNoNote":"No change note","newFromVersion":"＋ New from {{v}}","versionCopying":"Copying…","versionCopied":"BOM {{v}} created from the previous version","versionCopyError":"Could not create a new BOM version","bomVersionStatus":{"draft":"Draft","active":"Approved","obsolete":"Superseded"},"versionGroup":{"current":"Current","past":"Past"},"colProduct":"Product","colLength":"Length","colWidth":"Width","colHeight":"Height","colGrade":"Grade","colPaint":"Paint","colSku":"SKU","notSet":"not set","noDesignAccess":"no access","noDesignAccessHint":"Your role cannot read BOM designs, so size, material, grade and paint are hidden.","notPriced":"not priced yet","qtyUnit":"pc","parts":"{{count}} parts in the BOM →","moq":"MOQ {{n}}","fob":"{{money}} FOB","verChip":"v{{v}}","stage":{"draft":"Material requirements added","pending":"Submitted for approval","revision":"Changes requested","approved":"Approved by Lead / Manager","priced":"Pricing added","final":"BOM approved"},"chip":{"all":"All","inprogress":"In progress","approved":"BOM approved"},"counter":"{{n}} of {{m}} products","columnFilters":"Column filters","allMaterials":"All materials","allGrades":"All grades","allPaints":"All paints","resetColumns":"Reset columns","ctlSearch":"search","ctlStage":"stage filter","ctlMaterial":"Material filter","ctlGrade":"Grade filter","ctlPaint":"Paint filter","noneMatch":"No products match your {{controls}}.","clearFilters":"Clear all filters","rowMenu":"Product actions","ctlSearchVal":"search \"{{q}}\"","ctlMaterialVal":"material {{v}}","ctlGradeVal":"grade {{v}}","ctlPaintVal":"paint {{v}}","copiedFrom":"Copied from {{ref}}","copiedFromUnknown":"Copied from another product","skuIncomplete":"SKU incomplete","skuIncompleteTitle":"The SKU has no variant yet — open the BOM to add it","copyBomTitle":"Copy BOM to a new product","copyBomDesc":"A new finished good will be created from {{name}} with the same bill of materials.","copySkuLabel":"New SKU (optional)","copySkuPlaceholder":"Leave blank to auto-generate","copySkuHint":"Leave blank and a SKU will be generated automatically.","loadError":"Couldn't load this customer's products.","loadErrorHint":"Check your connection and try again.","retry":"Retry"},"person":{"titleField":"Title","department":"Department","email":"Email","phone":"Phone","mobile":"Mobile","language":"Preferred language","primaryBadge":"Primary contact","edit":"Edit","log":"＋ Log","setPrimary":"Set as primary","unsetPrimary":"Unset primary"},"quote":{"title":"New quote","sub":"Full quote builder — {{name}}.","createdTitle":"Quote {{no}} created","createdSub":"The draft is saved. Add lines, pricing and approvals on the full quote screen, or head back to the record.","backToRecord":"Back to record","openQuote":"Open quote →","embedCaption":"Full quote screen · {{name}}"},"materials":{"title":"Supplied materials · {{count}}","sub":"This vendor's catalog — costs, MOQs and lead times","newMaterial":"+ New material","searchPlaceholder":"Search materials…","empty":"No materials in this vendor's catalog yet.","colCode":"Code","colMaterial":"Material","colVendorSku":"Vendor SKU","colStdCost":"Standard cost","colMoq":"MOQ","colLead":"Lead","leadDays":"{{n}}d","preferred":"Preferred","order":"Order","newStackTitle":"New material","newStackSub":"Add a material supplied by {{name}}","detailStackTitle":"Material","embedCaption":"Supplied by {{name}}","colOnHand":"On hand","stockFilterAll":"All stock status","stock":{"in":"In stock","low":"Low stock","out":"Out of stock"},"colCategory":"Category","colUom":"Unit of measure","colStockStatus":"Stock status","colStorage":"Storage","colLastReceived":"Last received","colQc":"QC","catFilterAll":"All categories","qcBadge":"QC"},"pos":{"title":"Purchase orders · {{count}}","sub":"Orders placed with this vendor","searchPlaceholder":"Search PO number…","allStatuses":"All statuses","empty":"No purchase orders with this vendor yet.","colNo":"PO number","approve":"✓ Approve","approvedToast":"{{no}} approved — ready to send","sentToast":"{{no}} sent to vendor","vendor":"Vendor","deliverTo":"Deliver to","kindPurchaseOrder":"Purchase order","sendToVendor":"✉ Send to vendor","newPo":"+ New PO","typePo":"PO"},"rfqsPanel":{"title":"Requests for quote · {{count}}","sub":"RFQs this vendor was invited to or awarded","newRfq":"+ New RFQ","empty":"No RFQs involving this vendor yet.","colNo":"RFQ number","colTitle":"Title","colMaterials":"Materials","colSource":"Source","colRequestedBy":"Requested by","itemsCount":"{{n}} items","sourceInternal":"Internal request","sourcePurchasing":"Purchasing","review":"Review →"},"payables":{"title":"Payables · {{count}}","sub":"Vendor bills and payment status","empty":"No bills from this vendor yet.","billMeta":"Bill · {{date}} · due {{due}}","balanceDue":"Due {{amount}}"},"poBuilder":{"title":"New purchase order","sub":"Order from {{name}} — lines come from their catalog","stepDraft":"Draft","stepApproval":"Approval","stepSent":"Sent","approvalWorkflow":"Approval workflow","expected":"Expected","incoterms":"Incoterms","incotermsPlaceholder":"e.g. FOB Ho Chi Minh City","skuHint":"{{n}} of {{total}} SKUs","filterCategory":"Filter by category","categoryAll":"All","vat":"VAT %","notes":"Notes","notesPlaceholder":"Internal notes…","lines":"Line items · {{count}}","addMaterials":"+ Add materials","pickerEmpty":"No more catalog materials to add.","noLines":"No lines yet — add materials from the vendor's catalog.","colUnitCost":"Unit cost","colQty":"Quantity","colLineTotal":"Line total","removeLine":"Remove line","subtotal":"Subtotal","vatAmount":"VAT {{rate}}%","cancel":"Cancel","saveDraft":"Save draft","submit":"Submit for approval","needWarehouse":"Choose a deliver-to warehouse first.","draftToast":"{{no}} saved as draft","submittedToast":"{{no}} submitted for approval"},"sendPo":{"title":"Send {{no}}","sub":"Email the purchase order to {{name}}","tab":{"email":"Email compose","preview":"PDF preview"},"to":"To","cc":"Cc","subjectLabel":"Subject","body":"Message","subject":"Purchase Order {{no}} — {{name}}","bodyTemplate":"Dear {{name}},\n\nPlease find attached our purchase order {{no}}. Kindly confirm receipt, sign and return one copy.\n\nBest regards,\nPurchasing Department\n{{company}}","emailNote":"Sending records the PO as sent to the vendor. Attach the downloaded PDF when emailing from your mail client.","attachment":"Attachment","pdfName":"{{no}}.pdf","preview":"preview →","editLines":"Edit lines","editLinesHint":"Edit line items and conditions before sending — this is what the vendor receives.","editLinesToast":"Adjust the lines in the PO detail, then send again","conditions":"Terms & conditions","applyTemplate":"Apply template…","saveTemplate":"Save as template","templateNamePrompt":"Template name","templateSaved":"Saved template “{{name}}”","templateApplied":"Applied “{{name}}”","addCondition":"+ Add condition","docTitle":"PURCHASE ORDER","tel":"Tel","taxId":"Tax ID","attn":"Attn","colUom":"Unit of measure","colAmount":"Amount","vatTotal":"VAT","total":"Total","sigBuyer":"Buyer","sigSeller":"Seller","sigNameDate":"Name · Date","downloadPdf":"Download PDF","recipientRequired":"Enter a valid recipient email before sending.","ourCompanyFallback":"Our company","asAgreed":"as agreed","defaultConditions":{"c1":"Deliver one sample for {{company}} to check dimensions and finish; mass production only after the sample is approved.","c2":"Inspect product quality before delivery to avoid delivering non-conforming goods.","c3":"If the delivered goods do not meet quality, the buyer may return them without bearing any cost to the seller.","c4":"Products must be delivered to the standard and quality of the sample agreed by both parties.","c5":"Delivery time: {{expected}} (during office hours). Delivery place: at the buyer's warehouse ({{company}}).","c6":"If the seller delivers late or non-conforming and this affects the buyer's production or shipment, the seller is fully responsible for all resulting damages to the buyer.","c7":"Payment by cash or bank transfer within 30 days of debt reconciliation and receipt of the VAT invoice. Payment documents: goods delivery note and financial invoice.","c8":"The material name on the delivery note and invoice must match the name on this purchase order. If it cannot match, notify {{company}} on receipt of this PO so it can be adjusted; otherwise the invoice is invalid and not payable.","c9":"Please check the order carefully, sign to confirm and return it to {{company}}."}},"poReview":{"title":"Review PO {{no}}","sub":"Purchase order for {{name}}","reviewPdf":"Review PDF"},"rfqBuilder":{"title":"New request for quote","sub":"Ask {{name}} to quote these materials","autoTitle":"Materials RFQ — {{name}}","neededBy":"Needed by","shipTo":"Ship to","shipToPlaceholder":"Delivery address…","notesPlaceholder":"Please quote FOB, lead time and MOQ…","noLines":"No materials yet — add them from the vendor's catalog.","footerNote":"{{count}} materials · no prices yet","flowBanner":"Request pricing from {{name}}. A PDF is generated to send; the vendor replies with their quoted prices which you record back here.","send":"Send RFQ","sentToast":"{{no}} sent to vendor","saveDraft":"Save draft RFQ","draftToast":"{{no}} saved as a draft","draftOnlyHint":"Sending to the vendor needs the RFQ send permission; this saves a draft."},"rfqDetail":{"materialUnavailable":"Material no longer available","colQuotedUnit":"Quoted unit","needPrices":"Enter at least one quoted price first.","markQuote":"Mark quote received","quoteRecorded":"Quote recorded on {{no}}","comparingBanner":"Quote received — review prices, then finalize to draft a purchase order.","awardedBanner":"Finalized — a purchase order was drafted from this RFQ.","finalize":"Finalize → create PO","awardReason":"Finalized from vendor workspace","poNote":"Drafted from {{no}}","finalizedToast":"PO {{po}} drafted for approval","copyLink":"🔗 Copy vendor fill-in link","linkCopied":"Vendor portal link copied"},"contract":{"header":"Contract · {{no}}","draftNo":"Draft","tab":{"edit":"Edit","preview":"PDF preview"},"status":{"draft":"Draft","sent_for_signature":"Sent for signature","signed":"Signed · active","cancelled":"Cancelled"},"cardTitle":"Contract agreements · {{count}}","cardSub":"Purchase-frame contracts with this vendor","newContract":"+ New contract","empty":"No contracts with this vendor yet.","continue":"Continue →","open":"Open →","signedOn":"signed {{date}}","defaultTitle":"Principal purchase contract","defaultGoods":"paint, thinner and coating materials for wooden products","titleLabel":"Title","effectiveFrom":"Effective from","effectiveTo":"Effective to","signedDocTitle":"Signed document","signedDocEmpty":"No signed PDF attached yet.","signedDocUpload":"Upload signed PDF","signedDocReplace":"Replace file","signedDocRemove":"Remove","signedDocUploading":"Uploading…","signedDocUploaded":"Signed document uploaded","signedDocRemoved":"Signed document removed","goods":"Goods covered","partyA":"Party A — Buyer","partyB":"Party B — Seller","party":{"name":"Company name","addr":"Address","rep":"Represented by","pos":"Position","tel":"Tel","tax":"Tax code","bank":"Bank account"},"terms":{"paymentDays":"Payment (days)","deliveryDays":"Delivery (business days)","poConfirmDays":"PO confirm (business days)","cancelPenalty":"Cancellation penalty (%)","interestCap":"Late-payment interest cap (%)","priceNoticeDays":"Price-change notice (days)","priceReplyDays":"Price-change reply (days)","term":"Contract term","governingLaw":"Governing law"},"articlesTitle":"Articles · {{count}}","resetFromTerms":"↻ Reset from terms","addArticle":"+ Add article","regenToast":"Articles reset from current terms","moveUp":"Move up","moveDown":"Move down","savedToast":"{{no}} saved","sentToast":"{{no}} sent for signature","signedToast":"{{no}} marked signed","sendToSign":"Send to sign","markSigned":"Mark signed","srvMotto":"Socialist Republic of Vietnam — Independence · Freedom · Happiness","noLabel":"No: {{no}}","datedLabel":"Dated {{date}}","madeBy":"This Contract is made and signed by and between:","agreeIntro":"After discussion, the two Parties agree to sign this Contract on the following terms:","articleN":"Article {{n}}: {{title}}","sigStamp":"(signature & stamp)","representedBy":"Represented by","articles":{"a1t":"General provision","a1b":"1.1 The business relationship between Party A and Party B is on the basis of mutual benefit.\n1.2 Party B agrees to sell to Party A, and Party A agrees to buy from Party B, {{goods}} (the \"Goods\").\n1.3 Under this Contract the Parties will sign a Purchase Order for each delivery. Each Purchase Order specifies the quality, quantity, price, delivery and payment terms, and is an integral annex to this Contract.\n1.4 Where a Purchase Order conflicts with this Contract, this Contract prevails unless the Parties agree otherwise in writing. Any amendment must be in writing and signed by both Parties.","a2t":"Execution of purchase order","a2b":"2.1 Party A sends a signed Purchase Order to Party B based on the agreed quotation (price, quality, delivery time).\n2.2 Within {{po_confirm_days}} Business Days, Party B confirms the Purchase Order by email or issues a rejection. A Business Day means any day other than Saturday, Sunday or a public holiday in Vietnam.\n2.3 If Party B proposes amendments, it must send the amended Purchase Order within {{po_confirm_days}} Business Days for Party A's written approval; once confirmed it binds both Parties.\n2.4 If Party A cancels a confirmed Purchase Order without valid reason, Party A shall pay a penalty of {{cancel_penalty_pct}}% of the total Purchase Order value.","a3t":"Standard – quantity – price","a3b":"3.1 Standard: quality per the manufacturer's specification or as stated in the Purchase Order; packing and preservation to manufacturer standard; Goods warranted 100% new.\n3.2 Quantity: the actual quantity is per the confirmed Purchase Order and may increase or decrease with Party A's consumption.\n3.3 Price: agreed via Party B's quotation and Party A's order; adjustable by mutual agreement. Party B must give written notice of any price change {{price_notice_days}} days in advance; a change takes effect only with Party A's written consent within {{price_reply_days}} working days.","a4t":"Delivery","a4b":"4.1 Party B delivers the Goods to Party A's factory or business location using Party B's transport, at Party B's cost. Party A provides warehouse space and labour to unload.\n4.2 Delivery within {{delivery_days}} Business Days of Party B confirming the Purchase Order, during Party A's office hours ({{deliver_from}} – {{deliver_to}}). Except for force majeure, Party B must deliver on time or notify Party A promptly and agree a new date.\n4.3 Title and risk pass to Party A on delivery at the designated destination. If Party A fails to accept on time without valid reason, Party B may charge reasonable storage and re-delivery costs.","a5t":"Payment","a5b":"5.1 Payment is based on the quantity actually delivered per the hand-over minutes, invoice and Purchase Order.\n5.2 Payment by bank transfer within {{payment_days}} days of receiving a valid VAT invoice, signed hand-over minutes, the original Purchase Order, debit note and any other documents reasonably requested.\n5.3 Payment is made to Party B's bank account stated in this Contract; transfer fees borne by Party A.\n5.4 Party A may suspend part or all payment without breach if Party B fails to perform. Late payment by Party A is subject to Article 6.","a6t":"Rights and obligations of each Party","a6b":"6.1 Party A may require Goods matching the quantity, quality, timing and terms of the Purchase Order and may refuse non-conforming Goods. Party A shall keep pricing and product information confidential, check and receive the Goods, cooperate on issues, and pay in full and on time.\nOn late payment Party A pays interest at the bank's one-month deposit rate on the overdue amount per day of delay, capped at {{interest_cap_pct}}% of the payment amount. If overdue beyond 30 days, Party B may suspend delivery on 15 days' written notice and, absent response, terminate and dispose of outstanding orders as set out herein.\n6.2 Party B shall supply conforming Goods on time, provide valid documents, and warrant the Goods 100% new.","a7t":"Force majeure","a7b":"Neither Party is liable for failure or delay caused by events beyond reasonable control (natural disaster, fire, flood, epidemic, war, strike, or lawful act of authority). The affected Party must notify the other within 7 days and take reasonable steps to mitigate. If force majeure continues beyond 60 days, either Party may terminate without liability except for amounts already due.","a8t":"Expiry and conditions for contract termination","a8b":"8.1 This Contract is valid for {{term}} from the signing date and renews unless either Party gives 30 days' written notice.\n8.2 Either Party may terminate early on 30 days' written notice, or immediately for material breach uncured within 15 days of notice.\n8.3 Termination does not affect obligations accrued before the termination date, including outstanding payment.","a9t":"Other terms","a9b":"9.1 This Contract is governed by {{governing_law}}. Disputes are settled amicably; failing that, by the competent court in Vietnam.\n9.2 This Contract is made in Vietnamese and English; the Vietnamese version prevails in case of discrepancy.\n9.3 This Contract is made in 04 copies of equal validity, 02 kept by each Party, effective from the signing date."}},"quickAction":"＋ Quick action","quick":{"newQuote":"New quote","newProduct":"New product / BOM","newMaterial":"New material","newPo":"New purchase order","logComm":"Log communication","addPerson":"Add a person","uploadDoc":"Upload document"},"newProduct":{"title":"New product — create BOM","step1Sub":"Step 1 of 2 · choose a starting point for {{name}}","step1Foot":"Step 1 of 2 · starting point","intro":"Every new product for {{name}} begins with a bill of materials. Start from nothing, or copy an existing BOM and adjust it — cloning keeps parts, materials and finishing so you only edit the differences.","scratchTitle":"Start from scratch","scratchSub":"An empty worksheet. Add every part, material, quantity and finishing step yourself. Best for a genuinely new design.","cloneTitle":"Clone an existing product","cloneSub":"Copy a BOM from a product already in the catalog, then edit. Faster for variants — a different size, finish or hardware set.","sourceLabel":"Source product","sourcePlaceholder":"— select a product to clone —","cloneNote":"The clone starts as a new draft at version 1 — the source product is untouched.","noSources":"No products in this customer's catalog yet — start from scratch.","pickSource":"Choose a product to clone","continue":"Continue →","creating":"Creating…","error":"Could not create the product","defaultName":"New product","copyName":"{{name}} (copy)","back":"← Back","cloneStackTitle":"New product — clone BOM","cloneStackSub":"Cloned from {{source}} · {{name}}","scratchStackSub":"Starting from a blank bill of materials for {{name}}","cloneFoot":"Cloned lines are editable — adjust then save as a new BOM · {{name}}","scratchFoot":"Create parts, materials & finishing → cost roll-up · {{name}}","skuSection":"Product SKU","customerLabel":"Customer","step1SubPick":"Step 1 of 2 · pick the customer and a starting point","introPick":"Every new product begins with a bill of materials. Pick the customer it belongs to, then start from nothing or copy an existing BOM and adjust it — cloning keeps parts, materials and finishing so you only edit the differences.","customerPickPlaceholder":"Search customers…","customerRequired":"Pick a customer first","productTypeLabel":"Product type","productTypePlaceholder":"— select a product type —","productSubTypeLabel":"Product sub-type","productSubTypePlaceholder":"— select a sub-type —","variantLabel":"Variant","variantPlaceholder":"e.g. A","versionLabel":"Version","versionHint":"{{digits}} digits — the starting version number","versionError":"Version must be exactly {{digits}} digits","skuPreviewLabel":"SKU preview"},"fullList":"Full list","importVendors":"Import vendors","importVendorsTitle":"Bulk import vendors from a CSV or Excel file","allFacets":{"type":"All types","segment":"All segments"},"nFacets":{"type":"{{count}} types selected","segment":"{{count}} segments selected"},"unclassifiedSegment":"No segment set","shipTo":{"intro":"<b>{{customer}}</b> buys and is invoiced. These are <b>their</b> clients — we ship to them on their behalf. A ship-to never receives an invoice; its address is what goes on the bill of lading and the customs entry, and it becomes the <b>consignee</b> on the export documents.","empty":"No ship-to accounts on this customer — every order is delivered to them directly.","addAccount":"Add a ship-to account","loading":"Loading ship-to accounts…","status":{"active":"Active","draft":"Draft"},"notifyChip":"notify party","personCount_one":"{{count}} person","personCount_other":"{{count}} people","noAddressWarning":"No address yet. A shipment cannot be consigned to this account until it has one.","detail":{"code":"Ship-to code","port":"Discharge port","incoterm":"Incoterm","lastShipment":"Last shipment","address":"Address on the bill of lading","tel":"Tel","fax":"Fax"},"peopleAt":"People at {{name}}","people":{"name":"Name","title":"Job title","department":"Department","email":"Email","phone":"Phone"},"nobodyYet":"Nobody on file at this account yet.","addSomeone":"Add someone","addPerson":"Add person","editAccount":"Edit account","roles":{"primary":"Primary","billing":"Billing","shipping":"Shipping","technical":"Technical","quality":"Quality","finance":"Finance"},"overviewLabel":"Ship-to accounts","overviewOnFile":"{{count}} on file","overviewShipsDirect":"Ships direct","toast":{"created":"{{name}} added as a ship-to under {{customer}}","updated":"Ship-to account updated","removed":"Ship-to account removed"},"form":{"newTitle":"New ship-to account","editTitle":"Edit ship-to account","sub":"Under <b>{{customer}}</b> · never invoiced — this address becomes the consignee on the bill of lading and export documents.","name":"Company name","namePlaceholder":"Legal name as it must appear on the B/L","code":"Ship-to code","codePending":"assigned on save","status":"Status","statusActive":"Active","statusDraft":"Draft — not shippable yet","country":"Country","city":"City","cityPlaceholder":"Okawa","address":"Full address","addressPlaceholder":"Street, city, prefecture / state, country","tel":"Telephone","telPlaceholder":"0081-944-88-2512","fax":"Fax","faxPlaceholder":"optional","port":"Discharge port","incoterm":"Incoterm","notify":"Default notify party","notifyHint":"Alerted on arrival. Uncheck if a freight agent is notified instead.","nameRequired":"A company name is required.","activeNeedsAddress":"An active ship-to needs a full address — customs reads it. Save it as Draft instead if the address is not confirmed.","saveAsDraft":"Save it as Draft instead","delete":"Delete","cancel":"Cancel","create":"Create ship-to account","saveChanges":"Save changes","peopleTitle":"People at this account","peopleHintFirst":"first is primary","peopleHintOptional":"optional — can be added later","nobodyAdded":"Nobody added yet.","unnamed":"Unnamed contact","noTitleEmail":"No title or email yet","removePerson":"Remove","addPerson":"Add person","groupWho":"Who is this person?","groupWhere":"Where do they work?","groupReach":"How to reach them","salutationLabel":"Salutation","salutation":{"none":"—","Mr":"Mr","Ms":"Ms","Mrs":"Mrs","Dr":"Dr","Anh":"Anh","Chi":"Chị"},"preferredName":"Preferred name","preferredNamePlaceholder":"How they're called day-to-day","givenName":"Given name","givenNamePlaceholder":"e.g. Kenzo","middleName":"Middle name","familyName":"Family name","familyNamePlaceholder":"e.g. Mabuchi","displayNameVi":"Display name (VI)","optionalPlaceholder":"optional","language":"Preferred language","languageOption":{"en":"English","vi":"Tiếng Việt","ja":"日本語"},"jobTitle":"Job title","jobTitlePlaceholder":"e.g. Warehouse manager","department":"Department","departmentPlaceholder":"e.g. Logistics","email":"Email","emailPlaceholder":"name@company.co.jp","phone":"Phone","phonePlaceholder":"944-88-2512","mobile":"Mobile","dialCode":"Dial code","roles":"Roles / tags","notes":"Notes","notesPlaceholder":"Anything the shipping team should know"}},"pi":{"title":"New order (proforma)","sub":"Issue a proforma invoice to {{name}}.","embedCaption":"Proforma invoice · {{name}}"},"account":{"titleReceivable":"Account & receivables","titlePayable":"Account & payables","receivableLimit":"receivable · limit {{limit}}","payableLimit":"payable · limit {{limit}}","used":"used","overdue":"⚠ {{amount}} overdue · {{days}} days","openPis":"Open PIs","openPos":"Open POs","ytdValue":"YTD value","lastTxn":"Last txn","note":"Note"},"embed":{"loading":"Loading…","errorTitle":"This screen did not load","errorBody":"It may still be starting, or your session may have ended. Retry, or open it on its own page.","retry":"Retry","openPage":"Open in full page"}},"toast":{"saved":"Saved","created":"{{name}} created","uploaded":"Document uploaded","documentDeleted":"Document deleted","primarySet":"Primary contact updated","commLogged":"Communication logged","productCreated":"{{name}} created","formulaSaved":"Paint formula saved","templateDownloadFailed":"Could not download the template","importDone":"Import finished: {{created}} created, {{updated}} updated, {{failed}} failed","importFailed":"Import failed — nothing was written","saveFailed":"Could not save","deleteFailed":"Could not delete","uploadFailed":"Could not upload","downloadFailed":"Could not download"},"completeness":{"titleCustomer":"Complete this customer","titleVendor":"Complete this vendor","body":"Some required details are missing. Fill them in to use this record on new documents.","listLabel":"Missing details","fields":{"legal_name":"Legal name","country":"Country","currency":"Currency","billing_address":"Billing address","contact":"Contact email or phone","payment_terms":"Payment terms","tax_id":"Tax ID"},"gate":{"title":"Complete the customer first","body":"{{customer}} is still incomplete, so it cannot be used on a new quote, PI or order. Missing: {{missing}}.","openCustomer":"Open {{customer}}"}}},"account":{"title":"My Account","tabs":{"identity":"Identity","contact":"Contact","role":"Role & Access","password":"Password","sessions":"Active Sessions","recent-signins":"Recent Sign-ins","notifications":"Notifications","navLabel":"Account navigation"},"identity":{"heading":"Identity","subheading":"Manage your name, title, and department","firstName":"First name","lastName":"Last name","middleName":"Middle name","title":"Title","department":"Department","email":"Email","emailHelp":"Contact your admin to change your email address","save":"Save changes","saved":"Changes saved"},"contact":{"heading":"Contact","subheading":"Manage your phone and mobile numbers","phone":"Phone","mobile":"Mobile","save":"Save changes","saved":"Changes saved"},"role":{"heading":"Role & Access","subheading":"Your assigned role and permissions","roleName":"Role","scope":"Data scope","noRole":"No role assigned","adminNote":"Talk to your admin to change your role or permissions"},"password":{"heading":"Change Password","subheading":"Update your account password","currentPassword":"Current password","newPassword":"New password","confirmPassword":"Confirm new password","submit":"Change password","success":"Password changed successfully","errorWrongCurrent":"Current password is incorrect","errorMismatch":"Passwords do not match","errorTooShort":"Password must be at least 8 characters"},"sessions":{"heading":"Active Sessions","subheading":"Devices and browsers with active access","current":"Current","revoke":"Revoke","revokeAll":"Sign out everywhere else","revokeAllConfirm":"This will sign out all other devices. Continue?","noSessions":"No other active sessions","userAgent":"Browser / Device","ipAddress":"IP Address","lastSeen":"Last seen","createdAt":"Signed in"},"recentSignins":{"heading":"Recent Sign-ins","subheading":"Login history for your account","when":"When","ip":"IP Address","userAgent":"Browser / Device","action":"Action","actionLogin":"Signed in","actionFailedLogin":"Failed login attempt","noHistory":"No sign-in history yet","searchPlaceholder":"Search sign-ins..."}},"admin":{"nav":{"users":"Users","roles":"Roles & Permissions","approvals":"Approval rights","company":"Company Settings","billing":"Billing","audit":"Audit Log","title":"Administration"},"common":{"cancel":"Cancel","save":"Save","saving":"Saving…","view":"View","actions":"Actions","close":"Close"},"users":{"title":"Users","subtitle":"{{count}} users","description":"Manage who can sign in, their roles, and account status.","searchPlaceholder":"Search by name or email…","allStatuses":"All statuses","statusActive":"Active","statusSuspended":"Suspended","noUsers":"No users found.","emptyTitle":"No users yet","emptyDescription":"Invite teammates to give them access to this workspace.","colName":"Name","colRole":"Role","colEmail":"Email","colStatus":"Status","colLastSignIn":"Last sign-in","pagination":"Page {{page}} · {{total}} users","role":"Role","lastSignIn":"Last sign-in","accountOwner":"Account Owner","saved":"Changes saved.","suspended":"User suspended.","activated":"User activated.","resetSent":"Password reset email sent.","sendPasswordReset":"Send password reset","suspend":"Suspend user","activate":"Activate user","status":{"active":"Active","suspended":"Suspended","deactivated":"Deactivated","invited":"Invited"},"helpIntro":"Manage everyone who can sign in to your workspace and the role that controls their access.","helpStep1":"Search or filter by status to find a user.","helpStep2":"Click a row to open the user detail panel.","helpStep3":"Use Invite to add a new person by email.","helpStep4":"Change a role or status from the detail panel.","helpTip1":"Suspended users keep their data but cannot sign in until reactivated.","colDepartment":"Department","colActions":"Actions","statusInvited":"Invited","pendingInvites":"Pending invitations","inviteResent":"Invitation re-sent.","inviteRevoked":"Invitation revoked.","inviteDeleted":"Invitation deleted.","resend":"Resend","revoke":"Revoke","deleteInvite":"Delete","deleteInviteConfirm":"Delete this pending invitation? The email will be freed so you can invite them again later.","editDetails":"Edit role & details","roleChangeHint":"Role changes take effect on the user's next page load.","you":"You","memberCount":"{{shown}} of {{total}} members"},"invite":{"cta":"Invite user","title":"Invite user","fullName":"Full name","email":"Email address","role":"Role","selectRole":"Select role…","department":"Department","send":"Send invite","sending":"Sending…","successTitle":"Invitation sent","successBody":"{{email}} has been invited.","noRole":"No role","departmentPlaceholder":"e.g. Production, Warehouse","selectDepartment":"Select department…","noDepartments":"No departments defined yet","error":"Failed to send invitation. Please try again.","fullNamePlaceholder":"Enter full name"},"roles":{"title":"Roles & Permissions","description":"Manage system and custom roles and the permissions they grant.","descriptionLabel":"Description","matrixCta":"Permission Matrix","newRole":"New custom role","noRoles":"No roles found.","emptyTitle":"No roles yet","emptyDescription":"Create a custom role to bundle permissions and assign them to users.","colName":"Name","colUsers":"Users","colType":"Type","colScope":"Data scope","colActions":"Actions","system":"System","custom":"Custom","name":"Role name","namePlaceholder":"e.g. Senior Accountant","colorTag":"Color tag","baseRole":"Base role (inherit permissions)","noBase":"No base role","dataScope":"Data scope","approvalLimit":"Approval limit (VND)","approvalLimitHint":"Leave blank for unlimited.","createRole":"Create role","scope":{"own":"Own records only","own_plus_reports":"Own + direct reports","team":"Full team","company":"Entire company"},"searchPlaceholder":"Search roles…","helpIntro":"Roles bundle permissions into a single assignable set so you can grant access by job function.","helpStep1":"Click New role to create a custom role.","helpStep2":"Click a role name to view or edit its permissions.","helpStep3":"Open the permission matrix to compare roles side by side.","helpTip1":"System roles cannot be deleted, but you can clone one as a starting point.","colStatus":"Status","colAccess":"Feature access","colLimit":"Approval limit","editRole":"Edit role","statusLabels":{"active":"Active","unused":"Unused","inactive":"Inactive"},"deleteRole":"Delete role","countLine":"{{total}} roles · {{custom}} custom","openMatrix":"Open permission matrix","viewMembers":"View assigned members ({{n}})","editRoleDetails":"Edit role details","cloneRole":"Clone role","cloneTitle":"Clone role","cloneNamePrefix":"Copy of {{name}}","customSuffix":"(custom)","nameVi":"Name (Vietnamese)","nameViPlaceholder":"e.g. Quản lý kho","descriptionViLabel":"Description (Vietnamese)"},"approvalRights":{"title":"Approval rights","description":"Who can approve each type of document","note":"Approval rights come from each person's role. To change them, change the role or the person's role.","coverage":"Document types shown: {{list}}.","notCovered":"Not shown here: export documents (they have no approval step), who is assigned to approve a particular record, a role's approval amount limit, whether your plan includes the module, and the automatic activation of a customer — a customer with every required detail is activated as soon as someone who can edit it saves it, or uses it on a quote or PI.","colPerson":"Person","colRole":"Role","doc":{"proforma_invoice":"Proforma invoice","quotation":"Quotation","pricing_worksheet":"Pricing worksheet","price_adjustment":"Price adjustment","sales_order":"Sales order","sample_request":"Sample request","customer":"Customer approval","purchase_request":"Purchase request","purchase_order":"Purchase order","rfq":"Request for quotation","vendor_bill":"Vendor bill","bom":"Bill of materials","engineering_change_order":"Engineering change order"},"canApprove":"Can approve","cannotApprove":"Cannot approve","owner":"Owner","legendTitle":"Legend","legendOwner":"Account owner — approves everything","legendMeaning":"Sample request: record the customer's decision. Customer approval: activate or deactivate a customer by hand (a complete customer is also activated automatically when saved). Vendor bill: approve it for payment.","noRole":"No role","filterRole":"Role","allRoles":"All roles","searchPlaceholder":"Search by name or email…","changeRole":"Change role","changeRoleBlocked":"Changing a person's role needs the Manage users right. Ask an administrator.","bomTransition":"No one has the Approve BOMs right yet, so anyone with the workflow stage rights can approve BOMs.","emptyTitle":"No active people","emptyDescription":"Invite people and give them a role to see their approval rights here.","emptyFilteredTitle":"No one matches","emptyFilteredDescription":"Try another name, email or role.","loadError":"Could not load approval rights. Check your connection and try again.","openRoles":"Roles & Permissions","countLine":"{{shown}} of {{total}} people","helpIntro":"A read-only view of who can approve which documents. Each tick comes from the person's role.","helpStep1":"Search for a person or filter by role.","helpStep2":"To change what a role can approve, open Roles & Permissions and edit that role.","helpStep3":"To change one person, use Change role on their row."},"matrix":{"title":"Permission Matrix","description":"Pick a role, then grant access the way the app is laid out — by nav section, then the features inside it, down to exact actions. The green dot marks what shows in this role’s left-hand menu.","exportCsv":"Export CSV","noData":"No matrix data available.","helpIntro":"The permission matrix sets exactly what one role can do, laid out like the left navigation.","helpStep1":"Pick the role to edit from the dropdown.","helpStep2":"Expand a section to see its features (nav items).","helpStep3":"Set an access level — None, View, Edit, Approve or Full — per row.","helpStep4":"The menu preview shows what this role will see in the left nav.","editingRole":"Editing role","limit":"limit","adminLocked":"Admin always has full access to every section — its permissions can’t be reduced.","action":{"view":"View","create":"Create","edit":"Edit","approve":"Approve","delete":"Delete"},"section":{"sales":"Sales","products":"Products","purchasing":"Purchasing","production":"Production","inventory":"Inventory","finance":"Finance","manufacturing":"Manufacturing","reports":"Reports","people":"People","settings":"Settings","knowledge_base":"Knowledge Base","administration":"Administration","other":"Other access (not in menu)"},"level":{"none":"None","view":"View","edit":"Edit","approve":"Approve","full":"Full","custom":"Custom"},"feature":{"sales_contacts":"Contacts","sales_pipeline":"Pipeline & Orders","sales_quotations":"Quotations","sales_pricing":"Pricing","sales_documents":"Order Documents","sales_delivery":"Delivery","sales_commissions":"Commissions","sales_forecast":"Demand Forecast","sales_samples":"Samples","sales_reports":"Sales Reports","sales_customers":"Customer Approval","products_list":"Product List","products_engineering":"Engineering BOM & Routing","purch_partners":"Supply Partners","purch_orders":"Purchase Orders","purch_rfqs":"RFQs & Forecast","purch_receiving":"Receiving & Claims","purch_planning":"Purchase Planning","purch_reports":"Purchasing Reports","purch_prices":"Purchase prices","purch_executive":"Executive Report","purch_requests":"Requests","prod_scheduling":"Scheduling","inv_warehouse":"Warehouse Workspace","inv_stock":"Stock & Materials","inv_cycle":"Cycle Count","inv_overages":"Overages","inv_logistics":"Logistics & Export Docs","fin_ledger":"Ledger & Finance Home","fin_payables":"Supplier Payables","fin_receivables":"Receivables","fin_cashflow":"Cash Flow & Payments","fin_compliance":"Compliance","mfg_orders":"Production Orders","mfg_mrp":"MRP","mfg_operations":"Work Operations","mfg_downtime":"Downtime","mfg_material":"Material Feedback","mfg_receipts":"Receipts","mfg_quality":"QA / QC","rep_reports":"Reports & Accounting","hr_employees":"Employees","hr_attendance":"Attendance","hr_shifts":"Shifts","hr_leave":"Leave","hr_overtime":"Overtime","hr_payroll":"Payroll","hr_performance":"Performance","hr_recruitment":"Recruitment","hr_self":"Self Service","hr_reports":"HR Reports","set_categories":"Categories","set_material_options":"Material Options","set_forms":"Forms","set_sku":"SKU Standards","set_formulas":"Formulas","set_payment_terms":"Payment Terms","set_modules":"Module Enablement","set_numbering":"Document Numbering","set_doc_templates":"Document Templates","set_card_titles":"Card Titles (company-wide)","set_alerts":"Inventory Alerts","set_delegations":"Delegations","kb_articles":"Articles","adm_users":"Users","adm_roles":"Roles & Permissions","adm_company":"Company Settings","adm_email":"Email Provider","adm_shopfloor_tablets":"Shop-floor tablets","adm_billing":"Billing","adm_audit":"Audit Log","other_customer_portal":"Customer Portal","other_supplier_portal":"Supplier Portal","other_maintenance":"Maintenance","sales_executive":"Executive Dashboard","set_approval_override":"Approve on behalf"},"cap":{"orders":"Orders","pipeline":"Pipeline","product_orders":"Product Orders","sample_requests":"Sample Requests","pricing":"Price Lists","worksheets":"Pricing Worksheets","price_adjustments":"Price Adjustments","selling_prices":"Selling prices","customer_codes":"Customer codes","customer_lock":"Lock / unlock customers","product_codes":"Product codes","bom_approve":"Approve BOMs","engineering":"Engineering BOM","eco":"Engineering Changes (ECO)","obsolescence":"Obsolescence","warehouse":"Warehouse Records","picking":"Picking","putaway":"Putaway","workspace":"Flow Board & Summary","ledger":"Stock Ledger","receive":"Receiving","movements":"Movements","transfers":"Transfers","returns":"Returns to Stock","rtv":"Returns to Vendor","reservations":"Reservations","fg":"Finished Goods","lots":"Lots & Quality","categories":"Categories","material_options":"Material Options","forms":"Forms","sku":"SKU Standards","inspections":"Inspections","qc":"QC Capture","employees":"Employees","departments":"Departments","positions":"Positions","contacts":"Contact Records","products":"Products & BOM","shipto":"Ship-to Accounts","paints":"Paint Colours","comms":"Communications","people":"People","docs":"Documents","activity":"History","planning":"Purchase Planning","pi_pipeline":"PI Pipeline","po_tracker":"PO Tracker","outsource":"Outsource"},"menuPreview":"Menu preview","previewSubtitle":"What {{name}} sees in the left nav","shownCount":"{{shown}} of {{total}} shown in menu","hiddenFromMenu":"Hidden from this role’s menu","itemsSummary":"{{items}} items across {{sections}} sections","previewEmpty":"Nothing visible. Grant View on a feature and it appears here.","hidePreview":"Hide preview","showPreview":"Show preview","resetDefault":"Reset to default","wholeSection":"Whole section","legendShown":"Shown in this role’s menu","legendHidden":"Hidden","accessRises":"Access rises left → right: View › Edit › Approve › Full","exactActions":"Show exact actions","impliesView":"enabling any action turns on View","noViewLevel":"no View level exists for this area","adminEditableNote":"Admin is editable — but Roles & Permissions stays on, so an edit can never lock every admin out of this matrix.","saved":"Permissions saved","roleUpdated":"Role updated","unsavedTitle":"Discard unsaved changes?","unsavedBody":"You have unsaved permission changes. Switching roles will discard them.","discardChanges":"Discard changes","editRole":"Edit details","roleNameEn":"Name (English)","roleNameVi":"Name (Vietnamese)","roleDescEn":"Description (English)","roleDescVi":"Description (Vietnamese)","cancel":"Cancel","saving":"Saving…","saveRole":"Save details","unsavedChanges":"You have unsaved changes","discard":"Discard","saveChanges":"Save changes"},"permissions":{"updateError":"Failed to update permission","noRoles":"No roles found.","permission":"Permission","system":"system","expandAll":"Expand all","collapseAll":"Collapse all","featureCount":"{{n}} features","selectAll":"All","clearAll":"None","save":"Save changes","saving":"Saving…","discard":"Discard","pending":"{{n}} unsaved change(s)","viewOnly":"View-only — you don't have permission to change roles."},"workspace":{"title":"Workspace","members":"Members","invites":"Pending invites","roles":"Roles"},"email":{"title":"Email Provider","subtitle":"Configure how KeenERP sends documents to your customers by email.","viewOnly":"You have read-only access to email settings.","loadError":"Could not load email settings","providerLabel":"Provider","providerDefault":"KeenERP default (shared)","providerDefaultHint":"Send through KeenERP's shared email service. No setup required.","providerCustom":"Custom SMTP","providerCustomHint":"Use your own SMTP server.","enabledLabel":"Enable outbound document email","enabledHint":"When off, sending a document produces only a portal link (no email).","smtpSection":"Custom SMTP","hostLabel":"SMTP host","portLabel":"Port","userLabel":"Username","passwordLabel":"Password","passwordSet":"A password is saved. Leave blank to keep it.","passwordPlaceholder":"Enter to set or change","senderSection":"Sender identity","fromEmailLabel":"From address","fromEmailHint":"Leave blank to use the KeenERP default.","fromNameLabel":"From name","replyToLabel":"Default reply-to","replyToHint":"Customer replies go here. Used for every document send unless overridden.","save":"Save changes","saved":"Email settings saved","test":"Send test email","testSending":"Sending…","testToLabel":"Send test to","testToPlaceholder":"you@example.com","testSuccess":"Test email sent to {{email}}","testFailed":"Test failed: {{detail}}","testNotConfigured":"Email is not configured yet."},"company":{"title":"Company Settings","subtitle":"Your organisation profile and the localisation defaults every module inherits.","save":"Save changes","saving":"Saving…","saved":"Company settings saved.","viewOnly":"View-only — you need the company-manage permission to make changes.","identity":"Identity","registration":"Registration","contactAddress":"Contact & address","regionTime":"Region & time","currency":"Currency","fiscalYear":"Fiscal year","tax":"Tax","none":"None","livePreview":"Live preview","previewMoney":"Money","previewDate":"Date","previewTz":"Timezone","localizationHint":"These defaults drive how dates, numbers and money display across every module. Documents (quotes, POs) can still switch currency per-record.","numberingHint":"Document numbering (customer, supplier, employee and product codes) is configured under Settings → SKU Standards.","lastEdited":"Last edited by {{name}}","tabs":{"profile":"Company profile","localization":"Localization","fiscal":"Fiscal & tax"},"firstDayLabels":{"monday":"Monday","sunday":"Sunday"},"months":{"1":"January","2":"February","3":"March","4":"April","5":"May","6":"June","7":"July","8":"August","9":"September","10":"October","11":"November","12":"December"},"fields":{"legalName":"Legal name (Tiếng Việt)","enName":"Name (English)","name":"Display name","shortName":"Short name","industry":"Industry","taxCode":"Tax code (MST)","phone":"Phone","fax":"Fax","email":"Email","website":"Website","country":"Country","countryHint":"· ISO code, e.g. VN","street":"Street / building","ward":"Ward","district":"City / District","city":"City","province":"Province / State","timezone":"Timezone","locale":"Display language","firstDay":"First day of week","dateFormat":"Date format","numberFormat":"Number format","baseCurrency":"Base currency","secondaryCurrency":"Secondary currency","fxRate":"Reference FX rate","fyStart":"Fiscal year starts","weekHours":"Working hours / week","vatDefault":"Domestic VAT default (%)","vatHint":"· applied to new documents","vatDomesticHelp":"Customers in your home country (Vietnam by default), or with no country set.","vatExport":"Export VAT default (%)","vatExportHelp":"Customers whose country is outside your home country (Vietnam by default).","logo":"Logo","searchAddress":"Search address","searchAddressHint":"· autocomplete · Google Places","searchAddressPlaceholder":"Start typing an address…"},"logoUpload":"Upload…","logoReplace":"Replace","logoRemove":"Remove","industryLabels":{"wooden_furniture":"Wooden furniture manufacturing","furniture_other":"Furniture manufacturing (other)","wood_products":"Wood & wood products","textiles_garments":"Textiles & garments","metal_products":"Metal products & fabrication","plastics_rubber":"Plastics & rubber products","electronics":"Electronics & electrical equipment","machinery":"Machinery & equipment","food_beverage":"Food & beverage processing","paper_packaging":"Paper, printing & packaging","construction_materials":"Construction & building materials","automotive":"Automotive & transport equipment","wholesale_distribution":"Wholesale & distribution","retail_consumer":"Retail & consumer goods","logistics_warehousing":"Logistics & warehousing","other_manufacturing":"Other manufacturing"},"countryLabels":{"VN":"Vietnam","US":"United States","CN":"China","JP":"Japan","KR":"South Korea","SG":"Singapore","TH":"Thailand","MY":"Malaysia","ID":"Indonesia","DE":"Germany","GB":"United Kingdom","AU":"Australia"},"errLoad":"Could not load company settings.","errSave":"Could not save company settings.","errLogoUpload":"Could not upload the logo.","errLogoRemove":"Could not remove the logo.","errNameRequired":"Display name is required.","errVatRequired":"{{field}} is empty. Enter a VAT rate from 0 to 100, for example 8 (or 0 for no VAT).","errVatInvalid":"{{field}} cannot be “{{value}}”. Enter a number from 0 to 100 with at most 2 decimals, for example 8 or 10.5.","sealSignatures":{"title":"Seal & signatures","hint":"Printed in the seller sign block of the proforma invoice. PNG with a transparent background works best (max 2MB).","seal":"Company seal","upload":"Upload","replace":"Replace","remove":"Remove","none":"None","loading":"Loading signers…","errLoad":"Could not load the signers.","noSigners":"No signers yet.","signatureOf":"Signature of {{name}}","errUpload":"Could not upload the image.","errRemove":"Could not remove the image.","linkedUser":"Linked user","notLinkedOption":"Not linked","notLinked":"Not linked to a user","unknownUser":"Inactive user","add":"Add signer","edit":"Edit","delete":"Delete","editOf":"Edit signer {{name}}","deleteOf":"Delete signer {{name}}","readOnly":"Only users with the Manage Company permission can add, edit or delete signers.","saved":"Signer saved.","deleted":"Signer deleted.","errSave":"Could not save the signer.","errDelete":"Could not delete the signer.","deleteConfirm":{"title":"Delete signer {{name}}?","body":"Documents that already print this signer keep it. It disappears from every signer list, and its user can be linked to another signer.","confirm":"Delete signer","cancel":"Cancel"},"drawer":{"addTitle":"Add signer","editTitle":"Edit signer {{name}}","hint":"Printed in the signature blocks of the documents. Link the signer to the real user who signs.","name":"Name","roleEn":"Title (English)","roleVi":"Title (Vietnamese)","userHint":"One signer per user.","sortOrder":"Print order","sortOrderHint":"Lowest first. Leave empty to put the signer last.","cancel":"Cancel","save":"Save","saving":"Saving…","required":{"name":"Enter the signer's name.","role_en":"Enter the title in English.","role_vi":"Enter the title in Vietnamese."},"docTypes":"Signs these documents","docTypesHint":"Only these documents offer this signer in their signer list.","allDocs":"All documents","docTypesRequired":"Tick at least one document, or tick All documents."},"docsAll":"Signs all documents","docsSome":"Signs: {{docs}}"},"sellerImport":{"title":"Seller details from invoice settings","hint":"Printed documents take the seller name, address, tax code and contact details from this company record. Import what invoice settings holds today: empty company fields are filled, and a field that differs is replaced only when you tick it. Bank details are shown for reference; manage them in Settings › Payment Terms. Documents print from this company record now.","cols":{"field":"Field","invoiceSettings":"Invoice settings","company":"Company","status":"Status","overwrite":"Replace"},"fields":{"en_name":"Name (English)","legal_name":"Legal name (Tiếng Việt)","address":"Street / building","city":"City","province":"Province / State","country":"Country","tax_id":"Tax code (MST)","phone":"Phone","fax":"Fax","email":"Email","website":"Website","postal_code":"Postal code","bank_name":"Bank","bank_branch":"Bank branch","bank_account_number":"Account number","bank_account_name":"Account holder","bank_swift_code":"SWIFT code"},"actions":{"fill":"Will fill","conflict":"Different","same":"Same","keep":"Company only","info":"Reference"},"reasons":{"bank":"Managed in Payment Terms","no_target":"No company field","too_long":"Too long for this field","placeholder":"Default placeholder, not imported"},"summary":"{{fill}} to fill · {{conflict}} different","upToDate":"The company record already holds everything invoice settings has.","noSource":"No invoice settings found. There is nothing to import.","saveFirst":"Save or discard your edits first.","refresh":"Refresh","applyCount":"Import {{count}} fields","apply":"Import","applying":"Importing…","cancel":"Cancel","retry":"Retry","confirmTitle":"Import seller details?","confirmMessage":"{{count}} company fields will be updated from invoice settings. Printed documents use the new values from now on.","applied":"Imported {{count}} fields","overwriteAria":"Replace {{field}} with the invoice settings value","errLoad":"Could not load the invoice settings comparison.","errApply":"Could not import the seller details."},"signerDocType":{"pi":"Proforma invoice (PI)","quotation":"Quotation","price_proposal":"Price proposal","po":"Purchase order","rfq":"Request for quotation (RFQ)","vendor_contract":"Vendor contract","sale_contract":"Sale contract","commercial_invoice":"Commercial invoice","export_docs":"Export documents"},"noSignerFor":"No signer is set up for {{document}}. An admin can add one in Admin › Company settings › Signers."},"audit":{"title":"Audit Log","subtitle":"An immutable record of security and configuration changes across the workspace.","exportCsv":"Export CSV","exporting":"Exporting…","searchPlaceholder":"Search events, users…","loading":"Loading…","empty":"No events match.","colWhen":"When","colEvent":"Event","colDetail":"Detail","colIp":"IP","totalEvents":"{{n}} events","prev":"Previous","next":"Next","justNow":"just now","minutesAgo":"{{n}}m ago","hoursAgo":"{{n}}h ago","daysAgo":"{{n}}d ago","actionLabels":{"auth_login":"Sign-in","auth_login_failed":"Failed sign-in","admin_invite_user":"Invite","admin_bulk_invite":"Bulk invite","admin_patch_user":"User updated","admin_suspend_user":"Suspended","admin_activate_user":"Reactivated","admin_deactivate_user":"Deactivated","admin_reset_password":"Password reset","admin_create_role":"Role created","admin_patch_role":"Role updated","admin_delete_role":"Role deleted","admin_update_matrix":"Permissions","admin_company_settings_update":"Company settings","admin_company_seller_import_apply":"Seller details imported"},"actor":"User"},"breadcrumb":"Settings · Administration"},"shell":{"accountOwner":"Account Owner","collapse":"Collapse","collapseSidebar":"Collapse sidebar","expandSidebar":"Expand sidebar","signOut":"Sign out","openMenu":"Open menu","logoAlt":"keenERP bird","version":"v{{version}}","userMenu":{"account":"Account","admin":"Admin","profile":"Profile"},"notifications":{"title":"Notifications","markAllRead":"Mark all as read","empty":"No notifications","viewAll":"View all notifications","justNow":"Just now","minutesAgo":"{{count}}m ago","hoursAgo":"{{count}}h ago","daysAgo":"{{count}}d ago","bellLabel":"Notifications","bellLabelUnread":"Notifications, {{count}} unread","badgeOverflow":"9+","loading":"Loading notifications","loadError":"Couldn't load notifications.","retry":"Try again","actionChip":"Action","urgent":"Urgent","note":"Note: {{note}}"},"commandPalette":{"label":"Command palette","placeholder":"Search pages and actions…","createHeading":"Create","goToHeading":"Go to","empty":"No matches","actions":{"newContact":"New contact","newQuote":"New quote","newSalesOrder":"New sales order","newPurchaseOrder":"New purchase order","newProduct":"New product"}}},"quotations":{"generatePi":{"title":"Generate PI","subtitle":"Export a PDF to send to the customer. The quotation status will change to \"Sent\".","successToast":"PI generated","languageLabel":"Language","languageBilingual":"Bilingual EN / VI","languageEnglish":"English","languageVietnamese":"Vietnamese","incotermLabel":"Incoterm override (optional)","notesLabel":"PI notes","notesPlaceholder":"Leave blank to use quotation notes","cancel":"Cancel","submit":"Generate"}},"materials":{"recode":{"edit":"Edit code","checking":"Checking usage…","inputLabel":"New material code","useNext":"Use next code for this category","noCategory":"Set a category first to generate a code.","save":"Save code","noSpaces":"A code can’t contain spaces.","saving":"Saving…","cancel":"Cancel","unusedHint":"Not used anywhere yet, so the code can still be changed.","lockedInUse":"This code is already in use and can’t be changed.","usedIn":"Used in:","moreReasons":"+{{count}} more","reasonWithRefs":"{{kind}} ({{count}}): {{refs}}","reasonNoRefs":"{{kind}} ({{count}})","lockedSystem":"System-generated code; it can’t be changed here.","lockedNotMaterial":"Only raw-material codes can be changed here.","usageFailed":"Could not check where this code is used.","confirmTitle":"Change material code?","confirmBody":"{{from}} → {{to}}. Printed labels, spreadsheets and messages that still show the old code will not update.","confirmButton":"Change code","changed":"Code changed: {{from}} → {{to}}","categoryHint":"The code still reflects the previous category.","usageKind":{"purchasing":"Purchasing","sales":"Sales","accounting":"Accounting","inventory":"Inventory","bom":"BOM","production":"Production","planning":"Planning","quality":"Quality","pricing":"Pricing","paint_formula":"Paint formula","sample":"Samples","other":"Other"}},"crumb":"Inventory · Materials","title":"Materials","description":"Master list of every raw material — wood, board, hardware, packaging and coatings. BOMs consume these; stock, goods receipt and purchasing all reference this list.","newMaterial":"New material","close":"Close","searchPlaceholder":"Search code, material, vendor…","clearFilters":"Clear filters","loadingRest":"Showing the first {{shown}} of {{total}} materials — loading the rest…","kpi":{"materials":"Materials","materialsSub":"in master list","categories":"Categories","categoriesSub":"wood → coatings","lowStock":"Low stock","lowStockSub":"at / below reorder — filter","lowStockFiltered":"filtered · click to clear","qcRequired":"QC required","qcRequiredSub":"inspect on receipt","stockValue":"Stock value","stockValueSub":"on hand, std cost"},"banner":{"title_one":"{{count}} vendor profile needs completing","title_other":"{{count}} vendor profiles need completing","sub":"Added from a material form — finish their details so Purchasing can transact.","complete":"Complete"},"stockStatus":{"in_stock":"In stock","reorder_soon":"Reorder soon","low":"Low","out_of_stock":"Out of stock"},"vendorTotals":{"title":"Totals — {{vendor}}:","materials":"{{count}} materials","onHand":"On hand:","none":"none in stock","stockValue":"Stock value: {{value}}"},"table":{"otherUnitStock":"Held in another unit: {{list}}","otherUnitStockHint":"Part of this on-hand is stored in a unit other than the material's. See Stock Summary for each bin.","code":"Code","material":"Material","dimension":"Dimension","actions":{"edit":"Edit","clone":"Clone","delete":"Delete"},"category":"Category","uom":"Unit of measure","stdCost":"Standard cost","onHand":"On hand","onOrder":"On order (not yet issued)","fullCartons":"Full cartons","cartonNote":"Notes","cartonPartialNote":"Partial carton: {{count}} loose","unitsPerBoxHint":"{{count}} pcs per carton","leadTime":"Lead time","stockStatus":"Stock status","storageLocation":"Storage location","lastReceived":"Last received","primaryVendor":"Primary vendor","qc":"QC","order":"Order","reset":"Reset","resetTitle":"Reset sort & filters","sortTitle":"Sort","viewDetails":"View details","addPhoto":"Add photo","changePhoto":"Change photo","uncategorized":"Uncategorized","daysUnit":"days","daysAgo":"{{days}}d ago","reorderTooltip":"Reorder point {{qty}} {{uom}}","incomplete":"Incomplete","incompleteTooltip":"Vendor profile incomplete","qcBadge":"QC","qcTooltip":"Requires QC inspection on goods receipt","qcNoneTooltip":"No inspection needed — goes straight to stock","empty":"No materials match your filter.","loading":"Loading materials…","filterClear":"Clear","filterSearch":"Search…","filterNoMatches":"No matches","filterName":{"category":"Category","status":"Stock status","vendor":"Primary vendor"},"qcFilterRequired":"QC required","qcFilterNone":"No QC","emptyCategory":"No materials in {{tab}} yet — add one to get started.","attachmentTooltip":"{{count}} attached file(s)","selectAll":"Select all","selectRow":"Select row","selectAllMatching":"Select all {{n}} matching rows (all pages)","openingStock":"Opening stock","openingWarehouse":"Opening warehouse","stockCutoff":"Stock cut-off","pricingUnit":"Pricing unit","conversionFactor":"Conversion factor","conversionFactorHint":"1 {{stock}} = {{factor}} {{pricing}}","priceEffectiveDate":"Price effective date"},"attachmentKind":{"spec_sheet":"Spec sheet","drawing":"Drawing","certificate":"Certificate","msds":"MSDS","test_report":"Test report","quote":"Quote","other":"Other"},"files":{"title":"Files & documents","attach":"Attach files","dropHint":"Spec sheets, drawings, certificates, MSDS — drag & drop or click","dropHintCreate":"Vendor spec sheet, drawing, certificate, MSDS — drag & drop or click","attachesOnSave":"attaches on save","download":"Download","remove":"Remove file","tooLarge":"{{name}} exceeds the 20 MB limit","uploadFailed":"Could not upload the file","toastAttached":"{{count}} file(s) attached","toastRemoved":"Removed {{name}}","someFailed":"{{count}} file(s) could not be attached"},"vendorPanel":{"title":"On hand by vendor origin","totalLabel":"total","vendorCount_one":"{{count}} vendor","vendorCount_other":"{{count}} vendors","vendor":"Vendor","sku":"SKU","productName":"Vendor product name","uom":"UoM","packQty":"Pack qty","dimension":"Dimension","description":"Description","lastReceipt":"Last receipt","resizeColumn":"Resize column","primaryPill":"PRIMARY","altPill":"ALT"},"drawer":{"photoNote":"A reference photo of this material. It shows in the BOM wherever this material is used.","addPhoto":"Add photo","removePhoto":"Remove photo","stdCost":"Std cost (₫)","perUom":"per {{uom}}","onHand":"On hand","inStock":"{{uom}} in stock","stockValue":"Stock value","stockValueSub":"cost × on-hand","qcOnReceipt":"QC on receipt","qcRequiredOpt":"Required","qcNoOpt":"No","details":"Details","category":"Category","uom":"Unit of measure","bomUnit":"BOM unit","bomUnitSame":"— same as general —","bomFactor":"1 BOM = ? {{gen}}","code":"Material code","storageLocation":"Storage location","lastReceived":"Last received","vendors":"Vendors","primary":"Primary","alternate":"Alternate","removeVendor":"Remove vendor","vendorName":"Supplier","vendorSku":"Vendor SKU","vendorSkuFull":"Vendor SKU","vendorUom":"Vendor UoM","vendorUomFull":"Vendor unit of measure","vendorConversion":"1 vendor UoM = ? general","vendorConversionFull":"1 vendor unit = ? general units","vendorProductName":"Vendor's product name","vendorProductNameFull":"Vendor's product name","vendorPackQty":"Pack qty","vendorPackQtyFull":"Pack quantity","vendorDimension":"Dimension","vendorDescription":"Description","save":"Save","savedToast":"Changes saved","addVendorFromList":"＋ Add vendor from list…","newVendorOption":"＋ New vendor…","newVendorPlaceholder":"New vendor name…","descriptionTitle":"Description / spec","usedIn":"Used in products","usedInEmpty":"Not used in any BOM yet.","orderMaterials":"Order materials","toastVendorAdded":"Vendor added","toastVendorRemoved":"Vendor removed","storageWarehouse":"Warehouse","storageNotSet":"Not set","grade":"Level 3 grade","gradeUngraded":"KPC — ungraded","gradeCurrent":"{{code}} (current)","gradeLoading":"Loading…","gradeHint":"Changing the grade re-generates the material code if the material has no transactions yet; a material already in use keeps its code.","gradeHintOnlyKpc":"This type has no grades; the grade stays KPC.","gradeCodeRegenerated":"Code re-generated: {{from}} → {{to}}","gradeCodeKept":"Grade saved; code {{code}} kept because the material already has transactions","specsTitle":"Specifications","quality":"Quality","qualityNotSet":"Not set","specNotSet":"Not set","specSaving":"Saving…","specSaveFailed":"{{field}} was not saved. {{reason}} The field shows the saved value again.","specErrForbidden":"You don’t have permission to edit materials. Ask an administrator for the “Edit products” permission.","specErrGone":"This material no longer exists or was removed. Close the drawer and refresh the list.","specErrRejected":"The value was rejected. Check it fits the field (a number for number fields), then enter it again.","specErrGeneric":"Check your connection, then enter the value again.","specsReadOnlyHint":"You can view these specifications but not change them. To change them, ask an administrator for the “Edit products” permission.","sourceBom":"Source (BOM)","planning":"Planning","reorderPoint":"Reorder point","safetyStock":"Safety stock","leadTime":"Lead time (days)","pricingUnit":"Pricing unit","pricingUnitSame":"— same as general —","pricingFactor":"1 {{stock}} = ? {{pricing}}","priceEffectiveDate":"Price effective date","openingStock":"Opening stock","stockCutoffOn":"cut-off {{date}}","vendorPrice":"Price","vendorPriceDate":"Price date","makePrimary":"Make primary","makePrimaryTitle":"Make {{vendor}} the primary vendor?","makePrimaryMessage":"{{vendor}} becomes the primary vendor of this material; {{current}} becomes an alternate.","makePrimaryMessageNone":"{{vendor}} becomes the primary vendor of this material.","toastPrimaryChanged":"{{vendor}} is now the primary vendor"},"vp":{"title":"Complete vendor profile","sub":"Finish {{name}} so Purchasing can raise POs & payments.","taxId":"Tax ID / MST","taxPlaceholder":"0xxxxxxxxx","paymentTerms":"Payment terms","contact":"Contact person","contactPlaceholder":"Name","phone":"Phone","phonePlaceholder":"+84…","address":"Address","addressPlaceholder":"Street, city, province","later":"Later","save":"Save vendor","toastSaved":"Vendor “{{name}}” profile completed"},"nm":{"title":"New material","sub":"Create a raw material from scratch. BOMs, stock and purchasing all reference it afterwards.","code":"Code","codePlaceholder":"05.__.___.___","name":"Material name","namePlaceholder":"e.g. White oak, sawn 26mm","category":"Category","uom":"Unit (UoM)","generalUnit":"General unit","unitsConversion":"Units & conversion","unitsConversionHint":"— the BOM (design) unit can differ from the general unit used by Purchasing · Inventory · Accounting","bomUnit":"BOM unit","bomUnitSame":"— same as general —","bomUnitSub":"Design unit · pre-costing. Blank = identical.","bomCoefficient":"Coefficient (1 {{bom}} = ? {{gen}})","bomBadge":"BOM","coefPrefix":"1 {{bom}} =","coefSuffix":"{{gen}} · ⇄ 1 {{gen}} ≈","orderCalcNeed":"Test: need","orderCalcBuy":"must buy","orderCalcRound":"· round to multiples of","orderCalcOrder":"→ order","unitsNoteSame":"BOM and general unit are the same — coefficient is 1.","unitsNoteDiff":"BOM is declared in {{bom}}; the system converts to {{gen}} for POs, stock deduction, cost of goods & AP. Purchasing · Inventory · Accounting all use {{gen}}.","vendorUnit":"Supplier's purchase unit","vendorUnitPlaceholder":"same as general — kg / bó / box","vendorFactor":"1 supplier unit = ? {{gen}}","stdCost":"Std cost (₫)","costPlaceholder":"0","primaryVendor":"Primary vendor","newVendorOption":"＋ New vendor…","newVendorPlaceholder":"New vendor name…","qcCheckbox":"QC required on receipt","typeDetails":"{{category}} details","description":"Description","optional":"optional","descPlaceholder":"Spec, grade, usage notes…","cancel":"Cancel","create":"Create material","errUom":"Choose a unit of measure","createFailed":"Could not create the material","toastCreated":"Created {{code}}","toastCreatedVendor":"Created {{code}} · finish the “{{vendor}}” vendor profile above","codeAuto":"auto","codeTitle":"Generated from category and sub-group per MH-QĐ-02","subGroup":"Sub-group","selectPlaceholder":"— select —","selectField":"Select {{label}}","errName":"Enter a material name","vendorPartName":"Vendor's own name","vendorPartNamePlaceholder":"what the supplier calls it on their quote / invoice","dimLength":"Length","dimWidth":"Width","dimThickness":"Thickness","planning":"Planning","reorderPoint":"Reorder point","safetyStock":"Safety stock","leadTime":"Lead time (days)","uomSearch":"Search units…","primaryVendorSearch":"Search suppliers…","chooseExistingVendor":"Choose existing supplier","grade":"Grade","gradeUngraded":"— ungraded —","skuBlock":"Material SKU","skuNote":"05 · group · type · grade · sequence","materialGroup":"Material group","materialType":"Material type","gradeHintUngraded":"This type has no grades; the grade slot fills with KPC.","gradeHintDefault":"Prefix and sequence are set by the system. Group, type and grade come from Material categories.","categoryNone":"— none —","pricingUnit":"Pricing unit","pricingUnitSame":"— same as general —","pricingUnitSub":"The unit prices are quoted in (e.g. m³ for wood stocked in bars). Blank = the general unit.","pricingFactor":"Conversion factor (1 {{gen}} = ? {{pricing}})","otherVendors":"Other vendors","otherVendorsSearch":"Add another supplier…","otherVendorsHint":"The primary vendor stays the preferred one; with no primary vendor the first one here becomes primary.","removeOtherVendor":"Remove {{vendor}}","otherVendorDuplicate":"{{vendor}} is already added","otherVendorFailed":"Could not link {{vendor}} — add it from the material drawer"},"toast":{"saved":"Saved","saveFailed":"Could not save the change","loadFailed":"Could not load materials","photoSaved":"Photo saved","photoRemoved":"Photo removed","photoFailed":"Could not update the photo","badImageType":"Use a JPEG, PNG or WebP image","cloned":"Material cloned","cloneFailed":"Clone failed"},"tabs":{"all":"All","other":"Other","allIn":"All {{tab}}","unclassified":"Unclassified"},"miss":{"title":"Not in the material master yet","sub":"{{code}} is not in the material master.","add":"Add to material master"},"imp":{"action":"Import from Excel","title":"Import materials from Excel","sub":"Upload the NVL MASTER workbook (.xlsx) and import a category tab into the material master","file":"Workbook (.xlsx)","chooseFile":"Choose file","noFileChosen":"No file chosen","category":"Material category","autodetect":"Autodetect from tab names","hint":"Pick the workbook, then preview to see what would be created, skipped or updated. Nothing is written until you import.","previewHead":"Preview","previewBtn":"Preview","commitBtn":"Import","working":"Working…","done":"Close","previewFailed":"Could not read the workbook","commitFailed":"Import failed","downloadTemplate":"Download template","templateFailed":"Could not download the template","toastDone":"Import finished — {{created}} created, {{updated}} updated","count":{"total":"Rows","create":"New","duplicate":"Duplicates","conflict":"Conflicts","invalid":"Invalid","vendors":"Vendor links"},"conflictMode":"Rows whose code exists with different details","modeSkip":"Skip them (keep what is in the master)","modeUpdate":"Update them from the workbook","modeUpdateSupplierHint":"Supplier links, quoted prices and supplier part names are only applied to materials that already exist in Update mode.","problems":"Rows needing attention ({{count}})","col":{"row":"Row","code":"Code","status":"Status","reason":"Reason"},"status":{"create":"New","duplicate":"Duplicate","conflict":"Conflict","invalid":"Invalid","vendor_added":"Vendor added","vendor_updated":"Vendor updated"},"conflictFields":"Differs in: {{fields}}","truncated":"Only the first 500 rows are detailed — the summary covers every row.","resultHead":"Import result","resultLine":"{{created}} created · {{updated}} updated · {{duplicates}} duplicates skipped · {{conflicts}} conflicts skipped · {{invalid}} invalid","exportMaterials":"Export current materials","codeHint":"Mã NVL is optional — leave it blank and a code 05.L1.L2.L3.nnn is generated on import from the Nhóm SKU (L1), Loại SKU (L2) and Cấp SKU (L3) columns. Pick L1/L2/L3 from the template's dropdowns; a blank L3 imports as ungraded.","exportHint":"To edit materials already in the master, export the current materials, change the rows and import the file again — rows are matched by their code.","autoSku":"auto","rowWarning":"Warning: {{message}}","unitConv":{"title":"Supplier unit check ({{count}})","hint":"Read each line back: the Hệ số quy đổi column means 1 ĐVT = ? ĐVT NCC. If a line reads the wrong way round, fix the number and import again. Example: a box (HỘP) of 20 pieces, stock unit CÁI → 1 CÁI = 0.05 HỘP, type 0.05.","col":"Reads as","line":"1 {{supplier}} = {{perSupplier}} {{stock}}","linePrice":"1 {{supplier}} = {{perSupplier}} {{stock}} · {{price}} ₫/{{supplier}} = {{unitPrice}} ₫/{{stock}}"},"unmatchedSuppliersTitle":"Suppliers not found ({{count}})","unmatchedSuppliersHint":"Suppliers not found will be skipped for linking — their materials still import. Add them in Contacts, then re-import to attach them.","namesAndMore":"{{names}} and {{count}} more","layoutHint":"Sheet names can also be in English (for example OFFICE SUPPLIES). To give one material several suppliers, use the NHÀ CUNG CẤP (SUPPLIERS) sheet — one line per material and supplier; it only saves supplier links. The template no longer includes this sheet; an export of your materials has it.","notices":{"title":"Check before importing ({{count}})","hint":"These do not stop the import, but the data may not land where you expect. Fix the file and preview again if needed."},"supplierLines":{"title":"Suppliers sheet","summary":"{{add}} new supplier links · {{update}} updated · {{unchanged}} unchanged · {{invalid}} not applied · {{ignored}} ignored","hint":"These lines only save supplier links. They are not counted as materials above.","problems":"Supplier lines needing attention ({{count}})","sheetRow":"{{sheet}} · row {{row}}"},"supplierStatus":{"add":"New link","update":"Link updated","unchanged":"No change","invalid":"Not applied","ignored":"Ignored"},"resultFailed":"{{count}} row(s) could not be saved — see the messages below. The other rows were not affected.","resultSupplierLines":"Suppliers sheet: {{added}} added · {{updated}} updated · {{unchanged}} unchanged · {{skipped}} not applied","downloadErrors":"Download error rows ({{count}})","downloadErrorsHint":"The skipped rows, with a Lỗi column explaining each problem — fix them and import the file again.","errorsFailed":"Could not download the error rows","resultLinks":"{{linked}} supplier links added · {{reminted}} SKUs re-minted","optMappedTitle_one":"{{count}} row matched to an option list value","optMappedTitle_other":"{{count}} rows matched to option list values","optMappedExample":"“{{raw}}” → {{value}} ({{count}})","optMappedHint":"The list value is saved instead of the text — nothing to fix.","optCertFilled_one":"{{field}} was blank on {{count}} row and is filled from the certification written in {{source}} (e.g. “Fsc 100%” → FSC 100%).","optCertFilled_other":"{{field}} was blank on {{count}} rows and is filled from the certification written in {{source}} (e.g. “Fsc 100%” → FSC 100%).","optKeptTitle_one":"{{count}} row kept as text (not in the option list)","optKeptTitle_other":"{{count}} rows kept as text (not in the option list)","optKeptExample":"“{{raw}}” ({{count}})","optKeptHint":"These rows still import, with the text stored as typed. To use list values instead, add them to the option list or correct the workbook, then import again.","optFieldLine_one":"{{field}}: {{count}} row — {{examples}}","optFieldLine_other":"{{field}}: {{count}} rows — {{examples}}","optFieldInTab":"{{field}} ({{tab}})","optMore":"and {{count}} more","dedupe":{"title":"Possible duplicates","summary":"{{existing}} rows match existing materials · {{inFile}} repeated in this file","hint":"Same material = same type, name and spec values (letter case and spacing ignored); Ghi chú and Nguồn (BOM) are not compared. These rows are skipped unless you tick Create anyway.","ofSku":"Duplicate of {{sku}}","ofRow":"Duplicate of row {{row}}","useExisting":"Skip: use existing {{sku}}","sameAsRow":"Skip: use the material from row {{row}}","createAnyway":"Create anyway","willCreate":"Will be created as a new material","sameCode":"Same code as row {{row}}; it cannot be created twice","colAction":"Action","result":"Skipped as duplicates: {{existing}} matched existing materials · {{inFile}} repeated in this file · {{anyway}} created anyway"},"resultOpeningStock":"Opening stock: {{posted}} posted · {{already}} already posted · {{skipped}} not posted","stockHint":"Stock: Số lượng tồn is the starting stock of a NEW material. For a material that already exists, fill Tồn điều chỉnh with its new total in the Kho warehouse — the difference from today's stock is posted as a stock adjustment dated Ngày chốt tồn. Leave it blank to keep the stock as it is.","stock":{"title":"Stock","summary":"{{opening}} opening stock · {{increase}} to increase · {{decrease}} to decrease · {{unchanged}} unchanged · {{skipped}} not posted","hint":"Opening stock is posted for new materials only. For existing materials, Tồn điều chỉnh is the new total in the warehouse: the difference is posted as a stock adjustment (an increase at the row's Đơn giá or the standard cost, a decrease at the current average cost). Importing the same total again changes nothing.","ignoredHint_one":"{{count}} row gives Số lượng tồn for a material that already exists — it is ignored. Use Tồn điều chỉnh to change its stock.","ignoredHint_other":"{{count}} rows give Số lượng tồn for materials that already exist — it is ignored. Use Tồn điều chỉnh to change their stock.","noPermissionTitle":"Stock will not be posted","noPermission":"Posting stock needs the inventory adjustment permission. The materials still import; ask someone who can adjust stock to import the file again.","colWarehouse":"Warehouse","colEffect":"Stock effect","noWarehouse":"No warehouse","truncated":"Only the first {{count}} rows are listed — the summary covers every row.","effect":{"opening":"Opening stock: {{qty}}","change":"Stock: {{current}} → {{target}} ({{delta}})","unchanged":"No change ({{qty}})","skipped":"Not posted — see the row's warnings","ignored":"Số lượng tồn {{qty}} ignored — existing material"}},"resultStockCount":"Stock counts (Tồn điều chỉnh): {{adjusted}} adjusted · {{unchanged}} unchanged · {{skipped}} not posted · Số lượng tồn ignored for {{ignored}} existing material(s)","vendorRows":{"title":"Several vendors","summary":"{{added}} vendor(s) to add · {{updated}} vendor(s) to update","hint":"These rows repeat an earlier row's material with another supplier. They only add or update that supplier's link (price, unit, vendor name) — in both conflict modes — and never change the material or its primary vendor.","colDetail":"Details","ofRow":"Material of row {{row}}","changed":"Changes: {{fields}}"},"resultVendors":"{{added}} vendor link(s) added · {{updated}} vendor link(s) updated"},"export":{"action":"Export materials","busy":"Exporting…","menuAria":"Export materials to Excel","all":"All materials ({{count}})","view":"Current view: {{scope}} ({{count}})","viewSelected":"Selected rows ({{count}})","done":"Exported {{count}} materials","doneNoCount":"Materials exported","failed":"Could not export the materials","retry":"The export did not finish. Try again.","signedOut":"Your session has ended. Sign in again, then export.","nothing":"No materials in this view to export.","filteredScope":"filtered rows"},"bulk":{"aria":"Bulk actions","selected":"{{n}} selected","clear":"Clear","createPR":"Create purchase request ({{n}})","createPRArchived":"Archived materials can't be bought. Restore them first, or unselect them.","allMatchingSelected":"All {{n}} matching materials selected","selectAllMatching":"Select all {{n}} matching","idleHint":"Select rows to act on several materials at once."},"bulkDelete":{"action":"Delete ({{n}})","actionOf":"Delete ({{n}} of {{total}})","archivedNoneDeletable":"Archived materials have stock or document history, so they can't be deleted. Restore to use again, or ask the account owner to purge the category.","archivedChecking":"Checking which archived materials can be deleted…","archivedCheckFailed":"Couldn't check the archived materials. Try again.","archivedRetry":"Try again","archivedTooMany":"Too many selected to check at once (max {{max}}). Select fewer archived materials.","archivedKept":"{{n}} archived materials are kept: they have stock or document history. Restore them to keep using them.","confirmTitleDelete_one":"Delete the selected material?","confirmTitleDelete_other":"Delete {{n}} materials?","confirmTitleArchive_one":"Archive the selected material?","confirmTitleArchive_other":"Archive {{n}} materials?","confirmTitleBoth":"Delete or archive {{n}} materials?","confirmTitleDeleteOf":"Delete {{n}} of {{total}} materials?","confirmTitleArchiveOf":"Archive {{n}} of {{total}} materials?","confirmTitleBothOf":"Delete or archive {{n}} of {{total}} materials?","confirmArchiveNote":"A material that anything uses (a BOM, stock, a purchase request, order or receipt, an RFQ, a supplier link) is archived, never deleted: it leaves pickers and searches but stays on those records. Restore it from the Archived filter.","tooMany":"{{n}} materials are selected, but one delete takes at most {{max}}. Narrow the list with search or filters first.","doneTitle_one":"{{n}} material deleted or archived","doneTitle_other":"{{n}} materials deleted or archived","doneMessage":"Deleted: {{deleted}} · Archived because in use: {{archived}}. Archived materials are under the Archived filter.","noneDeletable_one":"The selected material can be neither deleted nor archived.","noneDeletable_other":"None of the {{n}} selected materials can be deleted or archived.","reason":{"in_bom":"In a BOM","family_finish":"A finish of a BOM family","family_base":"Base BOM with finishes","stock_on_hand":"Stock on hand","stock_movements":"Has stock movements","open_purchase_request":"On an open purchase request","open_purchase_order":"On an open purchase order","open_goods_receipt":"On an open goods receipt","not_found":"Already deleted or not found","vendor_links":"Linked to suppliers"}},"history":{"title":"History","hint":"Who did what to this material, and when.","viewHistory":"View history","filter":{"label":"Show","all":"All","changes":"Changes","stock":"Stock"},"loading":"Loading history…","empty":"No history yet","emptyHint":"Changes and stock movements will appear here as they happen.","error":"We couldn’t load the history. Check your connection and try again.","retry":"Try again","forbidden":"You don’t have permission to see this material’s history. Ask an administrator to give your role the “View stock” right.","notFound":"This material no longer exists, so it has no history to show. Go back to the Materials list.","loadMore":"Show older events","someone":"Someone","formerUser":"A former user","system":"The system","oldNew":"{{old}} → {{new}}","empty_value":"empty","yes":"Yes","no":"No","banner":{"title":"Archived by {{name}} on {{date}} — {{reason}}","reasonBulk":"bulk delete of {{count}} materials kept it because it has stock history","reasonBulkNoCount":"bulk delete kept it because it has stock history","reasonManual":"archived from the Materials list","unknown":"This material is archived. We have no record of who archived it or when.","restore":"Restore"},"bulkNote":"Bulk delete of {{count}} materials — kept as archived because it has stock history","importNote":"From the materials Excel import","stockMeta":{"voucher":"Voucher {{voucher}}","ref":"Ref {{ref}}","reason":"Reason: {{reason}}"},"action":{"created":"created this material","import_created":"created this material by Excel import","updated":"edited this material","archived":"archived this material","restored":"restored this material","deleted":"deleted this material","recoded":"changed the material code","image_changed":"changed the photo","other":"made a change"},"direction":{"in":"{{type}}: +{{qty}} {{unit}} into {{where}}","out":"{{type}}: −{{qty}} {{unit}} from {{where}}","transfer":"{{type}}: {{qty}} {{unit}} moved from {{from}} to {{to}}"},"field":{"name":"Name","name_vi":"Vietnamese name","description":"Description","spec":"Specification","barcode":"Barcode","type":"Type","status":"Status","category_id":"Category","material_category_id":"Material category","material_grade":"Grade","unit_id":"Unit","purchase_unit_id":"Purchase unit","accounting_uom_id":"Pricing unit","uom_conversion_factor":"Pricing unit factor","bom_unit_id":"BOM unit","bom_conversion_factor":"BOM unit factor","qc_required":"QC on receipt","default_location_id":"Default location","standard_cost":"Standard cost","list_price":"List price","can_be_purchased":"Can be purchased","can_be_sold":"Can be sold","can_be_manufactured":"Can be manufactured","track_inventory":"Track inventory","track_lots":"Track lots","track_serials":"Track serial numbers","is_fixed_cost_material":"Fixed-cost material","min_order_qty":"Minimum order quantity","lead_time_days":"Lead time (days)","reorder_point":"Reorder point","reorder_qty":"Reorder quantity","safety_stock":"Safety stock","weight_kg":"Weight (kg)","length_cm":"Length (cm)","width_cm":"Width (cm)","height_cm":"Height (cm)","cost_method":"Cost method","customer_id":"Customer","sku":"Code","image":"Photo","attribute":"{{name}}"}},"edit":{"loading":"Loading the material…","readOnlyHint":"You can view this material but not change it. To change it, ask an administrator for the “Edit products” permission.","codeRenewed":"Code will be renewed to match the new group/grade (no transactions yet).","codeKeptUsed":"Code stays {{code}}: this material is already used.","codeKeptFirst":"Code stays {{code}}: a material classified for the first time keeps its code.","codeMaybe":"If this material has no transactions yet, its code is renewed to match; otherwise the code stays.","saveFailed":"The material was not saved. {{reason}} Your changes are still in the form — fix them and press Save again.","vendorsFailed":"Vendor changes for {{vendors}} were not saved. {{reason}} Check the vendors in the form, then press Save again.","discardTitle":"Discard changes?","discardMessage":"This material has changes that are not saved. If you close now, they are lost. To keep them, choose Keep editing and press Save.","discardConfirm":"Discard changes","keepEditing":"Keep editing","removeVendorsTitle":"Remove vendors from this material?","removeVendorsMessage":"{{vendors}} will be unlinked from this material. A vendor offer that already has a price is kept. Choose Cancel to keep the vendors linked.","removeVendorsConfirm":"Remove and save","otherSpecs":"Other stored specifications","vendorTableHint":"Prices and vendor details below save as you type. Choose which vendors supply this material, and the primary one, in the form above.","vendorNoPermission":"You can’t change the vendors here (primary vendor, vendor’s name, unit, conversion, other vendors). To change them, ask an administrator for the “Stock & Materials — Edit” permission.","unknownCategory":"Unknown category"},"nameEdit":{"label":"Name","labelVi":"Vietnamese name","edit":"Edit","editAria":"Edit {{label}}","save":"Save","saving":"Saving…","cancel":"Cancel","hint":"Shown on documents and in the Materials list.","hintVi":"Optional. Shown when the interface is in Vietnamese.","empty":"Name can’t be empty. Type a name, or cancel to keep the current one.","errForbidden":"You don’t have permission to rename materials. Ask an administrator for the “Edit products” permission.","errGone":"This material no longer exists or was removed, so it can’t be renamed. Close the drawer and refresh the list.","errRejected":"The name was rejected. Check that it is 1–500 characters, then try again.","errGeneric":"Couldn’t save the name. Check your connection and try again.","reimportWarning":"Re-importing an older Excel file with the old name will create a new material. Update the name in your Excel file too."}},"quotes":{"detail":{"title":"Sales quote","waitingOnYou":"Waiting on you","waitingForApprovalBy":"Waiting for approval by: {{names}}","waitingForApprovalByManager":"Waiting for approval by a manager","revisionBadge":"Rev {{rev}}","originatingOrder":"Originating order","attn":"Attn · contact","addContact":"+ Add contact","attnNone":"Select contact…","contactName":"Name","contactEmail":"Email","contactPhone":"Phone","contactCancel":"Cancel","contactSave":"Save contact","contactAdded":"Contact {{name}} added","quoteDate":"Quote date","customer":"Customer","currency":"Currency","fxRate":"FX ₫/USD","validityDays":"Valid for (days)","validUntil":"Valid until {{date}} · prices are FOB / pc","depositPercent":"Deposit (%)","incoterms":"Incoterms","portOfLoading":"Port of loading","portOfDischarge":"Port of discharge","leadTimeDays":"Lead time (days)","paymentTerms":"Payment terms","warranty":"Warranty","cartonPly":"Carton ply","minContainer":"Min. container","clientNotes":"Notes — shown on the client quote","loading":"Loading quote…","saved":"Quote updated","selectCustomer":"Select customer…","foreignCurrency":"This quote is in {{code}}; quoting in other currencies is coming — amounts shown as stored.","orderPi":"Order (PI)"},"new":{"loading":"Preparing new quote…","numberPending":"Number assigned on save","save":"Save quote","saving":"Saving…","saveFirst":"Save the quote first","created":"Quote {{number}} created","customerRequired":"Pick a customer before saving.","currencyMissing":"USD is not set up as a currency — quote prices are in USD, so the quote cannot be saved.","linesRequired":"Add at least one product before saving."},"paymentPreset":{"deposit30Balance70":"30% deposit · 70% before shipment","deposit50Balance50":"50% deposit · 50% before shipment","lcAtSight":"L/C at sight","lc30":"L/C 30 days","lc60":"L/C 60 days","lc90":"L/C 90 days","cad":"CAD — cash against documents","net30":"Net 30","net45":"Net 45","net60":"Net 60","tt100Advance":"T/T 100% in advance","deposit30Lc70":"30% deposit · 70% L/C","custom":"Custom terms"},"lines":{"title":"Products — each pulls its active worksheet","product":"Product","sku":"SKU","worksheetVersion":"WS v{{version}}","noApprovedPrice":"No approved price, so this line is 0. Open Sales › Pricing Worksheets → the worksheet → Versions → “New version from this”, set “Approved price / unit”, click “Submit for approval”, and the approver clicks “Approve & activate”.","priceReadOnly":"From the approved pricing worksheet (read-only)","materialPainting":"Material / Painting","qty":"Quantity","moq":"MOQ {{moq}}","moqLabel":"MOQ","cartonM3":"Carton m³","unitCost":"Unit cost","margin":"Margin","unitFob":"Unit price","lineTotal":"Line total","expand":"Toggle line details","photo":"Photo","material":"Material","painting":"Painting","supplier":"Supplier","dimension":"Dimension (mm)","cartonSize":"Carton size (mm)","pcsPerCarton":"Pcs / carton","cartonsPer20":"Cartons / 20'","cartonsPer40hc":"Cartons / 40'HC","totalVolume":"Total volume","cartons":"Cartons (this line)","addProduct":"Add product","changeCustomerWarning":"Changing the customer clears all quote lines. Continue?","empty":"No products yet — add one from an active worksheet.","count":"{{total}} products","close":"Close","loading":"Loading worksheets…","pickerHint":"Only products with a completed and active pricing worksheet for {{customer}} can be added.","pickerEmpty":"No active pricing worksheets for {{customer}} yet.","pickerSearch":"Search by SKU or product name","pickerResults":"{{shown}} of {{total}} products","pickerNoMatch":"No products match \"{{q}}\"","seq":"Row number","volumeM3":"{{value}} m³","footSummary":"{{count}} products · Total volume {{volume}} m³","thisCustomer":"this customer","pickerAllBlocked":"None of these products can be quoted yet: each one's BOM must be Final first. Open a product's BOM to finish it.","bomNotFinal":"BOM not final — {{status}}","bomMissing":"No BOM yet","openBom":"Open BOM","notQuotableHint":"Finalize this product's BOM before adding it to a quote.","pickCustomerFirst":"Pick a customer first","pricesHidden":"Prices hidden — ask a sales manager for the “View selling prices” right"},"panels":{"priceDrift":"Price watch","driftAlert":"Margin below {{threshold}}%","createAddendum":"Create price addendum → Rev {{rev}}","subtotal":"Subtotal","deposit":"Deposit ({{percent}}%)","balance":"Balance before ship","volume":"Total volume","total":"Total","costBuildUp":"Cost build-up — internal","material":"Material (BOM)","labour":"Labour","overhead":"Factory overhead","packFreight":"Packaging & freight","grossMargin":"Gross margin","approvalStepper":"Approval workflow","approver":"Approver","clientResponse":"Awaiting client response","revisionHistory":"Revision history","noHistory":"No events yet","priceDelta":"{{pct}}%","tax":"VAT","totalInclTax":"Total incl. VAT"},"drift":{"driftDetected":"Worksheet costs changed since this quote — {{count}} line(s) below margin threshold","line":"Line {{n}}","snapshotCost":"Quoted cost","currentCost":"Current cost","marginNow":"Margin {{was}}% → {{now}}%","addendumCreated":"Addendum Rev {{rev}} created"},"status":{"draft":"Draft","pending_approval":"Pending approval","approved":"Approved","sent":"Sent to client","revision_requested":"Revision requested","confirmed":"Confirmed → order","accepted":"Accepted","rejected":"Rejected","expired":"Expired","converted":"Converted","costing":"With costing"},"stepper":{"draft":"Drafted","pending_approval":"Approval","approved":"Approved","sent":"Sent to client","confirmed":"Draft order created"},"actions":{"submitForApproval":"Submit for approval →","recall":"Recall","approve":"Approve","requestChanges":"Request changes","sendToClient":"Send to client →","resend":"Resend","reopenAsRevision":"Reopen as Rev {{rev}}","recordAccept":"Accept → draft order (PI)","recordRevision":"Request revision","recordReject":"Reject","noteLabel":"Note","noteRequired":"A note is required","cancel":"Cancel","copyPortalLink":"Copy portal link","portalLinkCopied":"Portal link copied — paste it into your email to the customer.","portalLinkUnavailable":"The customer link only works while the quote is with the customer. This quote is “{{status}}”, so the link is switched off. {{next}}","portalLinkNext":{"order":"Open the order (PI) instead.","send":"Send the quote to the customer first.","revise":"Create a new revision and send it to the customer."},"issueOrderNo":"Issue order no.","issueOrderTitle":"Issue order number","issueOrderBody":"Quotation {{number}} becomes a draft proforma invoice (PI), shipped from the warehouse below.","issueOrderWarehouse":"Ship from warehouse","orderIssued":"Order {{number}} issued as a draft PI","noWarehouse":"No active warehouse to issue the order from — add one under Inventory → Warehouses.","warehousesLoading":"Loading warehouses…","warehousesLoadFailed":"Couldn't load the warehouses — close this and try again."},"events":{"submit":"Submitted for approval","recall":"Recalled to draft","approve":"Approved internally","request_changes":"Changes requested","send":"Sent to client","resend":"Resent to client","reopen":"Reopened as new revision","client_accept":"Client accepted","client_revision":"Client requested revision","client_reject":"Client rejected","auto_approve":"Auto-approved (under the approval threshold)","auto_expire":"Expired automatically","costing_done":"Costing done","escalate":"Escalated","reject":"Rejected","send_costing":"Sent to costing"},"send":{"title":"Send to customer","titleResend":"Resend to customer","subtitle":"Email the customer their quotation. A PDF and a portal link are included automatically.","toLabel":"To","toPlaceholder":"customer@example.com","replyToLabel":"Reply-to","replyToPlaceholder":"Company default","replyToHint":"Replies go here. Leave blank to use your company's default reply-to address.","subjectLabel":"Subject","subjectPlaceholder":"Auto-generated from the quote number","messageLabel":"Message","messagePlaceholder":"Optional note to the customer","attachHint":"The quotation PDF and a secure portal link are attached automatically.","cancel":"Cancel","send":"Send","resend":"Resend"},"doc":{"generateDocument":"Generate document","previewLink":"Client preview","dialogTitle":"Generate quotation document","dialogSubtitle":"Prints the client QUOTATION with the customer's quotation template (Settings › Document Templates) and files the PDF under the customer's documents. No cost or margin data is included.","languageLabel":"Second language","languageBilingual":"The template's second language (Vietnamese if none)","languageEnglish":"English only","languageVietnamese":"English + Vietnamese","cancel":"Cancel","submit":"Generate PDF","successToast":"Quotation document generated","loading":"Loading document…","previewBanner":"Client preview — exactly what {{customer}} receives. No cost or margin is shown.","backToQuote":"Back to quote","print":"Print","respondTitle":"Client response","acceptQuote":"Accept quote","requestRevision":"Request revision","decline":"Decline","acceptedNote":"The client accepted this quote — the order is confirmed.","declinedNote":"This quote was declined.","unsentNote":"This quote has not been sent to the client yet. Send it from the quote page to enable a response.","responseRecorded":"Client response recorded","pdfUnavailable":"PDF generation is not available right now","templateUsed":"Template: {{name}}","templateFrozen":"Layout frozen when sent · {{name}}","loadError":"Could not load the document: {{message}}"},"bomStatus":{"draft":"Draft","pending":"Pending approval","revision":"In revision","approved":"Approved","priced":"Priced","final":"Final"},"toasts":{"submitted":"Quote submitted for approval","recalled":"Quote recalled to draft","approved":"Quote approved","changesRequested":"Changes requested — the quote is back with its author","sent":"Quote sent to the customer","resent":"Quote re-sent to the customer","reopened":"Quote reopened as a new revision","clientAccepted":"Customer acceptance recorded","clientRevision":"Customer revision request recorded","clientRejected":"Customer rejection recorded"}},"worksheets":{"status":{"draft":"Draft","pending":"Pending","revision":"Revision requested","active":"Active","superseded":"Superseded"},"detail2":{"backToAll":"All worksheets","crumb":"Products · Pricing worksheet","title":"Pricing Worksheet","versions":"Versions","openFullView":"Open in full view","backToNormalView":"Back to normal view","fullView":{"costStructure":"Cost structure","showCostStructure":"Show cost structure","hideCostStructure":"Hide cost structure","totalFobUnit":"TOTAL FOB / UNIT"},"save":"Save","delete":"Delete","deleteConfirm":{"title":"Delete worksheet v{{v}}?","body":"This version is removed from the history and its number is freed for the next version. This cannot be undone."},"deleted":"Worksheet v{{v}} deleted","saved":"Worksheet saved","pushToQuote":"Push price to quote","pushDisabledHint":"Available once the worksheet is approved & active","internalBanner":"Internal costing — visible to Sales Manager, Purchasing & Manager. The client only sees the final price on the quote.","costHiddenNote":"Cost components are hidden for your role.","readonlyNote":"This version is locked — only draft, pending or revision worksheets can be edited.","fields":{"customer":"Customer","product":"Product","spec":"Specification","materials":"Materials","paint":"Paint colour","fx":"FX ₫/USD"},"compare":{"title":"New version v{{v}} — comparing against v{{base}}","activeTag":"active","button":"Compare with v{{n}}"},"workflow":{"steps":{"draft":"Draft","pending":"Pending review","active":"Active"},"assignApprover":"Assign approver…","submit":"Submit for approval","resubmit":"Resubmit","submitted":"Submitted for approval","awaiting":"Awaiting {{name}}","requestRevision":"Request revision","approveActivate":"Approve & activate","approved":"Approved — worksheet is now active","approvedBy":"Approved by {{name}} · {{date}}","createNewVersion":"Create new version","sentBack":"Sent back for revision","rejectModal":{"title":"Request revision","hint":"Send v{{version}} back to {{author}} with a reason. They'll revise and resubmit.","authorFallback":"the author","placeholder":"What needs to change? (required)","cancel":"Cancel","send":"Send back for revision"},"paintAreaChanged":"BOM paint area changed since submit","paintAreaChangedHint":"Approving keeps the submitted paint figures. To use the new BOM area, request a revision and resubmit."},"thread":{"submit":"submitted for approval","approve":"approved & activated","reject":"requested revision"},"tables":{"materialsIn":"Materials in","woodTitle":"Table 1 · Wood parts","woodSub":"pulled from BOM","openBom":"Open BOM ↗","resyncBom":"Resync from BOM","resyncBusy":"Resyncing…","resyncError":"Could not resync from the BOM","consTitle":"Table 2 · Consumables","consSub":"packing & hardware","fixedGroup":"Fixed materials","catalogGroup":"Consumables catalog","cushTitle":"Table 3 · Cushion upholstery","cushSub":"sub-assembly, priced separately","addLine":"＋ Add line","inUseOnly":"In-use only","showFullList":"Show full list","inUseCount":"{{used}} in use · {{total}} items in master list","woodTotal":"Wood total · {{count}} parts","woodEmptyTitle":"No wood parts pulled from the BOM","woodEmptyHint":"Add wood parts to the product's BOM, then click “Resync from BOM” above to pull them into this worksheet.","consTotal":"Consumables total","cushTotal":"Cushion total","bomBadge":"BOM","removeLine":"Remove","namePlaceholder":"Select or type item…","materialPlaceholder":"Select or type material…","columns":{"index":"Row number","sku":"SKU","part":"Part","grade":"Grade","stock":"Stock","note":"Note","qty":"Qty","qtyFull":"Quantity","dims":"Thickness × Width × Length","netM3":"Finished m³","grossM3":"Buy m³","usdPerM3":"$/m³","amount":"Amount","item":"Item","material":"Material","unit":"Unit","qtyNorm":"Quantity / norm","norm":"Norm","unitVnd":"Unit ₫","amountVnd":"Amount ₫","roughFactor":"× factor","buyAllowance":"× allowance"},"woodBuyHint":"Buy m³ = finished m³ × rough factor × buying allowance of the species. The waste % applies to consumables and paint only.","paintSummaryRecipes":"Paint · from BOM recipes","paintSummaryCoverage":"Paint · by coverage","paintTag":"Paint","paintExcluded":"Paint lines (tagged) — totalled under Paint","priceSourceVendor":"Vendor price","priceSourceStandard":"Std cost","priceSourceVendorHint":"Unit price from the material's primary vendor quote, in this line's unit. Type a price to override it.","priceSourceStandardHint":"Unit price from the material's standard cost (no vendor quote). Type a price to override it.","refresh":{"button":"Refresh prices","buttonCount":"Refresh prices ({{count}})","confirmTitle":"Refresh prices from Settings › Formulas?","confirmBody":"Rows to update: {{count}}. They take the current wood grid / paint formula price in place of the price they have now. Wood rows with a typed (Manual) $/m³ keep their price. Totals and FOB are recalculated.","done":"Prices refreshed ({{count}} rows)","upToDate":"Prices match Settings › Formulas","hint":"{{count}} rows differ from Settings › Formulas","confirmManual":"Manual rows kept: {{count}}."},"woodPrice":{"gridPrice":"Grid: {{price}}","missing":"No wood price for {{species}} at {{mm}} mm — set it in Settings › Formulas","openGrid":"Open Settings › Formulas","manual":"Manual","inputLabel":"$/m³ for {{part}}","gridPriceManual":"Grid price {{price}} — Refresh keeps your price","useGrid":"Use grid price ({{price}})","noGrid":"The wood grid has no price for this row, so there is no grid price to go back to. Set one in Settings › Formulas › Wood pricing."}},"rollup":{"title":"Table 4 · Cost structure","pctCaption":"% of sell price","woodRow":"Wood BOM (Table 1)","consRow":"Consumables (Table 2)","matWaste":"Materials + waste","sellNoCushion":"Sell price — no cushion","cushRow":"+ Cushion upholstery (Table 3)","fobCaption":"Total FOB / unit","fobFootnote":"Profit {{pct}}% · FOB Ho Chi Minh","fobNoLines":"No cost lines yet","fobNoLinesHint":"Add material lines before quoting this price","approved":{"title":"Approved price / unit","calcCompare":"Calculated FOB {{value}}","placeholder":"Approved price (USD)","belowCalcWarning":"At or below the calculated FOB ({{calc}}). A reason is required.","belowCalcFlag":"Below calculated price","reasonLabel":"Reason","reasonPlaceholder":"Why approve at or below the calculated price?","save":"Save approved price","clear":"Clear","saved":"Approved price saved","cleared":"Approved price cleared","invalid":"Enter a valid price (0 or more)","confirmTitle":"Approve at or below the calculated price?","confirmMessage":"{{price}} is at or below the calculated FOB of {{calc}}. Quotes will use {{price}}.","confirmLabel":"Save anyway","setBy":"Set by {{name}} · {{date}}"},"paintRow":"Paint"},"drawer":{"title":"Version history","subtitle":"{{product}} · {{customer}}","close":"Close","editingNow":"editing now","by":"By {{name}} · {{date}}","fromVersion":"from v{{v}}","approvedOn":"approved {{date}}","view":"View","newVersionFromThis":"New version from this","backToAll":"Back to all worksheets ↗","readonlyHint":"Inactive versions are read-only. Start an editable copy with New version from this.","cloned":"New draft v{{v}} started","viewModal":{"title":"Worksheet v{{v}}","readonly":"read-only","close":"Close","product":"Product","customer":"Customer","fob":"FOB price / unit","author":"Author","created":"Created","basedOn":"Based on","approver":"Approver","approved":"Approved"},"summary":{"linesChanged_one":"{{count}} line changed","linesChanged_other":"{{count}} lines changed","added":"{{count}} added","removed":"{{count}} removed","fob":"FOB {{from}} → {{to}} ({{delta}})","noCostChanges":"No cost changes","detailsChanged_one":"{{count}} detail field changed","detailsChanged_other":"{{count}} detail fields changed","identical":"Identical to v{{n}}","sameQuantities":"Same quantities and details as v{{n}}","noBase":"Original version — nothing to compare with","baseMissing":"The version this was based on (v{{n}}) is no longer in the history, so there is nothing to compare with","loading":"Checking what changed…","error":"Could not load what changed. Close and reopen the history to try again."}},"paint":{"title":"Paint","mode":{"recipes":"from BOM recipes","coverage":"by coverage"},"switchTo":{"coverage":"Price by coverage","recipes":"Use BOM recipes"},"switched":{"coverage":"Paint is now priced by coverage","recipes":"Paint is now priced from the BOM recipes"},"confirm":{"title":{"coverage":"Price the paint by coverage?","recipes":"Price the paint from the BOM recipes?"},"body":{"coverage":"The paint lines are replaced by one row per coat: kg = the BOM process area ÷ the coverage, at a blended ₫/kg. Every other line stays as it is.","recipes":"The coat rows are replaced by the paint seeded from the BOM recipes (kg = g/m² × area). Every other line stays as it is."},"go":{"coverage":"Switch to coverage","recipes":"Switch to recipes"},"legacyBody":"This worksheet was created before paint lines were marked, so its old paint lines can't be told apart from the other consumables. Resync all BOM lines in the new mode instead? Prices typed on BOM lines are reset; lines you added yourself are kept.","resyncAll":"Resync all BOM lines"},"recipesNote":"Paint is seeded from the BOM recipes (kg = g/m² × area). Its lines are listed in Table 2 · Consumables, tagged Paint, and totalled here — not in Consumables.","noProcessesHint":"This product's BOM has no paint process with a formula yet — add one on the BOM's Painting tab.","addCoat":"+ Add coat","removeCoat":"Remove coat","columns":{"index":"Row number","coat":"Coat","process":"BOM process","area":"Area m²","coverage":"Coverage","kg":"kg","price":"₫/kg","amount":"Amount ₫"},"coatPlaceholder":"e.g. Primer","unknownProcess":"{{code}} (not in the BOM)","fromBomBadge":"from BOM","fromBomBadgeMany":"from BOM · {{count}}","fromBomOne":"From the BOM: this process's painted area (Painting tab). Read-only.","fromBomMany":"From the BOM · {{count}} processes share this code: their areas are summed. Read-only.","missingArea":"No BOM area","missingCoverage":"Missing coverage","areaChanged":"BOM area changed: {{area}} m²","areaUpdate":"Update","coveragePrefix":"1 kg mix /","coverageUnit":"m²","emptyTitle":"No coats yet","emptyHint":"Add a row per paint coat, or switch back to the BOM recipes.","total":"Paint total","recipesTotal":"Paint total · {{count}} lines","rateTag":"(1 kg mix / {{m2}} m²)","formulaNow":"Formula now: {{price}}/kg · 1 kg / {{m2}} m²","formulaNowCoverage":"Formula now: 1 kg / {{m2}} m²","formulaNoPrice":"Formula {{code}} has no price for this step — its chemicals have no price, so the row keeps its own ₫/kg. Set the chemical prices in Settings › Formulas.","openFormulas":"Open Settings › Formulas","chemicals":{"show":"Show the chemicals of {{step}}","hide":"Hide the chemicals of {{step}}","name":"Chemical","ratio":"Ratio","price":"₫/kg","kg":"Kg"}},"versionCompare":{"title":"Compare v{{next}} with v{{base}}","readonly":"Read-only — shows what v{{next}} changed from the version it was based on, v{{base}}.","close":"Close","onlyChanges":"Only changes","fob":"FOB / unit","status":{"added":"Added","removed":"Removed","changed":"Changed"},"same":"These versions are the same","sameHint":"Nothing differs between v{{base}} and v{{next}} in costs, lines or details.","sameHintQty":"Nothing differs between v{{base}} and v{{next}} in line quantities or details.","loading":"Loading both versions…","errorTitle":"Could not load the versions","errorBody":"The two versions could not be loaded, so nothing can be compared. Check your connection and try again; if it keeps failing, ask your administrator.","retry":"Try again","noBase":"This is the original version, so there is nothing to compare it with.","pricesHidden":"Prices are hidden for your role, so only details and line quantities are compared. Ask a Sales Manager or Purchasing lead if you need the costs.","colItem":"Item","colStatus":"Status","manualOn":"Manual price","manualOff":"Grid price","qtyPrice":"{{qty}} × {{price}}","section":{"details":"Details","costs":"Cost settings","overhead":"Overhead % of sell price","wood":"Table 1 · Wood parts","consumable":"Table 2 · Consumables","paint":"Paint","cushion":"Table 3 · Cushion upholstery","rollup":"Cost structure"},"field":{"dim_w_mm":"Width (mm)","dim_d_mm":"Depth (mm)","dim_h_mm":"Height (mm)","carton_w_mm":"Carton width (mm)","carton_d_mm":"Carton depth (mm)","carton_h_mm":"Carton height (mm)","pcs_per_carton":"Pieces per carton","moq":"MOQ","material":"Materials","painting":"Paint colour","supplier_name":"Supplier","notes":"Notes","fx_rate":"FX ₫/USD","waste_pct":"Waste %","paint_mode":"Paint pricing","bom_cost":"BOM cost","labour_cost":"Labour","overhead_cost":"Overhead","pack_freight_cost":"Pack & freight","name":"Name","spec":"Spec","unit":"Unit","qty":"Qty","norm":"Norm","unit_price":"Price","grade":"Grade","thickness_mm":"Thickness (mm)","width_mm":"Width (mm)","length_mm":"Length (mm)","net_m3":"Net m³","gross_m3":"Gross m³","price_manual":"Price source","coverage_m2_per_kg":"Coverage m²/kg","area_m2":"Area m²","note":"Note"},"rollupRow":{"woodUsd":"Wood BOM (Table 1)","consUsd":"Consumables (Table 2)","paintUsd":"of which paint","cushUsd":"Cushion upholstery (Table 3)","matBase":"Materials + waste","priceNC":"Sell price — no cushion","fob":"Total FOB / unit"},"noDetailChanges":"No changes in details."}},"gate":{"crumb":"Products · Pricing worksheet","title":"New pricing worksheet","helper":"Choose the customer and product to begin. We'll pull the product's BOM wood parts and the consumables master list to start the cost build-up.","customer":"Customer","customerPlaceholder":"Select customer…","product":"Product","productPlaceholder":"Select product…","start":"Start worksheet","cancel":"Cancel","started":"New draft started · {{product}} · {{customer}}"},"landing":{"crumb":"Sales","title":"Pricing Worksheets","subtitle":"Cost build-ups per product & customer — the source of the FOB price pushed to quotes","newWorksheet":"New worksheet","kpi":{"total":"Total worksheets","totalSub":"{{products}} products · {{customers}} customers","active":"Active","activeSub":"approved & pushable","inApproval":"In approval","inApprovalSub":"pending or in revision","draft":"Draft","draftSub":"not yet submitted","review":"Price review","reviewSub":"material cost drifted","reviewOk":"all costs current"},"filters":{"all":"All","active":"Active","pending":"Pending","draft":"Draft","revision":"Revision","drift":"Price review","archived":"Archived"},"allCustomers":"All customers","searchPlaceholder":"Search product, customer, code, owner…","columns":{"product":"Product","customer":"Customer","version":"Version","fob":"FOB / unit","status":"Status","updated":"Updated","owner":"Owner","approver":"Approver"},"revs":"{{count}} revs","driftChip":"Cost +{{pct}}% — re-price","driftTitle":"Material cost rose {{pct}}% since {{since}} — approved FOB {{was}}, current cost implies {{now}}. Needs a new version.","empty":"No worksheets match this view.","showing":"Showing {{from}}–{{to}} of {{total}}","rows":"Rows","noResults":"No worksheets","ago":{"today":"today","day":"1 day ago","days":"{{count}} days ago","month":"1 month ago","months":"{{count}} months ago"},"truncated":"Showing first {{count}} worksheets — refine filters to see the rest.","history":{"toggle":"Version history","captionOne":"Version history · {{count}} version","captionMany":"Version history · {{count}} versions","meta":"{{by}} · {{date}}","fromVersion":"from v{{v}}","approvedBy":"appr {{name}}","open":"Open","newVersion":"New version"},"rowActions":{"open":"Open","activate":"Activate","activated":"Version v{{v}} is now the active worksheet.","activateConfirmTitle":"Activate version v{{v}}?","activateConfirmBody":"This version becomes the active one and the current active version is archived. Quotes will price from it.","activateDisabled":"Only a draft or pending version can be activated. Open the worksheet to see where it stands.","cloneDisabled":"A new version is started from an active or archived version. Edit the draft directly, or submit it for approval first.","actionError":"The action could not be completed. Nothing was changed — try again."}},"overhead":{"labor_mgmt":"Labor + Management","factory":"Factory / Building","utilities":"Electricity + Water","sandpaper_tools":"Sandpaper + Tools","export_fees":"Export Fees","depreciation":"Machinery Depreciation","other":"Other (bank interest, samples…)","profit":"Profit"}},"documents":{"activity":{"title":"Sending and supplier links","loading":"Loading activity…","error":"Activity could not be loaded. Check your connection and try again.","retry":"Retry","supplierAnswered":"Latest answer from the supplier","noRights":{"po":"You can see this activity but cannot create, extend or revoke links. That needs the right to edit purchase orders. Ask your administrator to add it to your role.","rfq":"You can see this activity but cannot create, extend or revoke links. That needs the right to approve RFQs. Ask your administrator to add it to your role."},"copy":{"button":"Copy new link","copied":"New link copied. Paste it into your message to the supplier.","copyManually":"The link was created but could not be copied automatically. Copy it from the box below.","failed":"The link could not be created. Try again, or check that the supplier is set on this document.","needsVendor":"To copy a link, open this RFQ from the supplier's document: a link is made for one supplier at a time.","hint":"A link can be shown only once, when it is created. Copy new link makes a fresh personal link; earlier links keep working until you revoke them.","newTitle":"New link","onlyOnce":"This link will not be shown again. Copy it now."},"revoke":{"button":"Revoke","title":"Revoke this link?","body":"The link starting {{hint}} will stop working at once. The supplier will see that it was withdrawn and must ask you for a new one.","confirm":"Revoke link","done":"Link revoked.","failed":"The link could not be revoked. Try again."},"revokeAll":{"button":"Revoke all links","title":"Revoke all links?","body":"{{count}} active link(s) will stop working at once. Suppliers must ask you for a new link.","confirm":"Revoke all","done":"{{count}} link(s) revoked.","failed":"The links could not be revoked. Try again.","noneActive":"No active links to revoke."},"extend":{"button":"Extend","title":"Keep this link open longer?","body":"It is open until {{until}}. A link can stay open at most one year from when it was created.","label":"Add time","option":"{{days}} more days","confirm":"Extend","done":"Link extended.","failed":"The link could not be extended. Try again."},"links":{"title":"Links","empty":"No link has been made for this document yet. Sending it by email makes a personal link for each recipient.","noRecipient":"No recipient set","views":"Opened {{count}} time(s) · last opened {{last}}","notOpened":"Not opened yet","revokedAt":"revoked {{when}} ({{reason}})","expires":"open until {{when}}"},"linkState":{"active":"Active","expired":"Expired","revoked":"Revoked"},"revokeReason":{"manual":"revoked by a user","resend":"replaced by a resend","revoke_all":"all links revoked","voided":"document voided","cancelled":"email not delivered"},"sends":{"title":"Sent history","empty":"This document has not been sent yet.","byOn":"{{by}} · {{when}}","channel":{"email":"Emailed","manual":"Sent outside the app","link_copy":"Link copied"},"emailReason":{"partly_sent":"Some recipients did not receive the email. Resend it to them.","send_failed":"The email could not be delivered. Check the address and send it again.","no_recipient":"No recipient address was set. Add one and send again.","not_configured":"Email is not set up for this company. Ask your administrator.","pdf_unavailable":"The PDF could not be made, so nothing was emailed. Try again in a minute."}},"responseStatus":{"acknowledged":"Acknowledged","confirmed":"Confirmed","change_requested":"Changes proposed","rejected":"Rejected"},"responseAction":{"acknowledged":"Acknowledged receipt","confirmed":"Confirmed the order","change_requested":"Proposed changes","rejected":"Rejected the order","comment":"Message"},"replies":{"title":"Supplier replies","empty":"The supplier has not replied yet.","viaLink":"from their link","logged":"logged by a buyer"},"events":{"toggle":"Link events ({{count}})","kind":{"viewed":"Opened","downloaded":"PDF downloaded","responded":"Answered","signed":"Signed","uploaded":"File uploaded","denied_expired":"Opened after it expired","denied_revoked":"Opened after it was revoked"}},"log":{"button":"Log supplier reply","done":"Reply logged.","title":"Log supplier reply","intro":"Record an answer the supplier gave you by email or phone. The same rules apply as on their link.","action":"What did the supplier say?","note":"Note (optional)","noteRequiredLabel":"Note (required)","noteRequired":{"change_requested":"Write what the supplier wants changed before saving.","rejected":"Write why the supplier rejected the order before saving.","comment":"Write the message before saving."},"emailInvalid":"Enter a valid email address, or leave it empty.","name":"Who replied (optional)","email":"Their email (optional)","failed":"The reply was not saved. Try again.","cancel":"Cancel","save":"Save reply"}}},"portal":{"supplierLink":{"brand":"keenERP","supplierPortal":"Supplier link","loading":"Opening your document…","refusal":{"title":"This link cannot be used","titleRetry":"We could not open this page right now","generic":"The link could not be opened.","nextNewLink":"What to do: ask the person at the company who sent you this link to send you a new one. Nothing you have entered on this page was sent.","nextRetry":"What to do: wait a minute, then reload this page or press the button below. Your link is still valid.","retry":"Try again"}},"supplierRfq":{"greeting":"Request for quotation for {{vendor}}","intro":"{{company}} invites you to quote. Fill in your prices below and send them. Only you and {{company}} can see this page.","downloadPdf":"Download PDF","pdfFailed":"The PDF could not be downloaded. Try again in a minute, or answer on this page without it.","sendFailed":"Your answer was not sent. Check the fields above and try again, or contact the buyer.","noPriceError":"Enter a unit price for at least one line before sending.","badPriceError":"The price on line {{line}} must be a number greater than zero. Fix it or clear the field.","fields":{"requestDate":"Request date","deadline":"Answer by","deliveryTarget":"Delivery wanted","incoterm":"Incoterm","deliveryAddress":"Deliver to:"},"state":{"closed":"This request is no longer taking answers. You can still read it. If you want to quote, contact the buyer who sent you this link.","deadlinePassed":"The deadline ({{deadline}}) has passed, so the quote can no longer be sent or changed. Contact the buyer to ask for more time.","declined":"You declined this request on {{when}}.","declineReason":"Your reason: {{reason}}","declinedRequote":"Changed your mind? Send a quote below before the deadline and the decline is cancelled.","declinedLocked":"The request is closed, so the decline stands. Contact the buyer if you want to quote after all.","hasQuote":"Your quote was received on {{when}}. You can change it below until the deadline."},"sent":{"quote":"Your quote was sent. Thank you.","quoteEditable":"Your quote was sent. You can change it here until the deadline.","decline":"Your decline was sent. Thank you.","declineEditable":"Your decline was sent. If you change your mind, send a quote here before the deadline."},"lines":{"no":"Row number","item":"Item","qty":"Quantity","unitPrice":"Your unit price","leadDays":"Lead time (days)","priceAria":"Unit price for line {{line}}","leadAria":"Lead time in days for line {{line}}","total":"Quoted total: {{total}}"},"quote":{"title":"Your quote","titleReadOnly":"Quote","reference":"Your quote number","validUntil":"Quote valid until","leadTime":"Overall lead time (days)","paymentTerms":"Payment terms","incoterm":"Incoterm","submit":"Send quote","update":"Update quote"},"decline":{"open":"Decline to quote","again":"Decline again","reasonLabel":"Reason (optional)","reasonPlaceholder":"For example: we cannot make this item","hint":"The buyer sees your reason. You can still send a quote later, before the deadline.","confirm":"Send decline","cancel":"Cancel"},"forecastTitle":"Forecast RFQ — {{category}}"},"supplierPo":{"greeting":"Purchase order for {{vendor}}","intro":"{{company}} sent you this order. Please acknowledge it or tell them what needs to change. Only you and {{company}} can see this page.","title":"Purchase order","downloadPdf":"Download PDF","pdfFailed":"The PDF could not be downloaded. Try again in a minute; you can still answer on this page.","sendFailed":"Your answer was not sent. Try again, or contact the buyer.","cancel":"Cancel","fields":{"orderDate":"Order date","expectedDate":"Delivery date","paymentTerms":"Payment terms"},"lines":{"no":"Row number","item":"Item","qty":"Quantity","unitPrice":"Unit price","total":"Amount"},"totals":{"subtotal":"Subtotal","tax":"Tax","grand":"Total"},"status":{"acknowledged":"Acknowledged","confirmed":"Confirmed","change_requested":"Changes proposed","rejected":"Rejected"},"answer":{"title":"Your answer","notSignature":"Acknowledging or confirming tells the buyer you received the order. It is not a signature on the order.","yourName":"Your name (optional)","lockedNone":"This order is not open for answers now, for example because the buyer is changing it. Wait for their updated order, or contact the buyer.","locked":{"acknowledged":"You acknowledged this order. Nothing more is needed unless you want to confirm it, propose changes or reject it.","confirmed":"You confirmed this order. No further answer is needed. Contact the buyer if something changes.","change_requested":"Your proposed changes were sent. Wait for the buyer to send an updated order. Contact them if you need to add more.","rejected":"You rejected this order. Contact the buyer if you want to reconsider."}},"actions":{"acknowledge":"Acknowledge receipt","confirm":"Confirm order","proposeChanges":"Propose changes","reject":"Reject order"},"noteRequired":{"rejected":"Say why you cannot accept this order before sending.","changes":"Say what needs to change before sending."},"reject":{"noteLabel":"Why can you not accept this order?","send":"Send rejection"},"changes":{"hint":"Fill in only the lines that need to change; leave the others empty.","line":"Line {{line}} · {{item}}","quantity":"New quantity","unitPrice":"New unit price","date":"New date","lineNote":"Note","noteLabel":"What needs to change?","send":"Send proposed changes"},"done":{"acknowledged":"Thank you. The buyer was told you received this order.","confirmed":"Thank you. The buyer was told you confirmed this order.","change_requested":"Your proposed changes were sent to the buyer. Wait for an updated order from them.","rejected":"Your rejection was sent to the buyer.","comment":"Your message was sent to the buyer."},"history":{"title":"Your answers so far","action":{"acknowledged":"Acknowledged","confirmed":"Confirmed","change_requested":"Changes proposed","rejected":"Rejected","comment":"Message"}}},"priceProposal":{"header":{"brand":"Van Huu Thinh","customerPortal":"Customer portal","secureSession":"Secure session","downloadPdf":"Download PDF","pdfComingSoon":"PDF download will be available soon."},"greeting":"Hello {{customer}} team","intro":"{{company}} has sent you a price proposal to review.","footer":"This is a confidential proposal for {{customer}}. Need help? Contact your representative.","doc":{"title":"PRICE PROPOSAL","tagline":"Confidential pricing proposal","preparedFor":"Prepared for","proposalDate":"Proposal date","effectiveFrom":"Effective from","colNum":"#","colProduct":"Product","colSize":"Size (mm)","colCurrent":"Current","colNew":"New price","authorisedBy":"Authorised by","confidential":"This proposal contains confidential pricing intended solely for {{customer}}.","forCompany":"For and on behalf of","date":"Date","tel":"Tel","taxId":"Tax code"},"status":{"awaiting":"Awaiting your response","approved":"Approved","adjust_requested":"Adjustments requested","declined":"Declined","finalized":"Finalized & agreed"},"statusNote":{"approved":"Thank you — your approval has been sent to the team, who will confirm and finalise the agreement.","adjust_requested":"Your adjustment request has been sent. We will review and send you a revised proposal shortly.","declined":"You have declined this proposal. The team has been notified and may follow up.","finalized":"These prices are agreed and finalised. Thank you for your business."},"response":{"title":"Your response","subtitle":"Approve the revised prices, or send us a note to request changes. We will keep working with you until we agree.","noteLabel":"Add a note about your response","notePlaceholder":"Add a note (required to request changes or decline)…","noteRequired":"Please add a note explaining the change you'd like.","approve":"Approve these prices","adjust":"Request adjustments","decline":"Decline","proposedPriceLabel":"Your proposed price (optional)","proposedPricePlaceholder":"Enter your counter price…"},"errors":{"rateLimited":"Too many requests. Please wait a moment and try again.","generic":"Something went wrong. Please try again."},"history":{"title":"Conversation history","roleVendor":"Van Huu Thinh","roleCustomer":"You","quotedNote":"“{{note}}”","action":{"sent":"Proposal sent","resent":"Revised proposal sent","revised":"Proposal revised","client_approved":"Approved the proposed prices","client_adjust":"Requested adjustments","client_declined":"Declined the proposal","confirmed":"Prices confirmed","applied":"Applied to price list","finalized":"Finalized & agreed"}},"notFound":{"title":"Proposal not found","body":"This link is invalid or has expired. Please contact your representative for a new link."},"error":{"title":"Unable to load proposal","body":"We could not load this proposal. Please try again in a moment."}},"quote":{"header":{"brand":"keenERP","customerPortal":"Customer portal","secureSession":"Secure session"},"greeting":"Hello {{customer}} team","intro":"A quotation from {{company}} is ready for your review.","footer":"This secure link was issued to {{customer}}. Please do not forward it.","status":{"awaiting":"Awaiting your response","confirmed":"Confirmed","revision_requested":"Revision requested","declined":"Declined","closed":"Closed"},"notFound":{"title":"This link is no longer active","body":"The quotation link you followed is invalid or has been withdrawn. Please contact your sales representative."},"error":{"title":"Something went wrong","body":"We could not load the quotation. Please try again shortly."},"doc":{"title":"QUOTATION","to":"To:","pleased":"We are pleased to offer you our best price for furniture as follows.","number":"No.","rev":"Rev {{rev}}","date":"Date:","validUntil":"Valid until:","currency":"Currency:","colNo":"#","colProduct":"Product","colQty":"Quantity","colUnitPrice":"Unit price","colAmount":"Amount","subtotal":"Subtotal","deposit":"Deposit ({{percent}}%)","total":"Total","payment":"Payment:","incoterm":"Incoterms:","leadTime":"Lead time:","leadDays":"{{days}} days","warranty":"Warranty:","authorised":"Authorised signature","accepted":"Accepted by (customer)","tax":"VAT"},"yourResponse":"Your response","notePlaceholder":"Add a note (required for revision or decline)…","noteRequired":"Please add a note explaining your request.","respondFailed":"Could not send your response. Please try again.","acceptUnpriced":"This quote cannot be accepted yet: one or more lines have no price. We cannot confirm an order without a price. Please contact your sales person to get a priced quote.","accept":"✓ Accept quote","requestRevision":"Request revision","decline":"Decline","decided":{"confirmed":"You accepted this quotation — the order is confirmed. Our team will contact you with next steps.","revision_requested":"You requested a revision. Our sales team will send an updated quotation.","declined":"You declined this quotation.","closed":"This quotation is closed.","awaiting":""},"history":"History","thread":{"customer":"You","vendor":"Seller","actions":{"send":"Quotation sent","resend":"Quotation resent","client_accept":"Quotation accepted","client_revision":"Revision requested","client_reject":"Quotation declined"}}},"orderDoc":{"header":{"brand":"keenERP","customerPortal":"Customer portal","secureSession":"Secure session"},"greeting":"Hello, {{customer}}","intro":"A document for order {{so}} is ready for your review.","footer":"This secure page was prepared for {{customer}}. Please do not share the link.","error":{"title":"Something went wrong","body":"We could not load this document. Please try again later or contact your sales representative."},"notFound":{"title":"This link is no longer active","body":"The document link is invalid or has expired. Please contact your sales representative for a new link."},"status":{"draft":"Draft","internal_review":"In review","sent":"Awaiting your response","accepted":"Approved","change_requested":"Changes requested","rejected":"Declined","signed":"Signed","superseded":"Replaced by a newer version"},"decided":{"draft":"This document is not open for responses yet.","internal_review":"This document is not open for responses yet.","sent":"Awaiting your response.","accepted":"You approved this document. Our team will follow up with the next steps.","change_requested":"You requested changes. Our team will send a revised version shortly.","rejected":"You declined this document. Our team will be in touch.","signed":"You signed this document. Our team will follow up with the next steps.","superseded":"This document was replaced by a newer version. It is kept for your records; our team will send you the new version."},"docTitle":{"proforma_invoice":"PROFORMA INVOICE","sale_contract":"SALES CONTRACT","commercial_invoice":"COMMERCIAL INVOICE","cbm_plan":"CBM LOADING PLAN","packing_list":"PACKING LIST","invoice_by_container":"INVOICE BY CONTAINER"},"doc":{"to":"To:","shipTo":"Ship to:","number":"No.:","date":"Date:","order":"Order:","version":"Version:","colNo":"No","colDescription":"Description","colQty":"Qty","colUnitPrice":"Unit price","colAmount":"Amount","total":"Total","payment":"Payment:","incoterm":"Incoterm:","etd":"ETD:","versionShort":"v{{version}}"},"yourResponse":"Your response","namePlaceholder":"Your full name","signaturePlaceholder":"Type your full name to sign","signatureHint":"Typing your name here acts as your signature on this contract.","notePlaceholder":"Add a note (required when requesting changes or declining)","nameRequired":"Please enter your name.","noteRequired":"Please add a note explaining your request.","respondFailed":"We could not record your response. Please try again.","accept":"Approve","sign":"Sign contract","requestChanges":"Request changes","reject":"Decline","noReview":"No response is needed for this document."}},"materialRequirements":{"pi":{"label":"Planned for PI","placeholder":"Optional — pick a PI","clear":"Clear","empty":"No confirmed PI includes this product yet.","emptySearch":"No PI matches “{{q}}” for this product.","hintOn":"Wood is bought at this PI's allowance per species. Create PO links the orders to this PI.","hintOff":"Pick a PI to buy wood at its allowance and create POs linked to it."},"createPo":{"button":"Create PO for PI","creating":"Creating POs…","nothing":"Nothing to order on a PO: every shortfall is covered or set to its BOM alternative (use Create Purchase Request for those).","created_one":"{{count}} draft PO created for {{pi}}.","created_other":"{{count}} draft POs created for {{pi}}.","done":"POs for {{pi}}:","unassigned_one":"{{count}} line has no preferred supplier and was not ordered ({{skus}}). Use Create Purchase Request for it.","unassigned_other":"{{count}} lines have no preferred supplier and were not ordered ({{skus}}). Use Create Purchase Request for them."},"breadcrumb":"Purchasing · Materials","title":"Material Requirements","subtitle":"Explode a product's BOM by build quantity, net the requirement against stock on hand and reusable semi-finished surplus, and turn the shortfall into a Purchase Request — then on to ordering.","allowance":{"title":"Allowance","titleForPi":"Wood buying allowance for PI {{number}}","hint":"Wood buying allowance for this PI, per species. The lines below are priced with it."},"product":"Product","productEmpty":"No product with an active BOM matches “{{q}}”. Publish its BOM in Products › Product BOM first.","piProductNotice":{"what":"{{product}} is not on PI {{pi}}.","why":"The allowance and POs would not match this PI.","fix":"Pick one of the PI's products, or clear the PI."},"buildQuantity":"Build quantity","needBy":"Need by","units":"units","editBom":"← Edit BOM","kpi":{"toOrder":"To order","toOrderSub":"materials short","purchaseValue":"Purchase value","purchaseValueSub":"estimated","covered":"Covered","coveredSub":"by stock + semi-finished","leadRisk":"Lead-time risk","leadRiskSub":"may miss need-by"},"groupSummary":"{{toOrder}}/{{total}} to order ·","colMaterial":"Material","colPerUnit":"Per unit","colGross":"Gross ×{{qty}}","colScrap":"Scrap%","colNet":"Net need","colStock":"Stock","incomingSub":"{{qty}} incoming","requestedSub":"{{qty}} requested","colBtp":"Semi-finished stock","colOrderMore":"Order more","colLead":"Lead","colEstCost":"Estimated cost","coveredCell":"✓ covered","leadDays":"lead {{days}}d","leadDaysPlain":"{{days}}d","empty":"No BOM lines to explode for this product.","daysShort":"{{days}}d","footToOrder":"to order","footLeadRisk":"{{count}} lead-time risk","prCreated":"✓ {{number}} created · pending approval","createPr":"Create Purchase Request","sendToOrdering":"Send to ordering →","toastNothingToOrder":"Nothing to order — fully covered by stock & semi-finished","toastPrCreated":"Purchase Request {{number}} created with {{count}} lines · sent for approval","toastCreateFirst":"Create the Purchase Request first","uncategorized":"Uncategorized","coverageLink":"Material Coverage →","emptyNoBomTitle":"No product has an active BOM yet","emptyNoBomBody":"Material Requirements explodes a product's active bill of materials. Create a BOM and set it Active, then come back here to plan materials.","productPlaceholder":"Pick a product","productPlaceholderEmpty":"No products with an active BOM","bomAlternative":{"chip":"Alt: {{sku}}","use":"Use alternative","useBom":"Use BOM material","using":"Ordering {{sku}}"},"btpAvailable":"{{qty}} available","btpOpen":"Confirm or undo semi-finished pallets for this PI","btpNeedsPi":"Pick a PI first: semi-finished stock is confirmed for one PI at a time."},"materialCoverage":{"breadcrumb":"Purchasing · Planning","title":"Material Coverage","subtitle":"Net every material's on-hand stock plus incoming POs against all open demand over a chosen window. Shortfalls become draft purchase orders; a per-item ₫ ceiling keeps inventory liability in check.","timeframe":"Timeframe","window":{"week":"1 week","month":"1 month"},"demandSources":"Demand sources","source":{"so":"Sales orders","bom":"BOM / in-progress"},"search":"Search","searchPlaceholder":"code, name…","allCategories":"All categories","kpi":{"materialsShort":"Materials short","materialsShortSub":"of {{total}} in window","suggestedBuy":"Suggested buy","suggestedBuySub":"within ₫ ceilings","openDemand":"Open demand","openDemandSub":"SO demand in window","liability":"Inventory liability","liabilitySub":"on-hand value at standard cost"},"colMaterial":"Material","colOnHand":"On hand","colIncoming":"Incoming","colDemand":"Demand","colSafety":"Safety","colProjected":"Projected","colCoverage":"Coverage","colSelect":"Select","colCategory":"Category","colSuggest":"Suggest buy","colAlternate":"BOM alternate","alternateChip":"Alt: {{sku}}","alternateMore":"Alt: {{sku}} +{{count}}","status":{"shortage":"Shortage","at_risk":"At risk","covered":"Covered","overstock":"Overstock"},"suggestCapped":"{{uom}} · capped","coveredCell":"✓ covered","empty":"No materials with stock or demand in this window.","footShort":"short","footSelected":"selected","clearSelection":"Clear selection","generate":"Generate PO","generateCount":"Generate PO · {{count}} items","createdBanner":"Created:","toastCreated":"✓ Created {{poCount}} draft purchase orders · sent to ordering","toastCreatedWithPr":"✓ Created {{poCount}} draft POs + purchase request {{prNumber}} for items without a preferred vendor","colOrderAs":"Order as"},"purchaseContracts":{"title":"Purchase Contracts","subtitle":"Vendor contracts and their effective windows. A signed, in-window contract sets the firm buy price.","newContract":"New contract","allStatuses":"All statuses","activeOnly":"Firm (in-window) only","loading":"Loading contracts…","error":"Could not load contracts.","empty":"No purchase contracts yet.","colNumber":"Contract","colVendor":"Vendor","colWindow":"Effective window","colPayment":"Payment","colStatus":"Status","colFirm":"Firm price","firmYes":"Firm","firmNo":"Not firm","netDays":"Net {{days}}","status":{"draft":"Draft","sent_for_signature":"Sent for signature","signed":"Signed","cancelled":"Cancelled"},"colSignedCopy":"Signed copy","noSignedCopy":"None","filesTitle":"Signed copies · {{no}}","filesSubtitle":"{{vendor}} · {{title}}"},"orderMaterials":{"breadcrumb":"Purchasing","title":"Order Materials","subtitle":"Browse by the material you need. Each one lists every vendor that supplies it — with their own name, SKU, price and terms — so you can compare like-for-like, add the best offer, and split picks into draft POs.","tabs":{"catalog":"Catalog","builder":"Order Builder","mapping":"Vendor Mapping"},"searchPlaceholder":"Search material name, code or vendor SKU…","chipAll":"All","priceType":{"contract":"Contract","quote":"Quote","request":"No price"},"legend":{"contractHint":"locked price","quoteHint":"responded","requestHint":"no price yet"},"perUom":"/{{uom}}","buyHelper":{"need":"Need","per":"· 1 {{bom}} =","round":"· round to","order":"→ order","apply":"Apply to offers"},"catalog":{"from":"From","vendors":"Vendors","inOrder":"{{count}} in order","empty":"No materials match your filters.","noVendors":"No vendors linked to this material yet.","noVendorsHint":"Link a vendor's product name, SKU and pricing to start comparing offers.","linkVendor":"＋ Link a vendor","noRating":"No rating yet","colMaterial":"Material","colCategory":"Category","colUom":"Unit of measure","colBest":"Best price","toggle":"Show vendor offers","requestQuote":"Request quote","add":"Add","perUomBest":"/{{uom}} · best","moqValue":"{{qty}} {{uom}}","leadDays":"{{days}}d","leadFast":"{{days}}d ⚡","terms":"Net {{days}}","colDescription":"Description","colDimension":"Dimension","materialLink":"Material link","materialLinkHint":"Linked on the Materials page","priceStale":"older than offers","priceStaleHint":"This last quote is older than the newest priced offer for the material (or has no date), so it is not counted as best price.","mapAsOffer":"Map as offer","mapAsOfferHint":"Open Vendor Mapping with this vendor's details so the material can be ordered from it"},"col":{"vendor":"Vendor","theirName":"Their name / SKU","priceType":"Price type","unitPrice":"Unit price","ourPrice":"Our {{uom}} price","moq":"MOQ","lead":"Lead","terms":"Terms","order":"Order"},"builder":{"empty":"No materials added yet","emptyHint":"Add offers from the Catalog tab. Picks group into a draft PO per vendor — you can split a vendor's lines across several POs.","createdTitle":"Created {{count}} draft POs — pending review","draftPo":"Draft PO {{n}}","leadApprox":"· lead ~{{days}}d","lineCount":"· {{count}} lines","subtotal":"Subtotal","colMaterial":"Material","colQty":"Quantity","colUnit":"Unit","colLineTotal":"Line total","colPo":"PO","belowMoq":"below MOQ {{moq}}","poOption":"PO {{n}}","newPo":"+ New PO","remove":"Remove","summary":"{{pos}} draft POs · {{lines}} lines across {{vendors}} vendors","grandTotal":"Grand total","clear":"Clear","create":"Create {{count}} draft POs"},"mapping":{"title":"Vendor ↔ material mapping","subtitle":"Each internal material links to one row per vendor — their product name, SKU, selling unit and conversion to our unit. This is what lets the catalog compare like-for-like.","add":"＋ Add mapping","ourUnit":"· our unit: {{uom}}","links":"{{count}} vendor links","noLinks":"No vendor links yet.","colVendor":"Vendor","colName":"Vendor's product name","colSku":"Vendor SKU","colSellsIn":"Sells in","colConversion":"Conversion","conversion":"1 {{vendorUom}} = {{factor}} {{uom}}","edit":"Edit","unlink":"Unlink","form":{"material":"Internal material","selectMaterial":"Select a material…","vendor":"Vendor","selectVendor":"Select a vendor…","vendorName":"Vendor's product name","vendorNamePlaceholder":"e.g. Flat Clear 15° (16kg pail)","vendorSku":"Vendor SKU","sellsIn":"Vendor sells in","sellsInPlaceholder":"pail","unitsPerOne":"Our units per 1","priceType":"Price type","contract":"Purchase contract","contractNone":"None (no contract)","price":"Price / vendor unit","moq":"MOQ (our unit)","leadDays":"Lead (days)","cancel":"Cancel","save":"Save mapping","saveEdit":"Update mapping","required":"Required"},"toastLinked":"Vendor linked to material","toastUpdated":"Mapping updated","toastUnlinked":"Unlinked {{vendor}} from {{sku}}","toastMissingFields":"Fill in material, vendor, product name and selling unit"},"toastEnterQty":"Enter a quantity","toastAdded":"Added {{qty}} {{uom}} · {{vendor}}","toastBelowMoq":"Added — note: below MOQ ({{moq}} {{uom}})","toastQuoteSent":"Quote request sent to {{vendor}}","toastQuoteCreated":"RFQ {{rfq}} created — add vendors and send","toastQuoteError":"Could not start the quote request","rfqTitle":"Quote request — {{sku}}","rfqNoPermission":"You do not have permission to create quote requests","toastPosCreated":"Created {{count}} draft POs: {{numbers}}","toastAlternate":"Line now orders {{sku}} from {{vendor}}."},"productionRequests":{"breadcrumb":"Sales · Production Requests","title":"Production Requests","titleTag":"(PI)","subtitle":"Each customer PI carries four controlled documents. Once all are attached and the PI is approved, the system explodes the BOM and pushes a material plan to every department.","tabs":{"requests":"Requests","attachments":"Attachments","distribution":"Material Distribution"},"col":{"pi":"PI","customer":"Customer","product":"Product","qty":"Quantity","docs":"Documents","status":"Status"},"summaryRequests":"Requests","summaryIncomplete":"Incomplete docs","listHint":"Click a request to open its attachments. A PI can't be submitted for approval until all four documents are attached.","empty":"No production requests yet. Create a proforma invoice first.","band":{"pi":"PI","customer":"Customer","product":"Product","qty":"Qty","docsCount":"{{count}}/4 docs"},"status":{"draft":"Draft","review":"In review","approved":"Approved","distributed":"Distributed"},"docKind":{"drawing":"Technical drawing","label":"Label","carton_spec":"Carton spec","packaging_process":"Packaging process"},"docSub":{"drawing":"From product code","label":"Product label","carton_spec":"Box dimensions","packaging_process":"How to pack"},"badgeAttached":"Attached","badgeRequired":"Required","notAttached":"Not attached","uploadFile":"⤒ Upload file","uploadNewVersion":"⤒ Upload new version","versionHistory":"Version history","requiredBeforeSubmit":"Required before submitting for approval","download":"Download","gateComplete":"All four documents attached. The system keeps every old version — nothing is deleted on re-upload.","gateMissing":"{{count}} of 4 documents missing","gateMissingTail":"— can't submit for approval yet. Old versions are always kept.","submit":"Submit for approval","approve":"Approve PI","waitingTitle":"Waiting for approval","waitingBodyDocs":"The BOM explosion and material distribution run automatically once {{pi}} is approved. Attach the remaining documents first.","waitingBodyApprove":"The BOM explosion and material distribution run automatically once {{pi}} is approved. Approve it from the Attachments tab.","approvedPi":"Approved PI","bomExplosion":"BOM explosion by product","bomVersion":"BOM v{{version}}","aggregatesLabel":"System aggregates materials by group","pushLabel":"System pushes a notification + planning sheet to each department","group":{"wood":"Wood","paint":"Paint","hardware":"Hardware","packaging":"Packaging"},"groupEmpty":"No materials in this group","dept":{"wood":"Materials dept","paint":"Paint dept","hardware":"Assembly dept","packaging":"Packaging dept"},"deptReceives":"Receives the {{group}} requirement for this PI","sentBadge":"✓ Sent","notifyBadge":"Notify + Excel","sendSheets":"Send planning sheets to all departments","toastUploaded":"{{kind}} → v{{version}} uploaded","toastSubmitted":"{{pi}} submitted for approval","toastApproved":"{{pi}} approved — material plan computed","toastDistributed":"Material plan sent to 4 departments for {{pi}}"},"orderFlow":{"breadcrumb":"Sales · Help","title":"Sales Order → BOM → Quote","intro":"End-to-end flow for an order that mixes existing products and brand-new ones. New products must be created and have their BOM approved before the order can be quoted. Once all lines are on the product list, a single combined quote (existing + new) goes to the client.","legend":{"rolesTitle":"Roles / responsibility","pipelineTitle":"Order status pipeline"},"roles":{"sales":"Sales","engineering":"BOM / Engineering","lead":"Team Lead / Manager","salesManager":"Sales Manager","client":"Client","purchasing":"Purchasing"},"pipeline":{"draft":"Draft","bomInProgress":"BOM in progress","bomApproved":"BOM approved","bomCosted":"BOM costed","quoted":"Quoted","confirmed":"Confirmed"},"step1":{"tag":"SALES","title":"Create Sales Order","status":"→ Draft","body":"Capture customer & contact, PO reference, order + requested-delivery dates, and one or more line items (product, variant, qty, price, currency & terms). Attach drawings / customer spec and notes.","output":"Output: a draft order with line items, each tagged by the next step."},"step2":{"tag":"SALES · SYSTEM","title":"Triage each line","body":"Picking from the product catalog = existing. Typing a name not in the catalog flags the line “new — needs BOM”. The order now splits into two paths per line."},"split":{"label":"Two paths per line item"},"existing":{"label":"Existing product line","badge":"READY","title":"Already on the product list","body":"Product exists with an approved BOM and known cost — no engineering needed. The line waits for the combined quote.","skip":"skips straight to the merge →"},"newPath":{"label":"New product line — main flow"},"subA":{"tag":"BOM / ENG","title":"Create product + BOM","body":"Engineering builds the product: parts, hardware, cushion, packaging, finishing (paint colour from the library) → wood/material requirements + cost roll-up.","status":"Status → BOM in progress · opens Product BOM →"},"subB":{"tag":"LEAD / MANAGER","title":"Approve BOM","body":"Lead/Manager reviews and approves (or requests a revision — back to A). On approval the product joins the product list.","status":"Status → BOM approved"},"subC":{"tag":"PURCHASING","title":"Provide material costs","body":"Purchasing fills the cost of each BOM material — pulled automatically from the annual contract price or average past purchase when available (editable), or entered manually when none exists. This finalises the cost roll-up.","status":"Status → BOM costed · submitted for final approval"},"subD":{"tag":"LEAD / MANAGER","title":"Final approval (costed BOM)","body":"Final sign-off on the approved + costed product. On approval the product becomes active on the product list and reusable; otherwise it returns to Purchasing (cost) or Engineering (BOM).","status":"Status → Product approved · ready for quote"},"merge":"▼ merge — both paths rejoin","step3":{"tag":"SYSTEM · GATE","title":"All products on the product list","body":"Gate: the order can only be quoted once every line — existing and newly created — has an approved BOM and a known cost. New products created here are now reusable for future orders."},"step4":{"tag":"SALES","title":"Compose the combined quote","status":"→ Quoted","body":"One quote for the whole order — existing + newly created lines combined — with prices, margins, currency and terms drawn from each product's cost roll-up."},"step5":{"tag":"SALES MANAGER","title":"Approve quote & pricing","body":"Sales Manager reviews margins and terms, then approves the quote for release (or sends it back to Sales to adjust)."},"step6":{"tag":"CLIENT","title":"Client review & approval","body":"Quote sent to the client. On acceptance the order is confirmed; rejection / change requests loop back to Sales."},"step7":{"tag":"SYSTEM","title":"Order confirmed → handoff","badge":"Confirmed","body":"Confirmed order hands off downstream:","purchasingLink":"Purchasing — forecast & ordering →","productionNote":"Production planning — separate module"},"matrix":{"title":"Who sees what in the BOM form","intro":"Every role opens the same Product BOM but sees a different screen. Pricing is captured against each material yet stays hidden from Sales & the BOM team — only Purchasing and the Manager see and adjust cost. (A “Viewing as” switch on the BOM, available to Manager/Purchasing, previews each role.)","colRole":"Role","colAction":"What they do at this step","colParts":"Parts & specs","colMaterials":"Materials & grades","colPricing":"Pricing & cost","badge":{"view":"View","edit":"Edit","hidden":"Hidden"},"rows":{"sales":{"name":"Sales","action":"Initiates the request from the sales order; tracks BOM status to the quote."},"bomTeam":{"name":"BOM team","action":"Enters parts, dimensions, materials, grades, packaging & finishing — the full spec."},"purchasing":{"name":"Purchasing","action":"After approval, fills & adjusts each material's cost (contract / average), submits for final approval."},"manager":{"name":"Manager / Lead","action":"Approves the gates — material requirements, then final release with pricing."}}},"live":{"label":"Live screens:","intro":"this map reflects the working flow —","salesOrders":"Sales Orders","productBom":"Product BOM (Orders)","quotations":"Quotations","materialRequirements":"Material Requirements","orderMaterials":"Order Materials"}},"engBom":{"breadcrumb":"Products · Engineering","title":"BOM & Routing","loading":"Loading engineering BOM…","emptyProducts":"No finished-good products yet. Create one from the Product List to build its engineering BOM.","previewBanner":"Preview — no finished-good products yet. This is an empty template; create a product from the Product List to build and save a real engineering BOM.","status":{"draft":"Draft","issued":"Issued","sent":"Sent to production"},"actions":{"saveDraft":"Save draft","timesChip":"Times","overrideBadge":"+{{n}}","standardTimes":"Standard times","issue":"Issue BOM","send":"Send to production"},"toast":{"draftSaved":"Draft saved.","partSaved":"Part saved.","partAdded":"Part added — open the row to fill in dimensions.","assemblyAdded":"Assembly added to the parts list.","issued":"BOM issued — the route is stamped.","issueBlocked":"Pick at least one production stage first.","sent":"Sent to production — {{qty}} units on {{order}}.","sendBlocked":"Issue the BOM before sending it to production.","profileSet":"Time profile set to \"{{name}}\"."},"errors":{"loadProducts":"Could not load the product list.","loadBom":"Could not load the engineering BOM.","save":"Could not save — try again."},"tabs":{"bom":"BOM parts","routing":"Routing","flags":"Review flags","files":"Attachments"},"placeholder":{"routing":"The routing matrix arrives with the next release.","flags":"Difficulty review arrives with an upcoming release.","files":"Attachments arrive with an upcoming release."},"card":{"product":"Product","sku":"SKU","category":"Category","finishedSize":"Finished size L × W × H (mm)","material":"Material","paint":"Paint colour","grade":"Material grade","colourCode":"Customer colour code","shippingForm":"Shipping form","shippingFormHint":"— drives invoice, packing list & CBM","dims":"{{l}} × {{w}} × {{h}} mm","order":"Order {{order}} · {{qty}} units"},"ship":{"assembled":"Assembled (Fixed)","knocked_down":"Knocked-down (Flat)","noteAssembled":"CBM measured on the finished product · packing list shows one line per unit · invoice reads \"Assembled\"","noteKnockedDown":"CBM measured per component carton · packing list itemises components · invoice reads \"Knocked Down\""},"parts":{"title":"Parts list","counts":"{{parts}} · {{assemblies}}","countParts":"{{n}} parts","countPartsOne":"1 part","countAssemblies":"{{n}} assemblies","countAssembliesOne":"1 assembly","gradeLockNote":"Wood grade confirmed by production at run time","addAssembly":"＋ Assembly","addPart":"＋ Part","colNo":"Row number","colName":"Part name","colThick":"Thickness","colWidth":"Width","colLength":"Length","colPcs":"Pieces / unit","colUom":"Unit of measure","colRough":"Rough thickness","colMaterial":"Material","colPaint":"Paint","colSpec":"Tech standard","colSource":"Source","colDifficulty":"Difficulty","colGrade":"Grade","empty":"No parts yet — add an assembly, then its parts.","assemblyCounts":"{{parts}} parts · {{pcs}} pcs","outChip":"OUT","gradeLocked":"set by production","rowHint":"Click any row to open the part detail drawer — dimensions, tech standard and its routing across all stages.","newAssemblyName":"NEW ASSEMBLY","newPartName":"New part"},"source":{"in_house":"In-house","outsourced":"Outsourced"},"difficulty":{"easy":"Easy","medium":"Medium","hard":"Hard","na":"N/A"},"drawer":{"close":"Close","subtitle":"{{assembly}} · {{pcs}}× per unit","name":"Part name","thickness":"Thickness (mm)","roughThickness":"Rough thickness (mm)","width":"Width (mm)","length":"Length (mm)","pcsPerUnit":"Pcs per unit","uom":"Unit of measure","material":"Material","paint":"Paint colour","techStandard":"Tech standard","techStandardPlaceholder":"e.g. bent lamination, veneer both faces","source":"Source","difficulty":"Difficulty","routingComing":"This part's routing blocks arrive with the routing matrix release.","closeBtn":"Close","saveBtn":"Save part","routingTitle":"Routing for this part — {{min}} min total","sarTag":"SAR","chipHint":"Click to select · click again on a selected operation to add a repeat.","packThrough":"Goes through packing.","packNot":"Does not go through packing.","packOutsourced":"Outsourced — not packed in house.","setupShort":"setup {{n}}","runShort":"run {{n}}","subtitleProduct":"{{assembly}} · {{pcs}}× per unit · {{product}}"},"stage":{"raw":"Raw material","sh1":"Shaping 1","sh2":"Shaping 2","snd":"Sanding","stn":"Staining","asm":"Assembly","fin":"Finishing","pak":"Packing"},"op":{"sel":"Select stock","moi":"Moisture check","srt":"Sort by grade","rgh":"Rough cut","pln":"Plane","cut":"Cut","rip":"Rip edge","glu":"Glue-up","bnd":"Bend","scr":"Scroll saw","fgr":"Finger joint","trn":"Turning","fcu":"Fine cut","shp":"Shaper","rou":"Router","dri":"Drill","tnp":"Tenon (+)","tnm":"Mortise (−)","edg":"Edge band","c2d":"CNC 2D","clt":"CNC lathe","c3d":"CNC 3D","drm":"Drum","blt":"Belt","rol":"Roller","brs":"Brush","pad":"Pad","hnd":"Hand","bas":"Base stain","sol":"Solid stain","oil":"Oil wipe","sub":"Sub-assemble","adr":"Drill","atr":"Trim cut","agl":"Glue","ana":"Nail / screw","s_fcu":"Fine cut","s_shp":"Shaper","s_rou":"Router","s_dri":"Drill","s_tnp":"Tenon (+)","s_tnm":"Mortise (−)","s_edg":"Edge band","s_c2d":"CNC 2D","s_clt":"CNC lathe","s_c3d":"CNC 3D","scf":"Pre-paint scuff","sea":"Sealer spray","ssd":"Sealer sand","top":"Topcoat spray","chk":"Colour check"},"afterState":{"part_level":"Part-level","sub_assembly":"Sub-assembly","finished_unit":"Finished unit"},"routing":{"title":"Production stages","hintStepper":"Click a cell to select it; hover a selected cell and use − / + to set how many times the operation runs.","selectAll":"Select all stages","clear":"Clear","empty":"Pick a production stage above to build the routing.","stageSeq":"{{seq}}.","passThrough":"pass-through + minutes","opCount":"{{n}} operations","opCountCum":"{{n}} operations · by assembly or part","min":"{{n}} min","stepsChip":"{{n}} steps","cumulativeNote":"Cumulative stage — tick against the assembly row (amber) or against individual parts.","colPcs":"Pieces","colPart":"Part","colPartAssembly":"Part / assembly","colSize":"Size","colUom":"Unit of measure","colTotal":"Total","colSetup":"Setup","colRun":"Run","colThrough":"Through packing","colEstTime":"Estimated time","colTip":"Select this operation for every part","stageAllTip":"Select or clear everything in this stage","all":"All","rate":"S{{s}} · R{{r}}","pcsTimes":"{{n}}×","asmChip":"ASSEMBLY","asmStateTitle":"State after assembly","asmStateHint":"— inherited by Finishing and Packing, and by the export documents","shipNoteAssembled":"Shipping form is Assembled — CBM is taken from the finished unit.","shipNoteKnockedDown":"Shipping form is Knocked-down — CBM is taken per component carton.","stageTotal":"Stage total","setup":"Setup","run":"Run","stepsSelected":"Steps selected","setupVsRun":"Setup vs run","outsourcedTip":"Outsourced","minUnit":"min","repeatMinus":"Fewer repeats","repeatPlus":"More repeats","bandAssembly":"Assembly","bandSar":"Post-assembly shaping (SAR)","cellTip":"Setup {{s}} min · Run {{r}} min","cellTipRepeat":"Setup {{s}} min · Run {{r}} min (×{{n}})"},"summary":{"perUnit":"Per unit","setup":"Setup","run":"Run","steps":"Steps","orderUnits":"Order {{qty}} units","hours":"{{n}} h","loadByStage":"Load by stage","stageMin":"{{n}}m"},"flags":{"title":"Difficulty review","explainer":"Parts whose recorded production time exceeds {{pct}}% of the nominal route — the same operations costed at difficulty ×1.0. Measuring against nominal keeps the reading stable when the grade changes, so setting the grade the evidence supports clears the flag. Production times feed back automatically from closed work orders.","empty":"No parts are running outside their planned time.","partMeta":"· {{th}}×{{w}}×{{l}} mm · {{pcs}}× per unit","sentence":"Recorded {{act}} min against a nominal plan of {{nom}} min — {{pct}}% of nominal. Difficulty is set to {{diff}}; the measured time supports {{suggest}}.","setTo":"Set difficulty to {{grade}}","openPart":"Open part","review":"Review","keep":"Keep as is","variance":"Variance","variancePct":"+{{pct}}%","toastSet":"Difficulty updated to {{grade}}.","rowChip":"⚠ Review difficulty","drawerBanner":"Recorded time is {{pct}}% of nominal. {{act}} min measured against a {{nom}} min nominal route. The evidence supports {{suggest}}.","reviewTitle":"Review difficulty — {{name}}","reviewSubtitle":"{{nom}} min nominal · {{act}} min recorded · {{pct}}% of nominal","tileNominal":"Nominal plan","tileRecorded":"Recorded","reviewExplainer":"Difficulty is currently {{diff}} (×{{mult}} on run time), which costs this part at {{est}} min. The variance is measured against the nominal route (×1.0), so it does not move when the grade changes. Recorded times come from closed work orders. At {{pct}}% of nominal the measured work supports a {{suggest}} grade — setting it clears this flag.","byStage":"Planned time by stage","colStage":"Stage","keepCurrent":"Keep {{grade}}"},"times":{"title":"Standard times","subtitle":"Time profile: {{name}}","subtitleOverrides":"Time profile: {{name}} · {{n}} overrides on this BOM","profileLabel":"Time profile for this BOM","profileDefault":"{{name}} — default","noNote":"No note on this profile.","multChip":"{{grade}} ×{{mult}}","colOp":"Operation","colSetup":"Setup","colRun":"Run / pc","colSource":"Source","src":{"catalogue":"Catalogue","profile":"Profile","bom":"BOM"},"reset":"Reset","resetTip":"Back to the profile rate","manageProfiles":"Manage profiles","clearOverrides":"Clear BOM overrides","done":"Done","subtitleOverride":"Time profile: {{name}} · 1 override on this BOM","infoBoxPre":"Run time is multiplied by pieces per unit and by the difficulty grade. Rates below come from the profile; editing one turns it into an override on this BOM only and never changes the profile. Profiles and the operation catalogue are maintained in ","infoBoxLink":"Settings › Work Centres","infoBoxPost":"."},"files":{"kind":{"label":"Labels & marks","drawing":"Technical drawings","carton":"Carton & packing","pack":"Packaging process"},"kindSub":{"label":"Product label","drawing":"Automatic from MSP","carton":"Container specifications","pack":"Packaging process"},"empty":"Nothing attached yet.","attach":"＋ Attach file","remove":"Remove attachment","toastAttached":"File attached to the BOM.","notesTitle":"Engineering notes","notesSub":"Travels with the BOM to production","confirmTitle":"Confirm {{n}} documents","confirmHint":"“Change” & “New model” → require uploading a new file ; “Unchanged” → uses the old file.","selectNewFile":"Select a new file","notePlaceholder":"Note changes (required)…","uploadRequired":"Required: upload file + add a note.","awaitingBody":"Document awaiting confirmation — select a status above to proceed.","reuseOld":"Reuse the old file (unchanged).","noFileYet":"No file on record yet.","versionHistory":"Version history","active":"ACTIVE","bannerBlocked":"Documents awaiting confirmation / missing files","bannerReady":"All documents confirmed — ready to submit","status":{"awaiting":"Awaiting confirmation","unchanged":"Unchanged","change":"Change","newmodel":"New model"}}},"workCentres":{"breadcrumb":"Settings · Work Centres","title":"Work centres & standard times","introPre":"The master list of production operations, their setup and run times, and the difficulty multipliers. Save a set of these as a named time profile — a chair cell and the panel line work at different rates — then pick the profile on each product’s ","introLink":"BOM & routing","introPost":". A profile only stores what differs from the operation catalogue, so adding an operation here reaches every profile at once.","loading":"Loading work centres…","railTitle":"Time profiles","defaultBadge":"DEFAULT","catalogueRates":"catalogue rates","customRateOne":"1 custom rate","customRates":"{{n}} custom rates","multsLine":"×{{e}} / ×{{m}} / ×{{h}}","usedBy":"Used by {{names}}","notAssigned":"Not assigned to a product yet","newProfile":"＋ New profile","newProfileName":"New profile","copyName":"{{name}} (copy)","legend":{"title":"How a rate is chosen","bomTitle":"Per-BOM override","bomDesc":"set on one product only","profileTitle":"Profile rate","profileDesc":"this profile’s own number","catalogueTitle":"Operation catalogue","catalogueDesc":"the factory default below"},"nameLabel":"Profile name","multLabel":"Difficulty multipliers","multHint":"— applied to run time","noteLabel":"When to use it","notePlaceholder":"e.g. batches of 200+ on the chair cells","defaultPill":"✓ Default profile for new BOMs","makeDefault":"Make default","duplicate":"Duplicate","delete":"Delete","inUse":"🔒 In use — cannot delete","inUseTip":"{{n}} product(s) use this profile","statusClean":"Every rate comes from the catalogue","statusDifferOne":"1 operation differs from the catalogue","statusDiffer":"{{n}} operations differ from the catalogue","statusMults":"· custom multipliers","clearCustom":"Clear customisations","assignedPre":"Assigned to ","assignedNone":"Assigned to no products yet","assignedMid":". A product picks its profile on ","assignedLink":"BOM & routing","assignedPost":" and that choice is what this list reads; rates edited there apply to that BOM only and never change this profile.","opCount":"{{n}} operations","opCountCum":"{{n}} operations · cumulative stage","customBadge":"{{n}} custom","onePassPre":"one pass ≈ ","onePassMin":"{{n}} min","colOp":"Operation","colSetup":"Setup (min)","colRun":"Run / piece (min)","colCatalogue":"Catalogue","catValue":"{{s}} · {{r}}","reset":"Reset","resetTip":"Back to the catalogue rate","packingNote":"No standard operations — packing time is entered per part on the BOM, because it follows the carton spec rather than a machine rate.","toast":{"created":"Profile created — name it and set its rates.","duplicated":"Profile duplicated.","deleted":"Profile deleted.","madeDefault":"“{{name}}” is now the default profile.","cleared":"Back to catalogue rates."},"errors":{"load":"Could not load work centres.","save":"Could not save the change."},"catalogue":{"rename":"Rename","edit":"Edit","remove":"Remove","moveUp":"Move up","moveDown":"Move down","restore":"Restore","save":"Save","cancel":"Cancel","rowMenu":"Actions for {{name}}","countedOnAssembled":"Counted on the assembled product","countedHint":"Tick for stations like Assembly, Finishing and Packing that work on the whole product. Leave unticked to count each part, like Raw material and Shaping.","countedLocked":"Can't change — BOMs already use this station and their times would change. Add a new station instead.","addOperation":"＋ Add operation","addStation":"＋ Add station","addStationTitle":"Add station","editStationTitle":"Rename station","addOpTitle":"Add operation","editOpTitle":"Edit operation","nameEn":"Name (English)","nameVi":"Name (Vietnamese)","nameBuiltinHint":"For a standard station or operation, clear both names to go back to its standard label.","nameBothRequired":"Enter both the English and the Vietnamese name.","setupMin":"Catalogue setup (min)","runMin":"Catalogue run / piece (min)","removeTitleArchive":"Archive “{{name}}”?","removeTitleDelete":"Delete “{{name}}”?","removeArchive":"“{{name}}” is in use, so it will be archived, not deleted: it is hidden here and can't be added to new routings.","removeArchiveBoms":"BOMs {{names}} keep it and keep their times.","removeArchiveProfiles":"Time profiles {{names}} keep their rates for it.","removeDelete":"“{{name}}” is not used by any BOM or time profile, so it will be deleted for good.","archiveAction":"Archive","deleteAction":"Delete","toastArchived":"“{{name}}” archived. You can restore it from Archived.","toastDeleted":"“{{name}}” deleted.","toastAdded":"“{{name}}” added.","toastSaved":"Saved.","toastMoved":"Order saved.","toastRestored":"“{{name}}” restored.","saveFailed":"Could not save the change. Try again.","archivedToggle":"Archived ({{n}})","archivedHint":"Archived items are hidden from this list and can't be added to new BOM routings. BOMs that already use them keep their times.","archivedStation":"Station","archivedOp":"Operation in {{station}}","archivedUsedBy":"Used by {{names}}"}},"forecastBuy":{"export":{"button":"Export Excel","pi":"PI","so":"SO","po":"Customer PO"},"eyebrow":"Purchasing · Planning","title":"Forecast & buy","proto":"Prototype","intro":"Every confirmed PI, exploded through its product BOMs (a closed PI is done and no longer counts as demand). Open one to run its procurement, or tick several and combine them so shared materials are pooled into one buy. Each order runs a four-step flow: reserve stock, request quotes, capture responses, then award and raise POs.","tab":{"pipeline":"PI Pipeline","tracker":"PO Tracker","outsource":"Outsource","trackerTitle":"PO Tracker","outsourceTitle":"Outsource (Gia Công)","soon":"This view ships with its own section of the Forecast build.","plan":"Material plan"},"stat":{"pisInForecast":"PIs in forecast","requirementsDone":"Requirements done","rfqsPosOut":"RFQs / POs out","estMaterialsBuy":"Est. materials buy"},"filter":{"all":"All","delivery":"ETD","deliveryFrom":"ETD from","deliveryTo":"ETD to","searchPlaceholder":"Search PI, customer, PO…"},"piStage":{"none":"Not started","calc":"Requirements calculated","rfq":"RFQs sent","quotes":"Quotes received","po":"POs raised","ordered":"Fully ordered","lead":"Awaiting lead times","sched":"Ready to schedule"},"batchStatus":{"posIssued":"POs issued","approvedReady":"Approved · ready to issue","awaitingApproval":"Awaiting approval","sourcingQuotes":"Sourcing / quotes","requirements":"Requirements"},"batches":{"title":"Consolidated buys","subtitle":"· {{count}} active — pooled procurement across multiple PIs. Resume where you left off.","piCount_one":"{{count}} PI","piCount_other":"{{count}} PIs","posIssued":"{{count}} POs issued","resume":"Resume →","loading":"Loading consolidated buys…","loadError":"Couldn't load consolidated buys. Combining is paused until they load.","retry":"Retry","uncombine":"Un-combine","uncombineTitle":"Un-combine {{id}}?","uncombineBody":"Its {{count}} PIs go back to the pipeline as separate PIs. The pooled requirements, RFQs and quotes saved on this buy are discarded.","uncombineBlocked":"POs have been issued from this buy, so it can't be un-combined.","cancel":"Cancel","removePi":"Remove {{pi}} from this buy","removePiTitle":"Remove {{pi}} from {{id}}?","removePiBody":"{{pi}} goes back to the pipeline on its own. The other PIs stay combined.","removePiConfirm":"Remove"},"combine":{"selected":"{{count}} PI(s) selected","hint":"Tick two or more PIs to pool their materials into one buy","clear":"Clear","selectAll":"Select all shown","combine":"⧉ Combine selected","combineN":"⧉ Combine {{count}} PIs"},"col":{"piSo":"PI / SO","customer":"Customer","products":"Products","estBuy":"Est. buy","estBuyFull":"Estimated buy","status":"Status","delivery":"ETD"},"list":{"noMatch":"No PIs match this filter.","lockedIn":"Locked — in {{id}}","poRef":"PO {{po}}","poTag":"PO {{no}}","productCount_one":"{{count}} product","productCount_other":"{{count}} products","open":"Open →","resume":"Resume →","noEtd":"No ETD","noPrice":"No price yet","noDemand":"No BOM demand","needRule":"Need date = ETD minus {{days}} days of production.","loading":"Loading PIs...","emptyTitle":"No confirmed PIs yet","emptyBody":"Confirmed PIs appear here with the materials their BOMs need. Closed PIs no longer count as demand.","loadErrorTitle":"Could not load PI demand","loadErrorBody":"The PI list and its material demand did not load. Try again.","covered":"Covered by stock and open orders"},"cat":{"Wood":"Wood","Board":"Board","Hardware":"Hardware","Upholstery":"Upholstery","Packaging":"Packaging","Paint":"Paint","Outsource":"Outsource"},"work":{"back":"Back to list","consolidatedBuy":"Consolidated buy","pisPooled_one":"{{count}} PI pooled","pisPooled_other":"{{count}} PIs pooled","loadingReference":"Loading materials and supplier offers…"},"kpi":{"materialsToBuy":"Materials to buy","materialsToBuyHint":"after stock reserve","reserved":"Reserved from stock","reservedHint":"lines drawn from inventory","awaitingQuotes":"Awaiting quotes","awaitingQuotesHint":"no price captured yet","estSpend":"Est. spend","estSpendHint":"at chosen / best price"},"step":{"requirements":{"name":"Requirements & stock","hint":"Consolidate & reserve"},"sourcing":{"name":"Sourcing & RFQs","hint":"Request quotes"},"quotes":{"name":"Quotes in","hint":"Capture vendor prices"},"award":{"name":"Award & POs","hint":"Choose winners & issue"}},"footer":{"back":"← Back","stepOf":"Step {{n}} of 4 · {{name}}","nextSourcing":"Next: Sourcing & RFQs →","nextQuotes":"Next: Quotes in →","nextAward":"Next: Award & POs →"},"pifilter":{"all":"All {{count}} PIs","caption":"Filter by PI","showingOne":"showing this order only"},"reqs":{"introTitle":"Reserve on-hand stock to these orders.","introMulti":"Each order has its own quantity column; Combined need pools them into the single consolidated buy.","introBody":"Reserved quantity is set aside for the PI and excluded from the buy; To buy is what is left to purchase. Semi-finished stock is the pallets of semi-finished parts you confirm for a PI (click it): they cover the materials under them and lower only that PI's To buy. Waste is already in the BOM quantities; wood is bought at rough m³ × its buying allowance.","materialCount":"{{count}} material(s)","colMaterial":"Material","colCombined":"Combined need","colNet":"Net need","colReserve":"Reserve","colToBuy":"To buy","colPrice":"Price","contractPrice":"contract · {{price}}","noContract":"no contract · RFQ","none":"No materials required.","wasteInBom":"Rough m³ from the BOM × buying allowance per species","needBy":"need by {{date}}","needUnknown":"no ETD","bomGapsHint":"Some products in this buy use a BOM that is not approved yet or have gaps; quantities may change.","onOrder":"{{qty}} already on order","awaitingApproval":"{{qty}} on a PO awaiting approval","roughOf":"rough {{qty}}","colBtp":"Semi-finished stock","btpAvailable":"{{qty}} available","btpOpen":"Confirm or undo semi-finished pallets for these PIs","btpNoPi":"Nothing to confirm here: no saved PI in this view orders this material. Pick a PI that orders it in the PI filter.","btpNone":"Nothing to confirm here: no PI in this view has semi-finished stock for this material — no usable pallet covers it and none is held. To buy covers the full need."},"sourcing":{"introTitle":"Each material group is sourced independently.","introBody":"Tick vendors in each group’s matrix, send its RFQs, and watch its status advance on its own. Progress is tracked per group.","none":"No materials to source.","sentQuoted_one":"{{sent}} sent · {{count}} vendor","sentQuoted_other":"{{sent}} sent · {{count}} vendors","alreadySentOn":"Already sent on {{no}}","sentWithout":"{{no}} already sent without this item","selectAll":"Select all","clearAll":"Clear all","useContract":"Use contract price","useContractHint":"When on, vendors with an annual contract price are covered by it and skipped in the RFQ. Turn off to request a fresh quote.","addVendor":"Add vendor","searchVendors":"Search vendors to add for quoting…","done":"Done","matrixHead":"Material · tick a vendor to request its quote","removeVendor":"Remove this vendor","badgeNew":"＋ NEW","badgeContract":"◆ CONTRACT","badgeNoContract":"NO CONTRACT","rfqSent":"RFQ sent","contract":"contract","contractCellHint":"Covered by the annual contract price — toggle off “Use contract price” to request a fresh quote instead","buyQty":"buy {{qty}} {{unit}}","rfqsToSend":"RFQs to send — grouped by vendor","selectVendorsHint":"Select vendors above to build this group’s RFQs.","linesIn":"{{count}} line(s) in {{cat}}","previewSend":"Preview & send RFQ","sent":"Sent"},"quotes":{"introTitle":"Capture vendor responses.","introBody":"The purchasing team can type quotes received by email, or pull in whatever vendors submitted on the portal.","checkPortal":"Check portal for responses","noRfqTitle":"No RFQs sent","noRfqBody":"Nothing is out for quote. If every material is on a contract price you can go straight to Award; otherwise send RFQs in Sourcing & RFQs.","sentLines":"sent {{at}} · {{filled}}/{{total}} lines quoted","received":"Quote received","awaiting":"Awaiting response","colMaterial":"Material","colLast":"Last quote","colUnitPrice":"Unit price","colLead":"Lead (d)","colLeadFull":"Lead time (days)","colSource":"Source","unitPricePlaceholder":"unit price","daysPlaceholder":"days","viaPortal":"via portal","office":"office","awaitingShort":"awaiting","vendorNote":"Vendor note","pulled":"{{count}} quote line(s) pulled from portal","noResponses":"No new portal responses yet","checking":"Checking…","pullFailed":"Couldn't check the portal. Try again.","noPortalUser":"{{vendor}} has no supplier-portal account, so they can't answer online. Type the prices they send you.","draftNotSent":"Draft: send the RFQ first. Prices can't be saved until the vendor has been sent it. Someone with the RFQ approval right ({{permission}}) must send it.","supplierQuote":"Supplier quote","typedQuote":"Quote (typed)","saving":"Saving prices…","saved":"Prices saved on the RFQ.","saveFailed":"The prices were not saved. Check your connection, then edit a price again to retry.","noRecordRight":"You can't record vendor quotes, so these prices are read-only. Ask an administrator to grant you the RFQ create permission (procurement.rfq.create).","foreignCurrency":"This vendor quoted in {{currency}} on the portal. Prices typed here are in ₫ and would overwrite that quote, so they are read-only. Use the portal quote, or ask the vendor to re-quote.","noBaseCurrency":"No base currency is set, so typed prices can't be saved. Ask an administrator to set the base currency under Currencies.","quotedPartial":"Quoted {{filled}}/{{total}} lines"},"award":{"introTitle":"Award the winners.","introBody":"Compare every vendor’s price below and pick a winner per material — the best price is pre-selected. Awarded lines pool into one consolidated PO per vendor.","noPrice":"{{count}} line(s) still have no price.","chooseTitle":"Award — choose a vendor per material","bestPreselected":"best pre-selected","matHead":"{{cat}} · material","buy":"buy {{qty}} {{unit}}","kindContract":"CONTRACT '26","kindQuote":"QUOTE","consolidatedTitle":"Consolidated purchase orders","consolidatedSub":"One PO per vendor · {{vendors}} vendor(s) across {{pis}} order(s)","grandTotal":"Grand total","created":"{{made}}/{{total}} created","noAwarded":"No awarded lines yet — pick winners above.","draftPo":"Draft PO","lineCount":"{{count}} line(s)","orders":"{{count}} orders","subtotal":"Subtotal","poCreated":"PO {{no}} created","viewPo":"View {{no}}","previewCreate":"Preview & create PO","colMaterial":"Material","colQty":"Quantity","colUnit":"Unit","colLineTotal":"Line total","createAll":"Create all {{count}} PO(s) →","missingIds":"This buy has materials or vendors without a record in the system — nothing was created.","createFailed":"The purchase orders could not be created. Nothing was saved.","submittedPo":"Submitted for approval","noCreatePermission":"You need the purchase order create permission.","noPricesToAward":"Creating purchase orders needs the View purchase prices permission.","creating":"Creating…","kindSupplierQuote":"Supplier quote · {{rfq}} · {{date}}","quotesLoading":"Loading supplier quotes…","quotesError":"Couldn’t load supplier quotes. Contract prices and typed quotes are still shown.","quotesRetry":"Retry","replyDeclined":"Declined","replyNone":"No reply yet","replyNoRate":"No ₫ rate for {{code}}","noRateBody":"Some supplier quotes can’t be compared or awarded: there is no ₫ exchange rate for {{codes}}. Ask an admin to set the rate for {{codes}} in the currency master (Currencies), then reload this step.","kindTypedQuote":"Quote (typed) · {{rfq}} · {{date}}"},"doc":{"purchaseOrder":"Purchase order","requestForQuotation":"Request for quotation","close":"Close","threeDays":"3 days","sendRfq":"Send RFQ + portal link","createPo":"Create PO","poCreated":"✓ PO {{no}} created","rfqSent":"✓ RFQ {{no}} sent","portal":"Vendor Portal","modePreview":"PDF preview","modeEdit":"Edit","modeEmail":"✉ Email","downloadPdf":"⬇ Download PDF","emailPo":"✉ Email PO to vendor","emailRfq":"✉ Email PDF + portal link","copyLink":"Copy portal link","openPortal":"Open Vendor Portal","emailDraftTitle":"Email that will be sent","emailDraftNote":"Draft · not yet sent","emailPersonalLink":"Each recipient gets their own personal link to this document in the email. You can revoke or extend links afterwards under Sending and supplier links.","emailTo":"To","emailCc":"Cc","emailSubject":"Subject","message":"Message","recipientPlaceholder":"Add email, press Enter","sendEmail":"✉ Send email","attachment":"1 attachment","attachmentPo":"PDF document · the purchase order shown in PDF preview","attachmentRfq":"PDF document · the RFQ shown in PDF preview","pdfLanguage":"PDF language","pdfDownloaded":"{{no}}.pdf downloaded","linkCopied":"Portal link copied","numberOnCreate":"Numbered on create","numberOnSend":"(number assigned on send)","attachmentPending":"PDF attached once the number is assigned","emailSent":"Email sent with the PDF attached","vendorPick":{"label":"Send this email to supplier","placeholder":"Choose a supplier…","unknown":"Supplier {{n}}","reason":"Send is off: this RFQ went to several suppliers. Choose which supplier this email goes to — each email carries only that supplier's own links and PDF."},"emailNotSent":{"no_recipient":"Saved, but not emailed: no recipient address","not_configured":"Saved, but not emailed: email is not set up","pdf_unavailable":"Saved, but not emailed: the PDF could not be generated","send_failed":"Saved, but the email could not be sent"},"rfqDraftSaved":"RFQ {{no}} saved as a draft — an approver has to send it","rfqFailed":"The RFQ could not be saved","pdfUnavailable":"PDF generation is not available right now","pdfFailed":"The PDF could not be downloaded","selectSigner":"— select —","sigFixedHint":"Set in Settings › Document Templates › Signatures.","downloadDraftPdf":"⬇ Download draft PDF","pdfDraftHint":"Downloads a DRAFT of what you see here — no number, nothing saved. Create the document for the numbered PDF.","noEmailPermission":"You do not have permission to email this document","noRfqPermission":"You need the RFQ create permission","createAndSend":"Create & send","rfqDraft":"RFQ {{no}} saved as draft","noPortalUser":"{{vendor}} has no supplier-portal account: invite one, or collect the prices by email.","previewFailed":"Couldn't load the vendor's address and references. You can still type them here.","markSent":"Mark as sent","markSentTitle":"Mark RFQ as sent","markSentIntro":"Record that the vendor got this RFQ outside the in-app email, for example the PDF you downloaded and sent on Zalo.","markSentChannel":"How was it sent?","markSentNote":"Note (optional)","markSentNotePlaceholder":"Who you sent it to, when…","markSentDone":"{{no}} marked as sent","markSentFailed":"Couldn't mark the RFQ as sent. Please try again.","sentLabel":"Sent","undoSent":"Undo","undoSentDone":"Sent mark removed","undoSentFailed":"Couldn't remove the sent mark. Please try again.","noMarkSentPermission":"You need the RFQ send permission"},"toast":{"alreadyInBatch":"Some PIs are already in another consolidated buy","vendorAdded":"Vendor added for quoting","rfqSent":"RFQ sent · portal link included","poCreated":"PO created","allPosCreated":"All consolidated POs created","combined":"{{id}} created · {{count}} PIs pooled","combineFailed":"Couldn't combine the PIs. Try again.","needsRealPis":"Combining needs live PIs — demo PIs can't be saved","uncombined":"{{id}} un-combined — its PIs are back in the pipeline","uncombineFailed":"Couldn't un-combine {{id}}","piRemoved":"{{pi}} removed from {{id}}","removeFailed":"Couldn't remove {{pi}}","saveFailed":"Couldn't save changes to {{id}} — retrying automatically","saveGaveUp":"Changes to {{id}} still aren't saved — check your connection; they'll be sent with your next edit","batchGone":"{{id}} was un-combined by a colleague — back to the pipeline","batchChanged":"{{id}} was just changed by a colleague — their latest version has been loaded","posLocked":"POs have been issued from {{id}} — the issued POs were kept","migrated":"{{count}} consolidated buy(s) saved in this browser moved to the server","migrateKept":"{{count}} browser-saved buy(s) kept in this browser, not moved: {{reasons}}","migrateReason":{"unknownPi":"a PI no longer exists or isn't live","tooFew":"fewer than 2 PIs","conflict":"some PIs are already in another buy","invalid":"the saved data was rejected (too large or malformed)","failed":"the server couldn't be reached"}},"stream":{"board":"Board · MDF/Plywood","wood":"Solid wood","iron":"Iron legs","screw":"Hardware","paint":"Paint","foam":"Foam / PE","carton":"Carton","pvc":"PVC / Fabric"},"poStage":{"none":{"short":"—","meaning":"Not ordered"},"sent":{"short":"PO sent","meaning":"Sent to the vendor"},"prod":{"short":"In prod","meaning":"In production at the vendor"},"recv":{"short":"Receiving","meaning":"Partly received into the warehouse"},"ship":{"short":"Shipped","meaning":"Shipped from the vendor"},"inhouse":{"short":"In-house","meaning":"Made in-house at VHT"},"approval":{"short":"Approval","meaning":"Created — awaiting approval"},"approved":{"short":"Approved","meaning":"Approved — not sent to the vendor yet"}},"tracker":{"awaitingSign":"Awaiting signature","drawerTitle":"PO detail","delivery":"Delivery","linesRecd":"{{recd}}/{{total}} lines received","colLine":"Line","colOrdered":"Ordered","colReceived":"Received","colRemaining":"Remaining","payment":"Payment","poTotal":"PO total","paidLbl":"Paid","outstanding":"Outstanding","awaitingSignNote":"A deposit cannot clear until the vendor returns the signed PO copy. Confirm it in PO Payments.","loading":"Loading purchase orders…","errorTitle":"The PO tracker could not be loaded","errorBody":"Check your connection and try again.","posAtStage":"POs at this stage","emptyTitle":"No purchase orders yet","emptyBody":"They appear here when the award step issues them, grouped by PI and vendor.","piVendors":"PI · vendors","lastReceipt":"Last receipt","lines":"Lines","billed":"Billed","noBill":"No vendor bill on this PO yet.","forPis":"Bought for","paidPct":"{{pct}}% paid","requiredDelivery":"Required delivery (material need)","piEtd":"PI ETD (customer ship date)","piEtdShort":"ETD {{date}}","datesHint":"Required delivery is when the material must arrive: the PI line ETD less the production lead time. The PO and RFQ print this date as the requested delivery date.","paidToDate":"Paid to date (deposits included)","otherCurrency_one":"{{count}} bill or payment on this PO is in another currency than {{currency}} and is not included above. See PO Payments.","otherCurrency_other":"{{count}} bills or payments on this PO are in another currency than {{currency}} and are not included above. See PO Payments."},"osStatus":{"open":"Not started","partial":"Partly in finished goods","finished":"In finished goods"},"os":{"introTitle":"Outsourced parts of the confirmed PIs.","introBody":"Parts the design BOM marks as outsourced, with the quantity each PI line needs and the date it is needed (ETD less the production offset). {{count}} parts across {{pis}} PIs.","notTrackedBadge":"Not tracked yet","notTracked":"Subcontractor, quantities sent out and returned, and the subcontract order are not recorded yet. Progress counts the parts inside finished goods already received for the PI line.","loading":"Loading outsourced parts…","errorTitle":"Couldn't load the outsourced parts","errorBody":"Check your connection and try again.","emptyTitle":"No outsourced parts","emptyBody":"No confirmed PI uses a product whose design BOM has an outsourced part.","overdue":"⚠ {{count}} overdue","overdueTag":"OVERDUE","byPi":"By PI","byProduct":"By product","searchPlaceholder":"Search PI, customer, product, part, operation…","noMatch":"No outsourced parts match.","partCount_one":"{{count}} part","partCount_other":"{{count}} parts","needBy":"Needed by","required":"Required","inFinishedGoods":"In finished goods","remaining":"Remaining","metaProduct":"Product","metaPerUnit":"{{qty}} {{unit}} per piece × {{pcs}} pcs","metaSpec":"Spec","metaEtd":"PI ETD","metaProduced":"Finished goods received: {{done}} / {{total}} pcs","metaBom":"BOM v{{version}}","metaBomDraft":"BOM v{{version}} (not approved)","olderHidden":"{{count}} older confirmed PIs (every line due before {{date}}) are not shown."},"gaps":{"draftBom_one":"{{count}} product uses a BOM that is not approved yet","draftBom_other":"{{count}} products use a BOM that is not approved yet","noBom_one":"{{count}} product has no BOM","noBom_other":"{{count}} products have no BOM","noMaterials_one":"{{count}} product's BOM lists no materials","noMaterials_other":"{{count}} products' BOMs list no materials","unlinked_one":"{{count}} BOM line has no material linked","unlinked_other":"{{count}} BOM lines have no material linked","unitMismatch_one":"{{count}} material is not in its stock unit","unitMismatch_other":"{{count}} materials are not in their stock unit","hint":"Draft BOM quantities may still change. Products with no BOM and unlinked lines are left out; the PI still counts."},"flags":{"draft":"BOM not approved","draftHint_one":"{{count}} product on this PI uses a BOM that is not approved yet","draftHint_other":"{{count}} products on this PI use a BOM that is not approved yet","missing":"{{count}} without BOM","missingHint_one":"{{count}} product on this PI has no BOM and is left out","missingHint_other":"{{count}} products on this PI have no BOM and are left out","unlinked_one":"{{count}} unlinked line","unlinked_other":"{{count}} unlinked lines","unlinkedHint_one":"{{count}} BOM line has no material linked and is left out","unlinkedHint_other":"{{count}} BOM lines have no material linked and are left out"},"plan":{"loading":"Loading the material plan…","error":{"title":"The material plan could not be loaded","body":"Check your connection and try again.","retry":"Retry"},"empty":{"title":"No PI demand to plan","body":"Confirmed PIs whose products have a BOM appear here, netted against stock and open orders. Closed PIs no longer count as demand."},"kpi":{"short":"Materials to buy","shortHint":"of {{count}} materials in demand","late":"Order date passed","lateHint":"Order-by date is before today","atRisk":"Order within 7 days","atRiskHint":"Order-by date in the next week","estBuy":"Est. buy (priced)","noPrice_one":"{{count}} material to buy has no price","noPrice_other":"{{count}} materials to buy have no price","priced":"Every material to buy has a price"},"rule":"Need date = ETD minus {{days}} days of production. Stock less reserved, open POs and approved PRs are netted first; stock goes to the earliest need. Order by = need date minus lead time.","noLeadCount_one":"{{count}} material has no lead time","noLeadCount_other":"{{count}} materials have no lead time","skippedSupply_one":"{{count}} PO/PR line left out: its unit does not convert","skippedSupply_other":"{{count}} PO/PR lines left out: their unit does not convert","bucketLabel":"Group by","bucket":{"week":"Week","month":"Month"},"search":"Search code or name","shortOnly":"Only materials to buy","save":"Save plan","saved":"Plan saved as a forecast run ({{count}} lines)","savedCached":"Nothing changed since the last saved plan","saveFailed":"The plan could not be saved","allCats":"All · {{count}}","noMatch":"No material matches these filters","undated":"No date","weekLabel":"W{{week}}","cellNeed":"need {{qty}}","col":{"material":"Material","available":"Available","onOrder":"On order","order":"To buy","orderBy":"Order by","flags":"Flags"},"flag":{"late":"Late","atRisk":"At risk","notNetted":"Not netted: unit","noPrice":"No price","noLead":"No lead time","awaitingApproval":"PO awaiting approval","altUnit":"Alternative not counted: unit"},"source":{"offer":"vendor offer","supplier":"preferred supplier","material":"material master","none":"not set"},"d":{"supply":"Supply and buying terms","onHand":"On hand","reserved":"Reserved","available":"Available","openPo":"Open POs","openPr":"Approved PRs","safety":"Safety stock","pack":"Order pack","moq":"MOQ","lead":"Lead time","days_one":"{{count}} day","days_other":"{{count}} days","price":"Unit price","vendor":"Vendor","cost":"Est. buy","notNettedHint":"The BOM quantity is not in the material's stock unit, so stock and open orders are not netted. Set the material's size or BOM unit to fix it.","timeline":"Timeline","period":"Period","need":"Need","poIn":"PO in","prIn":"PR planned","projected":"Balance after need","toBuy":"To buy","orderBy":"Order by","pis":"PIs","allocHint":"Stock and open orders go to the earliest need first; the rest is what each PI still has to buy.","pi":"PI","customer":"Customer","etd":"ETD","needDate":"Need date","qty":"Need","fromStock":"From stock","fromIncoming":"From open orders","openPoPending":"POs awaiting approval","pendingIn":"PO awaiting approval","fromPending":"From POs awaiting approval","roundingNote":"Net need {{net}}; to buy {{order}} after rounding each period's order to the pack / MOQ (+{{extra}}). The week and month views round per period, so their totals can differ.","altReceived":"Alternative grade received","altUnitHint":"{{sku}} ({{qty}} {{unit}}) is ordered or received as an alternative grade for this material but is not counted: its unit does not convert to this material's stock unit. Add a unit conversion or correct the PO line's unit, then reload."},"csv":{"sku":"Code","name":"Material","unit":"Unit","category":"Category","available":"Available","openPo":"Open POs","openPr":"Approved PRs","safety":"Safety stock","lead":"Lead time (days)","moq":"MOQ","price":"Unit price (VND)","gross":"Need","net":"Shortfall","order":"To buy","cost":"Est. buy (VND)","orderBy":"Order by","flags":"Flags"},"later":"Later","awaitingCount_one":"{{count}} material leans on a PO awaiting approval","awaitingCount_other":"{{count}} materials lean on POs awaiting approval","cellAwaiting":"{{qty}} awaiting approval","roundingHint":"Includes pack / MOQ rounding: each period's shortfall is rounded up to the pack and to at least the MOQ, so the week and month views can total differently. Requirements rounds the pooled shortfall once.","roundedUp":"+{{qty}} pack / MOQ"},"holdReason":{"buy_later":"Buy later","not_buying":"Not buying"},"hold":{"action":"Do not purchase for now","title":"Do not purchase for now","subtitle":"{{material}} — for {{pis}}","reasonLabel":"Reason","buyLaterHint":"Plan to buy it later; its stock stays reserved for this PI","notBuyingHint":"Not buying it at all; its stock goes to the other PIs","plannedDate":"Planned purchase date (optional)","note":"Note","notePlaceholder":"Why, who decided, what to wait for…","save":"Save","cancel":"Cancel","saved":"{{material}} is held: left out of To buy","saveFailed":"Couldn't save. Please try again.","buyAgain":"Buy again","cleared":"{{material}} is back in To buy","clearFailed":"Couldn't put it back in the buy. Please try again.","pillBuyLater":"Buy later · keeps stock","partial":"Held for {{held}}/{{total}} PIs","tipPlanned":"planned {{date}}","tipBy":"set by {{name}} {{date}}","showHeld":"Show held lines ({{count}})","colAction":"Actions","pillBuyLaterOn":"Buy later {{date}} · keeps stock","pillNotBuying":"Not buying · stock released","tipKeeps":"keeps {{qty}} from stock / on order","keepsStock":"keeps its stock share","releasesStock":"its stock share goes to the other PIs","edit":"Edit hold"},"alt":{"button":"Alternative","open":"Order an alternative grade for this material","needsVendor":"Pick a vendor price for this material first: the alternative is ordered on that vendor's PO.","chip":"Alt: {{sku}} · {{qty}} {{unit}} · {{reason}}","poLineFor":"Alternative for {{code}} · {{reason}}","askButton":"Ask alternative","askChip":"Also quote: {{sku}} · {{reason}}","titleAward":"Alternative grade · {{code}}","titleRfq":"Ask for an alternative grade · {{code}}","hintAward":"Order part or all of {{name}} as another grade. The rest stays the BOM grade; each is its own PO line.","hintRfq":"The RFQ also asks the vendor to quote another grade of {{name}}. Its quote can price the alternative in Award.","internalOnly":"Internal only: the customer's PI, quotation and BOM keep the BOM grade, and the quote price does not change.","lockedPo":"This vendor's PO is already issued, so its lines cannot change here. Change the PO in Purchasing › Purchase orders.","lockedRfq":"An RFQ with this material was already sent, so its lines cannot change. Add the alternative on a new RFQ.","vendorLine":"Ordered on the PO of {{vendor}} (the vendor this material is awarded to).","gradesTitle":"Grades you can order instead","loading":"Loading grades…","loadError":"The grades could not be loaded. Close and open this panel again; if it keeps failing, check your connection.","noSibling":"No other grade of the same material type and size exists, so there is no alternative to pick. Add the grade to the material catalogue first if you need one.","grade":"Grade {{grade}}","suggested":"Suggested (from BOM)","quoted":"Vendor quoted","stock":"Stock {{qty}} {{unit}}","lastPrice":"Last price {{price}}","bestOffer":"Best offer {{price}}","quotePrice":"Quote {{price}}","qtyLabel":"Quantity, in the BOM material's unit ({{unit}})","qtyHint":"Up to {{max}}. Less than the to-buy splits the buy.","noConversion":"{{sku}} is stocked in {{altUnit}}, which does not convert into {{unit}}, so the quantity cannot be worked out. Add a conversion between the two units in Units of measure, or pick another grade.","qtyConverted":"{{qty}} {{unit}} ≈ {{alt}} {{altUnit}} on the PO","priceLabel":"Unit price of the alternative","priceHint":"Per {{unit}} of the alternative (the vendor's quote when there is one).","reasonLabel":"Reason","reasonPlaceholder":"Pick a reason","noteLabel":"Note (optional)","errPick":"Pick a grade to order instead.","errReason":"Pick a reason: it is kept on the PO line for the internal record.","errQty":"Enter a quantity above 0 and up to {{max}} {{unit}}.","errPrice":"Enter the alternative's unit price, above 0 — a line at 0 would put the grade on the PO with no cost.","remove":"Remove alternative","cancel":"Cancel","save":"Save","trackerTitle":"Ordered vs BOM","trackerHint":"Alternative grades ordered for these PIs. Internal only: customers see the BOM grade.","trackerEmpty":"No alternative grade was ordered for these PIs.","colPi":"PI","colBom":"BOM grade","colOrdered":"Ordered grade","colQty":"Qty","colPo":"PO","colReason":"Reason","docNote":"This PO also orders alternative grades (internal; the sheet below lists the BOM grades, the created PO has one line per grade):","docLine":"{{sku}} · {{qty}} {{unit}} instead of {{code}}"}},"vendorPortal":{"brand":"VẠN HỮU THỊNH · Vendor Portal","tagline":"Supplier quotation & order response","noneTitle":"No RFQs yet","noneBody":"RFQs sent to you from keenERP Forecast will appear here. Open the portal link in the RFQ email to respond.","indexTitle":"Your requests for quotation","indexSub":"Open a request to submit your prices.","lineCount":"{{count}} line(s)","statusQuoted":"Quote submitted","statusAwaiting":"Awaiting your quote","allRfqs":"All RFQs","detailEyebrow":"Request for quotation","fromLine":"From VẠN HỮU THỊNH · buyer {{buyer}} · received {{at}}","pleaseQuote":"Please quote","enterHint":"Enter your best unit price and lead time for each line, then submit. Prices are in VND, excluding VAT.","colSku":"SKU","colMaterial":"Material","colQty":"Quantity","colYourPrice":"Your unit price","colLead":"Lead (days)","unitPrice":"unit price","days":"days","noteLabel":"Note to VHT (optional)","noNote":"— no note —","notePlaceholder":"e.g. Price valid 30 days · MOQ 100 sets · can expedite 3 items","priced":"{{filled}}/{{total}} lines priced","estimatedTotal":"estimated total {{total}}","thankYou":"Thank you — your quote was sent back to VHT.","editQuote":"Edit quote","submitQuote":"Submit quote to VHT →"},"finance":{"home":{"eyebrow":"Finance","title":"Finance home","proto":"Prototype","intro":"The single home for what the factory owes and is owed. The headline positions read the live ledgers: open supplier bills, open customer invoices converted to VND, bank balances and unapplied deposits. Receivables, treasury, payroll and reports screens are being built out and gather here as they land.","kpi":{"payable":{"label":"Payable (AP)","sub":"{{n}} suppliers · owed to vendors"},"receivable":{"label":"Receivable (AR)","subFx":"≈ {{amounts}} open · multi-currency","subVnd":"{{n}} customers · owed to us"},"cash":{"label":"Cash & bank","sub":"across {{n}} operating accounts"},"deposits":{"label":"Net deposits","sub":"held from customers − paid to vendors"}},"week":{"out":{"label":"↑ Money out this week","sub":"supplier balances due this week"},"in":{"label":"↓ Money in this week","sub":"customer payments expected"},"overdue":{"label":"⚠ Overdue","sub":"{{n}} vendor bills past due"}},"group":{"payables":"Payables · money out","receivables":"Receivables · money in","treasury":"Treasury","payroll":"Payroll & reporting"},"card":{"poPay":{"name":"PO Payments & Deposits","desc":"Advances and balances owed on every PO raised from the Forecast — with a payment schedule.","metric":"{{amt}} due this week"},"supplierPayables":{"name":"Supplier Payables","desc":"Outstanding balances per supplier, aging, and ACB disbursement eligibility.","metric":"{{amt}} · {{n}} suppliers"},"custInvoices":{"name":"Customer Invoices","desc":"Commercial invoices issued and their payment status, in the customer’s currency."},"custDeposits":{"name":"Customer Deposits","desc":"The PI deposit gate — deposits invoiced, received, and applied to orders."},"bankCash":{"name":"Bank & Cash","desc":"Balances across operating accounts, transfers, and a running cash position."},"vatTax":{"name":"VAT / Tax","desc":"Input vs output VAT, filing periods, and amounts due."},"payrollRun":{"name":"Payroll","desc":"Monthly payroll runs, social insurance, and union dues."},"reports":{"name":"Financial Reports","desc":"P&L, cashflow, and công nợ statements — payable and receivable."}},"plannedMetric":{"planned":"Planned","multiCurrency":"Multi-currency AR","centralized":"Centralized here"},"pill":{"live":"Live","planned":"Planned"},"loadError":"Couldn’t load finance figures","loadErrorBody":"The ledgers didn’t respond. Try again in a moment.","fxMissing":"Some balances are left out of the ₫ totals: there is no exchange rate for {{codes}}. Set the rate under Currencies."},"poPay":{"eyebrow":"Finance · Payments","title":"PO Payments & Deposits","proto":"Prototype","intro":"Every purchase order raised from the Forecast, with the money owed against it — the advance/deposit due before production and the balance due on delivery. Record payments here; balances roll up into Supplier Payables and the Finance home.","kpi":{"outstanding":"Outstanding to vendors","dueWeek":"Due this week","overdue":"Overdue","paidMonth":"Paid this month","outstandingSub":"{{n}} confirmed POs","dueWeekSub":"deposits + balances","overdueSub":"past due date","paidMonthSub":"this month"},"tab":{"pos":"Vendor POs","requests":"Payment requests","schedule":"Payment schedule"},"chip":{"all":"All","cleared":"Cleared to pay","unsigned":"Awaiting signature","overdue":"Overdue","dep":"Deposit due","bal":"Balance due","await":"Awaiting","paid":"Paid","noSchedule":"No schedule yet"},"searchPlaceholder":"Search PO, vendor, PI…","nextDueFilter":{"overdue":"Overdue","dueSoon":"Due within 7 days","later":"Due later","none":"No due date"},"handoff":{"title":"Receiving → payment handoff","sub":"balances that only fall due once the warehouse confirms the goods are in","clearedLabel":"✓ cleared to pay","waitingLabel":"⏸ awaiting delivery","clearedNote":"{{n}} balance(s) — goods received, ready to release","waitingNote":"{{n}} balance(s) — held until receiving confirms goods in"},"col":{"poPi":"PO / PI","vendor":"Vendor","amount":"PO amount","paid":"Paid","outstanding":"Outstanding","received":"Received","nextDue":"Next due","stage":"Stage"},"paidLabel":"paid","recv":{"allIn":"✓ all in","of":"{{r}}/{{tot}}"},"overdueTag":"⚠ overdue","empty":{"pos":"No POs match this filter.","noneTitle":"No POs sent to suppliers yet","noneBody":"Purchase orders appear here once they are sent to the supplier."},"stage":{"unsigned":"Awaiting signature","paid":"Paid in full","dep":"Deposit due","bal":"Balance due","await":"Awaiting due date","noSchedule":"No schedule yet"},"disp":{"cleared":"✓ Cleared to pay","awaitingDelivery":"⏸ Awaiting delivery","payDeposit":"▶ Pay deposit to start"},"schedule":{"overdue":"Overdue","thisWeek":"This week","later":"Later","count":"{{n}} payment(s)","recordPayment":"Record payment","today":"today","inDays":"in {{n}}d","overdueDays":"{{n}}d overdue","of":"of {{amt}}","empty":"No scheduled payments — every PO is settled.","noDue":"no due date"},"requests":{"awaitingAlloc":"Awaiting allocation","awaitingSub":"{{n}} line item(s) from Cash Flow","received":"Requests received","receivedSub":"raised in Cash Flow & Payables","empty":"No payment requests yet. When a manager raises one in Cash Flow & Payables, it lands here to allocate against the vendor’s open POs and pay.","recorded":"✓ Recorded","part":"Part · {{amt}}","awaiting":"Awaiting","openInvoices":"{{n}} open invoice(s)","noOpenInvoices":"no open invoices","noLinkedPo":"no linked PO","allocate":"Allocate & pay","loadError":"Could not load the payment requests"},"drawer":{"close":"Close","poAmount":"PO amount","paid":"Paid","outstanding":"Outstanding","confTitle":"Vendor PO confirmation"},"conf":{"confirmed":"✓ Confirmed","awaiting":"⧗ Awaiting signature","confirmedBy":"Confirmed {{date}} by {{by}} · {{via}} — this PO is a live payable.","markedConfirmed":"waived — no signed copy","signedOnFile":"signed PO on file","awaitingExplain":"Sent to the vendor, awaiting their signed copy. Not a payable yet — it stays out of payables, the schedule and KPIs until confirmed. Upload the signed PO or mark it confirmed to start the payment clock.","signedDoc":"Signed PO / agreement","markConfirmed":"Confirm without signed copy…","viaAck":"acknowledged by the supplier","confirmedOn":"Confirmed {{date}} · {{via}} — this PO is a live payable."},"doc":{"replace":"Replace","remove":"Remove","uploadPrompt":"Upload the signed PO / vendor agreement","uploadHintConf":"PDF or image — one authoritative signed copy for this PO","uploadHintUnconf":"Uploading confirms this PO and starts the payment clock","removeTitle":"Remove the signed copy?","removeBody":"The file is deleted. The PO stays confirmed.","openFailed":"Couldn’t open the signed copy.","onFile":"Signed copy on file","open":"Open","none":"No signed copy on file."},"inv":{"title":"Invoices","onFile":"{{n}} on file · outstanding {{amt}}","record":"Record invoice","none":"No invoices recorded yet.","noneConf":"Record the vendor’s bill when it arrives after delivery.","open":"{{amt}} open","paidLower":"paid","paid":"Paid","part":"Part","openTag":"Open","recordTitle":"Record vendor invoice","no":"Invoice no.","date":"Invoice date","amount":"Amount ({{currency}})","note":"Note (optional)","notePlaceholder":"e.g. delivery 2 of 3","cancel":"Cancel","save":"Save invoice","noPlaceholder":"e.g. INV-2026-001"},"ms":{"title":"Payment milestones","paidFull":"Paid in full","remaining":"{{amt}} remaining · due {{date}}","due":"Due {{date}}","overdueSuffix":" · overdue","heldTitle":"Held for delivery — not payable yet","heldBody":"Warehouse has received {{r}}/{{tot}} lines on {{po}}. This balance unlocks for payment when receiving confirms the goods are in.","awaitingDelivery":"Awaiting delivery","clearedNote":"Goods received on {{po}} — cleared to pay by warehouse","release":"✓ Release payment","recordAnother":"Record another payment","recordPayment":"Record payment","otherPays":"Other payments on this PO","otherPaysHint":"Bill payments and deposits not tied to a milestone settle the earliest unpaid milestones."},"pay":{"title":"Record a payment","remaining":"Remaining","amount":"Amount ({{currency}})","partialHint":"Enter less than the remaining for a partial payment.","date":"Date","method":"Method","ref":"Reference / UTR","refPlaceholder":"e.g. TT-240810-01","note":"Note (optional)","cancel":"Cancel","save":"Save payment"},"method":{"bank_transfer":"Bank transfer","cash":"Cash","check":"Cheque","credit_card":"Credit card"},"remitTo":"Remit to","alloc":{"title":"Allocate & pay","perInvoice":"Allocate per open invoice","toAllocate":"To allocate","allocated":"Allocated","paymentAmount":"Payment amount (₫)","cancel":"Cancel","submit":"Record payment","note":"Cash Flow request {{id}}","partial":"Recorded for {{paid}} ({{amt}}); the rest failed: {{reason}}. Reopen the request to pay what is left.","fxSkipped":"{{n}} open invoice(s) in another currency are not listed; pay them from the PO.","over":"The allocation is more than the {{amt}} left on this request line."},"toast":{"paymentRecorded":"{{label}} · {{vendor}} · {{amt}} recorded","confirmed":"{{vendor}} · {{po}} confirmed — now a live payable","confirmedDoc":"{{po}} confirmed — signed PO on file, now a live payable","docUpdated":"Signed PO document updated","docRemoved":"Signed PO document removed","invoiceRecorded":"Invoice {{no}} recorded on {{po}}","allocRecorded":"Recorded {{amt}} · {{name}}","enterAmount":"Enter an amount to record","amountExceeds":"Amount exceeds the remaining {{amt}}","amountPositive":"Enter an amount greater than zero","saveFailed":"Couldn’t save. Try again."},"milestoneKind":{"deposit":"Deposit","balance":"Balance","net":"Net terms","other":"Other"},"confirmVia":{"signed":"Signed PO uploaded","manual":"Marked confirmed"},"sched":{"generated":"Payment schedule created from the PO’s payment term","saved":"Payment schedule saved","removeTitle":"Remove “{{label}}”?","removeBody":"The milestone leaves the payment schedule.","remove":"Remove","removed":"Milestone removed","done":"Done","edit":"Edit schedule","editOne":"Edit","noneTitle":"No payment schedule yet","noneBody":"Set the deposit and balance milestones for this PO ({{amt}}) to track what is due and when.","term":"Payment term: {{term}}.","generate":"Create from payment term","add":"Add milestone","totals":"Milestones {{sum}} of the PO total {{total}}","up":"Move up","down":"Move down","gatedShort":"held for delivery","label":"Milestone","labelPlaceholder":"e.g. Deposit 30%","kind":"Type","amount":"Amount ({{currency}})","due":"Due date","gated":"Payable only once the goods are received","save":"Save milestone"},"loading":"Loading vendor POs…","error":{"title":"Couldn’t load vendor POs","body":"The payables ledger didn’t respond. Try again in a moment.","retry":"Try again"},"noBank":"No bank account on file"},"cashFlow":{"eyebrow":"Finance · Executive","title":"Cash Flow & Payables","proto":"Prototype","intro":"The director view of supplier debt (outstanding, coming due and overdue), with a 6-week cash-position projection and a payment-request flow to Accounting. Balances, aging and open POs read the live supplier ledger; payment requests and supplier notes are shared with Accounting, which pays them from PO Payments & Deposits.","kpi":{"totalPayables":"Total payables","dueNow":"Due now","awaiting":"Awaiting payment","openPos":"Open POs (committed)","totalPayablesSub":"{{n}} suppliers","dueNowSub":"past or at due date","allPaid":"All paid","awaitingSub":"{{paid}} of {{of}} paid","requestsRaised":"{{n}} requests raised","openPosSub":"{{n}} orders placed"},"proj":{"title":"6-week cash position","sub":"expected receipts vs planned supplier payments — projected running balance","inflow":"Inflow","outflow":"Outflow","opening":"Opening balance","projected":"Projected in 6 wks","dips":"Dips to {{amt}} — receipts won’t cover planned payments; defer or stage some.","positive":"Stays positive across the horizon.","projBalance":"proj. balance","footnote":"Opening = bank balances across operating accounts. Inflow = open customer invoices by due date; outflow = open supplier bills by due date; W1 also carries everything already overdue. Raised payment requests draw on these bills, so they are not added again."},"alert":"{{n}} supplier(s) overdue more than 30 days — total due {{amt}}.","view":{"suppliers":"Suppliers","history":"Request history"},"requestPayments":"Request payments","aging":"Aging","legendNote":"Click a supplier to expand its overdue breakdown · Avg overdue = amount-weighted days past due","col":{"supplier":"Supplier","outstanding":"Outstanding","comingDue":"Coming due","dueNow":"Due now","openPos":"Open POs","requested":"Requested","status":"Status","avgOverdue":"Average overdue","notes":"Notes","requestAmount":"Request amount / %"},"days":"{{n}}d","onTime":"On time","orders":"{{n}} orders","viewThread":"{{n}} note(s) · view thread ›","addNote":"Add note","amount":"Amount","pctOfDue":"% of due","resetRow":"Reset this row","due":"Due","total":"TOTAL · {{n}} suppliers","status":{"paid":"✓ Paid","partPaid":"Part-paid","followUp":"Follow up · {{n}}d","requested":"Requested","requestedD":"Requested · {{n}}d"},"detail":{"outstanding":"Outstanding","comingDue":"Coming due · not yet due","dueNow":"Due now · needs paying","openPos":"Open POs","requested":"Requested","overdueBreakdown":"Overdue breakdown","openItems":"{{n}} open item(s) · amount owed by age","noOverdue":"No overdue items — nothing past due.","openPosNote":"Open POs: {{n}} order(s)","paymentRequests":"Payment requests","raisedNewest":"{{n}} raised · newest first","awaiting":"Awaiting","notes":"Notes","notesLog":"{{n}} entr(y/ies) · timestamped log","noNotes":"No notes yet — add one when raising a payment request.","dueOn":"{{bill}} · due {{date}}"},"history":{"empty":"No payment requests raised yet. Enter amounts in Suppliers and file a request to see it here.","suppliers":"{{n}} suppliers","cancel":"Cancel request","cancelTitle":"Cancel request {{id}}?","cancelBody":"Accounting will no longer pay against it. Payments already recorded stay as they are.","paidOf":"{{paid}} paid","loadError":"Could not load the payment requests","loadErrorBody":"Check your connection and try again.","showing":"Showing the newest {{n}} of {{total}} requests","showOlder":"Show older requests"},"pay":{"selected":"{{n}} selected","cancel":"Cancel","request":"Request payment"},"confirm":{"title":"Request payments","close":"Close","suppliers":"Suppliers","totalRequest":"Total request","vendorsNotes":"Vendors & notes","notesHint":"Add a note per vendor for Accounting — it shows in the Notes column. Leave blank if none.","lastNote":"Last note: “{{text}}”","addNotePlaceholder":"Add a note (optional)…","generalNote":"General note for Accounting (optional)","generalPlaceholder":"e.g. prioritise large suppliers, deadline Friday…","filesNote":"This files an official payment request to Accounting and logs it under Request history.","cancel":"Cancel","send":"Send request","sending":"Sending…"},"notes":{"thread":"notes thread","latest":"Latest","empty":"No notes yet. Add the first one below.","addPlaceholder":"Write a note…","add":"Add","delete":"Delete","deleteTitle":"Delete this note?","deleteBody":"It is removed from the supplier’s thread.","loadError":"Could not load the notes","loadErrorBody":"Check your connection and try again.","emptyReadOnly":"No notes yet."},"toast":{"requestSent":"Request sent · {{amt}} · {{n}} suppliers","enterOne":"Enter an amount for at least one supplier","requestFailed":"The payment request was not sent","requestCancelled":"Request {{id}} cancelled","noteAdded":"Note added","noteDeleted":"Note deleted","saveFailed":"Could not save the change"},"requestStatus":{"requested":"Requested","partially_paid":"Part-paid","paid":"Paid","cancelled":"Cancelled"},"loadError":"Couldn’t load supplier balances","loadErrorBody":"The payables ledger didn’t respond. Try again in a moment.","empty":{"title":"No open supplier balances","body":"Approved supplier bills and sent purchase orders appear here as soon as they are recorded."},"retry":"Retry"}},"status":{"draft":"Draft","pending":"Pending","review":"In review","active":"Active","approved":"Approved","done":"Done","rejected":"Rejected","error":"Error","warning":"Warning","info":"Info","success":"Success","inStock":"In stock","lowStock":"Low stock","noStock":"Out of stock","production":"In production","shipping":"Shipping","paid":"Paid","unpaid":"Unpaid","overdue":"Overdue","archived":"Archived","awaitingSignature":"Awaiting signature","partiallySigned":"Partially signed","signed":"Signed","signatureDeclined":"Signature declined","signatureVoided":"Signature voided","signatureExpired":"Signature expired","waived":"Waived","draftTranslation":"Draft translation"},"confirm":{"cancel":"Cancel","confirm":"Confirm","delete":"Delete"},"help":{"title":"Help Center","subtitle":"Guides for using KeenERP, module by module.","loading":"Loading articles…","error":"Couldn't load help articles.","retry":"Try again","unavailableTitle":"Help is unavailable","unavailableBody":"The knowledge base isn't reachable right now. Please try again later.","emptyTitle":"No articles yet","emptyBody":"Help articles will appear here once they're published.","backToIndex":"← All articles","notFoundTitle":"Article not found","notFoundBody":"This article may have been moved or unpublished.","editor":{"toolbar":"Formatting","bold":"Bold","italic":"Italic","heading2":"Heading","heading3":"Subheading","bulletList":"Bulleted list","orderedList":"Numbered list","link":"Link","linkPrompt":"Enter a URL (leave empty to remove the link)","image":"Insert image","imageAfterSaveHint":"Save the article first, then reopen it to add images to the body.","aiBannerTitle":"AI-generated draft.","aiBannerBody":"The AI author captured the app pages and wrote both languages. Review the text and screenshots, edit anything, then publish."},"manage":{"title":"Manage articles","subtitle":"Create, edit, and publish Help Center articles.","newArticle":"New article","backToQueue":"← Back to queue","forbiddenTitle":"No authoring access","forbiddenBody":"Your account can read the Help Center but can't author articles.","emptyTitle":"No articles yet","emptyBody":"Create the first article to get started.","slug":"Slug","module":"Module","save":"Save","submit":"Submit for review","publish":"Publish","archive":"Archive","fieldTitle":"Title","fieldSummary":"Summary","fieldBody":"Body","status":{"draft":"Draft","in_review":"In review","published":"Published","archived":"Archived"},"locale":{"en":"English","vi":"Vietnamese"},"updated":"updated","aiDraft":"AI draft","manual":"Manual"},"requests":{"title":"Article requests","subtitle":"Ask the AI author for a new article — it captures the app pages you list and files a draft for review.","newRequest":"Request article","closeForm":"Close","runNow":"Run now","titleEn":"Title (English)","titleVi":"Title (Vietnamese, optional)","module":"Module (optional)","pagesLabel":"Pages to capture (max 8)","pagePath":"/dashboard/...","noteEn":"What this step shows (English)","noteVi":"Vietnamese note (optional)","addPage":"Add page","removePage":"Remove page","submit":"Submit request","submitted":"Request submitted — it will be processed by Run now or the nightly run.","runStarted":"Worker started — drafts will appear in the review queue in a few minutes.","runNothing":"No pending requests to process.","runUnavailable":"Run now is not available on this deploy — the nightly run will process pending requests.","empty":"No article requests yet.","delete":"Delete","deleted":"Request deleted.","deleteTitle":"Delete this request?","deleteBody":"“{{title}}” will be removed before it is processed.","status":{"pending":"Pending","processing":"Processing","done":"Done","failed":"Failed"},"promptPlaceholder":"Describe the article you want — topic, which screens or workflow it should cover, anything to emphasize. The AI picks the pages and writes the draft.","usePrompt":"Use description instead","useAdvanced":"Choose pages manually","draftedReview":"Drafted → review","revise":"Revise","reviseTitle":"Revise “{{title}}” — the article will be regenerated from the new description.","reviseSubmit":"Regenerate","reviseQueued":"Revision queued — run it with Run now or wait for the nightly run."},"sections":{"core":"Getting started","contacts":"Contacts","sales":"Sales","purchasing":"Purchasing","inventory":"Inventory","production":"Production","quality":"Quality","accounting":"Accounting","hr":"Human resources","settings":"Settings","other":"Other"},"ask":{"title":"Ask the knowledge base","placeholder":"Ask a question — e.g. how do I receive goods?","submit":"Ask","thinking":"Looking through the articles…","noAnswer":"The knowledge base doesn't cover that yet. Try browsing the sections below.","budget":"The assistant is temporarily unavailable (monthly usage limit). Browse the articles below instead.","sources":"Sources:","hint":"AI answers cite the articles they come from.","answerTitle":"Answer from the knowledge base"},"filterPlaceholder":"Filter articles…","noMatches":"No articles match.","popular":"Popular articles","articleCount":"{{count}} articles","viewCount":"{{count}} views","article":{"aiDraft":"✦ AI draft","manual":"Manual","updated":"Updated","helpfulQ":"Was this article helpful?","helpfulYes":"Yes","helpfulNo":"No","helpfulThanks":"Thanks for the feedback!","helpfulPct":"{{pct}}% found it helpful","related":"Related"}},"executiveDashboard":{"title":"Sales performance & projections","sampleBadge":"Sample data · for client validation","targetsSampleBadge":"Sample targets","noLiveTabs":{"title":"Nothing to show yet","body":"Sections appear on this dashboard as soon as their figures come from live data."},"loading":"Loading executive dashboard…","close":"Close","partial":"partial","months":{"jan":"Jan","feb":"Feb","mar":"Mar","apr":"Apr","may":"May","jun":"Jun","jul":"Jul","aug":"Aug","sep":"Sep","oct":"Oct","nov":"Nov","dec":"Dec"},"kpi":{"fyTarget":"FY {{year}} target","fyTargetSub":"entered on the target worksheet","ytdActual":"{{year}} YTD actual","ytdActualSub":"{{from}} – {{to}} (last month partial)","ytdVsTarget":"YTD vs target","ytdVsTargetSub":"{{actual}} of {{target}} YTD","projected":"Projected FY {{year}}","projectedSub":"run-rate projection · {{pct}} of target","prevYearActual":"FY {{year}} actual","prevYearActualSub":"best year since 2022"},"legend":{"actual":"ACT.","target":"TARGET","projected":"Projected (3-mo avg)"},"hints":{"clickDiamond":"· click a blue diamond for order detail","hoverBar":"· hover a bar for the exact figure"},"charts":{"targetVsActual":{"title":"{{year}} · Target vs actual by month","sub":"Monthly export sales against the {{plan}} plan · the dashed line projects the open months at the trailing average ({{avg}}/mo)"},"trend":{"title":"Export sales · 10-year trend","sub":"Actuals by year · {{year}} projected (dashed) · click a year dot for its monthly detail"},"mix":{"title":"Customer mix · {{year}}","sub":"Export value share by customer ({{total}}) · hover a slice for the numbers, click for its invoices"},"grouped":{"title":"{{prevYear}} vs {{year}} · month by month","sub":"Same-month comparison · current year shown through {{month}}"},"monthlyTable":{"title":"Monthly detail","sub":"Export sales by month (USD, thousands) — every year from the 10-year sheet"}},"worksheet":{"open":"Open target worksheet ▾","hide":"Hide worksheet ▴","title":"Target worksheet","sub":"mirrors the {{year}} SALES SUMMARY sheet — type a target and the chart & KPIs recalculate","item":"Item","total":"Total","average":"Average","target":"TARGET","targetHint":"· type to edit","targetInput":"Target for {{month}}","act":"ACT.","actHint":"· from system sales","pctCompleted":"% COMPLETED / TARGET","vsTarget":"± vs TARGET","quarterTitle":"{{year}} SALES SUMMARY BY QUARTER (USD)","quarter":"Quarter","sales":"Sales","avgPerMonth":"Average / month","howTitle":"How this works (proposed):","howBody":"ACT. pulls from the system's actual export sales automatically; TARGET is entered here by leadership and drives the target line, % completed and the FY-target KPI. To validate: where targets live, who can edit them, and when they lock."},"detail":{"title":"{{month}} {{year}} · the orders behind the number","meta":"{{shipments}} shipments · {{containers}} containers · {{lines}} order lines","date":"Date","customer":"Customer","pi":"PI / order","invoice":"Invoice","containers":"Container","lines":"Lines","value":"Value (USD)","monthTotal":"Month total — builds the ACT. figure","footnote":"Shipped = goods that left the factory: a delivery note marked shipped or delivered, or an export invoice marked shipped. The Export overview's Shipped tile counts export invoices marked shipped only."},"yearPanel":{"title":"{{year}} · month by month","meta":"total {{total}} · avg {{avg}}/mo","metaVsPrev":"total {{total}} · avg {{avg}}/mo · ± vs {{prevYear}}","exportHalt":"Aug 2021 = 0 — export halt (as recorded in the sheet)."},"mix":{"totalLabel":"Total","invoicesTitle":"{{name}} · {{year}} shipments","invoicesMeta":"{{count}} shipped PIs · invoice no., ship date, value (USD)","yearTotal":"Year total"},"grouped":{"aver":"Average","vsPrev":"± vs {{year}}","noPrev":"No {{year}} sales to compare with","noPrevBody":"Shipped value for {{year}} appears here once a {{year}} shipment is recorded; the {{current}} figures are in the charts above."},"monthlyTable":{"year":"Year"},"tips":{"target":"{{month}} {{year}} · target {{value}}","actual":"{{month}} {{year}} · actual {{actual}} vs target {{target}} · click for order detail","projected":"{{month}} {{year}} · projected {{value}} (3-mo avg)","year":"{{year}} · {{value}} · click for monthly detail","yearProjected":"{{year}} projected · {{value}}","monthValue":"{{month}} {{year}} · {{value}}","slice":"{{name}} · {{value}} · {{pct}}% of {{year}} exports · click for invoices"},"error":{"title":"Could not load the dashboard","body":"The executive dashboard data could not be fetched. Check your connection and try again.","retry":"Retry"},"accessDenied":{"title":"Executive access required","body":"This dashboard is available to account owners and the executive team only."},"pageTitle":"Executive dashboard","pageSubtitle":"sales & projections · production · stock summary","salesEyebrow":"Executive · Sales","monthlyDash":{"compareTitle":"{{prev}} vs {{cur}} comparison","pickMetric":"Pick a metric:","metricRevenue":"Revenue ($K)","metricVolume":"Volume (pcs)","unitValue":"Value ($K)","unitVolume":"Quantity (pcs)","monthlyTitle":"{{metric}} · all VHT · x-axis = month · 2025 vs 2026","metricWordValue":"Revenue","metricWordVolume":"Volume","byCustomerTitle":"{{metric}} by customer — {{month}}/{{cur}} vs {{month}}/{{prev}} (same period)","byCustomerSub":"Top 10 customers · vs same period last year · unit {{unit}} · click View details for the full 12 months","unitPcs":"pcs","unitK":"$K","viewDetails":"View details","detailTitle":"{{name}} — {{metric}} by {{period}}","byMonth":"Month","byQuarter":"Quarter","detailUnit":"2025 vs 2026 · unit {{unit}}","colMonth":"Month","colQuarter":"Quarter","colChange":"Change","detailNote":"{{year}} data runs to {{month}} only (current period); later periods are blank. Switch Month/Quarter with the buttons above.","mixTitle":"Product mix — {{metric}} (Top 5)","mixSub":"Left: Top 5 this year ({{cur}} YTD) — products DOWN vs the same period last year in red. Right: Top 5 for full-year {{prev}}.","badgeNew":"NEW","badgeDown":"DOWN","summaryTitle":"Customer summary (month)","abcThresholds":"ABC thresholds (% share/customer):","filter":"Filter:","sort":"Sort:","asc":"Asc","desc":"Desc","filterAll":"All groups","filterA":"Group A","filterB":"Group B","filterC":"Group C","sortVal":"Value","sortU":"Quantity","sortCont":"Cont","sortDiff":"Difference","sortName":"Customer name","showing":"Showing {{count}} customers · Cont {{cont}} · SL {{qty}} · Value ${{value}}","colCustomer":"Customer","colGroup":"Group","colCont":"Container","colQuantity":"Quantity (pieces)","colValue":"Value ($)","colDelta":"Change versus the same month {{prev}}","totalShown":"TOTAL (shown)","paretoTitle":"Revenue share by customer (ABC) — % of month","paretoGroups":"Group A: {{a}} (≥{{abcA}}%) · B: {{b}} ({{abcB}}–{{abcA}}%) · C: {{c}} (rest)","paretoLineLabel":"% of month revenue","other":"Other","tipPareto":"{{name}} · ${{k}}K · {{pct}}% of month","colYear":"{{year}} ({{unit}})","mixTopPrev":"▸ TOP 5 — {{year}} (full year)","mixTopCur":"▸ TOP 5 — {{year}} (YTD)","empty":{"title":"No shipments to compare yet","body":"The comparison fills in once confirmed PIs ship (delivery note shipped or export invoice shipped) this year or last year. Ship an order from Sales › Delivery notes or Export documents."}},"export":{"openFull":"Open full Export overview"},"tabs":{"sales":"Sales","export":"Export","production":"Production","stock":"Stock Summary","wood":"Wood Usage","purchasing":"Purchasing"},"stock":{"eyebrow":"Inventory · Reports","title":"Stock Summary","description":"Opening, receipts, issues and closing value across all 5 stock categories — synced from goods receipt & issue.","periodLine":"Period {{from}} – {{to}} · {{items}} items · {{value}} on hand.","periodTo":"Period to","periodToOption":"Period to {{date}}","export":"Export","exporting":"Exporting stock summary to Excel…","items":"{{count}} items","status":{"ok":"OK","watch":"Watch","over":"Over"},"categories":{"materials":"Materials & Supplies","wip":"Work in Progress","tools":"Tools & Equipment","finished":"Finished Goods","merchandise":"Merchandise"},"tabs":{"analytics":"Analytics","detail":"Material Detail","compare":"Compare"},"analytics":{"trendTitle":"Stock value trend · 8 periods","trendSub":"Closing value by category (₫ billions)","shareTitle":"Where capital sits","shareSub":"Share of total {{total}} on hand","ceilingTitle":"Value vs budget ceiling","ceilingSub":"How much working capital each category ties up against its target"},"tips":{"ofCeiling":"{{pct}}% of ceiling"},"detail":{"pick":"Material","hint":"Pick a material to see its 8-period trend & movement history.","closing":"Closing","unitPrice":"Unit price","value":"Value","closingChart":"Closing stock · 8 periods","valueChart":"Stock value · 8 periods","history":"Movement history","period":"Period"},"compare":{"compare":"Compare","with":"with","valueByCategory":"Value by category","difference":"Difference","category":"Category"}},"production":{"tabs":{"pi":"Customer PIs (mass production)","sample":"Sample"},"purposePi":"Purpose: MASS PRODUCTION against customer PIs","purposeSample":"Purpose: SAMPLE PRODUCTION (prototypes for customers)","kind":{"production":"Production","sample":"Sample production"},"tower":{"title":"VHT Production Control Tower","sub":"Production control tower · one screen for management & planning lead","today":"Today: {{date}}","block1":"1. Month overview","totalOrders":"Total orders:","piCount":"{{count}} PI","modelCount":"{{count}} model","totalVolume":"Total volume:","container":"Container:","closed":"closed","containerBalance":"Container balance / week (cap {{cap}})","overloadedWeeks":"{{count}} weeks overloaded","weekTip":"{{count}} cont / cap {{cap}}","week":"W{{n}}","block2":"2. Today's bottlenecks","noBottlenecks":"No bottlenecks.","bottleneck":{"paint_dry_wait":"Paint booth: orders waiting to dry: {{count}}","kitting_gate":"Assembly line: check all blanks are in before releasing an order (Kitting Gate)"},"block3":"3. Operating KPIs","otd":"On-time delivery (OTD)","oee":"Plant-wide OEE","blankRecovery":"Blank recovery rate (wood)","btpStock":"WIP blanks in stock (reuse)","blanks":"{{count}} blanks","block4":"4. Plan vs Actual"},"pva":{"pi":"PI number","model":"Model","qty":"Quantity","stage":"Current stage","etdPlan":"ETD plan","expected":"Expected finish","status":"Status","ahead":"Ahead {{days}} days","onTime":"On time","late":"Late {{days}} days","customer":"Customer","search":"PI / model / customer…","noMatch":"No orders match the search or filters.","slip":{"late":"Late","ahead":"Ahead"}},"progress":{"title":"Order progress — customer tracking","sub":"Grouped by customer + PI · one row per product · % joinery / finishing / total · start → finish → ship","search":"Customer / PI / product…","cols":{"customer":"Customer","pi":"PI","product":"Product","ordered":"Ordered","stageProgress":"Stage progress (NL→Packing)","pctJoinery":"% Joinery","pctFinishing":"% Finishing","pctTotal":"% Total","inWarehouse":"In warehouse","wip":"WIP","start":"Start","expectedFinish":"Expected finish","actualFinish":"Finished (actual)","plannedShip":"Planned ship","actualShip":"Shipped (actual)","status":"Status","notes":"Notes"},"empty":"No orders.","noteLate":"Planned after ETD","multi":"{{products}} products · {{pcs}} pcs","changes":"{{count}} changes","old":"OLD","status":{"done":"Done","overdue":"Overdue","finishing":"In finishing","joinery":"In joinery","inProduction":"In production"},"footnote":"A PI with several products is merged: Customer / PI / dates / status span the group, each product on its own row (qty, progress, % per product). Expected finish = planned production completion · Finished (actual) = actual completion · Shipped (actual) = date shipped · Planned ship = ETD.","stagesNotRecorded":"No day close yet · record stages in Scheduling › Day close","stagesOnFirstRow":"Stages: see the whole-order row above","stagesWholeOrder":"Whole order · {{pcs}} pcs","notePastEtd":"Past ETD, not finished","live":"Live · confirmed PIs + production receipts","noMatch":"No orders match the search or filters.","sortBy":"Sort by {{column}}","filters":{"customer":"Customer","allCustomers":"All customers","pi":"PI","allPis":"All PIs","status":"Status","allStatuses":"All statuses","band":"Progress (% total)","allBands":"Any progress","bands":{"b0":"0–24%","b25":"25–49%","b50":"50–74%","b75":"75–99%","b100":"100% (complete)"},"wip":"WIP","wipAll":"WIP: any","wipYes":"Has WIP","wipNo":"No WIP","count":"{{shown}} of {{total}} PIs","clear":"Clear filters"}},"rev":{"title":"PI revision history","piSent":"PI number sent to customer","unchanged":"(unchanged for the customer)","customer":"Customer:","rev":"Rev {{n}}","cols":{"date":"Date","model":"Model changed","item":"Item","before":"Before","after":"After","reason":"Reason","approvedBy":"Approved by"},"wholeOrder":"(whole order)","footnote":"Downstream documents (WO · issue slip · extra PO) reference this revision."},"dash":{"title":"{{kind}} dashboard","sub":"ETD loop · charts · productivity · standards"},"etd":{"title":"① ETD loop — {{kind}} progress vs delivery","cols":{"order":"Order","model":"Model","pi":"PI","etd":"ETD","progress":"Progress (parts · ops)","pctDone":"% done","cont":"Container packed / needed","status":"Status"},"empty":"No work order.","parts":"{{done}}/{{total}} parts","status":{"done":"Done","late":"LATE ETD","atRisk":"At risk","onSchedule":"On schedule","onTime":"On time"}},"charts":{"title":"② {{kind}} tracking","completionMonth":"{{kind}} — completion rate by month (%)","samplePcsMade":"Sample pcs made","completedQty":"Completed qty","rate":"Rate %","completionWorkshop":"{{kind}} — completion rate by workshop (%)","defectMonth":"{{kind}} — defect rate by month (%) · click a bar for details","defectHint":"Click a month in the \"Defect rate\" chart to see the top defects.","topDefects":"Top defects — {{month}} (Pareto)","opTime":"{{kind}} — planned vs actual time by operation (min)","planned":"Planned","actual":"Actual","byEtdStatus":"Orders by ETD status"},"productivity":{"title":"⑥ Productivity by operation (time & pass rate)","op":"Operation","runs":"Runs","planned":"Planned (min)","actual":"Actual (min)","ratio":"Actual/Planned","passRate":"Pass rate"},"standards":{"title":"⑤ Standards (reference)","wood":"Wood standard (m³ / unit)","model":"Model","m3Unit":"m³/unit","woodNote":"Compare with net wood issued (LXK) → actual loss.","timeFactor":"Time factor","woodGrade":"Wood grade:","difficulty":"Difficulty:","timeNote":"Standard time per sub-op = setup + min/pc (OPS table)."},"sample":{"title":"③ Sample production by month & customer","perMonth":"Sample pieces per month — planned vs made","planned":"Sample pcs planned","made":"Sample pcs made","month":"Month:","samples":"samples","pcs":"pcs","madeLabel":"made","cols":{"customer":"Customer","samples":"Samples (product × quantity · stage)","count":"Samples","pcs":"Pieces","made":"Made"},"empty":"No samples in this month.","stage":{"requested":"Requested","costing":"Costing / stock","approval":"Approval","inProduction":"In production","delivered":"Delivered","done":"done"}}},"purchasing":{"eyebrow":"Executive · Purchasing","title":"Purchasing Report","subtitle":"Spend, suppliers, price & savings and sourcing — rolled up from PI, PO, outsourcing & IQC.","loading":"Loading purchasing report…","export":"Export","exporting":"Preparing workbook…","exportDone":"Purchasing report downloaded.","exportError":"Could not export the report. Try again.","period":"Period","periods":{"y2026":"Year 2026 (through Sep)","q3_2026":"Q3 2026","y2025":"Year 2025"},"group":"Group","allGroups":"All material groups","unclassifiedGroup":"Unclassified","filteredBy":"Filtered: {{group}}","clearFilter":"Clear filter","error":{"title":"Could not load the purchasing report","body":"The purchasing data could not be fetched. Check your connection and try again.","retry":"Retry"},"gaps":{"title":"Data gaps","body":"These metrics have no live source yet and are shown empty rather than estimated:"},"tabs":{"overview":"Overview","year":"Year comparison","suppliers":"Suppliers","price":"Price & savings","sourcing":"Spend by order & sourcing"},"overview":{"kpis":{"totalSpend":"Total spend","vsPrior":"{{pct}} vs prior year","po":"Purchase orders (PO)","poSub":"{{suppliers}} suppliers · {{pis}} PIs","onTime":"On-time delivery %","awaiting":"Awaiting receipt","awaitingSub":"POs in production / transit","alerts":"Alerts","alertsSub":"{{jobs}} jobs + {{pos}} POs"},"needsAction":{"title":"Needs action","overdueJobs":"{{count}} outsourced jobs overdue","awaitingSig":"{{count}} POs awaiting signature (PI ref)","belowReorder":"{{count}} materials below reorder point with no PO"},"noAlerts":"Nothing needs action right now.","monthlyTitle":"Total purchase value by month","monthlySub":"One bar per month · billions VND","monthlyEmpty":"No monthly spend in this period.","mixTitle":"Spend mix by material group","mixSub":"Click a slice to filter the whole tab","mixEmpty":"No spend by group in this period.","mixCenter":"Total","topTitle":"Top 10 suppliers","topSub":"By purchase value","topEmpty":"No suppliers in this period.","colRank":"Rank","colSupplier":"Supplier","colShare":"Share","colValue":"Value","statusTitle":"Purchase orders by status","statusEmpty":"No purchase orders in this period.","colStatus":"Status","colOrders":"Orders","poStatus":{"approved":"Ordered","sent":"Sent","partially_received":"In production","received":"Received","pending_approval":"Awaiting signature","draft":"Draft","cancelled":"Cancelled"}},"year":{"kpis":{"total2026":"Total 2026 (YTD)","total2026Sub":"{{pct}} vs 2025","total2025":"Total 2025","total2025Sub":"{{pct}} vs 2024","fastest":"Fastest-growing group 25→26","fastestSub":"{{pct}} 25→26"},"chartTitle":"Purchase value by material group","chartTotalTitle":"Purchase value by year","chartEmpty":"No comparison data.","toggleGroup":"By material group","toggleTotal":"Total by year","colGroup":"Material group","colTotal":"TOTAL","colDelta":"Change 2025→2026","tableTitle":"Purchase value · 2024 / 2025 / 2026 YTD"},"suppliers":{"kpis":{"active":"Active suppliers","activeSub":"with active POs","lead":"Avg lead time","leadSub":"order → receipt","onTime":"Avg on-time %","iqc":"Avg IQC pass %"},"days":"{{count}} d","warning":{"title":"Supplier watch","slowest":"Slowest delivery: {{category}}","singleSource":"{{count}} single-source materials"},"noWarning":"No supplier risks flagged.","tableTitle":"Delivery time by category","tableSub":"Expand a category for its suppliers","tableEmpty":"No supplier delivery data.","colCategory":"Category","colValue":"Value","colLead":"Lead time","colOnTime":"On-time %","colIqc":"IQC pass %","suppliersCount":"({{count}} suppliers)"},"price":{"kpis":{"savings":"Savings YTD","savingsSub":"quote vs final price","up":"Materials up","upSub":"since start of year","rfqs":"RFQs","rfqsSub":"in period"},"changeTitle":"Material price change","changeSub":"Start of year vs now","changeEmpty":"No price changes recorded.","colMaterial":"Material","colStart":"Start","colNow":"Now","colDelta":"Price change (%)","colSupplier":"Supplier","quoteTitle":"Quote comparison","quoteSub":"Per-vendor price · chosen highlighted","quoteEmpty":"No quote comparisons available.","quotePick":"Material","chosen":"Chosen","savingsCallout":"Chose {{chosen}} over {{other}} — {{amount}} lower per unit"},"sourcing":{"spendTitle":"Spend by order / customer (PI)","spendSub":"Attributed to a proforma via the order chain","spendEmpty":"No PI-attributed spend in this period.","colPi":"PI","colCustomer":"Customer","colGroups":"Main material groups","colSpend":"Spend","unattributed":"Unattributed / direct-buy","total":"TOTAL","mixTitle":"Buy vs make vs outsource","mixSub":"Share by material group","mixEmpty":"No sourcing data.","legendBuy":"Buy","legendMake":"Make in-house","legendOutsource":"Outsource","legendUnclassified":"Unclassified"}},"salesEmpty":{"title":"No sales to show yet","body":"Sales appear here once a PI is confirmed and invoiced."}},"sampleRequests":{"lineQtyLabel":"Quantity for {{name}}","lineDeadlineLabel":"Deadline for {{name}}","lineNoteLabel":"Note for {{name}}","removeNamed":"Remove {{name}}","pending":{"title":"Not finished yet","askSomeone":"Ask someone with that permission to open this request and finish it.","step":{"reserve_main":"Parts & materials not reserved yet — needs warehouse reservation permission","draft_pr":"Purchase request not drafted yet — needs purchasing permission"}},"summary":{"reserved":"{{n}} reserved","prDrafted":"purchase request {{number}} drafted","pending":{"reserve_main":"parts & materials need a warehouse user","draft_pr":"purchase request needs a purchasing user"}},"crumb":"Sales · Samples","title":"Sample requests","description":"Every sample a customer has asked for. Create one from scratch, or from an existing product — reserving what’s in stock and producing the rest — and track it through to approval.","createRequest":"Create request","stageAll":"All","originAll":"All types","searchPlaceholder":"Search request / customer / product / MSP","overdueBanner_one":"{{count}} request past its deadline","overdueBanner_other":"{{count}} requests past their deadline","review":"Review","emptyTitle":"No sample requests yet","emptyDescription":"Create the first one — from scratch, or from a product already in the catalogue.","linesTitle":"Lines · per-line qty & deadline","noNotes":"No notes.","daysLate":"{{days}}d late","unassigned":"unassigned","overdue":"overdue","overduePill":"OVERDUE","versionPill":"V{{n}}","reserveCount":"{{n}} reserve","produceCount":"{{n}} produce","addLabel":"Add","removeLabel":"Remove","col":{"number":"Number","origin":"Origin","customer":"Customer","product":"Product","qty":"Quantity","purpose":"Purpose","deadline":"Deadline","assigned":"Assigned","stage":"Stage","nextAction":"Next action","dimensions":"Dimensions (mm)","material":"Material","inStock":"Available now","note":"Note","wanted":"Wanted","reserve":"Reserve","produce":"Produce","totals":"Totals","bom":"BOM","item":"Item (code · name)","spec":"Dimensions / spec","inStockShort":"In stock","buy":"Buy"},"origin":{"new_product":"From scratch","existing_product":"From existing product"},"purpose":{"showroom_display":"Showroom display","meet_customer":"Meet customer","quote_offer":"Quote / offer","exhibition":"Exhibition","other":"Other"},"stage":{"requested":"Requested","costing_stock":"Costing / stock","approval":"Approval","in_production":"In production","delivered":"Delivered","cancelled":"Cancelled"},"decision":{"approved":"Approved","revision":"Revision · re-sample","rejected":"Rejected"},"channel":{"portal":"In our system","external":"Outside our system"},"channelHint":{"portal":"Send & capture the reply here","external":"Record the decision only"},"nextAction":{"finishFulfilment":"Finish reservation / purchase request","accept":"Assign & accept","createBom":"Build sample BOM","submitBom":"Send BOM for approval","approveBom":"Approve BOM","reserve":"Reserve from stock","createWorkOrder":"Create work order","recordDecision":"Record customer decision","trackProduction":"Track production","createPi":"Create PI from sample","viewRecord":"View record","openProforma":"Open proforma","cancelled":"Cancelled","trackPurchase":"Track purchase"},"kpi":{"open":"Open requests","pending":"Pending acceptance","in_production":"In production","awaiting_decision":"Awaiting decision","overdue":"Overdue"},"kpiSub":{"open":"not yet completed","pending":"waiting to be accepted","in_production":"on the sample floor","awaiting_decision":"with the customer","overdue":"past deadline","onTime":"all on time"},"bomStatusNone":"No BOM yet","bomTag":"BOM {{code}}","department":{"engineering":"Sample R&D / Engineering","workshop":"Sample workshop","sales":"Sales"},"material":{"red_oak":"Red Oak","walnut":"Walnut","ash":"Ash","plywood":"Plywood","mdf":"MDF","other":"Other"},"bomStatus":{"draft":"Draft","pending":"Pending approval","revision":"Changes requested","approved":"Approved","priced":"Priced","final":"Final"},"field":{"customer":"Customer","customerPlaceholder":"Type or pick a company…","assignTitle":"Assign this request","assignHint":"goes to this person next","department":"Department","person":"Person","unassignedOption":"— unassigned —","ourCode":"VHT code","ourCodeHint":"internal","productType":"Product type","productTypePlaceholder":"Not set","productTypeHint":"Optional. With Our code blank or free text, the full sample code (…S01) is minted from it.","productName":"Product name","productNamePlaceholder":"e.g. Relax Armchair","dimensions":"Dimensions (mm)","dim":{"dim_w":"W","dim_d":"D","dim_h":"H"},"primaryMaterial":"Wood type / primary material","selectPlaceholder":"— select —","clientReference":"Client reference","clientCode":"Client code / SKU","clientDescription":"Client description","description":"Description","descriptionHint":"construction, finish, special notes","descriptionPlaceholder":"e.g. Solid oak frame, natural oil finish, brass hardware…","quantity":"Quantity","deadline":"Deadline","purpose":"Purpose","designFile":"Approved design file","designFilePlaceholder":"Attach design (PDF / DWG / image)","productImages":"Product images","productImagesHint":"reference photos, renders","note":"Note","notePlaceholder":"Special requirements…","zeroMake":"0 · make","lineNotePlaceholder":"Note…","orderNotePlaceholder":"Order-level note…","productMsp":"Product / MSP","orderFulfilment":"Order fulfilment","assigned":"Assigned","samples":"Samples","samplesHint_one":"{{count}} line · add as many as the request needs","samplesHint_other":"{{count}} lines · add as many as the request needs","zeroBuy":"0 · buy","purchaseRequest":"Purchase request","customerFiles":"Customer files","customerFilesHint":"requirements, specs, emails","optional":"optional"},"spec":{"product":"Product","customer":"Customer","dimensions":"Dimensions","material":"Material","bom":"Sample BOM"},"action":{"finishBoth":"Finish reservation & draft purchase request","finishReserve":"Finish reservation","finishPr":"Draft purchase request","accept":"Assign & accept","createBom":"Create sample BOM","openBom":"Open sample BOM","reviewBom":"Open BOM to review / approve","reserve":"Reserve from stock","createWorkOrder":"Create work order","finaliseBom":"Finalise as official BOM","createPi":"Create PI from sample","modify":"Modify request","cancel":"Cancel request","saveChanges":"Save changes","acceptBom":"Accept BOM","editBom":"Edit BOM","delete":"Delete request"},"lineBom":{"none":"No BOM","version":"v{{version}}","accepted":"Accepted · v{{version}}","acceptedSample":"Accepted · v{{version}} · sample"},"validation":{"maxQty":"Quantity can be at most {{max}}","maxLines":"A request can have at most {{max}} lines","customer":"Select a customer","productName":"Product name is required","quantity":"Quantity must be at least 1","deadline":"Deadline is required","designFile":"Attach the approved design file","lines":"Add at least one line — use one of the three buttons below","wholeQty":"Finished products need a whole quantity (1, 2, 3…)","positiveQty":"Quantity must be greater than 0"},"toast":{"finished":"Fulfilment finished","finishedPartly":"Fulfilment updated — some steps are still pending","created":"{{number}} created","fixFields":"Please complete the highlighted fields","uploadFailed":"{{number}} was created but {{name}} could not be uploaded — add it again from the record hub","fileTooLarge":"{{name}} is larger than {{maxMb}} MB","fileBadType":"{{name}} can't be added as a {{kind}}: that file type isn't accepted","uploadError":"{{name}} could not be uploaded","bomCreated":"Sample BOM created — opening the Product BOM","reserved":"Reserved from sample stock","workOrderCreated":"Work order created","updated":"Request updated — split & downstream stages recalculated","accepted":"Request accepted","cancelled":"Request cancelled","revision":"Re-sample — new version V{{version}}, back to BOM","revisionStock":"Re-sample — new version V{{version}}, back to costing / stock","decision":{"approved":"Customer approved the sample","revision":"Revision recorded","rejected":"Customer rejected the sample"},"attached_one":"{{count}} file attached","attached_other":"{{count}} files attached","finalised":"Finalised as official BOM","piCreated":"Proforma created from this sample","lineBomAccepted":"BOM accepted for {{product}}","linesAdded_one":"{{count}} line added","linesAdded_other":"{{count}} lines added","deleted":"{{number}} deleted"},"cancel":{"title":"Cancel {{number}}?","body":"Open stock reservations are released and a draft purchase request is cancelled. This cannot be undone."},"accept":{"pendingReserve":"You don’t have warehouse reservation permission — parts and materials will stay pending until someone who has it finishes them.","pendingPr":"You don’t have purchasing permission — the purchase request will stay pending until a purchasing user drafts it.","hint":"Assign the request to the person who handles it next and accept it into their queue.","commitNote":"Accepting reserves what is in stock and drafts a purchase request for anything to buy. Finished products come from the sample warehouse; parts and materials are reserved from the main warehouses only if you have warehouse reservation permission, and the purchase request is drafted only if you have purchasing permission — otherwise those steps stay pending. Lines are locked after that."},"modify":{"hintLines":"Change quantities, deadlines or notes — the reserve / produce / buy split re-computes from current stock when you save.","hintSingle":"Change the quantity or deadline for this request.","footnote":"Changes are logged against the request; downstream stages see the updated numbers immediately.","locked":"Lines are locked — the request was accepted and stock / purchasing were committed. To change them, cancel and recreate the request. You can still edit the note."},"drawer":{"newIntro":"New design → a fresh sample BOM will be built and produced.","linesTitle":"Lines · per-line qty & deadline","actions":"Actions","noActions":"No actions available at this stage."},"workflow":{"pendingWarehouse":"Pending · needs warehouse permission","pendingPurchasing":"Pending · needs purchasing permission","title":"Workflow · by phase","stepOf":"step {{n}} of {{total}}","sub":"Grouped into phases — request & approval, production, packaging, logistics, and the conversion to a real product.","active":"ACTIVE","now":"NOW","pending":"Not yet accepted","phase":{"req":"Request & approval","prod":"Production","pack":"Packaging","log":"Logistics","conv":"Convert to product"},"open":{"bom":"Open sample BOM","wo":"Open work order","reservations":"Open reservations in Warehouse","proforma":"Open proforma","purchaseRequest":"Open purchase request"},"step":{"created":"Request created","assign":"Assign to staff","assigned":"Assigned","bomBuilt":"Sample BOM built","bomApproval":"Check & manager approval","inProduction":"Costed & in production","packaged":"Ready · packaged for approval","customerReview":"Delivered · customer review","converted":"Approved → official BOM","reserved":"Reserved from stock","productionRun":"Production run · existing BOM","unitsReady":"Reserved + produced units ready","deliveredToCustomer":"Delivered to customer","proforma":"Proforma created from sample","purchased":"Bought in · purchase request"},"stepSub":{"created":"Logged in Sales · Sample requests","assign":"Pending assignment","assigned":"Accepted into their queue","bomBuilt":"R&D / Engineering — parts, materials, hardware in the Product BOM","bomApproval":"Mirrors the production BOM approval — reviewer → manager","inProduction":"Sample workshop makes the unit(s)","packaged":"Photos / docs attached for sign-off","customerReview":"Customer reviews the physical sample + pack","converted":"Converts to a real production BOM & product","reserved":"Finished products held in the SAMPLE warehouse; parts and materials in the main warehouses","productionRun":"Produce more — no new BOM (uses the approved one)","unitsReady":"In Warehouse as type Sample","deliveredToCustomer":"Pick list → logistics → customer","proforma":"Draft PI (type sample) linked to this request","purchased":"Draft purchase request for the bought-in shortfall"}},"approval":{"title":"Approval & feedback","sub":"Package the sample for customer sign-off — photos, videos, docs — sent in-system or handled outside, with the revise / re-sample loop.","media":"Media","documents":"Documents","noDocuments":"No documents yet.","recordDecision":"Record decision","feedback":"Customer feedback","feedbackPlaceholder":"What did the customer say?","save":"Save decision","customerFiles":"Customer files","noCustomerFiles":"No customer files yet."},"attachments":{"removeTitle":"Remove {{name}}?","kind":{"design":"Design","photo":"Photo","video":"Video","document":"Document","customer_file":"Customer file"}},"events":{"title":"Feedback log","empty":"No events yet.","system":"System","action":{"create":"created the request","accept":"accepted the request","assign":"assigned the request","update":"updated the request","create_bom":"created the sample BOM","create_line_bom":"started a sample version of the BOM","accept_line_bom":"accepted the BOM for a line","reserve":"reserved from stock","create_wo":"created a work order","customer_decision":"recorded the customer decision","finalise_bom":"finalised the official BOM","create_pi":"created a proforma","cancel":"cancelled the request","comment":"commented","create_pr":"drafted a purchase request"}},"wizard":{"title":"Create sample request","discardTitle":"Discard this request?","discardBody":"Nothing has been saved yet. Close and lose what you typed?","uploadingNote_one":"Uploading {{count}} file… you can carry on.","uploadingNote_other":"Uploading {{count}} files… you can carry on.","stage":{"request":"Request","recipe":"Recipe / stock","approve":"Approve","produce":"Produce","deliver":"Deliver"},"stageLabel":"Stage {{n}} · {{name}}","chooser":{"title":"Create the sample request","sub":"How does this sample originate? Pick one — it opens the right form."},"chooserTitle":{"new_product":"Brand new product","existing_product":"From existing inventory"},"chooserDesc":{"new_product":"No BOM yet — build the sample recipe (parts & materials), then produce it.","existing_product":"Already in the catalogue — reserve what’s in sample stock, produce only the shortfall."},"new":{"title":"New product — request details","sub":"Capture the basics. Next you’ll build this product’s sample BOM."},"existing":{"title":"From inventory — request details","sub":"Add finished products, product details (parts) and raw materials. Each line has its own quantity, deadline and note. Next you’ll see what comes from stock and what has to be produced or bought.","empty":"No lines yet. Use one of the three buttons below: search, tick, then add.","adderTitle":{"product":"Finished product","part":"Product details","material":"Raw material"},"adderSub":{"product":"whole product from the catalogue","part":"pick a product, then its parts","material":"any material in the warehouse"},"custWarnLines_one":"{{count}} line","custWarnLines_other":"{{count}} lines","custWarnText_one":"comes from products of {{prev}}, not {{customer}}. Keep it on this request?","custWarnText_other":"come from products of {{prev}}, not {{customer}}. Keep them on this request?","custWarnKeep":"Keep them","custWarnRemove":"Remove them"},"recipe":{"title":"Build the sample BOM","sub":"New product — build the recipe for {{product}} the same way as a production BOM. Costs roll up so you always know the would-be product cost.","hint":"Build the recipe in the Product BOM the same way as a production BOM."},"reserve":{"permissionNote":"Parts and materials are reserved in the main warehouses only when the person accepting has warehouse reservation permission, and the purchase request is drafted only with purchasing permission. Otherwise those steps stay pending on the request for someone who has it.","title":"Reserve, produce & buy","sub_one":"How the {{count}} line will be fulfilled: what is in stock is reserved when the request is accepted, made-in-house shortfalls are produced, bought-in shortfalls are purchased.","sub_other":"How the {{count}} lines will be fulfilled: what is in stock is reserved when the request is accepted, made-in-house shortfalls are produced, bought-in shortfalls are purchased.","tileReserve":"Reserve from stock","tileReserveSub":"held when accepted → logistics","tileProduce":"Produce","tileProduceSub":"made-in-house shortfall → produce stage","nothingToMake":"nothing to make","hint":"Nothing is reserved yet. When the request is accepted, in-stock units are reserved and flow to logistics for pick & ship.","reservedPill":"{{n}} reserved","tileBuy":"Buy","tileBuySub":"bought-in shortfall → purchase request","nothingToBuy":"nothing to buy","committedHint":"Stock was reserved when the request was accepted and flows to logistics for pick & ship; the buy shortfall is on a draft purchase request.","prPill":"Purchase request {{number}}"},"approve":{"title":"Approve","existingSub":"Producing more of an existing product uses its already-approved production BOM — no new approval needed.","existingSubReview":"Producing more of an existing product uses its production BOM — review and accept any draft BOM before it goes to the floor.","existingSubNone":"Only parts and materials — they are reserved or bought, so there is no production BOM to approve.","newSub":"The approver gets this task, reviews the BOM, then approves or requests changes — the same gate as a production BOM.","noBom":"No sample BOM yet","released":"Released to production","returned":"Returned to engineering for changes","waiting":"Waiting with the approver","preparedBy":"Prepared by {{name}}","noBomHint":"Create the sample BOM in the previous stage first.","bomsAccepted":"These products already have approved BOMs.","bomsReview":"Finished products use their existing BOM — accept any draft BOM in the previous stage first.","splitProduce_one":"The {{n}} to produce is released straight to the floor.","splitProduce_other":"The {{n}} to produce are released straight to the floor.","splitBuy_one":"The {{n}} to buy goes on a draft purchase request when the request is accepted.","splitBuy_other":"The {{n}} to buy go on a draft purchase request when the request is accepted.","splitReserve_one":"The {{n}} reserved skips production.","splitReserve_other":"The {{n}} reserved skip production."},"foot":{"choose":"Choose how this sample starts","continues":"{{number}} continues in the record hub — close any time.","step":"Step {{n}} of {{total}}","create":"Create request","finish":"Finish"},"recap":{"request":"Request","origin":"Origin","split":"Stock split","approval":"Approval","reserved":"{{n}} reserved","produced":"{{n}} produced","bought":"{{n}} bought","approvalExisting":"Existing BOM — not required","approvalReview":"Existing BOM — review draft BOM","approvalNone":"Not required — no finished products"}},"nLines_one":"{{count}} line","nLines_other":"{{count}} lines","ofParent":"of {{name}}","unitPcs":"pcs","buyCount":"{{n}} buy","lineKind":{"product":"Finished product","part":"Product detail","material":"Raw material"},"split":{"produce":"Produce {{n}}","buy":"Buy {{n}}"},"picker":{"tickLabel":"Select {{code}} · {{name}}","title":{"product":"Find finished products","partProduct":"Product details · 1 · choose the product","partTick":"Product details · 2 · tick the parts","material":"Find raw materials in the warehouse"},"placeholder":{"product":"Search by product name or SKU…","part":"Search part name or material…","material":"Search by name, code or spec…"},"col":{"select":"Select","choose":"Choose product","code":"Code","name":"Name","spec":"Dimensions / spec","material":"Material","inStock":"In stock","sku":"SKU","product":"Product","bom":"BOM","perProduct":"Per product","willAdd":"Will add"},"groupCustomer":"{{name}} · {{count}}","groupOther":"Other customers · {{count}}","alreadyAdded":"already in the request","noMatch":"Nothing matches.","noBom":"This product has no BOM yet — choose another product.","partCount_one":"{{count}} part","partCount_other":"{{count}} parts","choose":"Choose","changeProduct":"change product","productSets":"Product sets","productSetsHint":"Each ticked part gets per-product qty × sets. You can edit any part afterwards.","showingOf":"Showing {{shown}} of {{total}}. Type a name, code or spec to narrow it down.","close":"Close picker","ticked_one":"{{count}} ticked","ticked_other":"{{count}} ticked","addTicked_one":"Add {{count}} ticked to the request","addTicked_other":"Add {{count}} ticked to the request","addTickedNone":"Add ticked to the request"},"delete":{"title":"Delete {{number}}?","body":"The request is removed from the list and its number is not reused. This cannot be undone.","bodyBom":"Its draft sample BOM stays on the product as a draft BOM. Delete it from Product BOM if it is not needed."},"materials":{"title":"Materials sent to production","hint":"What the sample’s production consumes: each line’s BOM × the quantity to produce, a part’s own material, a material line itself. Read-only — nothing is issued or ordered here.","export":"Export CSV","loading":"Loading materials…","loadError":"Couldn’t load the materials.","retry":"Retry","emptyTitle":"Nothing is sent to production","emptyBody":"No line has a quantity to produce — every line is covered by stock or bought.","notLinked":"Not linked","requestQty":"Request","lineNo":"Line {{n}}","lineCount_one":"{{count}} line","lineCount_other":"{{count}} lines","sends":"{{qty}} to production","finishedShort":"finished {{value}} m³","allowance":"×{{value}}","stockHint":"On hand {{onHand}} · reserved {{reserved}}","breakdownTitle":"From the sample lines","woodNote":"Wood: Required is rough m³ (finished m³ × rough factor) — what production consumes. Buy m³ adds the species’ buying allowance.","gapsTitle":"Materials unknown for some lines","gap":{"no_bom":"No BOM — materials unknown. Build or link this product’s BOM.","no_product":"No product yet — create the sample BOM first.","part_not_on_bom":"This part is no longer on the product’s BOM.","no_materials":"The BOM has no material linked yet.","unlinked_parts":"Parts without a material: {{parts}} — link a material in the BOM."},"col":{"material":"Material","required":"Required","finishedM3":"Finished m³","buyM3":"Buy m³","sheets":"Sheets","available":"Available","lines":"Lines"},"category":{"wood":"Wood","hardware":"Hardware","cushion":"Cushion","packaging":"Packaging","paint":"Paint","other":"Other"},"csv":{"category":"Category","code":"Code","material":"Material","unit":"Unit","required":"Required","finishedM3":"Finished m³","buyM3":"Buy m³","sheets":"Sheets","onHand":"On hand","available":"Available","lines":"Lines"}}},"bomFamilyHealth":{"title":"Family health","description":"Check every model family of a customer: the base's BOM, each finish sharing it, the finish's wood and paint, linked parts, approval and publication.","breadcrumb":"Products","link":"Family health","linkTitle":"Check that each model's finishes share its BOM and are ready","loading":"Loading…","customerLabel":"Customer","customerPlaceholder":"Pick a customer…","onlyFailing":"Only failing","refresh":"Refresh","readOnly":"Read-only: this report never changes a BOM.","search":"Search SKU or name…","error":"Couldn't load the family health report.","errorTitle":"Couldn't load the report","retry":"Try again","familyMembers":"{{count}} members","openBom":"Open the BOM of {{sku}}","noBomLink":"No BOM yet: nothing to open","detailTitle":"Checks for {{sku}}","sectionCount":"{{section}} {{count}}","empty":{"pickTitle":"Pick a customer","pickBody":"The report lists the customer's model families and checks each member.","noFamiliesTitle":"No product families","noFamiliesBody":"{{customer}} has no finished products yet.","allPass":"Every family passes.","noRows":"No members match."},"kpi":{"familiesPass":"Families passing","familiesFail":"Families failing","membersPass":"Members passing","membersFail":"Members failing","ofFamilies":"of {{count}} families","ofMembers":"of {{count}} members"},"col":{"family":"Family","member":"Member","role":"Role","result":"Result"},"role":{"base":"Base","finish":"Finish {{letter}}","finishNoLetter":"Finish"},"status":{"pass":"Pass","fail":"Fail","na":"N/A","info":"Info"},"check":{"structure":"Family structure","finish_chip":"Wood and paint","parts":"Parts linked","labels":"Labels","approval":"Approval","published":"Published","worksheet":"Worksheet paint"},"section":{"wood":"wood","hardware":"hardware","cushion":"cushion","packaging":"packaging","other":"other"},"approval":{"draft":"Draft","pending":"In review","revision":"Returned for revision","approved":"Design approved","priced":"Priced","final":"Final"},"reason":{"no_design":"No BOM","base_own_bom":"Owns the family BOM","base_no_bom":"The base has no BOM","shares_base":"Shares {{base_sku}}'s BOM","other_family_bom":"Shares {{owner_sku}}'s BOM instead of {{base_sku}}'s","own_bom":"Has its own BOM, not sharing {{base_sku}}'s","no_bom":"No BOM and not linked to {{base_sku}}","chip_ok":"{{wood}}, paint {{paint}}","base_paint_ok":"Paint {{paint}}","not_painted":"Not painted","not_in_family_bom":"Not on the family BOM","no_wood":"Wood species not set","no_paint":"Paint code not set","paint_unknown":"Paint code {{code}} is not in the paint library","paint_other_customer":"Paint code {{code}} is not a colour of {{customer}}","parts_ok":"{{wood}} wood parts, {{parts}} parts linked","no_wood_parts":"No wood parts","subcontract_text":"{{count}} subcontract job(s) as text, not linked to a material","unlinked":"{{count}} parts without a material ({{sections}})","labels":"{{count}} labels, {{unlinked}} without a material","no_labels":"No labels","approved":"{{status}}, version {{version}}","in_progress":"{{status}}, version {{version}}","published":"Published {{version}} from BOM version {{design_version}}","stale":"Active version {{version}} comes from BOM version {{source_version}}; the BOM is version {{design_version}}","not_published":"Approved but not published to production","not_approved":"Not approved yet","notApprovedActive":"Not approved yet; production uses {{active}}","formula_ok":"Formula {{code}}, {{components}} components","no_surface":"The BOM has no painted surface (m²): paint quantities would be 0","formula_empty":"Formula {{code}} has no components","base_own_lines":"Priced from the base's own finishing lines"}},"bomImportReadiness":{"title":"BOM import readiness","description":"Check many dự trù workbooks at once and see what to set up before importing them. Read-only — nothing is imported.","breadcrumb":"Products","loading":"Loading…","dash":"—","more_one":"+{{count}} more","more_other":"+{{count}} more","setup":{"filesLabel":"Workbooks","choose":"Choose workbooks","addMore":"Add more workbooks","clear":"Clear all","hint":".xlsb or .xlsx, up to 25 MB each. Pick every workbook you plan to import.","customerLabel":"Customer (optional)","customerPlaceholder":"Use the customer in each file name","customerHint":"Leave empty when the files belong to different customers — each file's customer is read from its name.","remove":"Remove {{name}}","selected_one":"{{count}} workbook chosen · {{size}}","selected_other":"{{count}} workbooks chosen · {{size}}","run_one":"Check {{count}} workbook","run_other":"Check {{count}} workbooks","runNone":"Check workbooks","readOnly":"Each file is previewed; nothing is imported.","skipped_one":"{{count}} file will be skipped (see the list).","skipped_other":"{{count}} files will be skipped (see the list).","problem":{"type":"Not .xlsb / .xlsx","size":"Over 25 MB","empty":"Empty file"}},"empty":{"title":"No workbooks chosen yet","body":"Choose the dự trù workbooks you plan to import. The check previews each one and lists the customers, product types, paint formulas, materials and units to set up first."},"run":{"progress":"Checking {{current}} of {{total}}","current":"Now: {{name}}","progressLabel":"Readiness check progress","cancel":"Cancel","cancelled":"Stopped after {{done}} of {{total}} workbooks — this report covers those only.","again":"Check again"},"report":{"printedOn_one":"Checked {{date}} · {{count}} workbook · preview only — nothing was imported","printedOn_other":"Checked {{date}} · {{count}} workbooks · preview only — nothing was imported"},"actions":{"print":"Print / save as PDF","worklist":"Download worklist (Excel)","worklistError":"Could not build the worklist","materialsFile":"Download as Materials import file","materialsFileHint":"The Materials import template, pre-filled with every missing size. Fill in the group / type / grade columns, then import it in Materials.","materialsFileError":"Could not build the Materials import file"},"headline":{"blocked":{"title_one":"Not ready — {{count}} gap blocks the import","title_other":"Not ready — {{count}} gaps block the import","body":"Fix the rows marked 'Yes' under 'Blocks import?' first; everything else can follow."},"ready":{"title":"Ready to import","body_one":"Nothing blocks the import. Set up {{count}} more item so the BOMs are costed and linked to stock.","body_other":"Nothing blocks the import. Set up {{count}} more items so the BOMs are costed and linked to stock."},"clear":{"title":"All clear","body":"Every ordered product, paint code, material and unit in these workbooks is already set up."},"none":{"title":"No workbook could be checked","body":"Every file failed — see the reasons under Workbooks checked, fix them and check again."},"failed_one":"{{count}} workbook could not be checked — the result covers the others only.","failed_other":"{{count}} workbooks could not be checked — the result covers the others only.","skipped_one":"{{count}} file skipped (not a workbook).","skipped_other":"{{count}} files skipped (not workbooks).","partial":{"title":"Partial check — {{checked}} of {{total}} workbooks checked","body_one":"Nothing in the checked workbooks blocks the import, but {{count}} workbook was not checked. Check every workbook before importing.","body_other":"Nothing in the checked workbooks blocks the import, but {{count}} workbooks were not checked. Check every workbook before importing."}},"kpi":{"files":"Workbooks checked","blocking":"Gaps that block the import","advisory":"Items to set up","was":"was {{value}} last time"},"glance":{"title":"At a glance","col":{"area":"Area","gap":"Gap found","blocks":"Blocks import?","action":"Action"},"area":{"customers":"Customers","fg":"Finished goods","paint":"Paint library","missing":"Missing materials","choose":"Materials to choose","units":"Units of measure"},"gap":{"customers_one":"{{count}} workbook has no customer","customers_other":"{{count}} workbooks have no customer","customersNone":"Every workbook has a customer","fg":"{{created}} to create · {{needType}}","fgNone":"Every ordered product is already linked","paint_one":"{{count}} code to create ({{descriptions}})","paint_other":"{{count}} codes to create ({{descriptions}})","paintCodes_one":"{{count}} code to create","paintCodes_other":"{{count}} codes to create","paintNone":"Every paint code is in the library","paintUnchecked":"Not checked — needs paint-library access","missing_one":"{{count}} material ({{sizes}}) not in the catalogue","missing_other":"{{count}} materials ({{sizes}}) not in the catalogue","missingNone":"Every material is in the catalogue","choose_one":"{{count}} material matches several catalogue items","choose_other":"{{count}} materials match several catalogue items","chooseNone":"No choices needed","units_one":"{{count}} workbook unit has no matching unit","units_other":"{{count}} workbook units have no matching unit","unitsNone":"Every unit exists","unitsUnchecked":"Not checked — the unit list could not be loaded","notChecked":"Not checked — no workbook could be read"},"blocks":{"yes":"Yes","no":"No","ready":"Ready","unchecked":"Not checked","partial":"Not all checked"},"action":{"customers":"Add the customer in Contacts, or import that workbook with the customer picked by hand.","fgType":"Choose a product type for each one marked \"Needs a type\" (or add the category).","fg":"Nothing to do now — the import creates them with standard SKUs.","paint":"Create the formulas in the paint library using the exact codes below; codes several customers share go in the house palette.","missing":"Add them to the catalogue — download the Materials import file.","choose":"Pick one per import in the preview, or agree a default grade.","units":"Ask an administrator to add the units before creating the materials."},"needType_one":"{{count}} needs a product type","needType_other":"{{count}} need a product type","descriptions_one":"{{count}} is a description, not a code","descriptions_other":"{{count}} are descriptions, not codes"},"order":{"title":"Recommended order","step1":"Units of measure — add the missing units so new materials get the right unit.","step2":"Materials — add the missing materials (the Materials import file lists every size).","step3":"Paint formulas — create them with the exact codes shown; codes used by several customers go in the house palette.","step4":"Decisions — product types, workbooks without a customer, materials matching several items.","step5":"Import — run the workbooks oldest first. Every BOM lands as a draft for review."},"paint":{"byNameNote_one":"{{count}} paint description is linked by formula name — no code to create.","byNameNote_other":"{{count}} paint descriptions are linked by formula name — no code to create.","title":"Paint formulas to create","count_one":"{{count}} code","count_other":"{{count}} codes","note":"Spellings that differ only by spaces, hyphens or letter case are one code to the import (ZZ01/99 = ZZ-01/99), so create each once with the spelling shown.","unchecked":"The paint check needs access to the paint library. Ask for paint-library access, or have someone who has it run this check.","none":"Every paint code the ordered products name is already in the library.","col":{"code":"Code to create","also":"Also written as","client":"Create as","customers":"Customers using it","rows":"Rows","examples":"Example products","library":"Paint library","action":"Action"},"housePalette":"House palette (no client)","noCustomer":"(workbook without customer)","notCode":"Not a code","status":{"matched":"In library","not_in_library":"Not in library","partial":"Some customers only"},"create":"Create formula","createLabel":"Create paint formula {{code}}","twoFinish":{"title_one":"Product with two finishes ({{count}})","title_other":"Products with two finishes ({{count}})","note":"The import links the first code and warns about the others — confirm that is enough.","col":{"customer":"Customer","product":"Product","colour":"Colour cell in the file","linked":"Linked","notLinked":"Not linked"}},"noPaint_one":"{{count}} ordered row names no paint (e.g. fabric covers) — no action needed.","noPaint_other":"{{count}} ordered rows name no paint (e.g. fabric covers) — no action needed.","shared_one":"Used by {{count}} customer ({{customers}})","shared_other":"Used by {{count}} customers → create as house palette ({{customers}})","partialHint":"In the library for {{customers}} only — consider making it house palette.","woodUnresolved":{"title_one":"Wood paint not in the library ({{count}})","title_other":"Wood paint not in the library ({{count}})","note":"These wood-sheet paint texts are neither a paint code nor a colour name in the library. Their parts import without a paint code — add the colour (or its name) to the library first, or pick the paint on the BOM after import.","col":{"text":"Text in the file","customers":"Customers","products":"Products","examples":"Examples"}}},"fg":{"title":"Finished goods the import will create","summary":"{{created}} to create · {{matched}} already linked · {{suggested}} to confirm","none":"Every ordered product is already linked to a finished good.","col":{"customer":"Customer","name":"Finished good (standard name)","type":"Type","paint":"Paint code(s)","files":"Files","qty":"Quantity on POs","materials":"Missing / to choose"},"needsType":"Needs a type","noCustomer":"(no customer)","materials":"{{missing}} / {{ambiguous}}","type":"{{code}} · {{name}}"},"choose":{"title":"Materials to choose","count_one":"{{count}} material","count_other":"{{count}} materials","note":"Each matches several catalogue materials, so someone picks one per import in the preview.","none":"No material matches more than one catalogue item.","col":{"category":"Category","name":"Material in the file","sizes":"Sizes seen","unit":"Unit","rows":"Rows","candidates":"Catalogue candidates"}},"missing":{"title":"Missing materials","note":"They import as text lines — not costed and not linked to stock. Every size is in the worklist and the Materials import file.","none":"Every material the ordered products use is in the catalogue.","noMaterialsAccess":"Downloading them as a Materials import file needs the permission to import materials.","col":{"name":"Material","unit":"Unit","sizes":"Sizes","examples":"Example sizes","rows":"Rows","files":"Files"},"group":"{{category}} — {{materials}}, {{sizes}}","count_one":"{{count}} material","count_other":"{{count}} materials"},"units":{"title":"Units of measure","note":"Workbook units with no matching unit (compared ignoring accents and letter case). BOM lines keep the workbook text; add the units before creating the missing materials.","none":"Every unit the workbooks use exists.","unchecked":"The unit check could not run — the unit list could not be loaded.","col":{"unit":"Workbook unit","code":"Suggested code","materials":"Materials using it"},"count_one":"{{count}} unit","count_other":"{{count}} units"},"files":{"title":"Workbooks checked","note":"'Missing' and 'to choose' count only materials used by that workbook's ordered products. 'Notes' are the importer's own messages about the workbook.","col":{"index":"Row number","name":"Workbook","customer":"Customer","ordered":"Ordered","missing":"Missing","ambiguous":"To choose","notes":"Notes","status":"Status"},"fromFile":"from the file name","picked":"picked on this page","noCustomer":"No customer","candidates":"Likely: {{names}}","status":{"done":"Checked","failed":"Failed"},"count_one":"{{count}} workbook","count_other":"{{count}} workbooks"},"sizes_one":"{{count}} size","sizes_other":"{{count}} sizes","materials_one":"{{count}} material","materials_other":"{{count}} materials","errors":{"fileType":"Choose an .xlsb or .xlsx workbook.","tooLarge":"The file is larger than 25 MB.","empty":"The file is empty.","preview":"The workbook could not be previewed.","forbidden":"You don’t have permission for this check.","network":"The file could not be sent. This usually means the workbook was saved again (or re-synced by OneDrive / Zalo) after you picked it, or the connection dropped. Close the file in Excel, pick it again and retry."}},"bulkDelete":{"checking":"Checking which of the selected rows can be deleted…","deleting":"Deleting {{done}} of {{total}}…","progressLabel":"Delete progress","keptPreviewShowWhy_one":"{{count}} will be kept because it is in use. Show why","keptPreviewShowWhy_other":"{{count}} will be kept because they are in use. Show why","keptShowWhy_one":"{{count}} was kept because it is in use. Show why","keptShowWhy_other":"{{count}} were kept because they are in use. Show why","dismiss":"Hide this list","checkFailed":"Could not check the selection","deleteFailed":"Delete stopped after {{done}} of {{total}}","retry":"Nothing was changed for the rest. Try again.","noneDeletable_one":"The selected row is in use, so nothing was deleted.","noneDeletable_other":"All {{count}} selected rows are in use, so nothing was deleted.","keptNote_one":"{{count}} kept because it is in use.","keptNote_other":"{{count}} kept because they are in use."},"productFamily":{"base":"Base","variantCount_one":"{{count}} variant","variantCount_other":"{{count}} variants","variantCountShown_one":"{{shown}} of {{count}} variant","variantCountShown_other":"{{shown}} of {{count}} variants","variant":"Variant","letterTitle":"Variant {{letter}}","letterToConfirm":"Letter to confirm. Please review the SKU.","variantOf":"Variant of {{name}}","variantOfUnknown":"Variant of a product not in this list","expand":"Show the variants of {{name}}","collapse":"Hide the variants of {{name}}","groupToggle":"Group variants","groupToggleHint":"Show each finish variant under its base product","contextBase":"Shown because its variants match","section":{"title":"Variants","hint":"Finishes of this model. Each takes this product's number with its own letter.","colLetter":"Letter","colSku":"SKU","colName":"Name","colFinish":"Finish","colBom":"BOM","open":"Open BOM","openAria":"Open the BOM of {{name}}","sharesBom":"Shares this BOM","ownBom":"Own BOM","thisBom":"This BOM","loading":"Loading variants…","loadError":"Couldn't load the variants.","retry":"Try again"},"banner":{"variantOf":"Variant {{letter}} of {{name}} ({{sku}})","variantOfNoLetter":"Variant of {{name}} ({{sku}})","ownBom":"Has its own BOM for now","openBase":"Open the base BOM","skuNotSet":"SKU not set","baseMissing":"Its base product is no longer in the catalogue.","loadError":"Couldn't load the base product.","retry":"Try again"},"import":{"groupToggle":"Group by family","model":"Model: {{name}}","finishes_one":"{{count}} finish","finishes_other":"{{count}} finishes","fromMap":"From family map","baseLetter":"Base · {{letter}}","takesNumber":"Takes {{name}}'s number","tickBase":"Tick the base so these finishes share its number"},"group":{"action":"Group as variants","actionHint":"Select at least 2 finished goods to group them as variants of one base","actionNotFinished":"Only finished goods can be grouped as variants","title":"Group as variants","intro":"Pick the base product. The other selected products become its variants.","skuWarning":"SKUs will change. Each variant takes the base's number and the next free letter. The new letter stays marked 'to confirm' until someone saves the product's Variant field.","pickBase":"Base product","previewTitle":"SKU changes","previewLoading":"Checking the new SKUs…","previewError":"Couldn't preview the new SKUs.","previewRetry":"Try again","colOld":"Current SKU","colNew":"New SKU","keepsSku":"Keeps its SKU, linked to the base","alreadyVariant":"Already a variant of this base","movesFromOtherBase":"Moves from another base","cannotGroup":"Can't be grouped","confirm_one":"Group {{count}} variant","confirm_other":"Group {{count}} variants","cancel":"Cancel","nothingToDo":"Nothing to change: these products are already variants of this base.","done_one":"{{count}} product grouped under {{sku}}.","done_other":"{{count}} products grouped under {{sku}}.","someFailed_one":"{{count}} product couldn't be grouped: {{reason}}","someFailed_other":"{{count}} products couldn't be grouped. First reason: {{reason}}","error":"Couldn't group these products.","selectRow":"Select {{sku}}","selectAll":"Select all {{n}} listed products","clear":"Clear selection","bulkAria":"Actions on the selected products","ungroup":"Ungroup","ungroupConfirmTitle":"Ungroup {{sku}}?","ungroupConfirmBody":"{{sku}} stops being a variant of its base and is listed on its own. Its SKU is kept.","ungrouping":"Ungrouping…","ungroupDone":"{{sku}} is no longer a variant. Its SKU is kept.","ungroupError":"Couldn't ungroup {{sku}}.","split":"Split out","splitting":"Splitting out…","splitConfirmTitle":"Split out {{sku}}?","splitConfirmBody":"{{sku}} stops being a variant and gets a number of its own: {{sku}} → {{newSku}}. Its old number is not reused.","splitDone":"{{sku}} is now {{newSku}}, a product of its own.","splitError":"Couldn't split out {{sku}}."}},"materialLabel":{"mm":"{{value}} mm"},"workCentreList":{"title":"Work centre list","breadcrumb":"Settings","intro":"The stations, lines and machines your plant runs, with their hourly capacity, efficiency and cost. Their capacity sizes the Scheduling board.","new":"New work centre","retry":"Retry","hint":{"title":"Stage codes feed Scheduling capacity","body":"Give a work centre the code of a production stage ({{codes}}), or that code with a suffix such as ASM-01, and its capacity sizes that stage on the Scheduling board: capacity per day = capacity per hour × shift hours (8 h for now) × efficiency. Several work centres on one stage add up."},"table":{"code":"Code","name":"Name","stage":"Scheduling stage","stageNoneHint":"Not a stage code: does not feed Scheduling capacity.","capacity":"Capacity / hour","efficiency":"Efficiency","percent":"{{value}} %","parallel":"Parallel jobs","cost":"Cost / hour (VND)","warehouse":"Warehouse","type":"Type","status":"Status","stageShort":"Stage","capacityShort":"Cap. / h","efficiencyShort":"Eff.","parallelShort":"Parallel","costShort":"Cost / h"},"type":{"inHouse":"In-house","subcontractor":"Subcontractor"},"status":{"active":"Active","inactive":"Inactive"},"empty":{"title":"No work centres yet","body":"Create one per production stage to give the Scheduling board real capacity."},"errors":{"load":"Couldn't load the work centres."},"drawer":{"kickerNew":"New work centre","kickerEdit":"Edit work centre","untitled":"Untitled work centre","code":"Code","codePlaceholder":"e.g. ASM-01","feeds":"Feeds the {{stage}} stage ({{code}}) in Scheduling.","notStage":"Not a stage code: this work centre does not feed Scheduling capacity.","name":"Name","namePlaceholder":"e.g. Assembly line A","nameVi":"Name (Vietnamese)","description":"Description","capacity":"Capacity per hour (pcs)","efficiency":"Efficiency (%)","parallel":"Parallel jobs","labourCost":"Labour cost / h (VND)","overheadCost":"Overhead cost / h (VND)","type":"Type","status":"Status","warehouse":"Warehouse","save":"Save","cancel":"Cancel","delete":"Delete","confirmDelete":"Delete work centre {{code}}?","confirmDeleteBody":"It disappears from this list and from Scheduling capacity. Its code stays reserved and cannot be reused.","drying":"Drying hours after this stage","dryingHint":"Hours the pieces must dry (glue, stain, paint) before the next stage may start. 0 = none. The plan counts it in this work centre's shift hours, one plan day per shift, weekends included; if several work centres feed one stage, the longest wait applies."},"toast":{"saved":"Work centre {{code}} saved","deleted":"Work centre {{code}} deleted","saveError":"Couldn't save the work centre."},"invalid":{"required":"Code and name are required.","numbers":"Check the numbers: capacity and costs 0 or more, efficiency 0–200 %, parallel jobs a whole number of 1 or more.","drying":"Drying hours must be between 0 and 240. Enter how long the pieces dry after this stage, or 0 for none."}},"shopfloorTablets":{"breadcrumb":"Settings","title":"Shop-floor tablets","intro":"Tablets on the factory floor where operators sign in with a PIN to see and work their station's orders. Register a tablet, pair it once with the QR code, and set a PIN for each operator.","new":"Register tablet","retry":"Retry","sections":{"tablets":"Tablets","pins":"Operator PINs"},"hint":{"noWcTitle":"Some tablets show no work orders","noWcBody_one":"{{count}} active tablet has no work centre, so operators there see an empty list. Open it and choose its work centre.","noWcBody_other":"{{count}} active tablets have no work centre, so operators there see an empty list. Open each one and choose its work centre."},"table":{"code":"Code","name":"Name","workCentre":"Work centre","status":"Status","lastSeen":"Last sign-in","never":"Never","noWorkCentre":"No work centre","noWorkCentreHint":"Operators at this tablet see no work orders until it has a work centre."},"status":{"active":"Active","inactive":"Deactivated"},"empty":{"title":"No tablets yet","body":"Register the first tablet, then scan its pairing QR code on the device."},"drawer":{"kickerNew":"Register tablet","kickerEdit":"Edit tablet","untitled":"New tablet","code":"Code","codePlaceholder":"e.g. CUT-01","codeHint":"A short unique code. It can't be changed later.","codeLocked":"The code can't be changed. Register a new tablet if you need a different one.","name":"Name","namePlaceholder":"e.g. Cutting line tablet","workCentre":"Work centre","noWorkCentre":"— No work centre —","workCentreHint":"Operators at this tablet see the released work orders with a step at this work centre.","noWorkCentreWarning":"Without a work centre, operators at this tablet see no work orders.","inactiveTitle":"This tablet is deactivated","inactiveBody":"Nobody can sign in on it. Re-pair it to put it back in service.","save":"Save","registerAndPair":"Register and pair","cancel":"Cancel","repair":"Re-pair","deactivate":"Deactivate"},"pairing":{"kicker":"Pair tablet","onceTitle":"Valid for 10 minutes, for one tablet only","onceBody":"Scan it on the tablet now. The code works once, on one device, until {{time}}. If it runs out or you close this panel, use Re-pair to get a new code.","step1":"On the tablet, open the camera or a QR scanner app.","step2":"Scan the code below, or open the pairing link in the tablet's browser.","step3":"The tablet opens the PIN sign-in screen. Add it to the home screen to keep it there.","link":"Pairing link","copy":"Copy link","done":"Done"},"confirmRepair":{"title":"Re-pair {{name}}?","body":"The tablet's current pairing stops working right away and anyone signed in on it is signed out. You'll get a new QR code to pair it again.","confirm":"Re-pair"},"confirmDeactivate":{"title":"Deactivate {{name}}?","body":"Nobody will be able to sign in on this tablet, and anyone signed in now is signed out. You can bring it back later with Re-pair.","confirm":"Deactivate"},"pins":{"intro":"Operators sign in on a tablet with their short ID and a 4–6 digit PIN. Choose a person to set or reset their PIN. Resetting also unlocks a locked PIN.","table":{"name":"Person","shortId":"Short ID","pin":"PIN","lastUsed":"Last sign-in"},"state":{"set":"PIN set","notSet":"No PIN","locked":"Locked"},"empty":{"title":"No active people","body":"Add people in Users first, then set their PIN here."}},"pinDrawer":{"kickerSet":"Set PIN","kickerReset":"Reset PIN","intro":"They sign in on a tablet with the short ID {{shortId}} and this PIN.","lockedTitle":"This PIN is locked","lockedBody":"Too many wrong tries locked it for 15 minutes. Setting a new PIN unlocks it now.","pin":"New PIN","pinHint":"4 to 6 digits. It isn't shown again after you save.","confirm":"Repeat the PIN","save":"Save PIN","invalidFormat":"The PIN must be 4 to 6 digits. Type only numbers.","invalidMismatch":"The two PINs don't match. Type the same PIN in both boxes."},"invalid":{"required":"Code and name are required. Fill them in, then save."},"errors":{"loadTitle":"Couldn't load this list","load":"The list didn't load. Check your connection and retry."},"toast":{"saved":"{{name}} saved.","registered":"{{name}} registered. Pair it now.","deactivated":"{{name}} deactivated.","saveError":"Couldn't save the tablet. Try again.","copied":"Pairing link copied.","pinSaved":"PIN saved for {{name}}.","pinError":"Couldn't save the PIN. Try again."}},"woodAllowance":{"times":"×{{value}}","incl":"incl. allowance ×{{factor}}","source":{"pi_species":"PI · species","pi_all":"PI · all species","species":"Species","board":"Board","keyword":"Default","none":"Not set","mixed":"Mixed","line":"BOM line","override":"What-if","fallback":"Not set"},"sourceHint":{"pi_species":"Set on this PI for the species","pi_all":"This PI's value for every wood species","species":"The species' own value in the wood price book","board":"Sheet goods buy at ×1.0: whole sheets are their allowance","keyword":"Workbook default for the species (×1.23 or ×1.3)","none":"No allowance known: bought at ×1.0","mixed":"Several PIs or species with different allowances","line":"The BOM line's own waste %","override":"What-if percentage entered on this screen","fallback":"No allowance known for this wood: bought with the old 12 % wood buffer (×1.12)"},"note":{"lead":"Wood buying allowance: {{summary}} ·","link":"change it in Purchasing › Material requirements","defaults":"default per species"},"card":{"title":"Wood buying allowance","sub":"purchasing","colSpecies":"Species","colDefault":"Default","colThisPi":"This PI","allSpecies":"All species","allSpeciesHint":"Every wood species without its own value here (boards excluded)","perSpecies":"Per species","notSet":"Not set (species defaults)","board":"board","inputLabel":"Buying allowance for {{species}}","inheritPlaceholder":"Default","loading":"Loading wood species…","error":"Could not load the wood buying allowances.","empty":"No wood in this PI's BOMs yet.","editHint":"Leave a field blank to use the default. Allowed from ×{{min}} to ×{{max}}. Purchasing buys rough m³ × this factor.","saved":"Wood buying allowances saved","defaultsOnly":"defaults","notUsed":"No longer used by this PI's BOMs","clearedOnSave":"Not in the wood price book: cleared when you save"}},"bomWoodRecalc":{"title":"Wood recalc","description":"Published BOMs keep the wood quantities they were approved with. This compares each one with what re-approving would publish now (finished m³ × rough factor).","breadcrumb":"Products","link":"Wood recalc","linkTitle":"See which published BOMs would change wood m³ if re-approved","loading":"Loading…","refresh":"Refresh","readOnly":"Read-only: nothing is re-quantified here. Reopen and approve a BOM to publish its new quantities.","onlyChanged":"Only changed","search":"Search SKU or name…","error":"Couldn’t load the wood recalc preview.","errorTitle":"Couldn’t load the preview","retry":"Try again","openBom":"Open the BOM of {{sku}}","unchanged":"No change","lines":"{{count}} lines","designChanged":"Newer draft","designChangedHint":"The design has moved on since it was published: the new figure is the current design’s.","col":{"product":"Product","version":"Published","published":"Published m³","new":"New rule m³","delta":"Change","roughSizes":"Rough sizes drove m³","noSheet":"Boards without sheet size","confirmedPis":"Confirmed PIs"},"kpi":{"products":"Published BOMs","changed":"Would change","ofProducts":"of {{count}} BOMs","published":"Published wood m³","new":"New rule wood m³"},"empty":{"noneTitle":"No published BOMs","noneBody":"Approve a BOM to publish it; its wood will be compared here.","noneChanged":"Every published BOM already matches the current rule.","noRows":"No BOMs match."}},"signatures":{"docType":{"po":"Purchase order","rfq":"Request for quotation","vendor_contract":"Vendor contract","pi":"Proforma invoice","sale_contract":"Sale contract","commercial_invoice":"Commercial invoice","quotation":"Quotation","price_proposal":"Price proposal"},"side":{"internal":"Our company","external":"Other party"},"assigneeKind":{"user":"A specific user","role":"Anyone in a role","signer":"A company signer","document_actor":"The document's own person","counterparty":"The vendor or customer","pick":"Chosen on each document"},"documentActor":{"submitter":"Who submitted it","sender":"Who sent it","owner":"Its owner"},"requestStatus":{"draft":"Draft","pending":"Awaiting signature","partially_signed":"Partially signed","completed":"Signed","declined":"Declined","voided":"Voided","expired":"Expired"},"slotStatus":{"waiting":"Not yet","pending":"Awaiting signature","signed":"Signed","declined":"Declined","waived":"Waived"},"method":{"click":"Signed in the app","typed":"Typed name","drawn":"Drawn signature","uploaded_scan":"Signed copy uploaded","provider":"E-signature provider","waiver":"Waived"},"panel":{"title":"Signatures","loading":"Loading signatures…","error":"Could not load the signatures.","retry":"Retry","notRequested":"Not requested yet","legacySigned":"Confirmed signed on {{date}} (recorded before e-signatures).","fromTemplate":"These are the blocks this document signs with. Signing in the app is coming next.","noBlocks":"This document has no signature blocks.","optional":"(optional)","unassigned":"Not assigned","signedAt":"Signed {{when}}"},"files":{"title":"Signed copies","loading":"Loading signed copies…","error":"Could not load the signed copies.","retry":"Retry","empty":"No signed copy on file.","untitled":"Signed copy","current":"Current","superseded":"Superseded","uploadedBy":"Uploaded {{when}} by {{by}}","uploadedOn":"Uploaded {{when}}","imported":"Recorded before e-signatures","notScanned":"Not virus-scanned","open":"Open","openFailed":"Couldn’t open the file.","replace":"Replace","markSuperseded":"Mark superseded","upload":"Upload signed copy","uploadHint":"PDF, JPG or PNG, up to 50 MB. Earlier copies stay in the history.","uploading":"Uploading…","uploaded":"Signed copy uploaded","uploadedCompleted":"Signed copy uploaded — the document is now signed","uploadFailed":"Couldn’t upload the signed copy.","replaced":"Signed copy replaced — the earlier one stays in the history","supersedeTitle":"Mark this copy superseded?","supersedeBody":"The file stays in the history and is never deleted. The document keeps its signed status.","reasonLabel":"Reason","reasonPlaceholder":"Why is this copy no longer the valid one?","supersededToast":"Copy marked superseded","saveFailed":"Couldn’t save. Try again.","history":"History ({{count}})","historyLine":"Superseded {{when}} by {{by}}","historyLineNoBy":"Superseded {{when}}","reasonLine":"Reason: {{reason}}","reasonReplaced":"replaced by a newer copy","reasonRemoved":"removed from the document","waived":"Confirmed without a signed copy","waivedBy":"by {{by}} · {{when}}"},"waiver":{"title":"Confirm without a signed copy?","body":"This records a waiver: the signature is marked as waived with your reason and kept in the audit trail. You can still upload the signed copy later.","reasonLabel":"Reason (required)","reasonPlaceholder":"e.g. The supplier confirmed by e-mail","confirm":"Confirm without copy"}},"codeAuthority":{"customerHint":"Customer codes are issued by Sales, so this code is assigned automatically from the name. To change the letters, ask an administrator for the Issue customer codes right (Settings › Roles & Permissions › Sales › Contacts › Customer codes).","productHint":"Product codes are issued by Technical. The code is assigned automatically."},"docLanguage":{"title":"Document language","titleAlt":"Ngôn ngữ chứng từ","main":"Main language","second":"Second language","none":"None (single language)","swap":"⇄ Swap main and second","draftPill":"{{lang}} draft translation","jaNotice":"Have the Japanese text reviewed before the customer signs.","scope":"Applies to the PI, sale contract, invoices, CBM sheet and packing list of this order. Customer default for {{customer}}: {{pair}}.","reset":"Reset to customer default","apply":"Apply","fromCustomer":"from customer default"},"codeGuidance":{"choicesLabel":"What should happen to the product code?","recommended":"Recommended","continue":"Continue","cancel":"Cancel","noAuthority":"Only Technical can issue the new product code. Save now and ask Technical to apply the rule.","title":{"r7_one":"Structural change on one variant","r7_order":"This design is on an active order","r9":"Different finishing notes","finish":"Different finish"},"rule":{"r7_one":"VHT rule R7: only {{sku}} changes; the model's other variants have BOMs of their own. A structural change on one variant makes it a new model with its own sequence number. The other variants keep their codes.","r7_order":"VHT rule R7: an active sales order or PI holds the current design of {{sku}}. The new design gets a new code; {{sku}} stays on the order unchanged.","r9":"VHT rule R9: the same parts with different finishing notes (e.g. distressed) are a new product with a code of its own, not a variant.","finish":"The same parts in another wood or paint are a finish of the model: the new finish takes the model's next variant letter instead of changing {{sku}}."},"change":{"structural":"Parts that change: {{parts}}","structuralGeneric":"The parts change.","finishingNotes":"The finishing notes change.","finish":"The finish changes on: {{parts}}","finishGeneric":"The finish changes."},"orders":"Active orders","orderPi":"PI {{number}} · {{sku}}","orderSo":"Sales order {{number}} · {{sku}}","action":{"keep":"Save without changing the code","keepHint":"For a correction that does not make a new design.","new_model":"Make it a new model","new_modelHint":"{{sku}} gets the next sequence number of its own; the other variants keep their codes.","new_product":"Save as a new product","new_productHint":"The change is saved on a copy with a new code of its own. {{sku}} stays as it is.","variant":"Save as new variant {{newSku}}","variantHint":"A new finish of this model with the change. {{sku}} stays as it is."},"done":{"new_model":"{{sku}} is now {{newSku}}.","new_product":"Saved as new product {{newSku}}.","variant":"Saved as new variant {{newSku}}."},"applyError":"The BOM was saved, but the code could not be changed. Try again from the Variant field or the Product List.","copyError":"Couldn't save the change as a new product. Nothing was changed.","applyErrorTitle":"The product code was not changed","orphaned":"Couldn't save the change on the new product {{newSku}}, and {{newSku}} couldn't be removed again. Nothing changed on this product. Delete {{newSku}} from the Product List.","unavailable":"Not possible right now: {{actions}}.","dismiss":"Dismiss","variant":{"title":"Make {{sku}} a variant of {{base}}?","finish":"Only the finish differs (wood, paint): a variant letter of this model is right.","notCompared":"One of the two has no BOM to compare yet. A variant letter is only right when the parts are the same and only the finish differs.","r7_one":"VHT rule R7: {{sku}} has other parts than {{base}} ({{parts}}). A different structure is a model of its own: keep its own number.","r9":"VHT rule R9: same parts, but different finishing notes (e.g. distressed). That is a product code of its own, not a variant.","join":"Make it variant {{newSku}}","joinHint":"Its current number {{old}} is left unused.","keep":"Keep its own number","keepHint":"Nothing changes."},"newFinish":{"title":"New finish of this model","message":"A variant letter is for the same parts in another wood or paint. If this version will have other parts (VHT rule R7) or other finishing notes such as distressed (R9), it needs a model number of its own.","variant":"Create variant {{newSku}}","variantHint":"Same parts, another finish. The BOM is copied across.","new_model":"Create as a new model","new_modelHint":"A copy with the next sequence number of its own; set its finish on its BOM."},"customer":{"title":"Shared product code","message":"VHT rule R13: {{sku}} was first ordered by {{owner}}, so the code is theirs. {{customer}} shares the same code; no new code is created.","addPi":"Add to the PI","addSample":"Add to the sample request","otherCustomers":"Include other customers' products","otherCustomersHint":"A product another customer ordered first keeps its code (VHT rule R13)."}},"blockers":{"next":{"rfq":{"DRAFT":"send it to suppliers","SENT":"record the supplier quotes","QUOTING":"record the supplier quotes, then compare them","COMPARING":"award a supplier or cancel the RFQ","AWARDED":"nothing — the RFQ is closed","CANCELLED":"nothing — the RFQ is closed"},"productionRequest":{"draft":"attach the four documents, then submit it for review","review":"have an approver approve it","approved":"distribute it to the departments","distributed":"nothing — it is already distributed"},"shipSo":{"draft":"Submit it for approval, then confirm it.","pending_approval":"Wait for it to be approved, then confirm it.","approved":"Confirm the order, then create the delivery note.","shipped":"It has already shipped, so there is nothing more to ship.","delivered":"It has already been delivered, so there is nothing more to ship.","invoiced":"It has already been delivered and invoiced, so there is nothing to ship.","closed":"The order is closed, so there is nothing to ship.","cancelled":"The order is cancelled, so there is nothing to ship."},"shipPi":{"draft":"Confirm the proforma invoice first, then create the delivery note.","closed":"The proforma invoice is closed, so there is nothing more to ship.","cancelled":"The proforma invoice is cancelled, so there is nothing to ship."}},"status":{"received":"Received","inspecting":"Inspecting","accepted":"Accepted","posted":"Posted","invoiced":"Invoiced","closed":"Closed","substituted":"Substituted","cancelled":"Cancelled"},"anyBin":"any bin","noLines":"none"},"noteCell":{"add":"Add note","edit":"Edit note","title":"Note","titleFor":"Note — {{label}}","ariaHas":"{{label}}: has a note. Press Enter to read or edit.","ariaHasReadOnly":"{{label}}: has a note.","ariaEmpty":"{{label}}: no note. Press Enter to add one.","indicator":"Has a note","save":"Save","cancel":"Cancel","saveHint":"Ctrl+Enter to save, Esc to cancel","count":"{{count}} / {{max}}","readOnlyDefault":"This note can't be edited here. Open the record in edit mode or ask an admin for edit access.","readOnlyTitle":"Read-only","filterHas":"Has notes","filterYes":"Has notes","filterNo":"No notes","placeholder":"Write a note…"},"machines":{"title":"Machines","breadcrumb":"Manufacturing","intro":"The machines, tools and equipment of the factory, one list for every work centre. Codes follow MH-QĐ-03 (06.<machine type>.<number>); set the format in Settings › SKU Standards › Machine.","retry":"Retry","tabs":{"machines":"Machines","types":"Machine types"},"actions":{"new":"New machine","download":"Download list","downloadHint":"The .xlsx holds every machine and doubles as the import template.","downloadError":"The spreadsheet could not be made. Try again.","upload":"Upload list","uploadHint":"Upload a filled-in machine list to check it before importing.","uploadNoRight":"Uploading adds and changes machines: it needs the permission to create and to edit machines. Ask your administrator."},"errors":{"load":"Couldn't load the machines."},"empty":{"title":"No machines yet","body":"Add machines one by one with New machine, or download the list, fill it in and upload it."},"field":{"code":"Machine code","oldCode":"Old code","machineType":"Machine type","workCentre":"Work centre","name":"Name","nameVi":"Name (Vietnamese)","nameEn":"Name (English)","model":"Model","serialNumber":"Serial number","function":"Function","manufacturer":"Manufacturer","supplier":"Supplier","supplierVendor":"Supplier from the vendor list","supplierText":"Supplier name","countryOfOrigin":"Country of origin","yearOfManufacture":"Year of manufacture","widthM":"Width (m)","depthM":"Depth (m)","dustExtraction":"Dust extraction (diameter × count)","ratedCurrentA":"Rated current (A)","voltagePhase":"Voltage and phase","status":"Status","workshopLocation":"Workshop location","inServiceSince":"In service since","warrantyUntil":"Warranty until","personInCharge":"Person in charge","maintenanceCycleMonths":"Maintenance cycle (months)","notes":"Notes","specification":"Specification","additionalDescription":"Additional description","uom":"Unit (UOM)","supplierItemName":"Supplier item name","quantity":"Quantity"},"status":{"ACTIVE":"Active","DOWN":"Down","RETIRED":"Retired"},"voltage":{"v220_1p":"220 V single-phase","v380_3p":"380 V three-phase","other":"Other"},"tracking":{"individual":"Individual (one record per machine)","pooled":"Pooled (counted by quantity)"},"drawer":{"kickerNew":"New machine","kickerEdit":"Edit machine","untitled":"Untitled machine","save":"Save","cancel":"Cancel","delete":"Delete","choose":"Choose…","none":"None","identity":"Identity","technical":"Technical data","service":"Service and maintenance","tools":"Tools and equipment","quantityHint":"How many are held. Only for machine types counted as a pool.","quantityNeedsPool":"Quantity is only for machine types counted as a pool (Machines › Machine types › Tracking).","codeAuto":"Leave blank: the code is made from the machine type on save — next {{code}}.","codeAutoNoType":"Leave blank to make the code from the machine type (pick one first), or type the code.","codeLocked":"The machine code is its identity and stays as it is.","typeOff":"{{name}} (switched off)","supplierHint":"Pick the vendor when the supplier is in the vendor list; otherwise type the name.","nameHint":"At least one name. With no Vietnamese name, the English name shows in Vietnamese too.","confirmDelete":"Delete machine {{code}}?","confirmDeleteBody":"The machine leaves the list. A machine that production steps are planned on or used can't be deleted — set it to Retired instead."},"invalid":{"workCentre":"Pick the work centre the machine belongs to.","name":"Fill in the Vietnamese or the English name.","typeOrCode":"Pick a machine type (the code is made from it), or type the machine code.","numbers":"{{field}} must be a number of 0 or more.","year":"Year of manufacture must be between 1900 and {{max}}.","decimals":"{{field}} can have at most {{places}} decimal places.","tooLarge":"{{field}} must be less than {{max}}."},"toast":{"saved":"Machine {{code}} saved.","deleted":"Machine {{code}} deleted.","saveError":"The machine couldn't be saved.","imported":"Imported: {{create}} new, {{update}} updated."},"table":{"noType":"—"},"types":{"new":"New machine type","intro":"The machine type is the middle part of the machine code (06.BAO.001). Types an import creates are named by their code until you edit them.","code":"Type code","nameEn":"Name (English)","nameVi":"Name (Vietnamese)","machines":"Machines","status":"Status","active":"Active","inactive":"Switched off","kickerNew":"New machine type","kickerEdit":"Edit machine type","codeHint":"Letters A–Z and digits only, e.g. BAO, CAU, EPN.","codeLocked":"{{count}} machine(s) carry this code, so it can't change.","deleteBlocked":"{{count}} machine(s) use this type, so it cannot be deleted. Move them to another type first.","activeHint":"A switched-off type stays on its machines but can't be picked for new ones.","tracking":"Tracking","trackingHint":"Pooled types hold one record with a quantity (for example 50 identical drills); individual types get one record and one code per machine.","trackingLocked":"{{count}} machine(s) already use this type. Changing the tracking does not change them: set or clear their quantity in the machine itself.","empty":{"title":"No machine types yet","body":"Add the types the machine codes use (BAO, CAU, EPN …). An import adds missing ones too."},"invalidCode":"The type code needs 1–20 letters A–Z or digits.","confirmDelete":"Delete machine type {{code}}?","confirmDeleteBody":"Only a type no machine uses can be deleted; it is removed for good.","saved":"Machine type {{code}} saved.","deleted":"Machine type {{code}} deleted.","saveError":"The machine type couldn't be saved."},"import":{"title":"Check the machine list","file":"File: {{file}}","reading":"Reading the file…","checking":"Checking the machines…","readError":"This file can't be read. Save it as an Excel workbook (.xlsx) and upload it again.","noSheets":"No machine sheet was found in this file: no sheet has machine headers (for example Machine code, Name (Vietnamese), Work centre) in its first 10 rows.","checkError":"The machines couldn't be checked. Try again in a moment.","summary":"{{create}} new · {{update}} to update · {{unchanged}} unchanged · {{errors}} with errors · {{warnings}} with warnings","typesToCreate":"Machine types that will be created: {{codes}}","col":{"row":"Row","code":"Machine code","name":"Name","workCentre":"Work centre","action":"Result","messages":"Messages"},"rowRef":"{{sheet}} · row {{row}}","action":{"create":"New","update":"Update","unchanged":"No change","error":"Error"},"newCode":"New code on import","quantityUnits":"× {{count}} machines","poolQuantity":"pool of {{count}}","changes":"Changes: {{fields}}","blocked":"Fix the {{count}} row(s) with errors in the file, then upload it again. Nothing is imported while a row has an error.","nothing":"The file changes nothing.","confirm":"Import {{count}} machine(s)","confirming":"Importing…","close":"Close","issue":{"work_centre_missing":"No work centre: fill in the Work centre column (or put the machine on its department's sheet).","work_centre_not_found":"Work centre {{value}} not found — create it in Settings › Work Centre List first, or use an existing work centre code.","name_missing":"No name: fill in the Vietnamese or the English name.","type_missing":"Machine type is needed to make the machine code: fill in the Machine type (or the Machine code).","type_invalid":"Machine type {{value}} is not a valid type code: use letters A–Z and digits only.","type_inactive":"Machine type {{code}} is switched off: switch it on in Machines › Machine types, or use another type.","duplicate_in_file":"{{column}} {{value}} appears more than once in the file (rows {{rows}}): keep one row per machine.","old_code_ambiguous":"Old code {{value}} belongs to {{count}} machines: put the machine code in the row instead.","bad_number":"{{column}}: “{{value}}” is not a number of 0 or more.","bad_year":"Year of manufacture: “{{value}}” is not a year between 1900 and next year.","bad_date":"{{column}}: “{{value}}” is not a date (use yyyy-mm-dd or dd/mm/yyyy).","bad_status":"Status: “{{value}}” is not Active, Down or Retired.","text_too_long":"{{column}} is longer than {{max}} characters.","type_will_be_created":"Machine type {{code}} does not exist yet — it will be created (named {{code}} until you edit it).","supplier_not_matched":"Supplier “{{value}}” is not in the vendor list — the name is kept as text.","model_split":"Model and serial were split at “/”: model {{model}}, serial number {{serial}}.","voltage_other":"Voltage and phase “{{value}}” not recognised — saved as Other, the text is kept in Notes.","voltage_from_current":"“{{value}}” in Rated current is a voltage and phase — moved to Voltage and phase.","bad_quantity":"Quantity: “{{value}}” is not a whole number from 1 to {{max}}. Enter a whole number, or leave it blank for one machine.","type_level_not_found":"{{column}} “{{value}}” matches no machine type. Create it in Manufacturing › Machines › Machine types, or change the cell to the code or name of an existing type.","quantity_ignored":"Quantity {{value}} ignored — only one machine is handled for this row. To make several new machines, leave Machine code and Old code blank on a new row.","uom_unknown":"Unit “{{value}}” is not in the units list, so the unit is left empty. Add it in Settings › Material Options › Units, or use an existing unit's code or name, then upload again."},"column":{"code":"Machine code","old_code":"Old code","name_vi":"Name (Vietnamese)","name_en":"Name (English)","model":"Model","serial_number":"Serial number","function":"Function","manufacturer":"Manufacturer","supplier":"Supplier","country_of_origin":"Country of origin","dust_extraction":"Dust extraction","workshop_location":"Workshop location","person_in_charge":"Person in charge","notes":"Notes","width_m":"Width (m)","depth_m":"Depth (m)","rated_current_a":"Rated current (A)","maintenance_cycle_months":"Maintenance cycle (months)","in_service_since":"In service since","warranty_until":"Warranty until","machine_type_id":"Machine type","work_center_id":"Work centre","description":"Function","supplier_name":"Supplier","supplier_vendor_id":"Supplier","uom_id":"Unit (UOM)","year_of_manufacture":"Year of manufacture","voltage_phase":"Voltage and phase","status":"Status","level2":"Level 2","level3":"Level 3","quantity":"Quantity","specification":"Specification","additional_description":"Additional description","uom":"Unit (UOM)","supplier_item_name":"Supplier item name"}},"xl":{"sheetName":{"instructions":"Instructions","machines":"Machines","lists":"Lists"},"col":{"code":"Machine code","old_code":"Old code","machine_type":"Machine type","work_centre":"Work centre","name_vi":"Name (Vietnamese)","name_en":"Name (English)","model":"Model","serial_number":"Serial number","function":"Function","manufacturer":"Manufacturer","supplier":"Supplier","country_of_origin":"Country of origin","year_of_manufacture":"Year of manufacture","width_m":"Width (m)","depth_m":"Depth (m)","dust_extraction":"Dust extraction (diameter × count)","rated_current_a":"Rated current (A)","voltage_phase":"Voltage and phase","status":"Status","workshop_location":"Workshop location","in_service_since":"In service since","warranty_until":"Warranty until","person_in_charge":"Person in charge","maintenance_cycle_months":"Maintenance cycle (months)","notes":"Notes","level1":"Level 1 (group)","level2":"Level 2 (machine type)","level3":"Level 3 (machine type)","quantity":"Quantity","specification":"Specification","additional_description":"Additional description","uom":"Unit (UOM)","supplier_item_name":"Supplier item name"},"instr":{"a_title":"Machine list — how to fill it in","b_rows":"One row per machine on the Machines sheet. You can also upload the factory's own file with one sheet per department: the sheet name is then the work centre.","c_code":"Machine code: leave blank for a new machine — the next code of its machine type is made on import (06.<type>.<number>). A row with a code that already exists updates that machine; a row with only an Old code updates the machine with that old code.","d_type":"Machine type: the type code from the Lists sheet. A type that does not exist yet is created by the import.","e_centre":"Work centre: the work centre code from the Lists sheet. A work centre that does not exist is not created: create it in Settings › Work Centre List first.","f_blank":"A blank cell leaves the stored value as it is. Dates as yyyy-mm-dd or dd/mm/yyyy. Voltage and phase and Status: one of the choices on the Lists sheet.","g_check":"After uploading, the app shows every row with its errors and warnings before anything is saved.","h_tools":"Tools & equipment list: Level 2 / Level 3 name the machine type (its code or name from the Lists sheet; Level 3 wins, Level 1 is only a group heading). For other types, Quantity on a new row with a blank Machine code makes that many machines, each with its own code. Specification, Additional description, Unit and Supplier item name are saved on the machine. A unit must exist in Settings › Material Options › Units, otherwise the row is flagged and the unit is left empty. For a machine type counted as a pool (Machines › Machine types › Tracking) Quantity is the count held on ONE machine record; re-uploading the same Machine code updates it."},"lists":{"typeCode":"Machine type","typeNameEn":"Name (English)","typeNameVi":"Name (Vietnamese)","workCentreCode":"Work centre","workCentreName":"Name","workCentreNameVi":"Name (Vietnamese)","voltage":"Voltage and phase","status":"Status"},"status":{"ACTIVE":"Active","DOWN":"Down","RETIRED":"Retired"},"voltage":{"v220_1p":"220 V single-phase","v380_3p":"380 V three-phase","other":"Other"}},"start":{"title":"Production steps","empty":"This work order has no production steps.","col":{"sequence":"Sequence","step":"Step","workCentre":"Work centre","machine":"Machine","status":"Status"},"start":"Start","complete":"Complete","noRight":"Starting and completing steps needs the permission to edit production orders. Ask your administrator.","dialogTitle":"Start step: {{step}}","reason":"Work centre {{workCentre}} has machines, so pick the machine this step runs on.","machine":"Machine","choose":"Choose a machine…","pickFirst":"Pick the machine first.","loadError":"The machines of this work centre couldn't be loaded. Try again.","cancel":"Cancel","started":"Step {{step}} started.","completed":"Step {{step}} completed.","opStatus":{"not_started":"Not started","in_progress":"In progress","paused":"Paused","completed":"Completed","skipped":"Skipped"}}},"purchasePrices":{"hiddenNote":"Purchase prices are hidden for your role - ask an admin for the View purchase prices right.","hiddenShort":"Hidden for your role","fromAgreement":"From price agreement valid {{from}} → {{to}}","openEnded":"open-ended","targetPrice":"Target price"},"priceAgreements":{"title":"Price agreements","subtitle":"Agreed purchase prices per supplier and material, with the dates they are valid. New purchase orders and RFQs suggest the active price.","newLine":"New price line","import":"Import Excel","export":"Export Excel","colSupplier":"Supplier","colMaterial":"Material","colPrice":"Price","colUnit":"Purchase unit","conversion":"1 {{unit}} = {{n}} {{base}}","colMinQty":"Min qty","colWindow":"Valid","openEnded":"open-ended","colStatus":"Status","colNote":"Note","status":{"upcoming":"Upcoming","active":"Active","expired":"Expired"},"empty":"No price agreements yet.","emptyHint":"Add a price line, or import an Excel file exported from this page.","error":"The price agreements could not be loaded.","retry":"Try again","newTitle":"New price line","editTitle":"Edit price line","edit":"Edit","delete":"Delete","deleteTitle":"Delete this price line?","deleteBody":"{{supplier}} · {{material}} from {{from}}. New orders will no longer suggest this price. Orders already placed keep their prices.","deleted":"Price line deleted","saved":"Price line saved","fieldSupplier":"Supplier","fieldMaterial":"Material","fieldPrice":"Price","fieldCurrency":"Currency","fieldUnit":"Purchase unit","fieldConversion":"Base units per purchase unit","fieldConversionHint":"Leave empty to take it from the supplier's material link (1 when the unit is the material's own unit).","fieldMinQty":"Minimum quantity","fieldValidFrom":"Valid from","fieldValidTo":"Valid to","fieldValidToHint":"Leave empty for an open-ended price.","fieldNote":"Note","pickSupplier":"Search a supplier","pickMaterial":"Type a material code or name","pickUnit":"Pick a unit","requiredMissing":"Supplier, material, price, purchase unit and \"Valid from\" are required. Fill them in, then save.","save":"Save","cancel":"Cancel","importer":{"title":"Import price agreements","hint":"Upload an .xlsx in the export's layout. Nothing is saved until you confirm, and only when every row is valid.","choose":"Choose file","chooseAnother":"Choose another file","reading":"Checking the file…","summary":"{{valid}} rows ready, {{invalid}} rows with errors","colRow":"Row","colSupplier":"Supplier code","colMaterial":"Material code","colResult":"Result","ok":"Ready","commitBlocked":"{{count}} rows have errors, so nothing can be imported yet. Fix them in the file and choose it again.","commit":"Import {{count}} lines","committed":"Imported {{count}} price lines","cancel":"Cancel"}},"productUnit":{"label":"Product unit (unit of the finished product)","placeholder":"Select the product's unit...","required":"Choose the product's unit.","loading":"Loading units...","empty":"No units of measure are set up yet. Ask an administrator to add one under Settings, then reopen this form.","hint":"The unit the finished product itself is counted in (for example PCS). Part and line units are chosen separately.","lineRequired":"Choose a unit for every part line — a part with no unit cannot be saved.","lockedBody":"The unit can't change: this product is already used by {{uses}}. Create a new product with the right unit instead.","uses":{"stock":"stock on hand","movements":"stock movements","proforma":"proforma invoice lines","sales_order":"sales order lines","quotation":"quotation lines","purchase_order":"purchase order lines","approved_bom":"an approved BOM"}},"btpForPi":{"title":"Semi-finished stock for PI {{pi}}","description":"Confirm how much of each semi-finished pallet this PI reuses. Only this PI's purchase drops by what the pallets cover.","piLabel":"PI","forMaterial":"Opened from {{material}} — pallets that cover it are listed first.","loading":"Loading semi-finished stock…","loadError":"Couldn't load the semi-finished stock for this PI. Close the drawer and try again.","empty":"No reusable semi-finished stock for this PI's parts. Purchasing covers the full need.","piClosed":"PI {{pi}} is {{status}}, so semi-finished stock can't be held for it. Reopen the PI, or close this drawer and pick an open PI.","partNeed":"PI needs {{need}} · held {{held}}","condition":{"good":"Good","touch_up":"Touch-up","none":"Condition not recorded"},"touchUpTag":"Touch-up needed","coversThis":"Covers this material","colour":"Colour: {{colour}}","colourMatch":"Colour: {{colour}} (order colour — paint covered)","stage":"Done up to: {{stage}}","noStage":"Stage not recorded","reinspect":"Re-inspect by {{date}}","noReinspect":"No re-inspection date","covers_one":"Covers {{count}} material","covers_other":"Covers {{count}} materials","available":"Available: {{qty}}","heldForPi":"Held for this PI: {{qty}}","refusal":{"notAvailable":"No longer in semi-finished stock — this hold covers nothing. Undo it to tidy up.","unusable":"Marked unusable — this hold covers nothing.","reinspectOverdue":"Re-inspection overdue ({{date}}) — counts 0 until QC re-inspects it."},"qtyLabel":"Reuse qty","qtyHint":"Up to {{max}}","overCap":"At most {{max}}: what is free and what the PI still needs.","confirm":"Confirm reuse","cancel":"Cancel","undo":"Undo","undoTitle":"Release pallet {{code}}?","undoMessage":"Pallet {{code}} goes back to semi-finished stock and PI {{pi}} will buy what it covered.","confirmed":"Semi-finished stock confirmed for {{pi}}. To buy is updated.","released":"Pallet {{code}} released from {{pi}}.","confirmFailed":"Couldn't confirm the semi-finished stock reuse.","undoFailed":"Couldn't release the semi-finished stock hold.","noPermission":"You can see this semi-finished stock but not confirm or undo it: that changes what the PI buys, so it needs the “Create Purchase Planning Records” or “Plan Manufacturing” permission. Ask your administrator to add one to your role.","lotStatus":{"GONE":"removed from stock"}}}