feat(finance): implement project finance and rate card management features

- Added new controllers for managing project finance and rate cards, including CRUD operations for rate card roles and project finance tasks.
- Introduced API routes for project finance and rate card functionalities, enhancing the backend structure.
- Developed frontend components for displaying and managing project finance data, including a finance drawer and rate card settings.
- Enhanced localization files to support new UI elements and ensure consistency across multiple languages.
- Implemented utility functions for handling man-days and financial calculations, improving overall functionality.
This commit is contained in:
chamikaJ
2025-07-24 15:23:34 +05:30
parent 4b54f2cc17
commit 4ffc3465e3
51 changed files with 10202 additions and 169 deletions

View File

@@ -0,0 +1,114 @@
{
"financeText": "Finance",
"ratecardSingularText": "Rate Card",
"groupByText": "Group by",
"statusText": "Status",
"phaseText": "Phase",
"priorityText": "Priority",
"exportButton": "Export",
"currencyText": "Currency",
"importButton": "Import",
"filterText": "Filter",
"billableOnlyText": "Billable Only",
"nonBillableOnlyText": "Non-Billable Only",
"allTasksText": "All Tasks",
"projectBudgetOverviewText": "Project Budget Overview",
"taskColumn": "Task",
"membersColumn": "Members",
"hoursColumn": "Estimated Hours",
"manDaysColumn": "Estimated Man Days",
"actualManDaysColumn": "Actual Man Days",
"effortVarianceColumn": "Effort Variance",
"totalTimeLoggedColumn": "Total Time Logged",
"costColumn": "Actual Cost",
"estimatedCostColumn": "Estimated Cost",
"fixedCostColumn": "Fixed Cost",
"totalBudgetedCostColumn": "Total Budgeted Cost",
"totalActualCostColumn": "Total Actual Cost",
"varianceColumn": "Variance",
"totalText": "Total",
"noTasksFound": "No tasks found",
"addRoleButton": "+ Add Role",
"ratecardImportantNotice": "* This rate card is generated based on the company's standard job titles and rates. However, you have the flexibility to modify it according to the project. These changes will not impact the organization's standard job titles and rates.",
"saveButton": "Save",
"jobTitleColumn": "Job Title",
"ratePerHourColumn": "Rate per hour",
"ratePerManDayColumn": "Rate per man day",
"calculationMethodText": "Calculation Method",
"hourlyRatesText": "Hourly Rates",
"manDaysText": "Man Days",
"hoursPerDayText": "Hours per Day",
"ratecardPluralText": "Rate Cards",
"labourHoursColumn": "Labour Hours",
"actions": "Actions",
"selectJobTitle": "Select Job Title",
"ratecardsPluralText": "Rate Card Templates",
"deleteConfirm": "Are you sure ?",
"yes": "Yes",
"no": "No",
"alreadyImportedRateCardMessage": "A rate card has already been imported. Clear all imported rate cards to add a new one.",
"budgetOverviewTooltips": {
"manualBudget": "Manual project budget amount set by project manager",
"totalActualCost": "Total actual cost including fixed costs",
"variance": "Difference between manual budget and actual cost",
"utilization": "Percentage of manual budget utilized",
"estimatedHours": "Total estimated hours from all tasks",
"fixedCosts": "Total fixed costs from all tasks",
"timeBasedCost": "Actual cost from time tracking (excluding fixed costs)",
"remainingBudget": "Remaining budget amount"
},
"budgetModal": {
"title": "Edit Project Budget",
"description": "Set a manual budget for this project. This budget will be used for all financial calculations and should include both time-based costs and fixed costs.",
"placeholder": "Enter budget amount",
"saveButton": "Save",
"cancelButton": "Cancel"
},
"budgetStatistics": {
"manualBudget": "Manual Budget",
"totalActualCost": "Total Actual Cost",
"variance": "Variance",
"budgetUtilization": "Budget Utilization",
"estimatedHours": "Estimated Hours",
"fixedCosts": "Fixed Costs",
"timeBasedCost": "Time-based Cost",
"remainingBudget": "Remaining Budget",
"noManualBudgetSet": "(No Manual Budget Set)"
},
"budgetSettingsDrawer": {
"title": "Project Budget Settings",
"budgetConfiguration": "Budget Configuration",
"projectBudget": "Project Budget",
"projectBudgetTooltip": "Total budget allocated for this project",
"currency": "Currency",
"costCalculationMethod": "Cost Calculation Method",
"calculationMethod": "Calculation Method",
"workingHoursPerDay": "Working Hours per Day",
"workingHoursPerDayTooltip": "Number of working hours in a day for man-day calculations",
"hourlyCalculationInfo": "Costs will be calculated using estimated hours × hourly rates",
"manDaysCalculationInfo": "Costs will be calculated using estimated man days × daily rates",
"importantNotes": "Important Notes",
"calculationMethodChangeNote": "• Changing the calculation method will affect how costs are calculated for all tasks in this project",
"immediateEffectNote": "• Changes take effect immediately and will recalculate all project totals",
"projectWideNote": "• Budget settings apply to the entire project and all its tasks",
"cancel": "Cancel",
"saveChanges": "Save Changes",
"budgetSettingsUpdated": "Budget settings updated successfully",
"budgetSettingsUpdateFailed": "Failed to update budget settings"
},
"columnTooltips": {
"hours": "Total estimated hours for all tasks. Calculated from task time estimates.",
"manDays": "Total estimated man days for all tasks. Based on {{hoursPerDay}} hours per working day.",
"actualManDays": "Actual man days spent based on time logged. Calculated as: Total Time Logged ÷ {{hoursPerDay}} hours per day.",
"effortVariance": "Difference between estimated and actual man days. Positive values indicate over-estimation, negative values indicate under-estimation.",
"totalTimeLogged": "Total time actually logged by team members across all tasks.",
"estimatedCostHourly": "Estimated cost calculated as: Estimated Hours × Hourly Rates for assigned team members.",
"estimatedCostManDays": "Estimated cost calculated as: Estimated Man Days × Daily Rates for assigned team members.",
"actualCost": "Actual cost based on time logged. Calculated as: Time Logged × Hourly Rates for team members.",
"fixedCost": "Fixed costs that don't depend on time spent. Added manually per task.",
"totalBudgetHourly": "Total budgeted cost including estimated cost (Hours × Hourly Rates) + Fixed Costs.",
"totalBudgetManDays": "Total budgeted cost including estimated cost (Man Days × Daily Rates) + Fixed Costs.",
"totalActual": "Total actual cost including time-based cost + Fixed Costs.",
"variance": "Cost variance: Total Budgeted Costs - Total Actual Cost. Positive values indicate under-budget, negative values indicate over-budget."
}
}

View File

