import { MigrationInterface, QueryRunner } from 'typeorm'; /** * تطبيع أرقام الهاتف المخزَّنة مسبقاً (docs/17 — D1). * * قبل هذه الهجرة كانت `sendOtp`/`verifyOtp` تخزّنان الرقم **كما كُتب حرفياً** * — فحسابات اختبار الحمل (`0797…`) وأي دخول سابق مخزَّنة بصيغة محلية لا * دولية. تطبّق هذه الهجرة نفس منطق `PhoneService` بـSQL خام لكل مستأجر حسب * `country_pack`، وتتخطّى أي صفٍّ يتعارض ناتجه مع صفٍّ آخر (لا تكسر القيد * الفريد `(tenant_id, phone)`؛ التعارض النادر يُترك يدوياً). */ export class NormalizePhones1721880000000 implements MigrationInterface { public async up(q: QueryRunner): Promise { // jo/sy: صفر محلي + 9 أرقام → مفتاح الدولة + 9 أرقام. await q.query(` UPDATE tripz_users u SET phone = t.country_pack_cc || substring(u.phone from 2) FROM ( SELECT id, CASE country_pack WHEN 'jo' THEN '962' WHEN 'sy' THEN '963' END AS country_pack_cc FROM tripz_tenants WHERE country_pack IN ('jo', 'sy') ) t WHERE u.tenant_id = t.id AND u.phone ~ '^0[0-9]{9}$' AND NOT EXISTS ( SELECT 1 FROM tripz_users u2 WHERE u2.tenant_id = u.tenant_id AND u2.phone = t.country_pack_cc || substring(u.phone from 2) ) `); // eg: صفر محلي + 10 أرقام → "20" + 10 أرقام. await q.query(` UPDATE tripz_users u SET phone = '20' || substring(u.phone from 2) FROM tripz_tenants t WHERE u.tenant_id = t.id AND t.country_pack = 'eg' AND u.phone ~ '^0[0-9]{10}$' AND NOT EXISTS ( SELECT 1 FROM tripz_users u2 WHERE u2.tenant_id = u.tenant_id AND u2.phone = '20' || substring(u.phone from 2) ) `); } public async down(): Promise { // لا رجوع — لا سبيل لمعرفة الصيغة الأصلية بعد التطبيع (وقد تكون كانت // بصيغ مختلفة أصلاً). التطبيع أُحادي الاتجاه بطبيعته. } }