{{ t('ov.title') }}
{{ t('ov.sub') }}
{{ t('ov.empty') }}
{{ t('bt.title') }}
{{ batchScope(overviewBatch) }} {{ podScopeLabel }} {{ t('status.' + latestSurvey.status) }}{{ t('bt.noActual') }}
{{ voyageError }}
{{ t('vy.preview') }}
{{ t('vy.previewSub', { ports: importPreview.ports.length, voyages: importPreview.voyages.length, lanes: importPreview.lanes.join(' / ') || '—' }) }}
| Lane | {{ t('th.vessel') }} | VVD | BSA | {{ t('th.allocTotal') }} |
|---|---|---|---|---|
| {{ v.lane }} | {{ v.vessel }} | {{ v.vvd }} | {{ num(v.bsa) }} | {{ v.alloc_count }} |
| {{ t('th.vessel') }} | VVD | BSA | {{ t('th.allocTotal') }} | {{ t('th.portsRecorded') }} | {{ t('th.note') }} | |
|---|---|---|---|---|---|---|
| {{ v.vessel }} {{ t('vy.cancelled') }} | {{ v.vvd }} | {{ num(v.bsa) }} | {{ num(v.alloc_total) }}
{{ v.alloc_survey }}
|
{{ (v.ports || []).length }} | {{ v.note }} |
{{ t('empty.voyages') }}
{{ t('pt.title') }}
{{ t('pt.sub') }}
{{ portError }}
{{ t('pt.' + g.toLowerCase()) }}
{{ portsByGroup(g).length }} {{ t('pt.dragHint') }}{{ t('pt.' + g.toLowerCase() + 'Sub') }}
| {{ t('th.code') }} | {{ t('th.name') }} | {{ t('th.nameEn') }} | {{ t('th.active') }} | ||
|---|---|---|---|---|---|
| ⠿ | {{ p.code }} | ||||
| {{ t('empty.ports') }} | |||||
{{ t('pg.title') }}
{{ t('pg.sub') }}{{ podGroupError }}
{{ t('pg.empty') }}
{{ t('sv.title') }}
{{ t('sv.sub') }}
{{ t('sv.newTitle') }}
{{ t('sv.step1Note') }}
{{ t('sv.noVoyage') }}
{{ t('sv.laneNote') }}
{{ t('pick.noPorts') }}
{{ t('sv.portsNote') }}
{{ t('sv.gridNote') }}
| {{ t('sv.gridHead') }} | {{ t('wiz.askHead') }} | {{ p }} | {{ t('th.allocTotal') }} | BSA |
|---|---|---|---|---|
|
{{ row.vvd }} {{ row.vessel }} |
{{ num(rowSum(row)) }} | {{ num(row.bsa) }} |
{{ surveyError }}
| {{ t('th.batch') }} | {{ t('th.title') }} | {{ t('th.status') }} | {{ t('th.voyages') }} | {{ t('th.ports') }} | {{ t('th.replied') }} | {{ t('th.due') }} | |
|---|---|---|---|---|---|---|---|
| {{ s.code }} | {{ s.title }} | {{ t('status.' + s.status) }} | {{ s.voyage_count }} | {{ s.port_count }} | {{ s.filled_count }}/{{ s.port_count }} | {{ s.due_at ? s.due_at.replace('T',' ').slice(0,16) : '—' }} | |
| {{ t('empty.surveys') }} | |||||||
{{ t('rs.title') }}
{{ t('rs.sub') }}
{{ t('rs.empty') }}
{{ t('rs.comp') }}
| {{ t('th.port') }} | {{ t('th.carrier') }} | {{ t('th.pod') }} | {{ t('th.box') }} | {{ t('th.avg') }} | {{ t('th.etaArr') }} | {{ t('th.slots') }} | {{ t('th.routing') }} | {{ t('th.tsPort') }} |
|---|---|---|---|---|---|---|---|---|
| {{ c.port }} | {{ c.competitor }} | {{ c.pod }} | {{ c.box_type || '–' }} | {{ num(c.price) }} | {{ c.eta ? etaShort(c.eta) : '–' }} | {{ num(c.slots) }} | {{ c.routing === 'via' ? t('opt.via') : (c.routing ? t('opt.direct') : '–') }} | {{ c.ts_port || '–' }} |
| {{ t('flt.none2') }} | ||||||||
{{ t('ac.title') }}
{{ t('ac.sub') }}
{{ t('ac.auto') }}
{{ t('ac.autoBadge') }}{{ t('ac.autoDesc') }}
{{ t('ac.manual') }}
{{ t('ac.manualDesc') }}
{{ t('ac.preview') }}
{{ actualPreview.filename }}| {{ t('th.pol') }} | {{ t('th.tickets') }} | 20GP | 40HC | 40RH | TEU | {{ t('th.weight') }} |
|---|---|---|---|---|---|---|
| {{ r.pol }} | {{ num(r.tickets) }} | {{ num(r.c20) }} | {{ num(r.c40hc) }} | {{ num(r.c40rh) }} | {{ num(r.teu) }} | {{ num(r.weight_kg) }} |
{{ wmsg }}
{{ t('ac.list') }}
{{ actualUploads.length }}| {{ t('th.file') }} | VVD | {{ t('th.lane') }} | ETD | {{ t('th.tickets') }} | TEU | {{ t('th.uploaded') }} | |
|---|---|---|---|---|---|---|---|
| {{ u.filename }} | {{ u.vessel }} | {{ u.lane_code }}– | {{ u.etd || '–' }} | {{ num(u.tickets) }} | {{ num(u.teu) }} | {{ (u.uploaded_at || '').replace('T', ' ').slice(0, 16) }} |
{{ t('ac.empty') }}
{{ t('av.title') }}
{{ t('av.sub') }}
{{ t('av.empty') }}
{{ actualDetail.upload.vessel }}
{{ actualDetail.voyage.lane_code }} {{ actualDetail.upload.filename }} ETD {{ actualDetail.upload.etd || '–' }}{{ t('ac.matched') }} {{ actualDetail.voyage.vessel }} {{ actualDetail.voyage.vvd }} · BSA {{ num(actualDetail.voyage.bsa) }} {{ t('ac.notMatched') }}
{{ t('bt.title') }}
{{ actualBatch ? batchScope(actualBatch) : t('bt.noBatch') }}{{ t('bt.noActual') }}
{{ t('av.byPol') }}
| {{ t('th.pol') }} | {{ t('th.group') }} | {{ t('th.tickets') }} | 20GP | 40HC | TEU |
|---|---|---|---|---|---|
| {{ r.code }} | {{ r.group || 'CUL' }} | {{ num(r.tickets) }} | {{ num(r.c20) }} | {{ num(r.c40hc) }} | {{ num(r.teu) }} |
| {{ t('th.total') }} | {{ num(actualDetail.upload.tickets) }} | {{ num(actualDetail.upload.c20) }} | {{ num(actualDetail.upload.c40hc) }} | {{ num(actualDetail.upload.teu) }} | |
{{ t('av.byPod') }}
| {{ t('th.pod') }} | {{ t('th.tickets') }} | 20GP | 40HC | TEU |
|---|---|---|---|---|
| {{ r.code }} | {{ num(r.tickets) }} | {{ num(r.c20) }} | {{ num(r.c40hc) }} | {{ num(r.teu) }} |
| {{ t('th.total') }} | {{ num(actualDetail.upload.tickets) }} | {{ num(actualDetail.upload.c20) }} | {{ num(actualDetail.upload.c40hc) }} | {{ num(actualDetail.upload.teu) }} |
{{ t('av.matrix') }}
{{ t('av.matrixUnit') }}| {{ t('th.pol') }} \ {{ t('th.pod') }} | {{ p }} | TEU |
|---|---|---|
| {{ row.pol }}SUL | {{ c.teu ? num(c.teu) : '–' }} | {{ num(row.teu) }} |
| {{ t('th.total') }} | {{ num(actualMatrix.podTotals[p]) }} | {{ num(actualMatrix.total) }} |
{{ t('av.other') }}
{{ t('av.leadVal', { avg: actualDetail.extra.booking_lead.avg_days, med: actualDetail.extra.booking_lead.median_days, n: actualDetail.extra.booking_lead.parsed, total: actualDetail.extra.booking_lead.total }) }} {{ t('av.leadNone') }}
| {{ t('th.rank') }} | {{ t('th.customer') }} | {{ t('th.tickets') }} |
|---|---|---|
| {{ i + 1 }} | {{ s[0] }} | {{ s[1] }} |
{{ t('um.title') }}
{{ t('um.sub') }}
{{ roleDesc(r) }}
{{ t('um.add') }}
{{ roleDesc(roles.find((r) => r.code === userForm.role)) }}
{{ t('um.noPorts') }}
{{ userError }}
| {{ t('um.username') }} | {{ t('um.name') }} | {{ t('um.role') }} | {{ t('um.ports') }} | {{ t('um.active') }} | |
|---|---|---|---|---|---|
| {{ u.username }}{{ t('um.you') }} | {{ roleLabelByCode(u.role) }} | {{ u.ports.length ? u.ports.join(' · ') : '—' }} |
{{ t('an.title') }}
{{ t('an.sub') }}
{{ t('an.empty') }}
{{ t('bt.title') }}
{{ batchScope(analysis) }}{{ t('an.unmatched', { p: analysis.unmatched_pols.join(' / ') }) }}
{{ t('an.noActualAtAll', { d: num(analysis.kpi.declared_all), p: analysis.kpi.ports_declared }) }}
{{ t('an.partialActual', { n: analysis.kpi.voyages_total - analysis.kpi.voyages_with_actual }) }}
{{ t('an.chartMatrix') }}
{{ t('an.matrixNote') }}| {{ t('th.voyage') }} | {{ p }} | {{ t('th.variance') }} |
|---|---|---|
| {{ v.vvd }}{{ v.lane }} | {{ cellText(cell(v.id, p)) }} | {{ num(voyTotal(v.id).variance) }} |
| {{ t('th.total') }} | {{ portTotal(p).declared ? num(portTotal(p).variance) : '–' }} | {{ num(analysis.kpi.variance) }} |
{{ t('an.table') }}
{{ t('an.tableNote') }}| {{ t('th.voyage') }} | {{ t('th.pol') }} | {{ t('th.alloc') }} | {{ t('th.declared') }} | {{ t('th.actual') }} | {{ t('th.variance') }} | {{ t('th.varPct') }} | {{ t('th.status') }} |
|---|---|---|---|---|---|---|---|
| {{ g.vvd }} {{ t('an.nPorts', { n: g.count }) }} | {{ num(g.alloc) }} | {{ g.has_declared ? num(g.declared) : '–' }} | {{ g.has_actual ? num(g.actual) : '–' }} | {{ g.has_actual && g.has_declared ? num(g.variance) : '–' }} | {{ varPct(g) }} | {{ t(rowTag(g).key) }} | |
| {{ r.port }}SUL | {{ num(r.allocation) }} | {{ r.has_declared ? num(r.declared) : '–' }} | {{ r.has_actual ? num(r.actual) : '–' }} | {{ r.has_actual && r.has_declared ? num(r.variance) : '–' }} | {{ varPct(r) }} | {{ t(rowTag(r).key) }} | |
| {{ t('an.noScope') }} | |||||||
{{ t('an.footnote') }}
{{ t('fl.title') }}
{{ fillForm.open && fillForm.sul ? t('fl.subSul') : t('fl.sub') }}
| {{ t('th.batch') }} | {{ t('th.title') }} | {{ t('th.status') }} | {{ t('th.due') }} | |
|---|---|---|---|---|
| {{ s.code }} | {{ s.title }} | {{ s.filled ? t('status.replied') : t('status.' + s.status) }} | {{ s.due_at ? s.due_at.replace('T',' ').slice(0,16) : '—' }} | |
| {{ t('empty.mine') }} | ||||
{{ fillForm.survey.code }}
{{ fillForm.survey.title }}{{ t('fl.cancelled') }}
{{ t('fl.noAlloc') }}
| {{ t('th.rank') }} | {{ t('th.customer') }} | {{ t('th.teu') }} |
|---|---|---|
| {{ i + 1 }} |
| {{ t('th.pod') }} | {{ t('th.box') }} | {{ t('th.avg') }} | |
|---|---|---|---|
{{ t('fl.noAvg') }}
| {{ t('th.carrier') }} | {{ t('th.pod') }} | {{ t('th.box') }} | {{ t('th.avg') }} | {{ t('th.etaArr') }} | {{ t('th.slots') }} | {{ t('th.routing') }} | {{ t('th.tsPort') }} | |
|---|---|---|---|---|---|---|---|---|
{{ t('fl.noComp') }}
{{ t('fl.sulTable') }}
| {{ t('th.voyage') }} | {{ pt.code }} {{ portLabel(pt) }} |
|---|---|
| {{ r.lane }} {{ r.vessel }} {{ r.vvd }} {{ t('vy.cancelled') }} | alloc {{ num(flCell(pt, r.voyage_id).allocation) }} · {{ flCell(pt, r.voyage_id).eta }} – |