@@ -0,0 +1,52 @@
{
"nameColumn": "Emri",
"createdColumn": "Krijuar",
"noProjectsAvailable": "Nuk ka projekte të disponueshme",
"deleteConfirmationTitle": "Jeni i sigurt që doni të fshini këtë rate card?",
"deleteConfirmationOk": "Po, fshij",
"deleteConfirmationCancel": "Anulo",
"searchPlaceholder": "Kërko rate cards sipas emrit",
"createRatecard": "Krijo Rate Card",
"editTooltip": "Redakto rate card",
"deleteTooltip": "Fshi rate card",
"fetchError": "Dështoi të merret rate card",
"createError": "Dështoi të krijohet rate card",
"deleteSuccess": "Rate card u fshi me sukses",
"deleteError": "Dështoi të fshihet rate card",
"jobTitleColumn": "Titulli i punës",
"ratePerHourColumn": "Tarifa për orë",
"ratePerDayColumn": "Tarifa për ditë",
"ratePerManDayColumn": "Tarifa për ditë-njeri",
"saveButton": "Ruaj",
"addRoleButton": "Shto rol",
"createRatecardSuccessMessage": "Rate card u krijua me sukses",
"createRatecardErrorMessage": "Dështoi të krijohet rate card",
"updateRatecardSuccessMessage": "Rate card u përditësua me sukses",
"updateRatecardErrorMessage": "Dështoi të përditësohet rate card",
"currency": "Monedha",
"actionsColumn": "Veprime",
"addAllButton": "Shto të gjitha",
"removeAllButton": "Hiq të gjitha",
"selectJobTitle": "Zgjidh titullin e punës",
"unsavedChangesTitle": "Keni ndryshime të paruajtura",
"unsavedChangesMessage": "Dëshironi të ruani ndryshimet para se të largoheni?",
"unsavedChangesSave": "Ruaj",
"unsavedChangesDiscard": "Hidh poshtë",
"ratecardNameRequired": "Emri i rate card është i detyrueshëm",
"ratecardNamePlaceholder": "Shkruani emrin e rate card",
"noRatecardsFound": "Nuk u gjetën rate cards",
"loadingRateCards": "Duke ngarkuar rate cards...",
"noJobTitlesAvailable": "Nuk ka tituj pune të disponueshëm",
"noRolesAdded": "Ende nuk janë shtuar role",
"createFirstJobTitle": "Krijo titullin e parë të punës",
"jobRolesTitle": "Rolet e punës",
"noJobTitlesMessage": "Ju lutemi krijoni tituj pune së pari në cilësimet përpara se të shtoni role në rate cards.",
"createNewJobTitle": "Krijo titull të ri pune",
"jobTitleNamePlaceholder": "Shkruani emrin e titullit të punës",
"jobTitleNameRequired": "Emri i titullit të punës është i detyrueshëm",
"jobTitleCreatedSuccess": "Titulli i punës u krijua me sukses",
"jobTitleCreateError": "Dështoi të krijohet titulli i punës",
"createButton": "Krijo",
"cancelButton": "Anulo"
}

View File

@@ -0,0 +1,114 @@
{
"financeText": "Finance",
"ratecardSingularText": "Rate Card",
"groupByText": "Group by",
"statusText": "Status",
"phaseText": "Phase",
"priorityText": "Priority",
"exportButton": "Export",
"currencyText": "Currency",
"importButton": "Import",
"filterText": "Filter",
"billableOnlyText": "Billable Only",
"nonBillableOnlyText": "Non-Billable Only",
"allTasksText": "All Tasks",
"projectBudgetOverviewText": "Project Budget Overview",
"taskColumn": "Task",
"membersColumn": "Members",
"hoursColumn": "Estimated Hours",
"manDaysColumn": "Estimated Man Days",
"actualManDaysColumn": "Actual Man Days",
"effortVarianceColumn": "Effort Variance",
"totalTimeLoggedColumn": "Total Time Logged",
"costColumn": "Actual Cost",
"estimatedCostColumn": "Estimated Cost",
"fixedCostColumn": "Fixed Cost",
"totalBudgetedCostColumn": "Total Budgeted Cost",
"totalActualCostColumn": "Total Actual Cost",
"varianceColumn": "Variance",
"totalText": "Total",
"noTasksFound": "No tasks found",
"addRoleButton": "+ Add Role",
"ratecardImportantNotice": "* This rate card is generated based on the company's standard job titles and rates. However, you have the flexibility to modify it according to the project. These changes will not impact the organization's standard job titles and rates.",
"saveButton": "Save",
"jobTitleColumn": "Job Title",
"ratePerHourColumn": "Rate per hour",
"ratePerManDayColumn": "Rate per man day",
"calculationMethodText": "Calculation Method",
"hourlyRatesText": "Hourly Rates",
"manDaysText": "Man Days",
"hoursPerDayText": "Hours per Day",
"ratecardPluralText": "Rate Cards",
"labourHoursColumn": "Labour Hours",
"actions": "Actions",
"selectJobTitle": "Select Job Title",
"ratecardsPluralText": "Rate Card Templates",
"deleteConfirm": "Are you sure ?",
"yes": "Yes",
"no": "No",
"alreadyImportedRateCardMessage": "A rate card has already been imported. Clear all imported rate cards to add a new one.",
"budgetOverviewTooltips": {
"manualBudget": "Manual project budget amount set by project manager",
"totalActualCost": "Total actual cost including fixed costs",
"variance": "Difference between manual budget and actual cost",
"utilization": "Percentage of manual budget utilized",
"estimatedHours": "Total estimated hours from all tasks",
"fixedCosts": "Total fixed costs from all tasks",
"timeBasedCost": "Actual cost from time tracking (excluding fixed costs)",
"remainingBudget": "Remaining budget amount"
},
"budgetModal": {
"title": "Edit Project Budget",
"description": "Set a manual budget for this project. This budget will be used for all financial calculations and should include both time-based costs and fixed costs.",
"placeholder": "Enter budget amount",
"saveButton": "Save",
"cancelButton": "Cancel"
},
"budgetStatistics": {
"manualBudget": "Manual Budget",
"totalActualCost": "Total Actual Cost",
"variance": "Variance",
"budgetUtilization": "Budget Utilization",
"estimatedHours": "Estimated Hours",
"fixedCosts": "Fixed Costs",
"timeBasedCost": "Time-based Cost",
"remainingBudget": "Remaining Budget",
"noManualBudgetSet": "(No Manual Budget Set)"
},
"budgetSettingsDrawer": {
"title": "Project Budget Settings",
"budgetConfiguration": "Budget Configuration",
"projectBudget": "Project Budget",
"projectBudgetTooltip": "Total budget allocated for this project",
"currency": "Currency",
"costCalculationMethod": "Cost Calculation Method",
"calculationMethod": "Calculation Method",
"workingHoursPerDay": "Working Hours per Day",
"workingHoursPerDayTooltip": "Number of working hours in a day for man-day calculations",
"hourlyCalculationInfo": "Costs will be calculated using estimated hours × hourly rates",
"manDaysCalculationInfo": "Costs will be calculated using estimated man days × daily rates",
"importantNotes": "Important Notes",
"calculationMethodChangeNote": "• Changing the calculation method will affect how costs are calculated for all tasks in this project",
"immediateEffectNote": "• Changes take effect immediately and will recalculate all project totals",
"projectWideNote": "• Budget settings apply to the entire project and all its tasks",
"cancel": "Cancel",
"saveChanges": "Save Changes",
"budgetSettingsUpdated": "Budget settings updated successfully",
"budgetSettingsUpdateFailed": "Failed to update budget settings"
},
"columnTooltips": {
"hours": "Total estimated hours for all tasks. Calculated from task time estimates.",
"manDays": "Total estimated man days for all tasks. Based on {{hoursPerDay}} hours per working day.",
"actualManDays": "Actual man days spent based on time logged. Calculated as: Total Time Logged ÷ {{hoursPerDay}} hours per day.",
"effortVariance": "Difference between estimated and actual man days. Positive values indicate over-estimation, negative values indicate under-estimation.",
"totalTimeLogged": "Total time actually logged by team members across all tasks.",
"estimatedCostHourly": "Estimated cost calculated as: Estimated Hours × Hourly Rates for assigned team members.",
"estimatedCostManDays": "Estimated cost calculated as: Estimated Man Days × Daily Rates for assigned team members.",
"actualCost": "Actual cost based on time logged. Calculated as: Time Logged × Hourly Rates for team members.",
"fixedCost": "Fixed costs that don't depend on time spent. Added manually per task.",
"totalBudgetHourly": "Total budgeted cost including estimated cost (Hours × Hourly Rates) + Fixed Costs.",
"totalBudgetManDays": "Total budgeted cost including estimated cost (Man Days × Daily Rates) + Fixed Costs.",
"totalActual": "Total actual cost including time-based cost + Fixed Costs.",
"variance": "Cost variance: Total Budgeted Costs - Total Actual Cost. Positive values indicate under-budget, negative values indicate over-budget."
}
}

