Phase 3: Optimize & clean up — unified projects, account enhancements, new tenant fix
- Unify reserve_components + capital_projects into single projects model with full CRUD backend and new Projects page frontend - Rewrite Capital Planning to read from unified projects/planning endpoint; add empty state directing users to Projects page when no planning items exist - Add default designation to assessment groups with auto-set on first creation; units now require an assessment group (pre-populated with default) - Add primary account designation (one per fund type) and balance adjustment via journal entries against equity offset accounts (3000/3100) - Add computed investment fields (interest earned, maturity value, days remaining) with PostgreSQL date arithmetic fix for DATE - DATE integer result - Restructure sidebar: investments in Accounts tab, Year-End under Reports, Planning section with Projects and Capital Planning - Fix new tenant creation seeding unwanted default chart of accounts — new tenants now start with a blank slate Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -32,10 +32,29 @@ export class UnitsService {
|
||||
const existing = await this.tenant.query('SELECT id FROM units WHERE unit_number = $1', [dto.unit_number]);
|
||||
if (existing.length) throw new BadRequestException(`Unit ${dto.unit_number} already exists`);
|
||||
|
||||
// Resolve assessment group: use provided, fall back to default, or error
|
||||
let groupId = dto.assessment_group_id || null;
|
||||
if (!groupId) {
|
||||
const defaultGroup = await this.tenant.query(
|
||||
'SELECT id FROM assessment_groups WHERE is_default = true AND is_active = true LIMIT 1',
|
||||
);
|
||||
if (defaultGroup.length) {
|
||||
groupId = defaultGroup[0].id;
|
||||
} else {
|
||||
// Check if any groups exist at all
|
||||
const anyGroup = await this.tenant.query('SELECT id FROM assessment_groups WHERE is_active = true LIMIT 1');
|
||||
if (!anyGroup.length) {
|
||||
throw new BadRequestException('An assessment group must exist before creating units. Please create an assessment group first.');
|
||||
}
|
||||
// Use the first available group
|
||||
groupId = anyGroup[0].id;
|
||||
}
|
||||
}
|
||||
|
||||
const rows = await this.tenant.query(
|
||||
`INSERT INTO units (unit_number, address_line1, city, state, zip_code, owner_name, owner_email, owner_phone, monthly_assessment, assessment_group_id)
|
||||
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10) RETURNING *`,
|
||||
[dto.unit_number, dto.address_line1, dto.city, dto.state, dto.zip_code, dto.owner_name, dto.owner_email, dto.owner_phone, dto.monthly_assessment || 0, dto.assessment_group_id || null],
|
||||
[dto.unit_number, dto.address_line1, dto.city, dto.state, dto.zip_code, dto.owner_name, dto.owner_email, dto.owner_phone, dto.monthly_assessment || 0, groupId],
|
||||
);
|
||||
return rows[0];
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user