init: kovakemlak-crm project scaffold

- Next.js 16 + Appwrite multi-tenant emlak CRM
- Database: kovakemlak-db (properties, customers, customer_searches, property_matches, presentations, investors, activities, tenant_settings)
- Same stack as isletmem-kovakcrm (shadcn/ui template base)
- Modules: portföy, müşteri takibi, arama kriterleri, otomatik eşleştirme, sunum linki, yatırımcı portalı
This commit is contained in:
egecankomur
2026-05-05 04:37:04 +03:00
commit 37679e83e6
383 changed files with 53525 additions and 0 deletions
+64
View File
@@ -0,0 +1,64 @@
import "server-only";
import { Query } from "node-appwrite";
import { createAdminClient } from "./server";
import { DATABASE_ID, TABLES, type Invoice, type InvoiceItem } from "./schema";
export async function listInvoices(tenantId: string): Promise<Invoice[]> {
try {
const { tablesDB } = createAdminClient();
const result = await tablesDB.listRows({
databaseId: DATABASE_ID,
tableId: TABLES.invoices,
queries: [
Query.equal("tenantId", tenantId),
Query.orderDesc("issueDate"),
Query.limit(500),
],
});
return result.rows as unknown as Invoice[];
} catch {
return [];
}
}
export async function getInvoice(
tenantId: string,
id: string,
): Promise<Invoice | null> {
try {
const { tablesDB } = createAdminClient();
const row = (await tablesDB.getRow(
DATABASE_ID,
TABLES.invoices,
id,
)) as unknown as Invoice;
if (row.tenantId !== tenantId) return null;
return row;
} catch {
return null;
}
}
export async function listInvoiceItems(
tenantId: string,
invoiceId: string,
): Promise<InvoiceItem[]> {
try {
const { tablesDB } = createAdminClient();
const result = await tablesDB.listRows({
databaseId: DATABASE_ID,
tableId: TABLES.invoiceItems,
queries: [
Query.equal("tenantId", tenantId),
Query.equal("invoiceId", invoiceId),
Query.orderAsc("$createdAt"),
Query.limit(500),
],
});
return result.rows as unknown as InvoiceItem[];
} catch {
return [];
}
}