View File

@@ -0,0 +1,52 @@
{
"nameColumn": "Name",
"createdColumn": "Erstellt",
"noProjectsAvailable": "Keine Projekte verfügbar",
"deleteConfirmationTitle": "Sind Sie sicher, dass Sie diese Rate Card löschen möchten?",
"deleteConfirmationOk": "Ja, löschen",
"deleteConfirmationCancel": "Abbrechen",
"searchPlaceholder": "Rate Cards nach Name suchen",
"createRatecard": "Rate Card erstellen",
"editTooltip": "Rate Card bearbeiten",
"deleteTooltip": "Rate Card löschen",
"fetchError": "Rate Cards konnten nicht abgerufen werden",
"createError": "Rate Card konnte nicht erstellt werden",
"deleteSuccess": "Rate Card erfolgreich gelöscht",
"deleteError": "Rate Card konnte nicht gelöscht werden",
"jobTitleColumn": "Berufsbezeichnung",
"ratePerHourColumn": "Stundensatz",
"ratePerDayColumn": "Tagessatz",
"ratePerManDayColumn": "Satz pro Manntag",
"saveButton": "Speichern",
"addRoleButton": "Rolle hinzufügen",
"createRatecardSuccessMessage": "Rate Card erfolgreich erstellt",
"createRatecardErrorMessage": "Rate Card konnte nicht erstellt werden",
"updateRatecardSuccessMessage": "Rate Card erfolgreich aktualisiert",
"updateRatecardErrorMessage": "Rate Card konnte nicht aktualisiert werden",
"currency": "Währung",
"actionsColumn": "Aktionen",
"addAllButton": "Alle hinzufügen",
"removeAllButton": "Alle entfernen",
"selectJobTitle": "Berufsbezeichnung auswählen",
"unsavedChangesTitle": "Sie haben ungespeicherte Änderungen",
"unsavedChangesMessage": "Möchten Sie Ihre Änderungen vor dem Verlassen speichern?",
"unsavedChangesSave": "Speichern",
"unsavedChangesDiscard": "Verwerfen",
"ratecardNameRequired": "Rate Card Name ist erforderlich",
"ratecardNamePlaceholder": "Rate Card Name eingeben",
"noRatecardsFound": "Keine Rate Cards gefunden",
"loadingRateCards": "Rate Cards werden geladen...",
"noJobTitlesAvailable": "Keine Berufsbezeichnungen verfügbar",
"noRolesAdded": "Noch keine Rollen hinzugefügt",
"createFirstJobTitle": "Erste Berufsbezeichnung erstellen",
"jobRolesTitle": "Job-Rollen",
"noJobTitlesMessage": "Bitte erstellen Sie zuerst Berufsbezeichnungen in den Einstellungen, bevor Sie Rollen zu Rate Cards hinzufügen.",
"createNewJobTitle": "Neue Berufsbezeichnung erstellen",
"jobTitleNamePlaceholder": "Name der Berufsbezeichnung eingeben",
"jobTitleNameRequired": "Name der Berufsbezeichnung ist erforderlich",
"jobTitleCreatedSuccess": "Berufsbezeichnung erfolgreich erstellt",
"jobTitleCreateError": "Berufsbezeichnung konnte nicht erstellt werden",
"createButton": "Erstellen",
"cancelButton": "Abbrechen"
}

View File

