add progress bar in list view and fix translations
This commit is contained in:
parent
7e72940eae
commit
faec16f6fe
|
|
@ -2864,4 +2864,24 @@ public class Controller : ControllerBase
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[HttpGet(nameof(GetChecklistSummary))]
|
||||||
|
public ActionResult<IEnumerable<Object>> GetChecklistSummary(Token authToken)
|
||||||
|
{
|
||||||
|
var user = Db.GetSession(authToken)?.User;
|
||||||
|
if (user is null || user.UserType != 2) return Unauthorized();
|
||||||
|
|
||||||
|
var summaries = Db.ChecklistItems
|
||||||
|
.ToList()
|
||||||
|
.GroupBy(c => c.InstallationId)
|
||||||
|
.Select(g => new
|
||||||
|
{
|
||||||
|
installationId = g.Key,
|
||||||
|
done = g.Count(c => c.Status == (Int32)ChecklistStatus.Done),
|
||||||
|
total = g.Count()
|
||||||
|
})
|
||||||
|
.ToList();
|
||||||
|
|
||||||
|
return Ok(summaries);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -15,30 +15,30 @@ public static class ChecklistStepDefinitions
|
||||||
new( 5, "Information tab filled out (customer, serials, VPN)",
|
new( 5, "Information tab filled out (customer, serials, VPN)",
|
||||||
"""
|
"""
|
||||||
[
|
[
|
||||||
{"text":"Customer information (email, address)","checked":false},
|
{"text":"checklistStep5Sub1","checked":false},
|
||||||
{"text":"Installation information (external EMS, grid provider, data collection)","checked":false},
|
{"text":"checklistStep5Sub2","checked":false},
|
||||||
{"text":"Battery serial number","checked":false},
|
{"text":"checklistStep5Sub3","checked":false},
|
||||||
{"text":"Inverter serial number","checked":false},
|
{"text":"checklistStep5Sub4","checked":false},
|
||||||
{"text":"Data logger serial number","checked":false},
|
{"text":"checklistStep5Sub5","checked":false},
|
||||||
{"text":"VPN details","checked":false}
|
{"text":"checklistStep5Sub6","checked":false}
|
||||||
]
|
]
|
||||||
"""),
|
"""),
|
||||||
new( 6, "Installation configured and tested electrically / hardware-wise at Vebo",
|
new( 6, "Installation configured and tested electrically / hardware-wise at Vebo",
|
||||||
"""
|
"""
|
||||||
[
|
[
|
||||||
{"text":"Inverter firmware and configuration verified","checked":false},
|
{"text":"checklistStep6Sub1","checked":false},
|
||||||
{"text":"Battery firmware and configuration verified","checked":false},
|
{"text":"checklistStep6Sub2","checked":false},
|
||||||
{"text":"Internet for gateway configured","checked":false},
|
{"text":"checklistStep6Sub3","checked":false},
|
||||||
{"text":"Communication cable between gateway and inverter correct","checked":false}
|
{"text":"checklistStep6Sub4","checked":false}
|
||||||
]
|
]
|
||||||
"""),
|
"""),
|
||||||
new( 7, "Installation tested software-wise at Vebo",
|
new( 7, "Installation tested software-wise at Vebo",
|
||||||
"""
|
"""
|
||||||
[
|
[
|
||||||
{"text":"S3 bucket number and key credentials copied from Information tab into config.json","checked":false},
|
{"text":"checklistStep7Sub1","checked":false},
|
||||||
{"text":"Product ID configured in config.json","checked":false},
|
{"text":"checklistStep7Sub2","checked":false},
|
||||||
{"text":"USB ID configured in config.json","checked":false},
|
{"text":"checklistStep7Sub3","checked":false},
|
||||||
{"text":"Inverter data reading from inverter tested","checked":false}
|
{"text":"checklistStep7Sub4","checked":false}
|
||||||
]
|
]
|
||||||
"""),
|
"""),
|
||||||
new( 8, "Installation delivered to customer site", NoSubtasks),
|
new( 8, "Installation delivered to customer site", NoSubtasks),
|
||||||
|
|
|
||||||
|
|
@ -109,6 +109,33 @@ public static partial class Db
|
||||||
Connection.Execute("UPDATE User SET Name = 'inesco energy Master Admin' WHERE Name = 'InnovEnergy Master Admin'");
|
Connection.Execute("UPDATE User SET Name = 'inesco energy Master Admin' WHERE Name = 'InnovEnergy Master Admin'");
|
||||||
Connection.Execute("UPDATE User SET Name = 'inesco energy Master Admin' WHERE Name = 'inesco Energy Master Admin'");
|
Connection.Execute("UPDATE User SET Name = 'inesco energy Master Admin' WHERE Name = 'inesco Energy Master Admin'");
|
||||||
|
|
||||||
|
// One-time migration: rewrite early-seeded English subtask text to translation keys so the
|
||||||
|
// frontend can localize them. Idempotent: rows already containing keys match nothing.
|
||||||
|
var subtaskTextToKey = new (String Old, String Key)[]
|
||||||
|
{
|
||||||
|
("Customer information (email, address)", "checklistStep5Sub1"),
|
||||||
|
("Installation information (external EMS, grid provider, data collection)", "checklistStep5Sub2"),
|
||||||
|
("Installation information (external EMS, network provider, data collection)", "checklistStep5Sub2"),
|
||||||
|
("Battery serial number", "checklistStep5Sub3"),
|
||||||
|
("Inverter serial number", "checklistStep5Sub4"),
|
||||||
|
("Data logger serial number", "checklistStep5Sub5"),
|
||||||
|
("VPN details", "checklistStep5Sub6"),
|
||||||
|
("Inverter firmware and configuration verified", "checklistStep6Sub1"),
|
||||||
|
("Battery firmware and configuration verified", "checklistStep6Sub2"),
|
||||||
|
("Internet for gateway configured", "checklistStep6Sub3"),
|
||||||
|
("Communication cable between gateway and inverter correct", "checklistStep6Sub4"),
|
||||||
|
("S3 bucket number and key credentials copied from Information tab into config.json","checklistStep7Sub1"),
|
||||||
|
("Product ID configured in config.json", "checklistStep7Sub2"),
|
||||||
|
("USB ID configured in config.json", "checklistStep7Sub3"),
|
||||||
|
("Inverter data reading from inverter tested", "checklistStep7Sub4")
|
||||||
|
};
|
||||||
|
foreach (var (oldText, key) in subtaskTextToKey)
|
||||||
|
{
|
||||||
|
Connection.Execute(
|
||||||
|
"UPDATE ChecklistItem SET Subtasks = REPLACE(Subtasks, ?, ?) WHERE Subtasks LIKE ?",
|
||||||
|
$"\"{oldText}\"", $"\"{key}\"", $"%\"{oldText}\"%");
|
||||||
|
}
|
||||||
|
|
||||||
//UpdateKeys();
|
//UpdateKeys();
|
||||||
CleanupSessions().SupressAwaitWarning();
|
CleanupSessions().SupressAwaitWarning();
|
||||||
DeleteSnapshots().SupressAwaitWarning();
|
DeleteSnapshots().SupressAwaitWarning();
|
||||||
|
|
|
||||||
|
|
@ -144,7 +144,12 @@ function ChecklistStepRow({ item, adminUsers, onUpdate, onNotify }: Props) {
|
||||||
|
|
||||||
<TableCell sx={{ verticalAlign: 'top', minWidth: 240 }}>
|
<TableCell sx={{ verticalAlign: 'top', minWidth: 240 }}>
|
||||||
<Stack direction="row" spacing={1} alignItems="center">
|
<Stack direction="row" spacing={1} alignItems="center">
|
||||||
<Typography variant="body2">{item.stepTitle}</Typography>
|
<Typography variant="body2">
|
||||||
|
{intl.formatMessage({
|
||||||
|
id: `checklistStep${item.stepNumber}`,
|
||||||
|
defaultMessage: item.stepTitle
|
||||||
|
})}
|
||||||
|
</Typography>
|
||||||
{subtasks.length > 0 && (
|
{subtasks.length > 0 && (
|
||||||
<>
|
<>
|
||||||
<Chip
|
<Chip
|
||||||
|
|
@ -275,7 +280,7 @@ function ChecklistStepRow({ item, adminUsers, onUpdate, onNotify }: Props) {
|
||||||
{subtasks.length > 0 && subtasksOpen && (
|
{subtasks.length > 0 && subtasksOpen && (
|
||||||
<TableRow>
|
<TableRow>
|
||||||
<TableCell colSpan={6} sx={{ backgroundColor: '#fafafa', py: 1 }}>
|
<TableCell colSpan={6} sx={{ backgroundColor: '#fafafa', py: 1 }}>
|
||||||
<Box pl={6}>
|
<Box pl={6} display="flex" flexDirection="column">
|
||||||
{subtasks.map((s, i) => (
|
{subtasks.map((s, i) => (
|
||||||
<FormControlLabel
|
<FormControlLabel
|
||||||
key={i}
|
key={i}
|
||||||
|
|
@ -286,8 +291,12 @@ function ChecklistStepRow({ item, adminUsers, onUpdate, onNotify }: Props) {
|
||||||
onChange={() => handleSubtaskToggle(i)}
|
onChange={() => handleSubtaskToggle(i)}
|
||||||
/>
|
/>
|
||||||
}
|
}
|
||||||
label={<Typography variant="body2">{s.text}</Typography>}
|
label={
|
||||||
sx={{ display: 'block', ml: 0 }}
|
<Typography variant="body2" component="span">
|
||||||
|
{intl.formatMessage({ id: s.text, defaultMessage: s.text })}
|
||||||
|
</Typography>
|
||||||
|
}
|
||||||
|
sx={{ ml: 0 }}
|
||||||
/>
|
/>
|
||||||
))}
|
))}
|
||||||
</Box>
|
</Box>
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,56 @@
|
||||||
|
import React from 'react';
|
||||||
|
import { Box, LinearProgress, Tooltip, Typography } from '@mui/material';
|
||||||
|
import { FormattedMessage, useIntl } from 'react-intl';
|
||||||
|
|
||||||
|
interface Props {
|
||||||
|
done: number | null;
|
||||||
|
total: number | null;
|
||||||
|
}
|
||||||
|
|
||||||
|
function phaseId(done: number, total: number): string {
|
||||||
|
if (total === 0) return 'checklistPhaseEmpty';
|
||||||
|
if (done >= total) return 'checklistPhaseComplete';
|
||||||
|
if (done <= 5) return 'checklistPhasePreparation';
|
||||||
|
if (done <= 12) return 'checklistPhaseOnSite';
|
||||||
|
return 'checklistPhaseHandover';
|
||||||
|
}
|
||||||
|
|
||||||
|
function SetupProgress({ done, total }: Props) {
|
||||||
|
const intl = useIntl();
|
||||||
|
|
||||||
|
if (done === null || total === null || total === 0) {
|
||||||
|
return (
|
||||||
|
<Typography variant="body2" color="text.secondary" sx={{ fontSize: 'small' }}>
|
||||||
|
--
|
||||||
|
</Typography>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const percent = Math.round((done / total) * 100);
|
||||||
|
const color = percent >= 100 ? 'success' : percent > 0 ? 'warning' : 'inherit';
|
||||||
|
|
||||||
|
const tooltip = intl.formatMessage({
|
||||||
|
id: phaseId(done, total),
|
||||||
|
defaultMessage: 'Progress'
|
||||||
|
});
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Tooltip title={tooltip}>
|
||||||
|
<Box display="flex" alignItems="center" sx={{ minWidth: 120 }}>
|
||||||
|
<Box sx={{ width: 70, mr: 1 }}>
|
||||||
|
<LinearProgress
|
||||||
|
variant="determinate"
|
||||||
|
value={percent}
|
||||||
|
color={color === 'inherit' ? 'primary' : (color as any)}
|
||||||
|
sx={{ height: 6, borderRadius: 3 }}
|
||||||
|
/>
|
||||||
|
</Box>
|
||||||
|
<Typography variant="body2" sx={{ fontSize: 'small', whiteSpace: 'nowrap' }}>
|
||||||
|
{done}/{total}
|
||||||
|
</Typography>
|
||||||
|
</Box>
|
||||||
|
</Tooltip>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default SetupProgress;
|
||||||
|
|
@ -27,6 +27,14 @@ import { useLocation, useNavigate } from 'react-router-dom';
|
||||||
import routes from '../../../Resources/routes.json';
|
import routes from '../../../Resources/routes.json';
|
||||||
import { ProductIdContext } from '../../../contexts/ProductIdContextProvider';
|
import { ProductIdContext } from '../../../contexts/ProductIdContextProvider';
|
||||||
import SearchTwoToneIcon from '@mui/icons-material/SearchTwoTone';
|
import SearchTwoToneIcon from '@mui/icons-material/SearchTwoTone';
|
||||||
|
import { UserContext } from 'src/contexts/userContext';
|
||||||
|
import { UserType } from 'src/interfaces/UserTypes';
|
||||||
|
import axiosConfig from 'src/Resources/axiosConfig';
|
||||||
|
import {
|
||||||
|
CHECKLIST_ENABLED_PRODUCTS,
|
||||||
|
ChecklistSummary
|
||||||
|
} from 'src/interfaces/ChecklistTypes';
|
||||||
|
import SetupProgress from '../Checklist/SetupProgress';
|
||||||
|
|
||||||
interface FlatInstallationViewProps {
|
interface FlatInstallationViewProps {
|
||||||
installations: I_Installation[];
|
installations: I_Installation[];
|
||||||
|
|
@ -46,6 +54,28 @@ const FlatInstallationView = (props: FlatInstallationViewProps) => {
|
||||||
const [searchTerm, setSearchTerm] = useState('');
|
const [searchTerm, setSearchTerm] = useState('');
|
||||||
const [sortByStatus, setSortByStatus] = useState('All Installations');
|
const [sortByStatus, setSortByStatus] = useState('All Installations');
|
||||||
const [sortByAction, setSortByAction] = useState('All Installations');
|
const [sortByAction, setSortByAction] = useState('All Installations');
|
||||||
|
const { currentUser } = useContext(UserContext);
|
||||||
|
const showChecklistColumn =
|
||||||
|
currentUser?.userType === UserType.admin &&
|
||||||
|
CHECKLIST_ENABLED_PRODUCTS.has(product ?? -1);
|
||||||
|
const [progressMap, setProgressMap] = useState<Map<number, ChecklistSummary>>(
|
||||||
|
new Map()
|
||||||
|
);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (!showChecklistColumn) return;
|
||||||
|
axiosConfig
|
||||||
|
.get('/GetChecklistSummary')
|
||||||
|
.then((res) => {
|
||||||
|
if (!Array.isArray(res.data)) return;
|
||||||
|
const map = new Map<number, ChecklistSummary>();
|
||||||
|
res.data.forEach((s: ChecklistSummary) => {
|
||||||
|
map.set(s.installationId, s);
|
||||||
|
});
|
||||||
|
setProgressMap(map);
|
||||||
|
})
|
||||||
|
.catch(() => setProgressMap(new Map()));
|
||||||
|
}, [showChecklistColumn]);
|
||||||
|
|
||||||
const HoverableTableRow = styled(TableRow)(({ theme }) => ({
|
const HoverableTableRow = styled(TableRow)(({ theme }) => ({
|
||||||
cursor: 'pointer',
|
cursor: 'pointer',
|
||||||
|
|
@ -315,6 +345,14 @@ const FlatInstallationView = (props: FlatInstallationViewProps) => {
|
||||||
<TableCell>
|
<TableCell>
|
||||||
<FormattedMessage id="status" defaultMessage="Status" />
|
<FormattedMessage id="status" defaultMessage="Status" />
|
||||||
</TableCell>
|
</TableCell>
|
||||||
|
{showChecklistColumn && (
|
||||||
|
<TableCell>
|
||||||
|
<FormattedMessage
|
||||||
|
id="setupProgress"
|
||||||
|
defaultMessage="Setup Progress"
|
||||||
|
/>
|
||||||
|
</TableCell>
|
||||||
|
)}
|
||||||
</TableRow>
|
</TableRow>
|
||||||
</TableHead>
|
</TableHead>
|
||||||
<TableBody>
|
<TableBody>
|
||||||
|
|
@ -461,6 +499,19 @@ const FlatInstallationView = (props: FlatInstallationViewProps) => {
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
</TableCell>
|
</TableCell>
|
||||||
|
{showChecklistColumn && (
|
||||||
|
<TableCell>
|
||||||
|
{(() => {
|
||||||
|
const summary = progressMap.get(installation.id);
|
||||||
|
return (
|
||||||
|
<SetupProgress
|
||||||
|
done={summary?.done ?? 0}
|
||||||
|
total={summary?.total ?? 16}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
})()}
|
||||||
|
</TableCell>
|
||||||
|
)}
|
||||||
</TableRow>
|
</TableRow>
|
||||||
);
|
);
|
||||||
})}
|
})}
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
import React, { useMemo, useState } from 'react';
|
import React, { useContext, useEffect, useMemo, useState } from 'react';
|
||||||
import {
|
import {
|
||||||
Card,
|
Card,
|
||||||
CircularProgress,
|
CircularProgress,
|
||||||
|
|
@ -20,6 +20,14 @@ import routes from '../../../Resources/routes.json';
|
||||||
import CancelIcon from '@mui/icons-material/Cancel';
|
import CancelIcon from '@mui/icons-material/Cancel';
|
||||||
import BuildIcon from '@mui/icons-material/Build';
|
import BuildIcon from '@mui/icons-material/Build';
|
||||||
import { getDeviceTypeName } from '../Information/installationSetupUtils';
|
import { getDeviceTypeName } from '../Information/installationSetupUtils';
|
||||||
|
import { UserContext } from 'src/contexts/userContext';
|
||||||
|
import { UserType } from 'src/interfaces/UserTypes';
|
||||||
|
import axiosConfig from 'src/Resources/axiosConfig';
|
||||||
|
import {
|
||||||
|
CHECKLIST_ENABLED_PRODUCTS,
|
||||||
|
ChecklistSummary
|
||||||
|
} from 'src/interfaces/ChecklistTypes';
|
||||||
|
import SetupProgress from '../Checklist/SetupProgress';
|
||||||
|
|
||||||
interface FlatInstallationViewProps {
|
interface FlatInstallationViewProps {
|
||||||
installations: I_Installation[];
|
installations: I_Installation[];
|
||||||
|
|
@ -32,6 +40,29 @@ const FlatInstallationView = (props: FlatInstallationViewProps) => {
|
||||||
const currentLocation = useLocation();
|
const currentLocation = useLocation();
|
||||||
const baseRoute = props.product === 5 ? routes.sodistorepro_installations : routes.sodiohome_installations;
|
const baseRoute = props.product === 5 ? routes.sodistorepro_installations : routes.sodiohome_installations;
|
||||||
|
|
||||||
|
const { currentUser } = useContext(UserContext);
|
||||||
|
const showChecklistColumn =
|
||||||
|
currentUser?.userType === UserType.admin &&
|
||||||
|
CHECKLIST_ENABLED_PRODUCTS.has(props.product ?? -1);
|
||||||
|
const [progressMap, setProgressMap] = useState<Map<number, ChecklistSummary>>(
|
||||||
|
new Map()
|
||||||
|
);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (!showChecklistColumn) return;
|
||||||
|
axiosConfig
|
||||||
|
.get('/GetChecklistSummary')
|
||||||
|
.then((res) => {
|
||||||
|
if (!Array.isArray(res.data)) return;
|
||||||
|
const map = new Map<number, ChecklistSummary>();
|
||||||
|
res.data.forEach((s: ChecklistSummary) => {
|
||||||
|
map.set(s.installationId, s);
|
||||||
|
});
|
||||||
|
setProgressMap(map);
|
||||||
|
})
|
||||||
|
.catch(() => setProgressMap(new Map()));
|
||||||
|
}, [showChecklistColumn]);
|
||||||
|
|
||||||
const sortedInstallations = useMemo(() => {
|
const sortedInstallations = useMemo(() => {
|
||||||
return [...props.installations].sort((a, b) => {
|
return [...props.installations].sort((a, b) => {
|
||||||
// Data-collection-disabled installations sink below everything (even offline).
|
// Data-collection-disabled installations sink below everything (even offline).
|
||||||
|
|
@ -118,6 +149,14 @@ const FlatInstallationView = (props: FlatInstallationViewProps) => {
|
||||||
<TableCell>
|
<TableCell>
|
||||||
<FormattedMessage id="status" defaultMessage="Status" />
|
<FormattedMessage id="status" defaultMessage="Status" />
|
||||||
</TableCell>
|
</TableCell>
|
||||||
|
{showChecklistColumn && (
|
||||||
|
<TableCell>
|
||||||
|
<FormattedMessage
|
||||||
|
id="setupProgress"
|
||||||
|
defaultMessage="Setup Progress"
|
||||||
|
/>
|
||||||
|
</TableCell>
|
||||||
|
)}
|
||||||
</TableRow>
|
</TableRow>
|
||||||
</TableHead>
|
</TableHead>
|
||||||
<TableBody>
|
<TableBody>
|
||||||
|
|
@ -282,6 +321,19 @@ const FlatInstallationView = (props: FlatInstallationViewProps) => {
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
</TableCell>
|
</TableCell>
|
||||||
|
{showChecklistColumn && (
|
||||||
|
<TableCell>
|
||||||
|
{(() => {
|
||||||
|
const summary = progressMap.get(installation.id);
|
||||||
|
return (
|
||||||
|
<SetupProgress
|
||||||
|
done={summary?.done ?? 0}
|
||||||
|
total={summary?.total ?? 16}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
})()}
|
||||||
|
</TableCell>
|
||||||
|
)}
|
||||||
</HoverableTableRow>
|
</HoverableTableRow>
|
||||||
);
|
);
|
||||||
})}
|
})}
|
||||||
|
|
|
||||||
|
|
@ -25,6 +25,12 @@ export type ChecklistItem = {
|
||||||
|
|
||||||
export const CHECKLIST_ENABLED_PRODUCTS: ReadonlySet<number> = new Set([2, 4, 5]);
|
export const CHECKLIST_ENABLED_PRODUCTS: ReadonlySet<number> = new Set([2, 4, 5]);
|
||||||
|
|
||||||
|
export type ChecklistSummary = {
|
||||||
|
installationId: number;
|
||||||
|
done: number;
|
||||||
|
total: number;
|
||||||
|
};
|
||||||
|
|
||||||
export function parseSubtasks(raw: string | null | undefined): ChecklistSubtask[] {
|
export function parseSubtasks(raw: string | null | undefined): ChecklistSubtask[] {
|
||||||
if (!raw) return [];
|
if (!raw) return [];
|
||||||
try {
|
try {
|
||||||
|
|
|
||||||
|
|
@ -712,5 +712,41 @@
|
||||||
"checklistCommentsPlaceholder": "Notizen, Kontaktinformationen, Beobachtungen…",
|
"checklistCommentsPlaceholder": "Notizen, Kontaktinformationen, Beobachtungen…",
|
||||||
"checklistEmailSent": "E-Mail an {name} gesendet",
|
"checklistEmailSent": "E-Mail an {name} gesendet",
|
||||||
"checklistEmailFailed": "E-Mail-Versand fehlgeschlagen — bitte erneut versuchen",
|
"checklistEmailFailed": "E-Mail-Versand fehlgeschlagen — bitte erneut versuchen",
|
||||||
"checklistSaveFailed": "Änderung konnte nicht gespeichert werden"
|
"checklistSaveFailed": "Änderung konnte nicht gespeichert werden",
|
||||||
|
"checklistStep1": "Auftrag erstellt, Kunden- und Partnerinformationen im CRM erfasst",
|
||||||
|
"checklistStep2": "Hardware bei Vebo zusammengebaut",
|
||||||
|
"checklistStep3": "Installation auf Monitor unter korrektem Produkt und Ordner erstellt",
|
||||||
|
"checklistStep4": "Gateway-SD-Karte konfiguriert, VPN und Gateway-Name registriert",
|
||||||
|
"checklistStep5": "Informations-Tab ausgefüllt (Kunde, Seriennummern, VPN)",
|
||||||
|
"checklistStep6": "Installation bei Vebo elektrisch/hardwareseitig konfiguriert und getestet",
|
||||||
|
"checklistStep7": "Installation bei Vebo softwareseitig getestet",
|
||||||
|
"checklistStep8": "Installation am Kundenstandort ausgeliefert",
|
||||||
|
"checklistStep9": "Installation ans Netz angeschlossen",
|
||||||
|
"checklistStep10": "Hardware vor Ort verifiziert",
|
||||||
|
"checklistStep11": "Software vor Ort verifiziert",
|
||||||
|
"checklistStep12": "Installation online auf Monitor",
|
||||||
|
"checklistStep13": "Kunde über Monitor-Konto und Reports informiert",
|
||||||
|
"checklistStep14": "Benutzerkonto mit richtigen Ordnern und Zugriffen erstellt",
|
||||||
|
"checklistStep15": "Kundennachverfolgung abgeschlossen, Feedback eingeholt",
|
||||||
|
"checklistStep16": "Weitere Anliegen werden über das Ticket-System verfolgt",
|
||||||
|
"checklistStep5Sub1": "Kundeninformationen (E-Mail, Adresse)",
|
||||||
|
"checklistStep5Sub2": "Installationsinformationen (externes EMS, Stromanbieter, Datenerfassung)",
|
||||||
|
"checklistStep5Sub3": "Batterie-Seriennummer",
|
||||||
|
"checklistStep5Sub4": "Wechselrichter-Seriennummer",
|
||||||
|
"checklistStep5Sub5": "Datenlogger-Seriennummer",
|
||||||
|
"checklistStep5Sub6": "VPN",
|
||||||
|
"checklistStep6Sub1": "Wechselrichter-Firmware und Konfiguration geprüft",
|
||||||
|
"checklistStep6Sub2": "Batterie-Firmware und Konfiguration geprüft",
|
||||||
|
"checklistStep6Sub3": "Internet für Gateway konfiguriert",
|
||||||
|
"checklistStep6Sub4": "Kommunikationskabel zwischen Gateway und Wechselrichter korrekt",
|
||||||
|
"checklistStep7Sub1": "S3-Bucket-Nummer und Schlüssel-Credentials aus Informations-Tab in config.json übernommen",
|
||||||
|
"checklistStep7Sub2": "Produkt-ID in config.json konfiguriert",
|
||||||
|
"checklistStep7Sub3": "USB-ID in config.json konfiguriert",
|
||||||
|
"checklistStep7Sub4": "Datenlesung vom Wechselrichter getestet",
|
||||||
|
"setupProgress": "Setup-Fortschritt",
|
||||||
|
"checklistPhaseEmpty": "Nicht gestartet",
|
||||||
|
"checklistPhasePreparation": "Vorbereitung",
|
||||||
|
"checklistPhaseOnSite": "Vor Ort",
|
||||||
|
"checklistPhaseHandover": "Kundenübergabe",
|
||||||
|
"checklistPhaseComplete": "Abgeschlossen"
|
||||||
}
|
}
|
||||||
|
|
@ -460,5 +460,41 @@
|
||||||
"checklistCommentsPlaceholder": "Notes, contact info, observations…",
|
"checklistCommentsPlaceholder": "Notes, contact info, observations…",
|
||||||
"checklistEmailSent": "Email sent to {name}",
|
"checklistEmailSent": "Email sent to {name}",
|
||||||
"checklistEmailFailed": "Failed to send email — try again",
|
"checklistEmailFailed": "Failed to send email — try again",
|
||||||
"checklistSaveFailed": "Failed to save change"
|
"checklistSaveFailed": "Failed to save change",
|
||||||
|
"checklistStep1": "Order created, customer and partner info recorded in CRM",
|
||||||
|
"checklistStep2": "Hardware assembled at Vebo",
|
||||||
|
"checklistStep3": "Installation created on Monitor under correct product and folder",
|
||||||
|
"checklistStep4": "Gateway SD card configured, VPN and gateway name registered",
|
||||||
|
"checklistStep5": "Information tab filled out (customer, serials, VPN)",
|
||||||
|
"checklistStep6": "Installation configured and tested electrically / hardware-wise at Vebo",
|
||||||
|
"checklistStep7": "Installation tested software-wise at Vebo",
|
||||||
|
"checklistStep8": "Installation delivered to customer site",
|
||||||
|
"checklistStep9": "Installation connected to grid",
|
||||||
|
"checklistStep10": "Hardware verified on site",
|
||||||
|
"checklistStep11": "Software verified on site",
|
||||||
|
"checklistStep12": "Installation online on Monitor",
|
||||||
|
"checklistStep13": "Customer informed about Monitor account and reports",
|
||||||
|
"checklistStep14": "User account created with correct folders and access",
|
||||||
|
"checklistStep15": "Customer follow-up completed, feedback collected",
|
||||||
|
"checklistStep16": "Further issues tracked via Ticket system",
|
||||||
|
"checklistStep5Sub1": "Customer information (email, address)",
|
||||||
|
"checklistStep5Sub2": "Installation information (external EMS, grid provider, data collection)",
|
||||||
|
"checklistStep5Sub3": "Battery serial number",
|
||||||
|
"checklistStep5Sub4": "Inverter serial number",
|
||||||
|
"checklistStep5Sub5": "Data logger serial number",
|
||||||
|
"checklistStep5Sub6": "VPN",
|
||||||
|
"checklistStep6Sub1": "Inverter firmware and configuration verified",
|
||||||
|
"checklistStep6Sub2": "Battery firmware and configuration verified",
|
||||||
|
"checklistStep6Sub3": "Internet for gateway configured",
|
||||||
|
"checklistStep6Sub4": "Communication cable between gateway and inverter correct",
|
||||||
|
"checklistStep7Sub1": "S3 bucket number and key credentials copied from Information tab into config.json",
|
||||||
|
"checklistStep7Sub2": "Product ID configured in config.json",
|
||||||
|
"checklistStep7Sub3": "USB ID configured in config.json",
|
||||||
|
"checklistStep7Sub4": "Inverter data reading from inverter tested",
|
||||||
|
"setupProgress": "Setup Progress",
|
||||||
|
"checklistPhaseEmpty": "Not started",
|
||||||
|
"checklistPhasePreparation": "Preparation",
|
||||||
|
"checklistPhaseOnSite": "On-site",
|
||||||
|
"checklistPhaseHandover": "Customer handover",
|
||||||
|
"checklistPhaseComplete": "Complete"
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -712,5 +712,41 @@
|
||||||
"checklistCommentsPlaceholder": "Notes, coordonnées, observations…",
|
"checklistCommentsPlaceholder": "Notes, coordonnées, observations…",
|
||||||
"checklistEmailSent": "E-mail envoyé à {name}",
|
"checklistEmailSent": "E-mail envoyé à {name}",
|
||||||
"checklistEmailFailed": "Échec de l'envoi — veuillez réessayer",
|
"checklistEmailFailed": "Échec de l'envoi — veuillez réessayer",
|
||||||
"checklistSaveFailed": "Échec de l'enregistrement"
|
"checklistSaveFailed": "Échec de l'enregistrement",
|
||||||
|
"checklistStep1": "Commande créée, informations client et partenaire enregistrées dans le CRM",
|
||||||
|
"checklistStep2": "Matériel assemblé chez Vebo",
|
||||||
|
"checklistStep3": "Installation créée sur Monitor sous le bon produit et dossier",
|
||||||
|
"checklistStep4": "Carte SD du gateway configurée, VPN et nom du gateway enregistrés",
|
||||||
|
"checklistStep5": "Onglet Informations rempli (client, numéros de série, VPN)",
|
||||||
|
"checklistStep6": "Installation configurée et testée électriquement/matériel chez Vebo",
|
||||||
|
"checklistStep7": "Installation testée côté logiciel chez Vebo",
|
||||||
|
"checklistStep8": "Installation livrée sur le site du client",
|
||||||
|
"checklistStep9": "Installation raccordée au réseau",
|
||||||
|
"checklistStep10": "Matériel vérifié sur site",
|
||||||
|
"checklistStep11": "Logiciel vérifié sur site",
|
||||||
|
"checklistStep12": "Installation en ligne sur Monitor",
|
||||||
|
"checklistStep13": "Client informé du compte Monitor et des rapports",
|
||||||
|
"checklistStep14": "Compte utilisateur créé avec les dossiers et accès corrects",
|
||||||
|
"checklistStep15": "Suivi client effectué, retour recueilli",
|
||||||
|
"checklistStep16": "Problèmes ultérieurs suivis via le système de tickets",
|
||||||
|
"checklistStep5Sub1": "Informations client (e-mail, adresse)",
|
||||||
|
"checklistStep5Sub2": "Informations d'installation (EMS externe, fournisseur réseau, collecte de données)",
|
||||||
|
"checklistStep5Sub3": "Numéro de série de la batterie",
|
||||||
|
"checklistStep5Sub4": "Numéro de série de l'onduleur",
|
||||||
|
"checklistStep5Sub5": "Numéro de série de l'enregistreur de données",
|
||||||
|
"checklistStep5Sub6": "VPN",
|
||||||
|
"checklistStep6Sub1": "Firmware et configuration de l'onduleur vérifiés",
|
||||||
|
"checklistStep6Sub2": "Firmware et configuration de la batterie vérifiés",
|
||||||
|
"checklistStep6Sub3": "Internet pour le gateway configuré",
|
||||||
|
"checklistStep6Sub4": "Câble de communication entre gateway et onduleur correct",
|
||||||
|
"checklistStep7Sub1": "Numéro de bucket S3 et identifiants copiés depuis l'onglet Informations dans config.json",
|
||||||
|
"checklistStep7Sub2": "ID produit configuré dans config.json",
|
||||||
|
"checklistStep7Sub3": "ID USB configuré dans config.json",
|
||||||
|
"checklistStep7Sub4": "Lecture des données de l'onduleur testée",
|
||||||
|
"setupProgress": "Progression installation",
|
||||||
|
"checklistPhaseEmpty": "Non commencé",
|
||||||
|
"checklistPhasePreparation": "Préparation",
|
||||||
|
"checklistPhaseOnSite": "Sur site",
|
||||||
|
"checklistPhaseHandover": "Transfert client",
|
||||||
|
"checklistPhaseComplete": "Terminé"
|
||||||
}
|
}
|
||||||
|
|
@ -712,5 +712,41 @@
|
||||||
"checklistCommentsPlaceholder": "Note, contatti, osservazioni…",
|
"checklistCommentsPlaceholder": "Note, contatti, osservazioni…",
|
||||||
"checklistEmailSent": "E-mail inviata a {name}",
|
"checklistEmailSent": "E-mail inviata a {name}",
|
||||||
"checklistEmailFailed": "Invio e-mail non riuscito — riprovare",
|
"checklistEmailFailed": "Invio e-mail non riuscito — riprovare",
|
||||||
"checklistSaveFailed": "Salvataggio non riuscito"
|
"checklistSaveFailed": "Salvataggio non riuscito",
|
||||||
|
"checklistStep1": "Ordine creato, informazioni cliente e partner registrate nel CRM",
|
||||||
|
"checklistStep2": "Hardware assemblato presso Vebo",
|
||||||
|
"checklistStep3": "Installazione creata su Monitor sotto il prodotto e la cartella corretti",
|
||||||
|
"checklistStep4": "Scheda SD del gateway configurata, VPN e nome gateway registrati",
|
||||||
|
"checklistStep5": "Scheda Informazioni compilata (cliente, seriali, VPN)",
|
||||||
|
"checklistStep6": "Installazione configurata e testata elettricamente/hardware presso Vebo",
|
||||||
|
"checklistStep7": "Installazione testata a livello software presso Vebo",
|
||||||
|
"checklistStep8": "Installazione consegnata presso il sito del cliente",
|
||||||
|
"checklistStep9": "Installazione collegata alla rete",
|
||||||
|
"checklistStep10": "Hardware verificato in sito",
|
||||||
|
"checklistStep11": "Software verificato in sito",
|
||||||
|
"checklistStep12": "Installazione online su Monitor",
|
||||||
|
"checklistStep13": "Cliente informato su account Monitor e report",
|
||||||
|
"checklistStep14": "Account utente creato con cartelle e accessi corretti",
|
||||||
|
"checklistStep15": "Follow-up cliente completato, feedback raccolto",
|
||||||
|
"checklistStep16": "Ulteriori problemi tracciati tramite il sistema di ticket",
|
||||||
|
"checklistStep5Sub1": "Informazioni cliente (e-mail, indirizzo)",
|
||||||
|
"checklistStep5Sub2": "Informazioni installazione (EMS esterno, fornitore di rete, raccolta dati)",
|
||||||
|
"checklistStep5Sub3": "Numero di serie batteria",
|
||||||
|
"checklistStep5Sub4": "Numero di serie inverter",
|
||||||
|
"checklistStep5Sub5": "Numero di serie data logger",
|
||||||
|
"checklistStep5Sub6": "VPN",
|
||||||
|
"checklistStep6Sub1": "Firmware e configurazione inverter verificati",
|
||||||
|
"checklistStep6Sub2": "Firmware e configurazione batteria verificati",
|
||||||
|
"checklistStep6Sub3": "Internet per gateway configurato",
|
||||||
|
"checklistStep6Sub4": "Cavo di comunicazione tra gateway e inverter corretto",
|
||||||
|
"checklistStep7Sub1": "Numero bucket S3 e credenziali copiati dalla scheda Informazioni in config.json",
|
||||||
|
"checklistStep7Sub2": "ID prodotto configurato in config.json",
|
||||||
|
"checklistStep7Sub3": "ID USB configurato in config.json",
|
||||||
|
"checklistStep7Sub4": "Lettura dati inverter testata",
|
||||||
|
"setupProgress": "Avanzamento installazione",
|
||||||
|
"checklistPhaseEmpty": "Non avviato",
|
||||||
|
"checklistPhasePreparation": "Preparazione",
|
||||||
|
"checklistPhaseOnSite": "In sito",
|
||||||
|
"checklistPhaseHandover": "Consegna cliente",
|
||||||
|
"checklistPhaseComplete": "Completato"
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue