293 lines
8.3 KiB
JavaScript
293 lines
8.3 KiB
JavaScript
(function () {
|
|
const OrgPortal = (window.OrgPortal = window.OrgPortal || {});
|
|
const { portalData } = OrgPortal.data;
|
|
const store = OrgPortal.store;
|
|
const permissions = OrgPortal.permissions;
|
|
const registryStore = window.RegistryApp.store;
|
|
|
|
class OrgPortalActions {
|
|
constructor() {
|
|
this.treasuryNoticeTimer = null;
|
|
}
|
|
|
|
formatCurrency(value) {
|
|
return "$" + value.toLocaleString();
|
|
}
|
|
|
|
formatVehicleType(type) {
|
|
if (!type) {
|
|
return "";
|
|
}
|
|
|
|
return type.charAt(0).toUpperCase() + type.slice(1);
|
|
}
|
|
|
|
formatAssetType(type) {
|
|
if (!type) {
|
|
return "";
|
|
}
|
|
|
|
return type.charAt(0).toUpperCase() + type.slice(1);
|
|
}
|
|
|
|
formatDisplayName(value) {
|
|
if (!value) {
|
|
return "";
|
|
}
|
|
|
|
return String(value)
|
|
.trim()
|
|
.split(/\s+/)
|
|
.map((part) => {
|
|
if (!part) {
|
|
return "";
|
|
}
|
|
|
|
return (
|
|
part.charAt(0).toUpperCase() +
|
|
part.slice(1).toLowerCase()
|
|
);
|
|
})
|
|
.join(" ");
|
|
}
|
|
|
|
getAssetReadiness() {
|
|
if (portalData.fleet.length === 0) {
|
|
return null;
|
|
}
|
|
|
|
const total = portalData.fleet.reduce(
|
|
(sum, unit) => sum + (100 - parseInt(unit.damage, 10)),
|
|
0,
|
|
);
|
|
return Math.round(total / portalData.fleet.length);
|
|
}
|
|
|
|
showTreasuryNotice(type, text) {
|
|
store.setTreasuryNotice({ type, text });
|
|
|
|
if (this.treasuryNoticeTimer) {
|
|
clearTimeout(this.treasuryNoticeTimer);
|
|
}
|
|
|
|
this.treasuryNoticeTimer = setTimeout(() => {
|
|
store.setTreasuryNotice({ type: "", text: "" });
|
|
this.treasuryNoticeTimer = null;
|
|
}, 3500);
|
|
}
|
|
|
|
parseAmount(value) {
|
|
const amount = Number(value);
|
|
return Number.isFinite(amount) ? Math.round(amount) : 0;
|
|
}
|
|
|
|
getInputValue(id) {
|
|
const el = document.getElementById(id);
|
|
return el ? el.value : "";
|
|
}
|
|
|
|
closePortal() {
|
|
if (
|
|
typeof A3API !== "undefined" &&
|
|
typeof A3API.SendAlert === "function"
|
|
) {
|
|
A3API.SendAlert(
|
|
JSON.stringify({
|
|
event: "org::close",
|
|
data: {},
|
|
}),
|
|
);
|
|
return;
|
|
}
|
|
|
|
if (registryStore) {
|
|
registryStore.setView("home");
|
|
}
|
|
}
|
|
|
|
openModal(type) {
|
|
if (
|
|
(type === "payroll" ||
|
|
type === "transfer" ||
|
|
type === "credit") &&
|
|
!permissions.canManageTreasury()
|
|
) {
|
|
this.showTreasuryNotice(
|
|
"error",
|
|
"Only the organization leader or CEO can manage treasury actions.",
|
|
);
|
|
return;
|
|
}
|
|
|
|
if (type === "disband" && !permissions.canDisbandOrg()) {
|
|
return;
|
|
}
|
|
|
|
store.setModal({ type });
|
|
}
|
|
|
|
closeModal() {
|
|
store.setModal(null);
|
|
}
|
|
|
|
removeMember(memberName) {
|
|
if (!permissions.canManageMembers()) {
|
|
return false;
|
|
}
|
|
|
|
store.setMembers((currentMembers) =>
|
|
currentMembers.filter((member) => member.name !== memberName),
|
|
);
|
|
store.setCreditLines((currentLines) =>
|
|
currentLines.filter((line) => line.member !== memberName),
|
|
);
|
|
return true;
|
|
}
|
|
|
|
disbandOrganization() {
|
|
if (!permissions.canDisbandOrg()) {
|
|
return false;
|
|
}
|
|
|
|
store.setOrgDisbanded(true);
|
|
this.closeModal();
|
|
return true;
|
|
}
|
|
|
|
runPayroll(amountPerMember) {
|
|
if (!permissions.canManageTreasury()) {
|
|
this.showTreasuryNotice(
|
|
"error",
|
|
"Only the organization leader or CEO can manage treasury actions.",
|
|
);
|
|
return false;
|
|
}
|
|
|
|
const members = store.getMembers();
|
|
const funds = store.getFunds();
|
|
|
|
if (members.length === 0) {
|
|
this.showTreasuryNotice(
|
|
"error",
|
|
"No members available for payroll.",
|
|
);
|
|
return false;
|
|
}
|
|
|
|
if (amountPerMember <= 0) {
|
|
this.showTreasuryNotice(
|
|
"error",
|
|
"Enter a valid payroll amount.",
|
|
);
|
|
return false;
|
|
}
|
|
|
|
const total = amountPerMember * members.length;
|
|
if (total > funds) {
|
|
this.showTreasuryNotice(
|
|
"error",
|
|
"Insufficient org funds for payroll.",
|
|
);
|
|
return false;
|
|
}
|
|
|
|
store.setFunds(funds - total);
|
|
this.showTreasuryNotice(
|
|
"success",
|
|
`Payroll sent to ${members.length} members for ${this.formatCurrency(total)}.`,
|
|
);
|
|
return true;
|
|
}
|
|
|
|
sendFundsToMember(memberName, amount) {
|
|
if (!permissions.canManageTreasury()) {
|
|
this.showTreasuryNotice(
|
|
"error",
|
|
"Only the organization leader or CEO can manage treasury actions.",
|
|
);
|
|
return false;
|
|
}
|
|
|
|
const funds = store.getFunds();
|
|
|
|
if (!memberName) {
|
|
this.showTreasuryNotice(
|
|
"error",
|
|
"Select a member to receive funds.",
|
|
);
|
|
return false;
|
|
}
|
|
|
|
if (amount <= 0) {
|
|
this.showTreasuryNotice(
|
|
"error",
|
|
"Enter a valid transfer amount.",
|
|
);
|
|
return false;
|
|
}
|
|
|
|
if (amount > funds) {
|
|
this.showTreasuryNotice(
|
|
"error",
|
|
"Insufficient org funds for this transfer.",
|
|
);
|
|
return false;
|
|
}
|
|
|
|
store.setFunds(funds - amount);
|
|
this.showTreasuryNotice(
|
|
"success",
|
|
`${this.formatCurrency(amount)} sent to ${memberName}.`,
|
|
);
|
|
return true;
|
|
}
|
|
|
|
grantCreditLine(memberName, amount) {
|
|
if (!permissions.canManageTreasury()) {
|
|
this.showTreasuryNotice(
|
|
"error",
|
|
"Only the organization leader or CEO can manage treasury actions.",
|
|
);
|
|
return false;
|
|
}
|
|
|
|
if (!memberName) {
|
|
this.showTreasuryNotice(
|
|
"error",
|
|
"Select a member for the credit line.",
|
|
);
|
|
return false;
|
|
}
|
|
|
|
if (amount <= 0) {
|
|
this.showTreasuryNotice(
|
|
"error",
|
|
"Enter a valid credit line amount.",
|
|
);
|
|
return false;
|
|
}
|
|
|
|
store.setCreditLines((currentLines) => {
|
|
const existingIndex = currentLines.findIndex(
|
|
(line) => line.member === memberName,
|
|
);
|
|
if (existingIndex === -1) {
|
|
return [...currentLines, { member: memberName, amount }];
|
|
}
|
|
|
|
const updatedLines = [...currentLines];
|
|
updatedLines[existingIndex] = { member: memberName, amount };
|
|
return updatedLines;
|
|
});
|
|
|
|
this.showTreasuryNotice(
|
|
"success",
|
|
`Credit line of ${this.formatCurrency(amount)} assigned to ${memberName}.`,
|
|
);
|
|
return true;
|
|
}
|
|
}
|
|
|
|
OrgPortal.actions = new OrgPortalActions();
|
|
})();
|