@@ -0,0 +1,122 @@
{
"financeText": "Finance",
"ratecardSingularText": "Rate Card",
"groupByText": "Group by",
"statusText": "Status",
"phaseText": "Phase",
"priorityText": "Priority",
"exportButton": "Export",
"currencyText": "Currency",
"importButton": "Import",
"filterText": "Filter",
"billableOnlyText": "Billable Only",
"nonBillableOnlyText": "Non-Billable Only",
"allTasksText": "All Tasks",
"projectBudgetOverviewText": "Project Budget Overview",
"taskColumn": "Task",
"membersColumn": "Members",
"hoursColumn": "Estimated Hours",
"manDaysColumn": "Estimated Man Days",
"actualManDaysColumn": "Actual Man Days",
"effortVarianceColumn": "Effort Variance",
"totalTimeLoggedColumn": "Total Time Logged",
"costColumn": "Actual Cost",
"estimatedCostColumn": "Estimated Cost",
"fixedCostColumn": "Fixed Cost",
"totalBudgetedCostColumn": "Total Budgeted Cost",
"totalActualCostColumn": "Total Actual Cost",
"varianceColumn": "Variance",
"totalText": "Total",
"noTasksFound": "No tasks found",
"addRoleButton": "+ Add Role",
"ratecardImportantNotice": "* This rate card is generated based on the company's standard job titles and rates. However, you have the flexibility to modify it according to the project. These changes will not impact the organization's standard job titles and rates.",
"saveButton": "Save",
"jobTitleColumn": "Job Title",
"ratePerHourColumn": "Rate per hour",
"ratePerManDayColumn": "Rate per man day",
"calculationMethodText": "Calculation Method",
"hourlyRatesText": "Hourly Rates",
"manDaysText": "Man Days",
"hoursPerDayText": "Hours per Day",
"ratecardPluralText": "Rate Cards",
"labourHoursColumn": "Labour Hours",
"actions": "Actions",
"selectJobTitle": "Select Job Title",
"ratecardsPluralText": "Rate Card Templates",
"deleteConfirm": "Are you sure ?",
"yes": "Yes",
"no": "No",
"alreadyImportedRateCardMessage": "A rate card has already been imported. Clear all imported rate cards to add a new one.",
"budgetOverviewTooltips": {
"manualBudget": "Manual project budget amount set by project manager",
"totalActualCost": "Total actual cost including fixed costs",
"variance": "Difference between manual budget and actual cost",
"utilization": "Percentage of manual budget utilized",
"estimatedHours": "Total estimated hours from all tasks",
"fixedCosts": "Total fixed costs from all tasks",
"timeBasedCost": "Actual cost from time tracking (excluding fixed costs)",
"remainingBudget": "Remaining budget amount"
},
"budgetModal": {
"title": "Edit Project Budget",
"description": "Set a manual budget for this project. This budget will be used for all financial calculations and should include both time-based costs and fixed costs.",
"placeholder": "Enter budget amount",
"saveButton": "Save",
"cancelButton": "Cancel"
},
"budgetStatistics": {
"manualBudget": "Manual Budget",
"totalActualCost": "Total Actual Cost",
"variance": "Variance",
"budgetUtilization": "Budget Utilization",
"estimatedHours": "Estimated Hours",
"fixedCosts": "Fixed Costs",
"timeBasedCost": "Time-based Cost",
"remainingBudget": "Remaining Budget",
"noManualBudgetSet": "(No Manual Budget Set)"
},
"budgetSettingsDrawer": {
"title": "Project Budget Settings",
"budgetConfiguration": "Budget Configuration",
"projectBudget": "Project Budget",
"projectBudgetTooltip": "Total budget allocated for this project",
"currency": "Currency",
"costCalculationMethod": "Cost Calculation Method",
"calculationMethod": "Calculation Method",
"workingHoursPerDay": "Working Hours per Day",
"workingHoursPerDayTooltip": "Number of working hours in a day for man-day calculations",
"hourlyCalculationInfo": "Costs will be calculated using estimated hours × hourly rates",
"manDaysCalculationInfo": "Costs will be calculated using estimated man days × daily rates",
"importantNotes": "Important Notes",
"calculationMethodChangeNote": "• Changing the calculation method will affect how costs are calculated for all tasks in this project",
"immediateEffectNote": "• Changes take effect immediately and will recalculate all project totals",
"projectWideNote": "• Budget settings apply to the entire project and all its tasks",
"cancel": "Cancel",
"saveChanges": "Save Changes",
"budgetSettingsUpdated": "Budget settings updated successfully",
"budgetSettingsUpdateFailed": "Failed to update budget settings"
},
"columnTooltips": {
"hours": "Total estimated hours for all tasks. Calculated from task time estimates.",
"manDays": "Total estimated man days for all tasks. Based on {{hoursPerDay}} hours per working day.",
"actualManDays": "Actual man days spent based on time logged. Calculated as: Total Time Logged ÷ {{hoursPerDay}} hours per day.",
"effortVariance": "Difference between estimated and actual man days. Positive values indicate over-estimation, negative values indicate under-estimation.",
"totalTimeLogged": "Total time actually logged by team members across all tasks.",
"estimatedCostHourly": "Estimated cost calculated as: Estimated Hours × Hourly Rates for assigned team members.",
"estimatedCostManDays": "Estimated cost calculated as: Estimated Man Days × Daily Rates for assigned team members.",
"actualCost": "Actual cost based on time logged. Calculated as: Time Logged × Hourly Rates for team members.",
"fixedCost": "Fixed costs that don't depend on time spent. Added manually per task.",
"totalBudgetHourly": "Total budgeted cost including estimated cost (Hours × Hourly Rates) + Fixed Costs.",
"totalBudgetManDays": "Total budgeted cost including estimated cost (Man Days × Daily Rates) + Fixed Costs.",
"totalActual": "Total actual cost including time-based cost + Fixed Costs.",
"variance": "Cost variance: Total Budgeted Costs - Total Actual Cost. Positive values indicate under-budget, negative values indicate over-budget."
}
}

View File

@@ -0,0 +1,52 @@
{
"nameColumn": "Name",
"createdColumn": "Created",
"noProjectsAvailable": "No projects available",
"deleteConfirmationTitle": "Are you sure you want to delete this rate card?",
"deleteConfirmationOk": "Yes, delete",
"deleteConfirmationCancel": "Cancel",
"searchPlaceholder": "Search rate cards by name",
"createRatecard": "Create Rate Card",
"editTooltip": "Edit rate card",
"deleteTooltip": "Delete rate card",
"fetchError": "Failed to fetch rate cards",
"createError": "Failed to create rate card",
"deleteSuccess": "Rate card deleted successfully",
"deleteError": "Failed to delete rate card",
"jobTitleColumn": "Job title",
"ratePerHourColumn": "Rate per hour",
"ratePerDayColumn": "Rate per day",
"ratePerManDayColumn": "Rate per man day",
"saveButton": "Save",
"addRoleButton": "Add Role",
"createRatecardSuccessMessage": "Rate card created successfully",
"createRatecardErrorMessage": "Failed to create rate card",
"updateRatecardSuccessMessage": "Rate card updated successfully",
"updateRatecardErrorMessage": "Failed to update rate card",
"currency": "Currency",
"actionsColumn": "Actions",
"addAllButton": "Add All",
"removeAllButton": "Remove All",
"selectJobTitle": "Select job title",
"unsavedChangesTitle": "You have unsaved changes",
"unsavedChangesMessage": "Do you want to save your changes before leaving?",
"unsavedChangesSave": "Save",
"unsavedChangesDiscard": "Discard",
"ratecardNameRequired": "Rate card name is required",
"ratecardNamePlaceholder": "Enter rate card name",
"noRatecardsFound": "No rate cards found",
"loadingRateCards": "Loading rate cards...",
"noJobTitlesAvailable": "No job titles available",
"noRolesAdded": "No roles added yet",
"createFirstJobTitle": "Create First Job Title",
"jobRolesTitle": "Job Roles",
"noJobTitlesMessage": "Please create job titles first in the Job Titles settings before adding roles to rate cards.",
"createNewJobTitle": "Create New Job Title",
"jobTitleNamePlaceholder": "Enter job title name",
"jobTitleNameRequired": "Job title name is required",
"jobTitleCreatedSuccess": "Job title created successfully",
"jobTitleCreateError": "Failed to create job title",
"createButton": "Create",
"cancelButton": "Cancel"
}

