Răsfoiți Sursa

Add corp graphs

= 5 luni în urmă
părinte
comite
90c46514d4

Fișier diff suprimat deoarece este prea mare
+ 0 - 0
reports/data/knownCompanies.json


+ 19 - 0
reports/data/parentCorps.json

@@ -0,0 +1,19 @@
+{
+	"CULT": "ADI",
+	"OOGH": "OOG",
+	"OOGR": "OOG",
+	"PG": "GTU",
+	"BGTU": "GTU",
+	"AORE": "ADI",
+	"FB": "FIOC",
+	"KUPO": "KAWA",
+	"FSSR": "FIOC",
+	"BEU2": "BEU1",
+	"MP": "AHI",
+	"KAMA": "KAWA",
+	"FIOJ": "FIOC",
+	"EFIO": "FIOC",
+	"KMGO": "KAWA",
+	"GTUT": "GTU",
+	"SPPC": "KAWA"
+}

Fișier diff suprimat deoarece este prea mare
+ 0 - 0
reports/main.js


+ 42 - 7
reports/src/graphs/companyHistory.ts

@@ -1,12 +1,12 @@
 import { createGraph, switchPlot } from "../core";
 import { months, monthsPretty } from "../staticData/constants";
-import { addConfigField, clearChildren, getCompanyId, getData } from "../utils";
+import { addConfigField, clearChildren, getCompanyId, getData, updateUsernameLabel } from "../utils";
 import { Graph } from "./graph";
 
 export class CompanyHistory implements Graph {
     id = "compHistory";
     displayName = "Company History";
-    configFieldIDs = ["metric", "companyName"];
+    configFieldIDs = ["metric", "group", "companyName"];
     loadedData: any;
     urlParams: any;
 
@@ -27,6 +27,7 @@ export class CompanyHistory implements Graph {
         }
 
         configDiv?.appendChild(addConfigField("select", "metric", "Metric: ", {prettyValues: ["Volume", "Profit", "Bases"], values: ["volume", "profit", "bases"]}, useURLParams ? this.urlParams.metric : undefined, updateFunc));
+        configDiv?.appendChild(addConfigField("select", "group", "Group: ", {prettyValues: ["By Company", "By Corporation"], values: ["company", "corp"]}, useURLParams ? this.urlParams.group : undefined, updateUsernameLabel));
         configDiv?.appendChild(addConfigField("input", "companyName", "Username: ", undefined, useURLParams ? this.urlParams.companyName : undefined, updateFunc, "-27px"));
         
     }
