@chatman-media/storage 1.13.0 → 1.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -35,10 +35,15 @@ __export(exports_schema, {
35
35
  skillOutcomes: () => skillOutcomes,
36
36
  shadowEvaluations: () => shadowEvaluations,
37
37
  sessions: () => sessions,
38
+ serviceCatalogItems: () => serviceCatalogItems,
38
39
  selfPlayMatches: () => selfPlayMatches,
39
40
  referralCodes: () => referralCodes,
40
41
  questionnaireTokens: () => questionnaireTokens,
41
42
  passwordResets: () => passwordResets,
43
+ partners: () => partners,
44
+ partnerSettlements: () => partnerSettlements,
45
+ partnerServices: () => partnerServices,
46
+ partnerDeals: () => partnerDeals,
42
47
  pairwiseMatches: () => pairwiseMatches,
43
48
  outreachCampaigns: () => outreachCampaigns,
44
49
  outreachCampaignLeads: () => outreachCampaignLeads,
@@ -2745,6 +2750,8 @@ var stageDefinitions = pgTable("stage_definitions", {
2745
2750
  icon: text("icon"),
2746
2751
  goal: text("goal"),
2747
2752
  guidance: text("guidance"),
2753
+ partnerWebhookUrl: text("partner_webhook_url"),
2754
+ partnerWebhookMode: text("partner_webhook_mode").notNull().default("fire_and_forget"),
2748
2755
  createdAt: integer("created_at").notNull().default(epochNow()),
2749
2756
  updatedAt: integer("updated_at").notNull().default(epochNow())
2750
2757
  }, (t) => [
@@ -2790,10 +2797,12 @@ var leads = pgTable("leads", {
2790
2797
  decidedAt: integer("decided_at"),
2791
2798
  lastCheckinAt: integer("last_checkin_at"),
2792
2799
  visaInterviewField: text("visa_interview_field"),
2800
+ awaitingToken: text("awaiting_token"),
2793
2801
  createdAt: integer("created_at").notNull().default(epochNow()),
2794
2802
  updatedAt: integer("updated_at").notNull().default(epochNow())
2795
2803
  }, (t) => [
2796
2804
  index("idx_leads_state_recency").on(t.state, sql`${t.updatedAt} DESC`),
2805
+ index("idx_leads_awaiting_token").on(t.awaitingToken).where(sql`${t.awaitingToken} IS NOT NULL`),
2797
2806
  index("idx_leads_stage_def").on(t.stageDefinitionId),
2798
2807
  index("idx_leads_tenant_user").on(t.tenantId, t.userId)
2799
2808
  ]);
@@ -3454,6 +3463,112 @@ var exchangeOrders = pgTable("exchange_orders", {
3454
3463
  index("idx_exchange_orders_tenant_created").on(t.tenantId, t.createdAt),
3455
3464
  index("idx_exchange_orders_awaiting_ttl").on(t.status, t.rateExpiresAt).where(sql`status = 'awaiting_payment'`)
3456
3465
  ]);
3466
+ var partners = pgTable("partners", {
3467
+ id: serial("id").primaryKey(),
3468
+ tenantId: integer("tenant_id").notNull().references(() => tenants.id, { onDelete: "cascade" }),
3469
+ name: text("name").notNull(),
3470
+ status: text("status").notNull().default("active"),
3471
+ contactName: text("contact_name"),
3472
+ contactChannel: text("contact_channel"),
3473
+ contactValue: text("contact_value"),
3474
+ defaultCommissionPct: doublePrecision("default_commission_pct").notNull().default(0),
3475
+ settlementCurrency: text("settlement_currency").notNull().default("THB"),
3476
+ notes: text("notes"),
3477
+ createdAt: integer("created_at").notNull().default(epochNow()),
3478
+ updatedAt: integer("updated_at").notNull().default(epochNow())
3479
+ }, (t) => [
3480
+ check("partners_status_check", sql`${t.status} IN ('active','archived')`),
3481
+ index("idx_partners_tenant_status").on(t.tenantId, t.status)
3482
+ ]);
3483
+ var partnerServices = pgTable("partner_services", {
3484
+ id: serial("id").primaryKey(),
3485
+ tenantId: integer("tenant_id").notNull().references(() => tenants.id, { onDelete: "cascade" }),
3486
+ partnerId: integer("partner_id").notNull().references(() => partners.id, { onDelete: "cascade" }),
3487
+ name: text("name").notNull(),
3488
+ category: text("category"),
3489
+ funnelId: integer("funnel_id").references(() => funnels.id, { onDelete: "set null" }),
3490
+ stageDefinitionId: integer("stage_definition_id").references(() => stageDefinitions.id, { onDelete: "set null" }),
3491
+ commissionPct: doublePrecision("commission_pct").notNull().default(0),
3492
+ isActive: boolean("is_active").notNull().default(true),
3493
+ notes: text("notes"),
3494
+ createdAt: integer("created_at").notNull().default(epochNow()),
3495
+ updatedAt: integer("updated_at").notNull().default(epochNow())
3496
+ }, (t) => [
3497
+ uniqueIndex("uniq_partner_services_name").on(t.tenantId, t.partnerId, t.name),
3498
+ index("idx_partner_services_tenant_active").on(t.tenantId, t.isActive),
3499
+ index("idx_partner_services_stage").on(t.tenantId, t.stageDefinitionId)
3500
+ ]);
3501
+ var serviceCatalogItems = pgTable("service_catalog_items", {
3502
+ id: serial("id").primaryKey(),
3503
+ tenantId: integer("tenant_id").notNull().references(() => tenants.id, { onDelete: "cascade" }),
3504
+ slug: text("slug").notNull(),
3505
+ name: text("name").notNull(),
3506
+ category: text("category"),
3507
+ description: text("description"),
3508
+ routeType: text("route_type").notNull().default("manual"),
3509
+ funnelId: integer("funnel_id").references(() => funnels.id, { onDelete: "set null" }),
3510
+ partnerServiceId: integer("partner_service_id").references(() => partnerServices.id, { onDelete: "set null" }),
3511
+ webhookUrl: text("webhook_url"),
3512
+ isActive: boolean("is_active").notNull().default(true),
3513
+ sortOrder: integer("sort_order").notNull().default(0),
3514
+ metadataJson: text("metadata_json").notNull().default("{}"),
3515
+ createdAt: integer("created_at").notNull().default(epochNow()),
3516
+ updatedAt: integer("updated_at").notNull().default(epochNow())
3517
+ }, (t) => [
3518
+ check("service_catalog_route_type_check", sql`${t.routeType} IN ('manual','funnel','partner_service','webhook')`),
3519
+ uniqueIndex("uniq_service_catalog_slug").on(t.tenantId, t.slug),
3520
+ index("idx_service_catalog_tenant_active").on(t.tenantId, t.isActive, t.sortOrder),
3521
+ index("idx_service_catalog_funnel").on(t.tenantId, t.funnelId),
3522
+ index("idx_service_catalog_partner_service").on(t.tenantId, t.partnerServiceId)
3523
+ ]);
3524
+ var partnerDeals = pgTable("partner_deals", {
3525
+ id: serial("id").primaryKey(),
3526
+ tenantId: integer("tenant_id").notNull().references(() => tenants.id, { onDelete: "cascade" }),
3527
+ partnerId: integer("partner_id").references(() => partners.id, { onDelete: "set null" }),
3528
+ serviceId: integer("service_id").references(() => partnerServices.id, { onDelete: "set null" }),
3529
+ leadId: integer("lead_id").references(() => leads.id, { onDelete: "set null" }),
3530
+ stageDefinitionId: integer("stage_definition_id").references(() => stageDefinitions.id, { onDelete: "set null" }),
3531
+ status: text("status").notNull().default("sent"),
3532
+ handoffUrl: text("handoff_url"),
3533
+ handoffMode: text("handoff_mode").notNull().default("fire_and_forget"),
3534
+ grossAmount: doublePrecision("gross_amount"),
3535
+ currency: text("currency").notNull().default("THB"),
3536
+ commissionPct: doublePrecision("commission_pct").notNull().default(0),
3537
+ commissionAmount: doublePrecision("commission_amount"),
3538
+ proofJson: text("proof_json"),
3539
+ notes: text("notes"),
3540
+ sentAt: integer("sent_at"),
3541
+ acceptedAt: integer("accepted_at"),
3542
+ completedAt: integer("completed_at"),
3543
+ cancelledAt: integer("cancelled_at"),
3544
+ settledAt: integer("settled_at"),
3545
+ createdAt: integer("created_at").notNull().default(epochNow()),
3546
+ updatedAt: integer("updated_at").notNull().default(epochNow())
3547
+ }, (t) => [
3548
+ check("partner_deals_status_check", sql`${t.status} IN ('sent','accepted','rejected','completed','cancelled','disputed','settled')`),
3549
+ check("partner_deals_mode_check", sql`${t.handoffMode} IN ('fire_and_forget','await_callback')`),
3550
+ index("idx_partner_deals_tenant_status").on(t.tenantId, t.status),
3551
+ index("idx_partner_deals_partner").on(t.tenantId, t.partnerId),
3552
+ index("idx_partner_deals_lead").on(t.tenantId, t.leadId)
3553
+ ]);
3554
+ var partnerSettlements = pgTable("partner_settlements", {
3555
+ id: serial("id").primaryKey(),
3556
+ tenantId: integer("tenant_id").notNull().references(() => tenants.id, { onDelete: "cascade" }),
3557
+ partnerId: integer("partner_id").notNull().references(() => partners.id, { onDelete: "cascade" }),
3558
+ periodStart: integer("period_start").notNull(),
3559
+ periodEnd: integer("period_end").notNull(),
3560
+ status: text("status").notNull().default("draft"),
3561
+ totalGross: doublePrecision("total_gross").notNull().default(0),
3562
+ totalCommission: doublePrecision("total_commission").notNull().default(0),
3563
+ currency: text("currency").notNull().default("THB"),
3564
+ paidAt: integer("paid_at"),
3565
+ notes: text("notes"),
3566
+ createdAt: integer("created_at").notNull().default(epochNow()),
3567
+ updatedAt: integer("updated_at").notNull().default(epochNow())
3568
+ }, (t) => [
3569
+ check("partner_settlements_status_check", sql`${t.status} IN ('draft','issued','paid','cancelled')`),
3570
+ index("idx_partner_settlements_partner").on(t.tenantId, t.partnerId, t.periodStart)
3571
+ ]);
3457
3572
  // src/integration-helpers.ts
3458
3573
  import { readdirSync, readFileSync } from "node:fs";
3459
3574
  import { join } from "node:path";
@@ -5492,11 +5607,16 @@ export {
5492
5607
  skillOutcomes,
5493
5608
  shadowEvaluations,
5494
5609
  sessions,
5610
+ serviceCatalogItems,
5495
5611
  selfPlayMatches,
5496
5612
  exports_schema as schema,
5497
5613
  referralCodes,
5498
5614
  questionnaireTokens,
5499
5615
  passwordResets,
5616
+ partners,
5617
+ partnerSettlements,
5618
+ partnerServices,
5619
+ partnerDeals,
5500
5620
  pairwiseMatches,
5501
5621
  outreachCampaigns,
5502
5622
  outreachCampaignLeads,