View File

@@ -0,0 +1,114 @@
{
"financeText": "Finance",
"ratecardSingularText": "Rate Card",
"groupByText": "Group by",
"statusText": "Status",
"phaseText": "Phase",
"priorityText": "Priority",
"exportButton": "Export",
"currencyText": "Currency",
"importButton": "Import",
"filterText": "Filter",
"billableOnlyText": "Billable Only",
"nonBillableOnlyText": "Non-Billable Only",
"allTasksText": "All Tasks",
"projectBudgetOverviewText": "Project Budget Overview",
"taskColumn": "Task",
"membersColumn": "Members",
"hoursColumn": "Estimated Hours",
"manDaysColumn": "Estimated Man Days",
"actualManDaysColumn": "Actual Man Days",
"effortVarianceColumn": "Effort Variance",
"totalTimeLoggedColumn": "Total Time Logged",
"costColumn": "Actual Cost",
"estimatedCostColumn": "Estimated Cost",
"fixedCostColumn": "Fixed Cost",
"totalBudgetedCostColumn": "Total Budgeted Cost",
"totalActualCostColumn": "Total Actual Cost",
"varianceColumn": "Variance",
"totalText": "Total",
"noTasksFound": "No tasks found",
"addRoleButton": "+ Add Role",
"ratecardImportantNotice": "* This rate card is generated based on the company's standard job titles and rates. However, you have the flexibility to modify it according to the project. These changes will not impact the organization's standard job titles and rates.",
"saveButton": "Save",
"jobTitleColumn": "Job Title",
"ratePerHourColumn": "Rate per hour",
"ratePerManDayColumn": "Rate per man day",
"calculationMethodText": "Calculation Method",
"hourlyRatesText": "Hourly Rates",
"manDaysText": "Man Days",
"hoursPerDayText": "Hours per Day",
"ratecardPluralText": "Rate Cards",
"labourHoursColumn": "Labour Hours",
"actions": "Actions",
"selectJobTitle": "Select Job Title",
"ratecardsPluralText": "Rate Card Templates",
"deleteConfirm": "Are you sure ?",
"yes": "Yes",
"no": "No",
"alreadyImportedRateCardMessage": "A rate card has already been imported. Clear all imported rate cards to add a new one.",
"budgetOverviewTooltips": {
"manualBudget": "Manual project budget amount set by project manager",
"totalActualCost": "Total actual cost including fixed costs",
"variance": "Difference between manual budget and actual cost",
"utilization": "Percentage of manual budget utilized",
"estimatedHours": "Total estimated hours from all tasks",
"fixedCosts": "Total fixed costs from all tasks",
"timeBasedCost": "Actual cost from time tracking (excluding fixed costs)",
"remainingBudget": "Remaining budget amount"
},
"budgetModal": {
"title": "Edit Project Budget",
"description": "Set a manual budget for this project. This budget will be used for all financial calculations and should include both time-based costs and fixed costs.",
"placeholder": "Enter budget amount",
"saveButton": "Save",
"cancelButton": "Cancel"
},
"budgetStatistics": {
"manualBudget": "Manual Budget",
"totalActualCost": "Total Actual Cost",
"variance": "Variance",
"budgetUtilization": "Budget Utilization",
"estimatedHours": "Estimated Hours",
"fixedCosts": "Fixed Costs",
"timeBasedCost": "Time-based Cost",
"remainingBudget": "Remaining Budget",
"noManualBudgetSet": "(No Manual Budget Set)"
},
"budgetSettingsDrawer": {
"title": "Project Budget Settings",
"budgetConfiguration": "Budget Configuration",
"projectBudget": "Project Budget",
"projectBudgetTooltip": "Total budget allocated for this project",
"currency": "Currency",
"costCalculationMethod": "Cost Calculation Method",
"calculationMethod": "Calculation Method",
"workingHoursPerDay": "Working Hours per Day",
"workingHoursPerDayTooltip": "Number of working hours in a day for man-day calculations",
"hourlyCalculationInfo": "Costs will be calculated using estimated hours × hourly rates",
"manDaysCalculationInfo": "Costs will be calculated using estimated man days × daily rates",
"importantNotes": "Important Notes",
"calculationMethodChangeNote": "• Changing the calculation method will affect how costs are calculated for all tasks in this project",
"immediateEffectNote": "• Changes take effect immediately and will recalculate all project totals",
"projectWideNote": "• Budget settings apply to the entire project and all its tasks",
"cancel": "Cancel",
"saveChanges": "Save Changes",
"budgetSettingsUpdated": "Budget settings updated successfully",
"budgetSettingsUpdateFailed": "Failed to update budget settings"
},
"columnTooltips": {
"hours": "Total estimated hours for all tasks. Calculated from task time estimates.",
"manDays": "Total estimated man days for all tasks. Based on {{hoursPerDay}} hours per working day.",
"actualManDays": "Actual man days spent based on time logged. Calculated as: Total Time Logged ÷ {{hoursPerDay}} hours per day.",
"effortVariance": "Difference between estimated and actual man days. Positive values indicate over-estimation, negative values indicate under-estimation.",
"totalTimeLogged": "Total time actually logged by team members across all tasks.",
"estimatedCostHourly": "Estimated cost calculated as: Estimated Hours × Hourly Rates for assigned team members.",
"estimatedCostManDays": "Estimated cost calculated as: Estimated Man Days × Daily Rates for assigned team members.",
"actualCost": "Actual cost based on time logged. Calculated as: Time Logged × Hourly Rates for team members.",
"fixedCost": "Fixed costs that don't depend on time spent. Added manually per task.",
"totalBudgetHourly": "Total budgeted cost including estimated cost (Hours × Hourly Rates) + Fixed Costs.",
"totalBudgetManDays": "Total budgeted cost including estimated cost (Man Days × Daily Rates) + Fixed Costs.",
"totalActual": "Total actual cost including time-based cost + Fixed Costs.",
"variance": "Cost variance: Total Budgeted Costs - Total Actual Cost. Positive values indicate under-budget, negative values indicate over-budget."
}
}

View File