@@ -37,18 +38,52 @@ export class CompanyHistory implements Graph {
 
         // Get Company Data
         const knownCompanies = await getData(this.loadedData, "knownCompanies");
+        var companyName: string;
+        var companyID; 
 
-        // Get Company ID
-        var companyID = await getCompanyId(configValues.companyName, this.loadedData) as string;
-        if(!companyID){ return; }
-        var companyName = knownCompanies[companyID];
+        if(configValues.group == 'company')
+        {
+            companyID = await getCompanyId(configValues.companyName, this.loadedData) as string;
+            if(!companyID){ return; }
+            companyName = knownCompanies[companyID]?.Username;
+        }
+        else
+        {
+            companyName = configValues.companyName.toUpperCase()
+        }
 
         // Get Data
         const fullCompanyData = [] as any[];    // Company data across the months
         for(var i = 0; i < months.length; i++)
         {
             const monthData = await getData(this.loadedData, configValues.metric == "bases" ? "base" : "company", months[i]);
-            fullCompanyData.push(configValues.metric == "bases" ? monthData[companyID] : monthData.totals[companyID]);
+            const dataset = configValues.metric == "bases" ? monthData : monthData.totals;
+            if(configValues.group == 'company')
+            {
+                fullCompanyData.push(dataset[companyID || '']);
+            }
+            else
+            {
+                const corpData = {} as any;
+                var hasData = false;
+                const parentCorps = await getData(this.loadedData, 'parentCorps');
+                
+                Object.keys(dataset).forEach(id => {
+                    const companyObj = knownCompanies[id]
+                    if(companyObj && (companyObj.Corporation == companyName || parentCorps[companyObj.Corporation] == companyName))
+                    {
+                        hasData = true
+                        Object.keys(dataset[id]).forEach(metric => {
+                            if(!corpData[metric]){ corpData[metric] = 0; }
+                            corpData[metric] += dataset[id][metric]
+                        });
+                    }
+                });
+                if(hasData)
+                {
+                    fullCompanyData.push(corpData)
+                }
+            }
         }
         
         const validMonths = [] as string[]; // Months with data

+ 1 - 1
reports/src/graphs/companyRank.ts

@@ -42,7 +42,7 @@ export class CompanyRank implements Graph {
         var companyID = await getCompanyId(configValues.companyName, this.loadedData) as string;
         
         if(!companyID){ return; }
-        var companyName = knownCompanies[companyID];
+        var companyName = knownCompanies[companyID]?.Username;
 
         // Get Data
         const fullCompanyData = await getData(this.loadedData, "company", configValues.month);    // Company data for the current month

+ 51 - 13
reports/src/graphs/companyTotals.ts

@@ -1,12 +1,12 @@
 import { createGraph, switchPlot } from "../core";
 import { materialCategoryColors, months, monthsPretty, prettyModeNames } from "../staticData/constants";
-import { addConfigField, clearChildren, getCompanyId, getData, getMatCategory, getMatColor, prettyMonthName } from "../utils";
+import { addConfigField, clearChildren, getCompanyId, getData, getMatCategory, getMatColor, prettyMonthName, updateUsernameLabel } from "../utils";
 import { Graph } from "./graph";
 
 export class CompanyTotals implements Graph {
     id = "compTotals";
     displayName = "Company Totals";
-    configFieldIDs = ["chartType", "metric", "month", "companyName"];
+    configFieldIDs = ["chartType", "metric", "group", "month", "companyName"];
     loadedData: any;
     urlParams: any;
 
@@ -26,10 +26,13 @@ export class CompanyTotals implements Graph {
             clearChildren(configDiv);
         }
 
-        configDiv?.appendChild(addConfigField("select", "chartType", "Chart Type: ", {prettyValues: ["Bar", "Pie", "Treemap (Mat)", "Treemap (Cat)"], values: ["bar", "pie", "treemap", "treemap-categories"]}, useURLParams ? this.urlParams.chartType : undefined, updateFunc, "-30px"));
+        const usernameLabel = useURLParams && this.urlParams.group && this.urlParams.group != 'company' ? 'Corp Code: ' : 'Username: ';
+
+        configDiv?.appendChild(addConfigField("select", "chartType", "Chart Type: ", {prettyValues: ["Bar", "Pie", "Treemap (Mat)", "Treemap (Cat)"], values: ["bar", "pie", "treemap", "treemap-categories"]}, useURLParams ? this.urlParams.chartType : "treemap", updateFunc, "-30px"));
         configDiv?.appendChild(addConfigField("select", "metric", "Metric: ", {prettyValues: ["Volume", "Profit"], values: ["volume", "profit"]}, useURLParams ? this.urlParams.metric : undefined, updateFunc));
+        configDiv?.appendChild(addConfigField("select", "group", "Group: ", {prettyValues: ["By Company", "By Corporation"], values: ["company", "corp"]}, useURLParams ? this.urlParams.group : undefined, updateUsernameLabel));
         configDiv?.appendChild(addConfigField("select", "month", "Month: ", {prettyValues: monthsPretty, "values": months}, useURLParams && this.urlParams.month ? this.urlParams.month : months[months.length - 1], updateFunc));
-        configDiv?.appendChild(addConfigField("input", "companyName", "Username: ", undefined, useURLParams ? this.urlParams.companyName : undefined, updateFunc, "-27px"));
+        configDiv?.appendChild(addConfigField("input", "companyName", usernameLabel, undefined, useURLParams ? this.urlParams.companyName : undefined, updateFunc, "-27px"));
         
     }
 
@@ -40,18 +43,51 @@ export class CompanyTotals implements Graph {
         const companyData = await getData(this.loadedData, "company", configValues.month);
         const knownCompanies = await getData(this.loadedData, "knownCompanies");
 
-        // Get Company ID
-        var companyID = await getCompanyId(configValues.companyName, this.loadedData) as string;
-        if(!companyID){ return; }
-        var companyName = knownCompanies[companyID];
+        var companyName: string;
+        var prodData: any;
+
+        if(configValues.group == 'company')
+        {
+            // Get Company ID
+            var companyID = await getCompanyId(configValues.companyName, this.loadedData) as string;
+            if(!companyID){ return; }
+            companyName = knownCompanies[companyID]?.Username;
+            if(!companyData.individual[companyID]){return;}
+            prodData = companyData.individual[companyID];
+        }
+        else
+        {
+            const parentCorps = await getData(this.loadedData, 'parentCorps');
+            companyName = configValues.companyName.toUpperCase();
+            prodData = {}
+            
+            Object.keys(companyData.individual).forEach(id => {
+                const companyObj = knownCompanies[id]
+                if(companyObj && (companyObj.Corporation == companyName || parentCorps[companyObj.Corporation] == companyName))
+                {
+                    const indivCompanyData = companyData.individual[id]
+                    Object.keys(indivCompanyData).forEach(ticker => {
+                        if(!prodData[ticker])
+                        {
+                            prodData[ticker] = {volume: 0, profit: 0, amount: 0, rank: 0}
+                        }
+                        Object.keys(indivCompanyData[ticker]).forEach(metric => {
+                            prodData[ticker][metric] += indivCompanyData[ticker][metric]
+                        });
+                    });
+                }
+            });
+
+            if(Object.keys(prodData).length == 0){return;}
+        }
 
-        if(!companyData.individual[companyID]){return;}
         // Parse Data
         var catData = [] as number[]; // Y-axis of chart
         var categories = [] as any[];  // X-axis of chart
         var totalValue = 0; // Total of metric
-        Object.keys(companyData.individual[companyID]).forEach((ticker: string) => {
-            const metric = companyData.individual[companyID][ticker][configValues.metric];
+        
+        Object.keys(prodData).forEach((ticker: string) => {
+            const metric = prodData[ticker][configValues.metric];
             if(metric < 0 && (configValues.chartType == "treemap" || configValues.chartType == "treemap-categories")){return;}
             totalValue += metric;
 
@@ -121,7 +157,7 @@ export class CompanyTotals implements Graph {
                 maxdepth: 2, 
                 branchvalues: 'total',
                 marker: {
-                    colors: colors,
+                    colors: colors
                 },
                 tiling: {
                     pad: 0,
@@ -192,4 +228,6 @@ export class CompanyTotals implements Graph {
                 }, {})
         }
     }
-}
+
+}
+

+ 179 - 0
reports/src/graphs/corpBreakdown.ts

@@ -0,0 +1,179 @@
+import { createGraph, switchPlot } from "../core";
+import { months, monthsPretty, prettyModeNames } from "../staticData/constants";
+import { addConfigField, clearChildren, getData, prettyMonthName } from "../utils";
+import { Graph } from "./graph";
+
+export class CorporationBreakdown implements Graph {
+    id = "corpBreakdown";
+    displayName = "Corp Breakdown";
+
+    configFieldIDs = ["chartType", "metric", "month", "companyName"];
+    loadedData: any;
+    urlParams: any;
+
+    constructor(loadedData: any, urlParams: any)
+    {
+        this.loadedData = loadedData;
+        this.urlParams = urlParams;
+    }
+
+    setConfigs(useURLParams?: boolean)
+    {
+        const updateFunc = function() {switchPlot();}
+
+        const configDiv = document.getElementById("selectorSubtypes");
+        if(configDiv)
+        {
+            clearChildren(configDiv);
+        }
+
+        configDiv?.appendChild(addConfigField("select", "chartType", "Chart Type: ", {prettyValues: ["Bar", "Pie", "Treemap"], values: ["bar", "pie", "treemap"]}, useURLParams ? this.urlParams.chartType : "treemap", updateFunc, "-30px"));
+        configDiv?.appendChild(addConfigField("select", "metric", "Metric: ", {prettyValues: ["Volume", "Profit", "Bases"], values: ["volume", "profit", "bases"]}, useURLParams ? this.urlParams.metric : undefined, updateFunc));
+        configDiv?.appendChild(addConfigField("select", "month", "Month: ", {prettyValues: monthsPretty, "values": months}, useURLParams && this.urlParams.month ? this.urlParams.month : months[months.length - 1], updateFunc));
+        configDiv?.appendChild(addConfigField("input", "companyName", "Corp Code: ", undefined, useURLParams ? this.urlParams.companyName : undefined, updateFunc, "-29px"));
+        
+    }
+
+    async generatePlot(configValues: any, plotContainerID: string)
+    {
+        if(!configValues.companyName || configValues.companyName == ""){return;}
+        // Get Company Data
+        const companyData = await getData(this.loadedData, configValues.metric == "bases" ? "base" : "company", configValues.month);
+        const dataset = configValues.metric == "bases" ? companyData : companyData.totals;
+
+        const knownCompanies = await getData(this.loadedData, "knownCompanies");
+
+        var companyName: string;
+
+        const parentCorps = await getData(this.loadedData, 'parentCorps');
+        companyName = configValues.companyName.toUpperCase();
+        const corpData = {} as any;
+        
+        Object.keys(dataset).forEach(id => {
+            const companyObj = knownCompanies[id]
+            if(companyObj && (companyObj.Corporation == companyName || parentCorps[companyObj.Corporation] == companyName))
+            {
+                const indivCompanyData = dataset[id];
+                const name = companyObj['Username'];
+                corpData[name] = indivCompanyData;
+            }
+        });
+
+        if(Object.keys(corpData).length == 0){return;}
+
+        // Parse Data
+        var catData = [] as number[]; // Y-axis of chart
+        var categories = [] as any[];  // X-axis of chart
+        var totalValue = 0; // Total of metric
+        
+        Object.keys(corpData).forEach((name: string) => {
+            const metric = corpData[name][configValues.metric];
+            if(metric < 0 && (configValues.chartType == "treemap")){return;}
+            totalValue += metric;
+
+            catData.push(metric);
+            categories.push(name);
+
+        });
+
+        // Sort data from largest to smallest categories
+        const indices = Array.from(categories.keys());
+        indices.sort((a, b) => catData[b] - catData[a]);
+        catData = indices.map(i => catData[i]);
+        categories = indices.map(i => categories[i]);
+
+        // Create graph
+        const titles = {
+		    'profit': 'Production Profit Breakdown of ',
+		    'volume': 'Production Volume Breakdown of ',
+            'bases': 'Base Breakdown of '
+	    } as any;
+
+        if(configValues.chartType == "treemap")
+        {
+            
+            const parents = categories.map(m => "Total");
+            categories.push("Total");
+            catData.push(totalValue);
+            parents.push('');
+
+            // Make graph
+            createGraph(plotContainerID, [{
+                labels: categories, 
+                values: catData, 
+                parents: parents, 
+                type: 'treemap', 
+                maxdepth: 2, 
+                branchvalues: 'total',
+                tiling: {
+                    pad: 0,
+                },
+                textposition: 'middle center',
+                hovertemplate: '%{label}<br>$%{value:,.3~s}/day<br>%{percentEntry:.2%}<extra></extra>'}],
+            {
+                width: this.urlParams.hideOptions !== undefined ? undefined : 800,
+                height: this.urlParams.hideOptions !== undefined ? undefined : 400,
+                autosize: this.urlParams.hideOptions !== undefined,
+                ...(this.urlParams.hideOptions !== undefined ? {margin: {
+                    l: 10,  // left
+                    r: 10,  // right
+                    t: 40,  // top
+                    b: 10   // bottom
+                }} : {}),
+                title: {text: titles[configValues.metric] + companyName + ' - ' + prettyMonthName(configValues.month)}
+            }, {})
+        }
+        else if(configValues.chartType == "bar")
+        {
+            // Create graph
+            createGraph(plotContainerID, [{x: categories, y: catData, type: 'bar'}], 
+                {
+                    width: this.urlParams.hideOptions !== undefined ? undefined : 800,
+                    height: this.urlParams.hideOptions !== undefined ? undefined : 400,
+                    autosize: this.urlParams.hideOptions !== undefined,
+                    ...(this.urlParams.hideOptions !== undefined ? {margin: {
+                        l: 60,  // left
+                        r: 10,  // right
+                        t: 40,  // top
+                        b: 60   // bottom
+                    }} : {}),
+                    title: {text: titles[configValues.metric] + companyName + ' - ' + prettyMonthName(configValues.month)},
+                    xaxis: {
+                        title: {text: 'Ticker'},
+                        range: [-0.5, Math.min(categories.length, 30) - 0.5]
+                    },
+                    yaxis: {
+                        title: {text: prettyModeNames[configValues.metric] + ' [$/day]'},
+                        range: [0, null]
+                    }
+                }, {})
+        }
+        else if(configValues.chartType == "pie")
+        {
+            // Create graph
+            createGraph(plotContainerID, [{labels: categories, values: catData, type: 'pie', textinfo: 'label',textposition: 'inside', insidetextorientation: 'none', automargin: false, hovertemplate: '%{label}<br>$%{value:,.3~s}/day<br>%{percent}<extra></extra>'}], 
+                {
+                    width: this.urlParams.hideOptions !== undefined ? undefined : 800,
+                    height: this.urlParams.hideOptions !== undefined ? undefined : 400,
+                    autosize: this.urlParams.hideOptions !== undefined,
+                    ...(this.urlParams.hideOptions !== undefined ? {margin: {
+                        l: 10,  // left
+                        r: 10,  // right
+                        t: 40,  // top
+                        b: 10   // bottom
+                    }} : {}),
+                    title: {text: titles[configValues.metric] + companyName + ' - ' + prettyMonthName(configValues.month)},
+                    xaxis: {
+                        title: {text: 'Ticker'},
+                        range: [-0.5, Math.min(categories.length, 30) - 0.5]
+                    },
+                    yaxis: {
+                        title: {text: prettyModeNames[configValues.metric] + ' [$/day]'},
+                        range: [0, null]
+                    }
+                }, {})
+        }
+    }
+
+}
+

+ 2 - 1
reports/src/graphs/marketOverview.ts

@@ -52,7 +52,8 @@ export class MarketOverview implements Graph {
             if (!tickerData) {
                 continue;
             }
-            labels.push(knownCompanies[key] ?? (key.substring(0, 5) + "..."));
+            const companyObj = knownCompanies[key]
+            labels.push(companyObj ? companyObj['Username'] : (key.slice(0, 5) + "..."));
             parents.push("Total");
             values.push(tickerData.amount);
             totalVolume += tickerData.volume;

+ 65 - 17
reports/src/graphs/topCompanies.ts

@@ -6,7 +6,7 @@ import { Graph } from "./graph";
 export class TopCompanies implements Graph {
     id = "topCompanies";
     displayName = "Top Companies";
-    configFieldIDs = ["metric", "month"];
+    configFieldIDs = ["metric", "group", "month"];
     loadedData: any;
     urlParams: any;
 
@@ -27,6 +27,7 @@ export class TopCompanies implements Graph {
         }
 
         configDiv?.appendChild(addConfigField("select", "metric", "Metric: ", {prettyValues: ["Volume", "Profit", "Bases"], values: ["volume", "profit", "bases"]}, useURLParams ? this.urlParams.metric : undefined, updateFunc));
+        configDiv?.appendChild(addConfigField("select", "group", "Group: ", {prettyValues: ["By Company", "By Corporation"], values: ["company", "corp"]}, useURLParams ? this.urlParams.group : undefined, updateFunc));
         configDiv?.appendChild(addConfigField("select", "month", "Month: ", {prettyValues: monthsPretty, "values": months}, useURLParams && this.urlParams.month ? this.urlParams.month : months[months.length - 1], updateFunc));
         
     }
@@ -36,24 +37,71 @@ export class TopCompanies implements Graph {
         // Get Data
         const companyData = await getData(this.loadedData, configValues.metric == "bases" ? "base" : "company", configValues.month);
         const knownCompanies = await getData(this.loadedData, "knownCompanies");
-        
-        // Convert the data object into an array of [companyID, volume] pairs
-        const volumeArray = Object.entries(configValues.metric == "bases" ? companyData : companyData.totals).map(([companyID, info]) => ({
-            companyID,
-            volume: (info as any)[configValues.metric]
-        }));
+        const dataset = configValues.metric == "bases" ? companyData : companyData.totals;
+
+        var companyNames;
+        var volumes;
+
+        // Agglomerate corporations
+        if(configValues.group == 'corp')
+        {
+            const parentCorps = await getData(this.loadedData, 'parentCorps');
+            const corpData = {} as any
+            Object.keys(dataset).forEach(id => {
+                const companyObj = knownCompanies[id]
+                if(companyObj && companyObj['Corporation'])
+                {
+                    var corp = companyObj['Corporation'] as string
+                    if(parentCorps[corp]){ corp = parentCorps[corp]; }
+                    
+                    if(corpData[corp])
+                    {
+                        corpData[corp] += dataset[id][configValues.metric]
+                    }
+                    else
+                    {
+                        corpData[corp] = dataset[id][configValues.metric]
+                    }
+                }
+            });
+
+            // Convert the data object into an array of [corpCode, volume] pairs
+            const volumeArray = Object.entries(corpData).map(([corpCode, info]) => ({
+                corpCode,
+                volume: info as any
+            }));
 
-        // Sort the array by volume in descending order
-        volumeArray.sort((a, b) => b.volume - a.volume);
+            // Sort the array by volume in descending order
+            volumeArray.sort((a, b) => b.volume - a.volume);
 
-        // Extract tickers and volumes into separate arrays
-        const companyIDs = volumeArray.map(item => item.companyID);
-        const volumes = volumeArray.map(item => item.volume);
+            // Extract tickers and volumes into separate arrays
+            companyNames = volumeArray.map(item => item.corpCode);
+            volumes = volumeArray.map(item => item.volume);
+        }
+        else
+        {
+            // Convert the data object into an array of [companyID, volume] pairs
+            const volumeArray = Object.entries(dataset).map(([companyID, info]) => ({
+                companyID,
+                volume: (info as any)[configValues.metric]
+            }));
+
+            // Sort the array by volume in descending order
+            volumeArray.sort((a, b) => b.volume - a.volume);
+
+            // Extract tickers and volumes into separate arrays
+            const companyIDs = volumeArray.map(item => item.companyID);
+            volumes = volumeArray.map(item => item.volume);
+
+            companyNames = [] as any[];
+            companyIDs.forEach(id => {
+                const companyObj = knownCompanies[id]
+                companyNames.push(companyObj ? companyObj['Username'] : (id.slice(0, 5) + "..."));
+            });
+        }
 
-        const companyNames = [] as any[];
-        companyIDs.forEach(id => {
-            companyNames.push(knownCompanies[id] || (id.slice(0, 5) + "..."));
-        });
+        // Pretty names for group
+        const prettyGroupNames = {'company': 'Companies', 'corp': 'Corporations'} as any
 
         // Create graph
         createGraph(plotContainerID, [{x: companyNames, y: volumes, type: 'bar'}], 
@@ -67,7 +115,7 @@ export class TopCompanies implements Graph {
                     t: 40,  // top
                     b: 100   // bottom
                 }} : {}),
-                title: {text: 'Top Companies (' + prettyModeNames[configValues.metric] + ') - ' + prettyMonthName(configValues.month)},
+                title: {text: 'Top ' + prettyGroupNames[configValues.group] + ' (' + prettyModeNames[configValues.metric] + ') - ' + prettyMonthName(configValues.month)},
                 xaxis: {
                     title: {text: 'Ticker'},
                     range: [-0.5, 29.5]

+ 3 - 1
reports/src/main.ts

@@ -10,6 +10,7 @@ import { UniverseHistory } from "./graphs/universeHistory";
 import { MarketOverview } from "./graphs/marketOverview";
 import { addPermalink } from "./permalink";
 import { addOption } from "./utils";
+import { CorporationBreakdown } from "./graphs/corpBreakdown";
 
 window.onload = function() {
 	// Do permalink stuff
@@ -63,5 +64,6 @@ export const graphs: Graph[] = [
     new MarketOverview(loadedData, urlParams),
 	new CompanyTotals(loadedData, urlParams),
 	new CompanyHistory(loadedData, urlParams),
-	new CompanyRank(loadedData, urlParams)
+	new CompanyRank(loadedData, urlParams),
+	new CorporationBreakdown(loadedData, urlParams)
 ];

+ 29 - 1
reports/src/utils.ts

@@ -25,6 +25,7 @@ export function addConfigField(inputType: string, id: string, label: string, val
 {
 	const labelElem = document.createElement('label');
 	labelElem.textContent = label;
+	labelElem.id = id + '-label'
 	
 	const inputElem = document.createElement(inputType);
 	inputElem.id = id;
@@ -126,6 +127,12 @@ export async function getData(loadedData: any, dataType: string, month?: string)
 				loadedData['universe-data'] = await fetch('data/universe-data.json?cb=' + Date.now()).then(response => response.json());
 			}
 			return loadedData['universe-data']
+		case "parentCorps":
+			if(!loadedData['parent-corps']) 
+			{ 
+				loadedData['parent-corps'] = await fetch('data/parentCorps.json?cb=' + Date.now()).then(response => response.json());
+			}
+			return loadedData['parent-corps']
 	}
 }
 
@@ -143,7 +150,8 @@ export async function getCompanyId(companyName: string, loadedData: any) {
 	const knownCompanies = await getData(loadedData, "knownCompanies") as any;
 
 	// Pull from known companies
-	var companyID = Object.keys(knownCompanies).find(id => (knownCompanies[id] ?? "").toLowerCase() == companyName.toLowerCase()) as string;
+	// @ts-ignore
+	var companyID = Object.entries(knownCompanies).find(([, v]) => v?.Username?.toLowerCase() === companyName.toLowerCase())?.[0] as any;
 	if(companyID) { return companyID; }
 
 	// Resort to FIO
@@ -156,4 +164,24 @@ export async function getCompanyId(companyName: string, loadedData: any) {
 	knownCompanies[companyID] = companyName;
 
 	return companyID as string | undefined;
+}
+
+// Update the username label (companyName-label ID) to say "Corp Code" or "Username" depending on group selection
+export function updateUsernameLabel()
+{
+    const usernameLabel = document.getElementById('companyName-label')
+    const groupElem = document.getElementById('group') as HTMLInputElement
+    
+
+    if(usernameLabel && usernameLabel.firstChild)
+    {
+        if(groupElem && groupElem.value && groupElem.value != 'company')
+        {
+            usernameLabel.firstChild.nodeValue = 'Corp Code: ';
+        }
+        else
+        {
+            usernameLabel.firstChild.nodeValue = 'Username: ';
+        }
+    }
 }

Unele fișiere nu au fost afișate deoarece prea multe fișiere au fost modificate în acest diff