word-doc-generator/public/client.js

1209 lines
41 KiB
JavaScript

import {
fields,
stateToPostalCode,
specificNames,
specificTwoLetters,
postalCode,
fieldToCellMap,
fieldToCellMapOld,
} from './constants.js';
import { judgeInfo } from './judgeInformation.js';
import { casePlaintiffInfo } from './casePlaintiffInfo.js';
import {
caseOpposingCounselInfo,
caseFilingAttorneyInfo,
} from './opposingCounselInfo.js';
import { generateLink } from './linkGenerator.js';
function toOrdinal(n) {
var s = ['th', 'st', 'nd', 'rd'],
v = n % 100;
return n + (s[(v - 20) % 10] || s[v] || s[0]);
}
let savedData = {};
function byId(id) {
return document.getElementById(id);
}
function onClick(id, handler) {
const el = byId(id);
if (el) el.addEventListener('click', handler);
}
function onChange(id, handler) {
const el = byId(id);
if (el) el.addEventListener('change', handler);
}
function onInput(id, handler) {
const el = byId(id);
if (el) el.addEventListener('input', handler);
}
function onSubmit(id, handler) {
const el = byId(id);
if (el) el.addEventListener('submit', handler);
}
function getFirstByName(name) {
const elements = document.getElementsByName(name);
return elements && elements.length > 0 ? elements[0] : null;
}
function safeString(value) {
return value == null ? '' : String(value);
}
function safeLastFour(value) {
const str = safeString(value);
return str ? str.slice(-4) : '';
}
function parseMoney(value) {
const parsed = parseFloat(safeString(value).replace(/,/g, ''));
return isNaN(parsed) ? 0 : parsed;
}
window.addEventListener('load', () => {
let inputs = document.getElementsByTagName('input');
for (let input of inputs) {
if (savedData[input.id] && !savedData[input.id].includes('xlsx')) {
input.value = savedData[input.id];
}
input.addEventListener('input', function () {
savedData[this.id] = this.value;
});
}
generateFields(0);
});
function generateFields(numCollectors) {
let container = byId('collectorsContainer');
if (!container) return;
container.innerHTML = '';
for (let i = 1; i <= 30; i++) {
let div = document.createElement('div');
div.id = 'collector' + i;
div.style.display = i <= numCollectors ? 'block' : 'none';
div.innerHTML = `
<h3>Letter to Collector #${i}</h3>
<div class="form-row">
<div class="form-group">
<label for="debtCollector${i}Name">Debt Collector ${i} Name:</label>
<input type="text" id="debtCollector${i}Name" name="debtCollector${i}Name" onblur="titleCase(this)">
</div>
<div class="form-group">
<label for="debtCollector${i}AddressLine1">Debt Collector ${i} Address L1:</label>
<input type="text" id="debtCollector${i}AddressLine1" name="debtCollector${i}AddressLine1" onblur="titleCase(this)">
</div>
<div class="form-group">
<label for="debtCollector${i}AddressLine2">Debt Collector ${i} Address L2:</label>
<input type="text" id="debtCollector${i}AddressLine2" name="debtCollector${i}AddressLine2" onblur="titleCase(this)">
</div>
</div>
<div class="form-row">
<div class="form-group">
<label for="debtCollector${i}Creditor">Debt Collector ${i} Creditor:</label>
<input type="text" id="debtCollector${i}Creditor" name="debtCollector${i}Creditor" onblur="titleCase(this)">
</div>
<div class="form-group">
<label for="debtCollector${i}Account">Debt Collector ${i} Account #:</label>
<input type="text" id="debtCollector${i}Account" name="debtCollector${i}Account">
</div>
<div class="form-group">
<label for="debtCollector${i}Amount">Debt Collector ${i} Amount:</label>
<input type="text" id="debtCollector${i}Amount" name="debtCollector${i}Amount" onblur="formatCurrency(this)">
</div>
</div>
`;
let inputs = div.querySelectorAll('input');
inputs.forEach((input) => {
if (savedData[input.id]) {
input.value = savedData[input.id];
}
input.addEventListener('input', function () {
savedData[this.id] = this.value;
localStorage.setItem('collectorData', JSON.stringify(savedData));
});
});
container.appendChild(div);
}
}
window.generateFields = generateFields;
const numCollectorsEl = byId('numCollectors');
if (numCollectorsEl) {
numCollectorsEl.onchange = function () {
const numCollectors = this.value;
for (let i = 1; i <= 30; i++) {
const div = byId('collector' + i);
if (div) {
div.style.display = i <= numCollectors ? 'block' : 'none';
}
}
};
}
onClick('generateClientFolderLinkBtn', function () {
let container = byId('clientFolderLinkContainer');
if (!container) return;
const clientFirstName = safeString(byId('clientFirstName')?.value);
const clientLastName = safeString(byId('clientLastName')?.value);
const folderPath = `file:///D:/Bklistservinfo Dropbox/Ryan Callahan/clients/${clientLastName}, ${clientFirstName}`;
container.innerHTML = `<a href="${folderPath}">Open Client Folder</a>`;
});
onClick('generateCaseLinkBtn', function () {
let container = byId('caseLinkContainer');
if (!container) return;
const caseNumberInput = safeString(byId('caseNumber')?.value);
const link = generateLink(caseNumberInput);
if (link) {
container.innerHTML = `<a href="${link}">Open Case</a>`;
}
});
async function sendFormData(path, data, templateName) {
data.templateName = templateName;
const normalizedPaths = [];
const seen = new Set();
const addPath = (p) => {
if (!p || seen.has(p)) return;
seen.add(p);
normalizedPaths.push(p);
};
addPath(path);
if (path.startsWith('/')) {
addPath(path.slice(1));
} else {
addPath(`/${path}`);
}
let lastError = null;
for (const candidate of normalizedPaths) {
try {
const response = await fetch(candidate, {
method: 'POST',
body: JSON.stringify(data),
headers: {
'Content-Type': 'application/json',
},
});
if (!response.ok) {
lastError = new Error(`Request failed for ${candidate}: ${response.status}`);
continue;
}
const contentDisposition = response.headers.get('Content-Disposition');
let filename = 'output.docx';
if (contentDisposition) {
const filenameMatch = contentDisposition.match(/filename="(.+)"/);
if (filenameMatch && filenameMatch.length === 2) {
filename = filenameMatch[1];
}
}
const blob = await response.blob();
const downloadUrl = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = downloadUrl;
a.download = filename;
document.body.appendChild(a);
a.click();
setTimeout(() => {
document.body.removeChild(a);
URL.revokeObjectURL(downloadUrl);
}, 0);
return;
} catch (error) {
lastError = error;
}
}
console.error('sendFormData failed:', lastError);
alert('Unable to reach the document generation route.');
}
function getFormData() {
let data = {};
fields.forEach((field) => {
data[field] = byId(field) ? byId(field).value : null;
});
data.today = dayjs().format('MMMM Do, YYYY');
data.currentDate = dayjs().format('YYYY-MM-DD');
data['currentDateMM-DD-YYYY'] = dayjs().format('MM-DD-YYYY');
if (data.dob) {
if (/^\d{4}$/.test(data.dob)) {
data.dob = data.dob;
} else {
data.dob = dayjs(data.dob).format('MM/DD/YYYY');
}
}
let installmentDate = dayjs(data.installmentDate);
data.installmentDate0 = installmentDate.format('MM/DD/YYYY');
for (let i = 1; i < 10; i++) {
installmentDate = installmentDate.add(1, 'month');
data[`installmentDate${i}`] = installmentDate.format('MM/DD/YYYY');
}
if (data.caseAnswerDate) {
const [datePart = '', timePart = ''] = data.caseAnswerDate.split(';');
const trimmedDatePart = datePart.trim();
const trimmedTimePart = timePart.trim();
data['caseAnswerDateYYYY-MM-DD'] = dayjs(trimmedDatePart, 'MM/DD/YYYY').format('YYYY-MM-DD');
data.caseAnswerDateTime = trimmedTimePart;
data.caseAnswerDateOnly = trimmedDatePart;
}
let judgeLastName = safeString(data.caseDivisionJudge).split(' ').pop();
data.caseAppearanceInfo =
judgeInfo[judgeLastName]
? `Division: ${judgeInfo[judgeLastName].division}; ${judgeInfo[judgeLastName].modality}`
: 'Modality: In-person; Access Code: N/A; Phone # / Link: N/A';
data.caseDivisionLocation =
judgeInfo[judgeLastName] && judgeInfo[judgeLastName].location
? judgeInfo[judgeLastName].location
: ' ';
let caseOpposingCounsel = safeString(getFirstByName('caseOpposingCounsel')?.value);
data.caseOCAddressLine1 =
caseOpposingCounselInfo[caseOpposingCounsel]
? caseOpposingCounselInfo[caseOpposingCounsel].caseOCAddressLine1
: 'Address Line 1 Not Found';
data.caseOCAddressLine2 =
caseOpposingCounselInfo[caseOpposingCounsel]
? caseOpposingCounselInfo[caseOpposingCounsel].caseOCAddressLine2
: 'Address Line 2 Not Found';
data.caseOCPhone =
caseOpposingCounselInfo[caseOpposingCounsel]
? caseOpposingCounselInfo[caseOpposingCounsel].caseOCPhone
: '111-111-1111';
data.caseOCFax =
caseOpposingCounselInfo[caseOpposingCounsel]
? caseOpposingCounselInfo[caseOpposingCounsel].caseOCFax
: '111-111-1112';
data.caseOCEmail =
caseOpposingCounselInfo[caseOpposingCounsel]
? caseOpposingCounselInfo[caseOpposingCounsel].caseOCEmail
: 'email@domain.com';
data.paymentOptions1 =
caseOpposingCounselInfo[caseOpposingCounsel] && caseOpposingCounselInfo[caseOpposingCounsel].paymentOptions1
? caseOpposingCounselInfo[caseOpposingCounsel].paymentOptions1
: 'Payment Options Not Found';
data.paymentOptions2 =
caseOpposingCounselInfo[caseOpposingCounsel] && caseOpposingCounselInfo[caseOpposingCounsel].paymentOptions2
? caseOpposingCounselInfo[caseOpposingCounsel].paymentOptions2
: ' ';
data.paymentOptions3 =
caseOpposingCounselInfo[caseOpposingCounsel] && caseOpposingCounselInfo[caseOpposingCounsel].paymentOptions3
? caseOpposingCounselInfo[caseOpposingCounsel].paymentOptions3
: ' ';
data.paymentOptions4 =
caseOpposingCounselInfo[caseOpposingCounsel] && caseOpposingCounselInfo[caseOpposingCounsel].paymentOptions4
? caseOpposingCounselInfo[caseOpposingCounsel].paymentOptions4
: ' ';
data.paymentOptions5 =
caseOpposingCounselInfo[caseOpposingCounsel] && caseOpposingCounselInfo[caseOpposingCounsel].paymentOptions5
? caseOpposingCounselInfo[caseOpposingCounsel].paymentOptions5
: ' ';
const casePlaintiffEl = byId('casePlaintiff');
const casePlaintiffValue = safeString(casePlaintiffEl?.value);
if (caseOpposingCounselInfo && caseOpposingCounselInfo[caseOpposingCounsel]) {
if (caseOpposingCounselInfo[caseOpposingCounsel].settlementPayee === 'casePlaintiff') {
data.settlementPayee = casePlaintiffValue;
} else {
data.settlementPayee = caseOpposingCounselInfo[caseOpposingCounsel].settlementPayee;
}
} else {
data.settlementPayee = 'Payee not found';
}
let caseFilingAttorney = safeString(getFirstByName('caseFilingAttorney')?.value);
data.caseAttyFirstName =
caseFilingAttorneyInfo[caseFilingAttorney]
? caseFilingAttorneyInfo[caseFilingAttorney].caseAttyFirstName
: 'First Name Not Found';
data.caseAttyLastName =
caseFilingAttorneyInfo[caseFilingAttorney]
? caseFilingAttorneyInfo[caseFilingAttorney].caseAttyLastName
: 'Last Name Not Found';
data.caseAttyAddressLine1 =
caseFilingAttorneyInfo[caseFilingAttorney]
? caseFilingAttorneyInfo[caseFilingAttorney].caseAttyAddressLine1
: 'Address Line 1 Not Found';
data.caseAttyAddressLine2 =
caseFilingAttorneyInfo[caseFilingAttorney]
? caseFilingAttorneyInfo[caseFilingAttorney].caseAttyAddressLine2
: 'Address Line 2 Not Found';
data.caseAttyPhone =
caseFilingAttorneyInfo[caseFilingAttorney]
? caseFilingAttorneyInfo[caseFilingAttorney].caseAttyPhone
: '111-111-1111';
data.caseAttyFax =
caseFilingAttorneyInfo[caseFilingAttorney]
? caseFilingAttorneyInfo[caseFilingAttorney].caseAttyFax
: '111-111-1112';
data.caseAttyEmail =
caseFilingAttorneyInfo[caseFilingAttorney]
? caseFilingAttorneyInfo[caseFilingAttorney].caseAttyEmail
: 'email@domain.com';
data.caseAttybarMO =
caseFilingAttorneyInfo[caseFilingAttorney]
? caseFilingAttorneyInfo[caseFilingAttorney].caseAttybarMO
: '######';
function formatDateString(dateString) {
let date = new Date(dateString);
if (!isNaN(date)) {
let day = date.getDate();
let dayOrdinal = toOrdinal(day);
return `${date.toLocaleDateString('en-US', {
month: 'long',
})} ${dayOrdinal}, ${date.getFullYear()}`;
} else {
console.error('Invalid Date');
return 'Invalid Date';
}
}
data.caseDispositionDateString = formatDateString(data.caseDispositionDate);
data.caseFilingDateString = formatDateString(data.caseFilingDate);
data.caseAnswerDateString = formatDateString(data.caseAnswerDateOnly);
data.caseAnswerFiledDateString = formatDateString(data.caseAnswerFiledDate);
data.discoCosDateString = formatDateString(data.discoCosDate);
data.discoResponseCosDateString = formatDateString(data.discoResponseCosDate);
let caseSuitAmount = parseMoney(data.caseSuitAmount);
let settlementAmount = parseMoney(data.settlementAmount);
let waivedAmount = caseSuitAmount - settlementAmount;
let settlementOfferPercentExpected = data.settlementOfferPercentExpected ? parseFloat(data.settlementOfferPercentExpected) : 0;
let settlementOfferPercentCurrent = data.settlementOfferPercentCurrent ? parseFloat(data.settlementOfferPercentCurrent) : 0;
let settlementOfferExpected = (caseSuitAmount * (settlementOfferPercentExpected / 100)).toFixed(2);
data.settlementOfferExpected = settlementOfferExpected;
let settlementOfferCurrent = (caseSuitAmount * (settlementOfferPercentCurrent / 100)).toFixed(2);
data.settlementOfferCurrent = settlementOfferCurrent;
let settlementOfferAmount = safeString(byId('settlementOfferAmount')?.value);
let settlementOffer = parseMoney(settlementOfferAmount).toFixed(2);
settlementOffer = parseFloat(settlementOffer).toLocaleString('en-US', { minimumFractionDigits: 2 });
data.settlementOffer = settlementOffer;
data.waivedAmount = waivedAmount.toLocaleString('en-US', {
style: 'currency',
currency: 'USD',
});
let settlementFirstPaymentDate = new Date(data.settlementFirstPaymentDate);
data.settlementFirstPaymentDateString = settlementFirstPaymentDate.toLocaleDateString('en-US', {
year: 'numeric',
month: 'long',
day: 'numeric',
});
let day = settlementFirstPaymentDate.getDate();
data.settlementFirstPaymentDayString = toOrdinal(day);
let settlementInstallmentAmount = parseMoney(data.settlementInstallmentAmount);
data.settlementInstallmentAmountString = isNaN(settlementInstallmentAmount)
? ''
: settlementInstallmentAmount.toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 });
if (!isNaN(settlementInstallmentAmount)) {
const dollars = Math.floor(settlementInstallmentAmount);
const cents = Math.round((settlementInstallmentAmount - dollars) * 100);
const dollarsText = numberToWords.toWords(dollars);
const centsText = numberToWords.toWords(cents);
data.settlementInstallmentAmountWords =
`${dollarsText.charAt(0).toUpperCase() + dollarsText.slice(1)} Dollar${dollars !== 1 ? 's' : ''} and ${centsText.charAt(0).toUpperCase() + centsText.slice(1)} Cent${cents !== 1 ? 's' : ''}`;
} else {
data.settlementInstallmentAmountWords = '';
}
let settlementCheckDate = new Date(settlementFirstPaymentDate);
settlementCheckDate.setDate(settlementFirstPaymentDate.getDate() - 10);
data.settlementCheckDate = settlementCheckDate.toLocaleDateString('en-US', {
year: 'numeric',
month: 'long',
day: 'numeric',
});
function adjustAndFormatDate(date) {
let day = date.getDate();
let month = date.getMonth();
let year = date.getFullYear();
let lastDayOfMonth = new Date(year, month + 1, 0).getDate();
if (day > lastDayOfMonth) {
day = lastDayOfMonth;
}
let adjustedDate = new Date(year, month, day);
let formattedMonth = (adjustedDate.getMonth() + 1).toString().padStart(2, '0');
let formattedDay = adjustedDate.getDate().toString().padStart(2, '0');
let formattedYear = adjustedDate.getFullYear();
return `${formattedMonth}/${formattedDay}/${formattedYear}`;
}
data.settlementPaymentDate01 = settlementFirstPaymentDate.toLocaleDateString('en-US', {
year: 'numeric',
month: '2-digit',
day: '2-digit',
});
for (let i = 1; i < 60; i++) {
let paymentDate = new Date(settlementFirstPaymentDate);
paymentDate.setMonth(paymentDate.getMonth() + i);
let lastDayOfMonth = new Date(paymentDate.getFullYear(), paymentDate.getMonth() + 1, 0).getDate();
if (settlementFirstPaymentDate.getDate() > lastDayOfMonth) {
paymentDate.setDate(lastDayOfMonth);
}
let formattedDate = adjustAndFormatDate(paymentDate);
data[`settlementPaymentDate${(i + 1).toString().padStart(2, '0')}`] = formattedDate;
}
for (let i = 1; i < 60; i++) {
let paymentDateKey = `settlementPaymentDate${(i + 1).toString().padStart(2, '0')}`;
let paymentDate = new Date(data[paymentDateKey]);
if (paymentDate.getDate() !== settlementFirstPaymentDate.getDate()) {
paymentDate.setMonth(paymentDate.getMonth() - 1);
paymentDate.setDate(new Date(paymentDate.getFullYear(), paymentDate.getMonth() + 1, 0).getDate());
data[paymentDateKey] = adjustAndFormatDate(paymentDate);
}
}
let settlementInstallmentNo = parseInt(data.settlementInstallmentNo, 10);
let settlementInterestRate = parseFloat(data.settlementInterestRate) || 0.00000000000000000001;
settlementAmount = parseMoney(data.settlementAmount);
let settlementCaseCosts = parseMoney(data.settlementCaseCosts);
let monthlyInterestRate = settlementInterestRate / 100 / 12;
let settlementPaymentAmounts = [];
let settlementRemainingBalances = [];
let cumulativeInterest = 0;
for (let i = 0; i < settlementInstallmentNo; i++) {
let interestPayment = settlementAmount * monthlyInterestRate;
let principalPayment = settlementInstallmentAmount - interestPayment;
if (settlementAmount < principalPayment) {
principalPayment = settlementAmount;
settlementInstallmentAmount = principalPayment + interestPayment + settlementCaseCosts;
}
settlementAmount -= principalPayment;
settlementPaymentAmounts.push(settlementInstallmentAmount.toFixed(2));
settlementRemainingBalances.push(settlementAmount.toFixed(2));
cumulativeInterest += interestPayment;
if (settlementAmount <= 0) {
break;
}
}
if (settlementAmount > 0) {
let finalInterestPayment = settlementAmount * monthlyInterestRate;
let finalPayment = settlementAmount + finalInterestPayment + settlementCaseCosts;
settlementPaymentAmounts.push(finalPayment.toFixed(2));
settlementRemainingBalances.push('0.00');
cumulativeInterest += finalInterestPayment;
}
for (let i = 0; i < 60; i++) {
data[`settlementPaymentAmount${(i + 1).toString().padStart(2, '0')}`] = settlementPaymentAmounts[i] || '0.00';
data[`settlementRemaingBalance${(i + 1).toString().padStart(2, '0')}`] = settlementRemainingBalances[i] || '0.00';
}
data.settlementTotalInterest = cumulativeInterest.toFixed(2);
data.remainingAmount = parseFloat(settlementAmount.toFixed(2)).toLocaleString('en-US', {
style: 'currency',
currency: 'USD',
});
data.SSNLastFour = safeLastFour(data.SSN);
data.SSN2LastFour = safeLastFour(data.client2SSN);
data.caseAccLastFour = safeLastFour(data.caseAccountNumber);
data.debtCollector1AccLastFour = safeLastFour(data.debtCollector1Account);
data.debtCollector2AccLastFour = safeLastFour(data.debtCollector2Account);
data.debtCollector3AccLastFour = safeLastFour(data.debtCollector3Account);
data.debtCollector4AccLastFour = safeLastFour(data.debtCollector4Account);
data.debtCollector5AccLastFour = safeLastFour(data.debtCollector5Account);
data.debtCollector6AccLastFour = safeLastFour(data.debtCollector6Account);
data.debtCollector7AccLastFour = safeLastFour(data.debtCollector7Account);
data.debtCollector8AccLastFour = safeLastFour(data.debtCollector8Account);
data.debtCollector9AccLastFour = safeLastFour(data.debtCollector9Account);
data.debtCollector10AccLastFour = safeLastFour(data.debtCollector10Account);
data.debtCollector11AccLastFour = safeLastFour(data.debtCollector11Account);
data.debtCollector12AccLastFour = safeLastFour(data.debtCollector12Account);
data.debtCollector13AccLastFour = safeLastFour(data.debtCollector13Account);
data.debtCollector14AccLastFour = safeLastFour(data.debtCollector14Account);
data.debtCollector15AccLastFour = safeLastFour(data.debtCollector15Account);
data.debtCollector16AccLastFour = safeLastFour(data.debtCollector16Account);
data.debtCollector17AccLastFour = safeLastFour(data.debtCollector17Account);
data.debtCollector18AccLastFour = safeLastFour(data.debtCollector18Account);
data.debtCollector19AccLastFour = safeLastFour(data.debtCollector19Account);
data.debtCollector20AccLastFour = safeLastFour(data.debtCollector20Account);
data.debtCollector21AccLastFour = safeLastFour(data.debtCollector21Account);
data.debtCollector22AccLastFour = safeLastFour(data.debtCollector22Account);
data.debtCollector23AccLastFour = safeLastFour(data.debtCollector23Account);
data.debtCollector24AccLastFour = safeLastFour(data.debtCollector24Account);
data.debtCollector25AccLastFour = safeLastFour(data.debtCollector25Account);
data.debtCollector26AccLastFour = safeLastFour(data.debtCollector26Account);
data.debtCollector27AccLastFour = safeLastFour(data.debtCollector27Account);
data.debtCollector28AccLastFour = safeLastFour(data.debtCollector28Account);
data.debtCollector29AccLastFour = safeLastFour(data.debtCollector29Account);
data.debtCollector30AccLastFour = safeLastFour(data.debtCollector30Account);
data.casePlaintiffFileName = safeString(data.casePlaintiff).replace(/ /g, '-').replace(/[,.]/g, '');
return data;
}
let counselDataList = byId('counsel-list');
let counselNames = Object.keys(caseOpposingCounselInfo);
if (counselDataList) {
for (let name of counselNames) {
let option = document.createElement('option');
option.value = name;
counselDataList.appendChild(option);
}
}
let filingAttorneyDataList = byId('attorney-list');
let filingAttorneyNames = Object.keys(caseFilingAttorneyInfo);
if (filingAttorneyDataList) {
for (let name of filingAttorneyNames) {
let option = document.createElement('option');
option.value = name;
filingAttorneyDataList.appendChild(option);
}
}
let plaintiffDataList = byId('plaintiff-list');
let plaintiffNames = Object.keys(casePlaintiffInfo);
if (plaintiffDataList) {
for (let name of plaintiffNames) {
let option = document.createElement('option');
option.value = name;
plaintiffDataList.appendChild(option);
}
}
let judgeDataList = byId('judge-list');
let judgeNames = Object.keys(judgeInfo);
if (judgeDataList) {
for (let name of judgeNames) {
let option = document.createElement('option');
option.value = name;
judgeDataList.appendChild(option);
}
}
onInput('caseDivisionJudge', function () {
let selectedJudge = this.value;
if (judgeInfo[selectedJudge]) {
if (byId('caseDivisionNumber')) byId('caseDivisionNumber').value = judgeInfo[selectedJudge].division;
if (byId('caseDesignation')) byId('caseDesignation').value = judgeInfo[selectedJudge].designation;
if (byId('caseCounty')) byId('caseCounty').value = judgeInfo[selectedJudge].county;
if (byId('caseState')) byId('caseState').value = judgeInfo[selectedJudge].state;
if (byId('caseDivisionDesignation')) byId('caseDivisionDesignation').value = judgeInfo[selectedJudge].divisionDesignation;
} else {
if (byId('caseDivisionNumber')) byId('caseDivisionNumber').value = '';
if (byId('caseDesignation')) byId('caseDesignation').value = '';
if (byId('caseCounty')) byId('caseCounty').value = '';
if (byId('caseState')) byId('caseState').value = '';
if (byId('caseDivisionDesignation')) byId('caseDivisionDesignation').value = '';
}
});
onChange('excelFile', function (e) {
readExcelFile(e);
});
onChange('excelFileOld', function (e) {
readExcelFileOld(e);
});
function cellToRowCol(cell) {
const col = cell.toUpperCase().charCodeAt(0) - 'A'.charCodeAt(0);
const row = parseInt(cell.slice(1)) - 1;
return [col, row];
}
window.cellToRowCol = cellToRowCol;
function readExcelFile(event) {
let input = event.target;
let reader = new FileReader();
reader.onload = function () {
let data = new Uint8Array(reader.result);
let workbook = XLSX.read(data, { type: 'array' });
let worksheet = workbook.Sheets[workbook.SheetNames[0]];
let jsonData = XLSX.utils.sheet_to_json(worksheet, { header: 1 });
let formData = mapExcelDataToFormData(jsonData);
populateForm(formData);
};
if (input.files[0]) {
reader.readAsArrayBuffer(input.files[0]);
}
}
function mapExcelDataToFormData(data) {
let formData = {};
for (let field in fieldToCellMap) {
let cell = fieldToCellMap[field];
let rowIndex = parseInt(cell.substr(1)) - 1;
let colIndex = cell.charCodeAt(0) - 65;
formData[field] = data[rowIndex] && data[rowIndex][colIndex] !== undefined ? data[rowIndex][colIndex] : '';
}
return formData;
}
function readExcelFileOld(event) {
let input = event.target;
let reader = new FileReader();
reader.onload = function () {
let data = new Uint8Array(reader.result);
let workbook = XLSX.read(data, { type: 'array' });
let worksheet = workbook.Sheets[workbook.SheetNames[0]];
let jsonData = XLSX.utils.sheet_to_json(worksheet, { header: 1 });
let formData = mapExcelDataToFormDataOld(jsonData);
populateForm(formData);
};
if (input.files[0]) {
reader.readAsArrayBuffer(input.files[0]);
}
}
function mapExcelDataToFormDataOld(data) {
let formData = {};
for (let field in fieldToCellMapOld) {
let cell = fieldToCellMapOld[field];
let rowIndex = parseInt(cell.substr(1)) - 1;
let colIndex = cell.charCodeAt(0) - 65;
formData[field] = data[rowIndex] && data[rowIndex][colIndex] !== undefined ? data[rowIndex][colIndex] : '';
}
return formData;
}
function populateForm(data) {
for (let field in data) {
let input = byId(field);
if (input) {
input.value = data[field];
savedData[input.id] = input.value;
localStorage.setItem('collectorData', JSON.stringify(savedData));
}
}
if (data.clientLastName && data.clientFirstName) {
document.title = `${data.clientLastName}, ${data.clientFirstName}`;
}
}
function trimSpaces(input) {
input.value = input.value.trim();
}
window.trimSpaces = trimSpaces;
function titleCase(input) {
input.value = input.value.trimStart();
if (!input.getAttribute('data-corrected')) {
input.value = input.value.trim().replace(/\b(\S+)\b/g, function (txt) {
if (txt.length === 2) {
const lowerCaseTxt = txt.toLowerCase();
if (postalCode.hasOwnProperty(lowerCaseTxt)) {
return txt.toUpperCase();
} else if (specificTwoLetters.hasOwnProperty(lowerCaseTxt)) {
return specificTwoLetters[lowerCaseTxt];
} else {
return txt;
}
}
if (specificNames.hasOwnProperty(txt.toLowerCase())) {
return specificNames[txt.toLowerCase()];
}
const mcMatch = txt.match(/^(mc)(.+)/i);
if (mcMatch) {
return 'Mc' + mcMatch[2].charAt(0).toUpperCase() + mcMatch[2].slice(1).toLowerCase();
}
const macMatch = txt.match(/^(mac)(.+)/i);
if (macMatch) {
return 'Mac' + macMatch[2].charAt(0).toUpperCase() + macMatch[2].slice(1).toLowerCase();
}
return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();
});
input.setAttribute('data-corrected', true);
}
}
window.titleCase = titleCase;
function validateEmail(input) {
const emailErrorElement = byId('emailError');
const trimmedValue = input.value.trim().toLowerCase();
if (trimmedValue !== '' && !input.getAttribute('data-corrected')) {
var emailRegex = /^\S+@\S+\.\S+$/;
if (!emailRegex.test(trimmedValue)) {
if (emailErrorElement) emailErrorElement.textContent = 'Please enter a valid email address';
input.focus();
savedData[input.id] = trimmedValue;
localStorage.setItem('collectorData', JSON.stringify(savedData));
return false;
} else {
if (emailErrorElement) emailErrorElement.textContent = '';
}
input.setAttribute('data-corrected', 'true');
} else {
if (emailErrorElement) emailErrorElement.textContent = '';
}
input.value = trimmedValue;
}
window.validateEmail = validateEmail;
function formatPhone(input, type) {
const typeToErrorElement = type === 'home' ? 'homePhoneError' : 'cellPhoneError';
const phoneErrorElement = byId(typeToErrorElement);
if (input.value.length > 0 && !input.getAttribute('data-corrected')) {
let value = input.value.replace(/[^0-9]/g, '');
if (/^\d{10}$/.test(value)) {
input.value = value.slice(0, 3) + '-' + value.slice(3, 6) + '-' + value.slice(6);
if (phoneErrorElement) phoneErrorElement.textContent = '';
input.setAttribute('data-corrected', 'true');
} else {
input.value = '';
if (phoneErrorElement) phoneErrorElement.textContent = 'Phone number must be 10 digits';
input.focus();
return false;
}
}
savedData[input.id] = input.value;
localStorage.setItem('collectorData', JSON.stringify(savedData));
return true;
}
window.formatPhone = formatPhone;
function formatCurrency(input) {
if (!input.getAttribute('data-corrected')) {
let value = input.value.replace(/[^0-9.]/g, '');
value = parseFloat(value).toFixed(2);
input.value = isNaN(value) ? '' : value;
savedData[input.id] = input.value;
localStorage.setItem('collectorData', JSON.stringify(savedData));
input.setAttribute('data-corrected', 'true');
}
}
window.formatCurrency = formatCurrency;
function formatDateTime(input) {
if (!input.getAttribute('data-corrected')) {
let value = new Date(input.value);
if (!isNaN(value.getTime())) {
let formatted =
value.toLocaleDateString(undefined, {
day: '2-digit',
month: '2-digit',
year: 'numeric',
}) +
'; ' +
value.toLocaleTimeString(undefined, {
hour: '2-digit',
minute: '2-digit',
hour12: true,
});
input.value = formatted;
}
input.setAttribute('data-corrected', 'true');
}
}
window.formatDateTime = formatDateTime;
function formatExpiration(input) {
if (!input.getAttribute('data-corrected')) {
let value = input.value.replace(/[^0-9]/g, '');
if (value.length === 4) {
input.value = value.slice(0, 2) + '/' + value.slice(2);
}
input.setAttribute('data-corrected', 'true');
}
}
window.formatExpiration = formatExpiration;
function formatSSN(input, type) {
const typeToErrorElement = type === 'client' ? 'clientSSNError' : 'client2SSNError';
const ssnErrorElement = byId(typeToErrorElement);
let lastFourDigits;
let wholeSSN;
if (input.value && !input.getAttribute('data-corrected')) {
let value = input.value.replace(/[^0-9]/g, '');
if (value.length === 9) {
lastFourDigits = value.slice(5);
input.value = value.slice(0, 3) + '-' + value.slice(3, 5) + '-' + lastFourDigits;
savedData[input.id] = input.value;
localStorage.setItem('collectorData', JSON.stringify(savedData));
if (ssnErrorElement) ssnErrorElement.textContent = '';
} else {
input.value = '';
if (ssnErrorElement) ssnErrorElement.textContent = 'SSN must be 9 digits';
input.focus();
return false;
}
}
wholeSSN = input.value;
return true;
}
window.formatSSN = formatSSN;
function formatState(input) {
const stateErrorElement = byId('homeStateError');
if (!input.getAttribute('data-corrected')) {
const stateInput = input.value.trim().toUpperCase().replace(/\s+/g, ' ');
const postalCode = stateToPostalCode[stateInput.toLowerCase()];
if (postalCode) {
input.value = postalCode.toUpperCase();
if (stateErrorElement) stateErrorElement.textContent = '';
} else if (Object.values(stateToPostalCode).includes(stateInput)) {
input.value = stateInput;
if (stateErrorElement) stateErrorElement.textContent = '';
} else {
if (stateErrorElement) stateErrorElement.textContent = 'Invalid state name or code';
input.focus();
return false;
}
savedData[input.id] = input.value;
localStorage.setItem('collectorData', JSON.stringify(savedData));
}
}
window.formatState = formatState;
function validateHomeZip(input) {
let zip = input.value;
let errorMessage = byId('zipError');
if (zip.indexOf('-') !== -1 && zip.split('-')[1].length < 4) {
zip = zip.substring(0, 5);
input.value = zip;
} else if (zip.indexOf('-') === -1 && zip.length > 5) {
zip = zip.substring(0, 5);
input.value = zip;
}
if (zip !== '' && !/^\d{5}(-\d{4})?$/.test(zip)) {
if (errorMessage) errorMessage.textContent = 'Format as 12345 or 12345-1234';
input.focus();
return false;
} else {
if (errorMessage) errorMessage.textContent = '';
return true;
}
}
window.validateHomeZip = validateHomeZip;
function formatCaseState(input) {
const stateErrorElement = byId('caseStateError');
if (!input.getAttribute('data-corrected')) {
const stateInput = input.value.trim().toUpperCase().replace(/\s+/g, ' ');
const stateName = Object.keys(stateToPostalCode).find((key) => stateToPostalCode[key] === stateInput);
if (stateName) {
input.value = stateName.charAt(0).toUpperCase() + stateName.slice(1).toLowerCase();
if (stateErrorElement) stateErrorElement.textContent = '';
} else if (stateToPostalCode.hasOwnProperty(stateInput.toLowerCase())) {
const fullStateName = Object.keys(stateToPostalCode).find((key) => stateToPostalCode[key] === stateInput);
input.value = fullStateName.charAt(0).toUpperCase() + fullStateName.slice(1).toLowerCase();
if (stateErrorElement) stateErrorElement.textContent = '';
} else {
if (stateErrorElement) stateErrorElement.textContent = 'Invalid state name or code';
input.focus();
return false;
}
savedData[input.id] = input.value;
localStorage.setItem('collectorData', JSON.stringify(savedData));
}
}
window.formatCaseState = formatCaseState;
onChange('excelFile', clearForm);
onChange('excelFileOld', clearForm);
onClick('clearForm', clearForm);
function clearForm() {
let forms = document.getElementsByName('clientDataForm');
if (forms.length > 0) {
let form = forms[0];
form.reset();
}
document.title = 'Client Intake Form';
localStorage.removeItem('clientTitle');
}
function clearCaseInfo() {
let caseFields = document.querySelectorAll('.case-info');
caseFields.forEach((field) => {
field.value = '';
savedData[field.id] = '';
});
localStorage.setItem('collectorData', JSON.stringify(savedData));
}
onClick('clearCaseInfo', clearCaseInfo);
onClick('generateClientFolderBtn', function (event) {
event.preventDefault();
const data = getFormData();
sendFormData('/generate-client-folder', data);
});
onSubmit('generateClientDataFile', function (event) {
event.preventDefault();
const data = getFormData();
sendFormData('/generate-excel', data, 'output.xlsx');
});
onClick('generatePaymentPlanBtn', function (event) {
event.preventDefault();
const data = getFormData();
sendFormData('/generate-payment-plan', data, 'output.xlsx');
});
onClick('generateIcsBtn', function (event) {
event.preventDefault();
const data = getFormData();
sendFormData('/generate-ics', data);
});
onClick('generateDiscoIcsMOBtn', function (event) {
event.preventDefault();
const data = getFormData();
sendFormData('/generate-MOdisco-ics', data);
});
onClick('generateDiscoBtn', function (event) {
generateDisco(event);
});
onClick('generateDiscoIcsKSBtn', function (event) {
event.preventDefault();
const data = getFormData();
sendFormData('/generate-KSdisco-ics', data);
});
onClick('generateIcsBodyBtn', function (event) {
event.preventDefault();
const data = getFormData();
sendFormData('/generate-ics-body', data);
});
onClick('generateContactBtn', function (event) {
event.preventDefault();
const data = getFormData();
sendFormData('/generate-vCard', data);
});
onClick('generateRetainerBtn', function (event) {
event.preventDefault();
const data = getFormData();
sendFormData('/generate-retainer', data);
});
onClick('generatePleadingBtn', function () {
generatePleading();
});
onClick('generateLetterBtn', function () {
generateLetter();
});
onClick('generateEoABtn', function (event) {
event.preventDefault();
const data = getFormData();
sendFormData('/generate-eoa', data);
});
onClick('generateNotesBtn', function (event) {
event.preventDefault();
const data = getFormData();
sendFormData('/generate-notes', data);
});
onClick('generateSpreadsheetData', function (event) {
event.preventDefault();
const data = getFormData();
sendFormData('/generate-spreadsheet', data);
});
onClick('generateADsBtn', function (event) {
event.preventDefault();
const data = getFormData();
sendFormData('/generate-ADs', data);
});
onClick('generateCloseOutBtn', function (event) {
event.preventDefault();
const data = getFormData();
sendFormData('/generate-closeout', data);
});
onClick('generateServiceWaiverBtn', function (event) {
event.preventDefault();
const data = getFormData();
sendFormData('/generate-waiver', data);
});
onClick('generateDisputeLetterBtn', function (event) {
event.preventDefault();
const data = getFormData();
sendFormData('/generate-Dispute-Letter', data);
});
onClick('generateCannedEmailsBtn', function (event) {
event.preventDefault();
const data = getFormData();
sendFormData('/generate-Canned-Emails', data);
});
onClick('generateDisputeEnvelopeBtn', function (event) {
event.preventDefault();
const data = getFormData();
sendFormData('/generate-Dispute-Envelope', data);
});
onClick('generateDisputeCertBtn', function (event) {
event.preventDefault();
const data = getFormData();
sendFormData('/generate-Dispute-Cert', data);
});
onClick('generateReminderICSBtn', function (event) {
event.preventDefault();
const data = getFormData();
sendFormData('/generate-reminder-ics', data);
});
onClick('generateCreditAuthBtn', function (event) {
event.preventDefault();
const data = getFormData();
sendFormData('/generate-credit-auth', data);
});
onClick('generateCreditAuthNoPaymentBtn', function (event) {
event.preventDefault();
const data = getFormData();
sendFormData('/generate-credit-auth-no-payment', data);
});
function generatePleading() {
var fileInput = byId('pleadingTemplateFile');
var file = fileInput?.files?.[0];
if (file) {
var templateName = file.name.split('.').slice(0, -1).join('.');
var data = getFormData();
sendFormData('/generate-pleading', data, templateName);
} else {
alert('Please select a file before clicking Generate');
}
}
function generateLetter() {
var fileInput = byId('letterTemplateFile');
var file = fileInput?.files?.[0];
if (file) {
var templateName = file.name.split('.').slice(0, -1).join('.');
var data = getFormData();
sendFormData('/generate-letter', data, templateName);
} else {
alert('Please select a file before clicking Generate');
}
}
function generateDisco(event) {
var fileInput = byId('discoTemplateFile');
var file = fileInput?.files?.[0];
if (file) {
var templateName = file.name.split('.').slice(0, -1).join('.');
var data = getFormData();
sendFormData('/generate-disco', data, templateName);
} else {
alert('Please select a file before clicking Generate');
}
}