@@ -0,0 +1,52 @@
{
"nameColumn": "Nombre",
"createdColumn": "Creado",
"noProjectsAvailable": "No hay proyectos disponibles",
"deleteConfirmationTitle": "¿Está seguro de que desea eliminar esta rate card?",
"deleteConfirmationOk": "Sí, eliminar",
"deleteConfirmationCancel": "Cancelar",
"searchPlaceholder": "Buscar rate cards por nombre",
"createRatecard": "Crear Rate Card",
"editTooltip": "Editar rate card",
"deleteTooltip": "Eliminar rate card",
"fetchError": "No se pudieron obtener las rate cards",
"createError": "No se pudo crear la rate card",
"deleteSuccess": "Rate card eliminada con éxito",
"deleteError": "No se pudo eliminar la rate card",
"jobTitleColumn": "Título del trabajo",
"ratePerHourColumn": "Tarifa por hora",
"ratePerDayColumn": "Tarifa por día",
"ratePerManDayColumn": "Tarifa por día-hombre",
"saveButton": "Guardar",
"addRoleButton": "Agregar rol",
"createRatecardSuccessMessage": "Rate card creada con éxito",
"createRatecardErrorMessage": "No se pudo crear la rate card",
"updateRatecardSuccessMessage": "Rate card actualizada con éxito",
"updateRatecardErrorMessage": "No se pudo actualizar la rate card",
"currency": "Moneda",
"actionsColumn": "Acciones",
"addAllButton": "Agregar todo",
"removeAllButton": "Eliminar todo",
"selectJobTitle": "Seleccionar título del trabajo",
"unsavedChangesTitle": "Tiene cambios sin guardar",
"unsavedChangesMessage": "¿Desea guardar los cambios antes de salir?",
"unsavedChangesSave": "Guardar",
"unsavedChangesDiscard": "Descartar",
"ratecardNameRequired": "El nombre de la rate card es obligatorio",
"ratecardNamePlaceholder": "Ingrese el nombre de la rate card",
"noRatecardsFound": "No se encontraron rate cards",
"loadingRateCards": "Cargando rate cards...",
"noJobTitlesAvailable": "No hay títulos de trabajo disponibles",
"noRolesAdded": "Aún no se han agregado roles",
"createFirstJobTitle": "Crear primer título de trabajo",
"jobRolesTitle": "Roles de trabajo",
"noJobTitlesMessage": "Por favor, cree primero títulos de trabajo en la configuración antes de agregar roles a las rate cards.",
"createNewJobTitle": "Crear nuevo título de trabajo",
"jobTitleNamePlaceholder": "Ingrese el nombre del título de trabajo",
"jobTitleNameRequired": "El nombre del título de trabajo es obligatorio",
"jobTitleCreatedSuccess": "Título de trabajo creado con éxito",
"jobTitleCreateError": "No se pudo crear el título de trabajo",
"createButton": "Crear",
"cancelButton": "Cancelar"
}

View File

@@ -0,0 +1,114 @@
{
"financeText": "Finance",
"ratecardSingularText": "Rate Card",
"groupByText": "Group by",
"statusText": "Status",
"phaseText": "Phase",
"priorityText": "Priority",
"exportButton": "Export",
"currencyText": "Currency",
"importButton": "Import",
"filterText": "Filter",
"billableOnlyText": "Billable Only",
"nonBillableOnlyText": "Non-Billable Only",
"allTasksText": "All Tasks",
"projectBudgetOverviewText": "Project Budget Overview",
"taskColumn": "Task",
"membersColumn": "Members",
"hoursColumn": "Estimated Hours",
"manDaysColumn": "Estimated Man Days",
"actualManDaysColumn": "Actual Man Days",
"effortVarianceColumn": "Effort Variance",
"totalTimeLoggedColumn": "Total Time Logged",
"costColumn": "Actual Cost",
"estimatedCostColumn": "Estimated Cost",
"fixedCostColumn": "Fixed Cost",
"totalBudgetedCostColumn": "Total Budgeted Cost",
"totalActualCostColumn": "Total Actual Cost",
"varianceColumn": "Variance",
"totalText": "Total",
"noTasksFound": "No tasks found",
"addRoleButton": "+ Add Role",
"ratecardImportantNotice": "* This rate card is generated based on the company's standard job titles and rates. However, you have the flexibility to modify it according to the project. These changes will not impact the organization's standard job titles and rates.",
"saveButton": "Save",
"jobTitleColumn": "Job Title",
"ratePerHourColumn": "Rate per hour",
"ratePerManDayColumn": "Rate per man day",
"calculationMethodText": "Calculation Method",
"hourlyRatesText": "Hourly Rates",
"manDaysText": "Man Days",
"hoursPerDayText": "Hours per Day",
"ratecardPluralText": "Rate Cards",
"labourHoursColumn": "Labour Hours",
"actions": "Actions",
"selectJobTitle": "Select Job Title",
"ratecardsPluralText": "Rate Card Templates",
"deleteConfirm": "Are you sure ?",
"yes": "Yes",
"no": "No",
"alreadyImportedRateCardMessage": "A rate card has already been imported. Clear all imported rate cards to add a new one.",
"budgetOverviewTooltips": {
"manualBudget": "Manual project budget amount set by project manager",
"totalActualCost": "Total actual cost including fixed costs",
"variance": "Difference between manual budget and actual cost",
"utilization": "Percentage of manual budget utilized",
"estimatedHours": "Total estimated hours from all tasks",
"fixedCosts": "Total fixed costs from all tasks",
"timeBasedCost": "Actual cost from time tracking (excluding fixed costs)",
"remainingBudget": "Remaining budget amount"
},
"budgetModal": {
"title": "Edit Project Budget",
"description": "Set a manual budget for this project. This budget will be used for all financial calculations and should include both time-based costs and fixed costs.",
"placeholder": "Enter budget amount",
"saveButton": "Save",
"cancelButton": "Cancel"
},
"budgetStatistics": {
"manualBudget": "Manual Budget",
"totalActualCost": "Total Actual Cost",
"variance": "Variance",
"budgetUtilization": "Budget Utilization",
"estimatedHours": "Estimated Hours",
"fixedCosts": "Fixed Costs",
"timeBasedCost": "Time-based Cost",
"remainingBudget": "Remaining Budget",
"noManualBudgetSet": "(No Manual Budget Set)"
},
"budgetSettingsDrawer": {
"title": "Project Budget Settings",
"budgetConfiguration": "Budget Configuration",
"projectBudget": "Project Budget",
"projectBudgetTooltip": "Total budget allocated for this project",
"currency": "Currency",
"costCalculationMethod": "Cost Calculation Method",
"calculationMethod": "Calculation Method",
"workingHoursPerDay": "Working Hours per Day",
"workingHoursPerDayTooltip": "Number of working hours in a day for man-day calculations",
"hourlyCalculationInfo": "Costs will be calculated using estimated hours × hourly rates",
"manDaysCalculationInfo": "Costs will be calculated using estimated man days × daily rates",
"importantNotes": "Important Notes",
"calculationMethodChangeNote": "• Changing the calculation method will affect how costs are calculated for all tasks in this project",
"immediateEffectNote": "• Changes take effect immediately and will recalculate all project totals",
"projectWideNote": "• Budget settings apply to the entire project and all its tasks",
"cancel": "Cancel",
"saveChanges": "Save Changes",
"budgetSettingsUpdated": "Budget settings updated successfully",
"budgetSettingsUpdateFailed": "Failed to update budget settings"
},
"columnTooltips": {
"hours": "Total estimated hours for all tasks. Calculated from task time estimates.",
"manDays": "Total estimated man days for all tasks. Based on {{hoursPerDay}} hours per working day.",
"actualManDays": "Actual man days spent based on time logged. Calculated as: Total Time Logged ÷ {{hoursPerDay}} hours per day.",
"effortVariance": "Difference between estimated and actual man days. Positive values indicate over-estimation, negative values indicate under-estimation.",
"totalTimeLogged": "Total time actually logged by team members across all tasks.",
"estimatedCostHourly": "Estimated cost calculated as: Estimated Hours × Hourly Rates for assigned team members.",
"estimatedCostManDays": "Estimated cost calculated as: Estimated Man Days × Daily Rates for assigned team members.",
"actualCost": "Actual cost based on time logged. Calculated as: Time Logged × Hourly Rates for team members.",
"fixedCost": "Fixed costs that don't depend on time spent. Added manually per task.",
"totalBudgetHourly": "Total budgeted cost including estimated cost (Hours × Hourly Rates) + Fixed Costs.",
"totalBudgetManDays": "Total budgeted cost including estimated cost (Man Days × Daily Rates) + Fixed Costs.",
"totalActual": "Total actual cost including time-based cost + Fixed Costs.",
"variance": "Cost variance: Total Budgeted Costs - Total Actual Cost. Positive values indicate under-budget, negative values indicate over-budget."
}
}

