feat(purchase): add per-purchase participant splits

This commit is contained in:
2026-03-11 14:34:27 +04:00
parent 98988159eb
commit 8401688032
26 changed files with 5050 additions and 114 deletions

View File

@@ -0,0 +1,16 @@
CREATE TABLE "purchase_message_participants" (
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
"purchase_message_id" uuid NOT NULL,
"member_id" uuid NOT NULL,
"included" integer DEFAULT 1 NOT NULL,
"share_amount_minor" bigint,
"created_at" timestamp with time zone DEFAULT now() NOT NULL,
"updated_at" timestamp with time zone DEFAULT now() NOT NULL
);
--> statement-breakpoint
ALTER TABLE "purchase_messages" ADD COLUMN "participant_split_mode" text DEFAULT 'equal' NOT NULL;--> statement-breakpoint
ALTER TABLE "purchase_message_participants" ADD CONSTRAINT "purchase_message_participants_purchase_message_id_purchase_messages_id_fk" FOREIGN KEY ("purchase_message_id") REFERENCES "public"."purchase_messages"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
ALTER TABLE "purchase_message_participants" ADD CONSTRAINT "purchase_message_participants_member_id_members_id_fk" FOREIGN KEY ("member_id") REFERENCES "public"."members"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
CREATE UNIQUE INDEX "purchase_message_participants_purchase_member_unique" ON "purchase_message_participants" USING btree ("purchase_message_id","member_id");--> statement-breakpoint
CREATE INDEX "purchase_message_participants_purchase_idx" ON "purchase_message_participants" USING btree ("purchase_message_id");--> statement-breakpoint
CREATE INDEX "purchase_message_participants_member_idx" ON "purchase_message_participants" USING btree ("member_id");

File diff suppressed because it is too large Load Diff

View File

@@ -113,6 +113,13 @@
"when": 1773223414625,
"tag": "0015_white_owl",
"breakpoints": true
},
{
"idx": 16,
"version": "7",
"when": 1773225121790,
"tag": "0016_equal_susan_delgado",
"breakpoints": true
}
]
}

View File

@@ -422,6 +422,7 @@ export const purchaseMessages = pgTable(
parsedAmountMinor: bigint('parsed_amount_minor', { mode: 'bigint' }),
parsedCurrency: text('parsed_currency'),
parsedItemDescription: text('parsed_item_description'),
participantSplitMode: text('participant_split_mode').default('equal').notNull(),
parserMode: text('parser_mode'),
parserConfidence: integer('parser_confidence'),
needsReview: integer('needs_review').default(1).notNull(),
@@ -447,6 +448,31 @@ export const purchaseMessages = pgTable(
})
)
export const purchaseMessageParticipants = pgTable(
'purchase_message_participants',
{
id: uuid('id').defaultRandom().primaryKey(),
purchaseMessageId: uuid('purchase_message_id')
.notNull()
.references(() => purchaseMessages.id, { onDelete: 'cascade' }),
memberId: uuid('member_id')
.notNull()
.references(() => members.id, { onDelete: 'cascade' }),
included: integer('included').default(1).notNull(),
shareAmountMinor: bigint('share_amount_minor', { mode: 'bigint' }),
createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
updatedAt: timestamp('updated_at', { withTimezone: true }).defaultNow().notNull()
},
(table) => ({
purchaseMemberUnique: uniqueIndex('purchase_message_participants_purchase_member_unique').on(
table.purchaseMessageId,
table.memberId
),
purchaseIdx: index('purchase_message_participants_purchase_idx').on(table.purchaseMessageId),
memberIdx: index('purchase_message_participants_member_idx').on(table.memberId)
})
)
export const processedBotMessages = pgTable(
'processed_bot_messages',
{