metallkart-erp/scripts/postpay-backfill.ts
louis 8cd97ebff7 feat: PO-POSTPAY-AUTO — auto PaymentRequest on SDN sign + postpay modes
- PostpayMode enum (SIMPLE/PER_DELIVERY) on POPaymentSchedule
- isPostDelivery flag on POInstallment (auto-set at creation)
- SDN.sign() → triggerPostpayOnSdnSign: creates/recalculates PaymentRequest
  - SIMPLE: 1 PR per postpay installment, dueDate = signedDate + postDeliveryDays
  - PER_DELIVERY: 1 PR per SDN, amount = deliveredAmount × postpayPercent/100
- SDN.cancel() → rejects PENDING/APPROVED PRs, preserves PAID PRs
- Frontend: postpayMode Radio in PO drawer, "После отгрузки" tag on installments
- Rename УПД tabs: исходящие → Клиенты, входящие → Поставщики
- Backfill: 2 installments marked isPostDelivery=true

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-28 13:27:57 +03:00

38 lines
1.3 KiB
TypeScript

import { PrismaClient } from '@prisma/client';
const prisma = new PrismaClient();
async function backfill() {
const schedules = await prisma.pOPaymentSchedule.findMany({
include: { installments: { orderBy: { sortOrder: 'desc' } } },
});
console.log(`Found ${schedules.length} payment schedules`);
let totalPatched = 0;
for (const s of schedules) {
let toMark: number[] = [];
if (s.paymentType === 'POST_DELIVERY') {
toMark = s.installments.map(i => i.id);
} else if (s.paymentType === 'INSTALLMENT') {
if (s.installments.length > 0) {
toMark = [s.installments[0].id]; // [0] car orderBy desc → dernier sortOrder
}
}
if (toMark.length > 0) {
const r = await prisma.pOInstallment.updateMany({
where: { id: { in: toMark } },
data: { isPostDelivery: true },
});
console.log(` Schedule ${s.id} (PO ${s.purchaseOrderId}, type=${s.paymentType}): ${r.count} installments → isPostDelivery=true`);
totalPatched += r.count;
}
}
console.log(`\nBackfill terminé : ${totalPatched} installments marqués isPostDelivery=true`);
console.log(`postpayMode reste à default 'SIMPLE' pour tous les schedules existants (rétrocompat).`);
}
backfill().catch(e => { console.error(e); process.exit(1); }).finally(() => prisma.$disconnect());