View File

@@ -0,0 +1,52 @@
{
"nameColumn": "Nome",
"createdColumn": "Criado",
"noProjectsAvailable": "Nenhum projeto disponível",
"deleteConfirmationTitle": "Tem certeza de que deseja excluir este rate card?",
"deleteConfirmationOk": "Sim, excluir",
"deleteConfirmationCancel": "Cancelar",
"searchPlaceholder": "Pesquisar rate cards por nome",
"createRatecard": "Criar Rate Card",
"editTooltip": "Editar rate card",
"deleteTooltip": "Excluir rate card",
"fetchError": "Falha ao buscar rate cards",
"createError": "Falha ao criar rate card",
"deleteSuccess": "Rate card excluído com sucesso",
"deleteError": "Falha ao excluir rate card",
"jobTitleColumn": "Cargo",
"ratePerHourColumn": "Taxa por hora",
"ratePerDayColumn": "Taxa por dia",
"ratePerManDayColumn": "Taxa por dia-homem",
"saveButton": "Salvar",
"addRoleButton": "Adicionar função",
"createRatecardSuccessMessage": "Rate card criado com sucesso",
"createRatecardErrorMessage": "Falha ao criar rate card",
"updateRatecardSuccessMessage": "Rate card atualizado com sucesso",
"updateRatecardErrorMessage": "Falha ao atualizar rate card",
"currency": "Moeda",
"actionsColumn": "Ações",
"addAllButton": "Adicionar todos",
"removeAllButton": "Remover todos",
"selectJobTitle": "Selecionar cargo",
"unsavedChangesTitle": "Você tem alterações não salvas",
"unsavedChangesMessage": "Deseja salvar as alterações antes de sair?",
"unsavedChangesSave": "Salvar",
"unsavedChangesDiscard": "Descartar",
"ratecardNameRequired": "O nome do rate card é obrigatório",
"ratecardNamePlaceholder": "Digite o nome do rate card",
"noRatecardsFound": "Nenhum rate card encontrado",
"loadingRateCards": "Carregando rate cards...",
"noJobTitlesAvailable": "Nenhum cargo disponível",
"noRolesAdded": "Nenhuma função adicionada ainda",
"createFirstJobTitle": "Criar primeiro cargo",
"jobRolesTitle": "Funções de trabalho",
"noJobTitlesMessage": "Por favor, crie cargos primeiro nas configurações antes de adicionar funções aos rate cards.",
"createNewJobTitle": "Criar novo cargo",
"jobTitleNamePlaceholder": "Digite o nome do cargo",
"jobTitleNameRequired": "O nome do cargo é obrigatório",
"jobTitleCreatedSuccess": "Cargo criado com sucesso",
"jobTitleCreateError": "Falha ao criar cargo",
"createButton": "Criar",
"cancelButton": "Cancelar"
}

View File

@@ -0,0 +1,114 @@
{
"financeText": "Finance",
"ratecardSingularText": "Rate Card",
"groupByText": "Group by",
"statusText": "Status",
"phaseText": "Phase",
"priorityText": "Priority",
"exportButton": "Export",
"currencyText": "Currency",
"importButton": "Import",
"filterText": "Filter",
"billableOnlyText": "Billable Only",
"nonBillableOnlyText": "Non-Billable Only",
"allTasksText": "All Tasks",
"projectBudgetOverviewText": "Project Budget Overview",
"taskColumn": "Task",
"membersColumn": "Members",
"hoursColumn": "Estimated Hours",
"manDaysColumn": "Estimated Man Days",
"actualManDaysColumn": "Actual Man Days",
"effortVarianceColumn": "Effort Variance",
"totalTimeLoggedColumn": "Total Time Logged",
"costColumn": "Actual Cost",
"estimatedCostColumn": "Estimated Cost",
"fixedCostColumn": "Fixed Cost",
"totalBudgetedCostColumn": "Total Budgeted Cost",
"totalActualCostColumn": "Total Actual Cost",
"varianceColumn": "Variance",
"totalText": "Total",
"noTasksFound": "No tasks found",
"addRoleButton": "+ Add Role",
"ratecardImportantNotice": "* This rate card is generated based on the company's standard job titles and rates. However, you have the flexibility to modify it according to the project. These changes will not impact the organization's standard job titles and rates.",
"saveButton": "Save",
"jobTitleColumn": "Job Title",
"ratePerHourColumn": "Rate per hour",
"ratePerManDayColumn": "Rate per man day",
"calculationMethodText": "Calculation Method",
"hourlyRatesText": "Hourly Rates",
"manDaysText": "Man Days",
"hoursPerDayText": "Hours per Day",
"ratecardPluralText": "Rate Cards",
"labourHoursColumn": "Labour Hours",
"actions": "Actions",
"selectJobTitle": "Select Job Title",
"ratecardsPluralText": "Rate Card Templates",
"deleteConfirm": "Are you sure ?",
"yes": "Yes",
"no": "No",
"alreadyImportedRateCardMessage": "A rate card has already been imported. Clear all imported rate cards to add a new one.",
"budgetOverviewTooltips": {
"manualBudget": "Manual project budget amount set by project manager",
"totalActualCost": "Total actual cost including fixed costs",
"variance": "Difference between manual budget and actual cost",
"utilization": "Percentage of manual budget utilized",
"estimatedHours": "Total estimated hours from all tasks",
"fixedCosts": "Total fixed costs from all tasks",
"timeBasedCost": "Actual cost from time tracking (excluding fixed costs)",
"remainingBudget": "Remaining budget amount"
},
"budgetModal": {
"title": "Edit Project Budget",
"description": "Set a manual budget for this project. This budget will be used for all financial calculations and should include both time-based costs and fixed costs.",
"placeholder": "Enter budget amount",
"saveButton": "Save",
"cancelButton": "Cancel"
},
"budgetStatistics": {
"manualBudget": "Manual Budget",
"totalActualCost": "Total Actual Cost",
"variance": "Variance",
"budgetUtilization": "Budget Utilization",
"estimatedHours": "Estimated Hours",
"fixedCosts": "Fixed Costs",
"timeBasedCost": "Time-based Cost",
"remainingBudget": "Remaining Budget",
"noManualBudgetSet": "(No Manual Budget Set)"
},
"budgetSettingsDrawer": {
"title": "Project Budget Settings",
"budgetConfiguration": "Budget Configuration",
"projectBudget": "Project Budget",
"projectBudgetTooltip": "Total budget allocated for this project",
"currency": "Currency",
"costCalculationMethod": "Cost Calculation Method",
"calculationMethod": "Calculation Method",
"workingHoursPerDay": "Working Hours per Day",
"workingHoursPerDayTooltip": "Number of working hours in a day for man-day calculations",
"hourlyCalculationInfo": "Costs will be calculated using estimated hours × hourly rates",
"manDaysCalculationInfo": "Costs will be calculated using estimated man days × daily rates",
"importantNotes": "Important Notes",
"calculationMethodChangeNote": "• Changing the calculation method will affect how costs are calculated for all tasks in this project",
"immediateEffectNote": "• Changes take effect immediately and will recalculate all project totals",
"projectWideNote": "• Budget settings apply to the entire project and all its tasks",
"cancel": "Cancel",
"saveChanges": "Save Changes",
"budgetSettingsUpdated": "Budget settings updated successfully",
"budgetSettingsUpdateFailed": "Failed to update budget settings"
},
"columnTooltips": {
"hours": "Total estimated hours for all tasks. Calculated from task time estimates.",
"manDays": "Total estimated man days for all tasks. Based on {{hoursPerDay}} hours per working day.",
"actualManDays": "Actual man days spent based on time logged. Calculated as: Total Time Logged ÷ {{hoursPerDay}} hours per day.",
"effortVariance": "Difference between estimated and actual man days. Positive values indicate over-estimation, negative values indicate under-estimation.",
"totalTimeLogged": "Total time actually logged by team members across all tasks.",
"estimatedCostHourly": "Estimated cost calculated as: Estimated Hours × Hourly Rates for assigned team members.",
"estimatedCostManDays": "Estimated cost calculated as: Estimated Man Days × Daily Rates for assigned team members.",
"actualCost": "Actual cost based on time logged. Calculated as: Time Logged × Hourly Rates for team members.",
"fixedCost": "Fixed costs that don't depend on time spent. Added manually per task.",
"totalBudgetHourly": "Total budgeted cost including estimated cost (Hours × Hourly Rates) + Fixed Costs.",
"totalBudgetManDays": "Total budgeted cost including estimated cost (Man Days × Daily Rates) + Fixed Costs.",
"totalActual": "Total actual cost including time-based cost + Fixed Costs.",
"variance": "Cost variance: Total Budgeted Costs - Total Actual Cost. Positive values indicate under-budget, negative values indicate over-budget."
}
}

View File

@@ -0,0 +1,52 @@
{
"nameColumn": "名称",
"createdColumn": "创建时间",
"noProjectsAvailable": "没有可用的项目",
"deleteConfirmationTitle": "您确定要删除此费率卡吗?",
"deleteConfirmationOk": "是,删除",
"deleteConfirmationCancel": "取消",
"searchPlaceholder": "按名称搜索费率卡",
"createRatecard": "创建费率卡",
"editTooltip": "编辑费率卡",
"deleteTooltip": "删除费率卡",
"fetchError": "获取费率卡失败",
"createError": "创建费率卡失败",
"deleteSuccess": "费率卡删除成功",
"deleteError": "删除费率卡失败",
"jobTitleColumn": "职位名称",
"ratePerHourColumn": "每小时费率",
"ratePerDayColumn": "每日费率",
"ratePerManDayColumn": "每人每日费率",
"saveButton": "保存",
"addRoleButton": "添加角色",
"createRatecardSuccessMessage": "费率卡创建成功",
"createRatecardErrorMessage": "创建费率卡失败",
"updateRatecardSuccessMessage": "费率卡更新成功",
"updateRatecardErrorMessage": "更新费率卡失败",
"currency": "货币",
"actionsColumn": "操作",
"addAllButton": "全部添加",
"removeAllButton": "全部移除",
"selectJobTitle": "选择职位名称",
"unsavedChangesTitle": "您有未保存的更改",
"unsavedChangesMessage": "您想在离开前保存更改吗?",
"unsavedChangesSave": "保存",
"unsavedChangesDiscard": "放弃",
"ratecardNameRequired": "费率卡名称为必填项",
"ratecardNamePlaceholder": "输入费率卡名称",
"noRatecardsFound": "未找到费率卡",
"loadingRateCards": "正在加载费率卡...",
"noJobTitlesAvailable": "没有可用的职位名称",
"noRolesAdded": "尚未添加角色",
"createFirstJobTitle": "创建第一个职位名称",
"jobRolesTitle": "职位角色",
"noJobTitlesMessage": "请先在职位名称设置中创建职位名称,然后再向费率卡添加角色。",
"createNewJobTitle": "创建新职位名称",
"jobTitleNamePlaceholder": "输入职位名称",
"jobTitleNameRequired": "职位名称为必填项",
"jobTitleCreatedSuccess": "职位名称创建成功",
"jobTitleCreateError": "职位名称创建失败",
"createButton": "创建",
"cancelButton": "取消"
}