Compare commits
2
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
cc852e7c6f | ||
|
|
31a8177958 |
@@ -42,3 +42,6 @@ yarn-error.log*
|
|||||||
next-env.d.ts
|
next-env.d.ts
|
||||||
|
|
||||||
/src/generated/prisma
|
/src/generated/prisma
|
||||||
|
|
||||||
|
# Raw statement exports — real financial data, never commit
|
||||||
|
dump/
|
||||||
|
|||||||
@@ -1,84 +0,0 @@
|
|||||||
"TransferWise ID",Date,"Date Time",Amount,Currency,Description,"Payment Reference","Running Balance","Exchange From","Exchange To","Exchange Rate","Payer Name","Payee Name","Payee Account Number",Merchant,"Card Last Four Digits","Card Holder Full Name",Attachment,Note,"Total fees","Exchange To Amount","Transaction Type","Transaction Details Type"
|
|
||||||
TRANSFER-2268507611,24-07-2026,"24-07-2026 23:59:50.116",-10000.00,USD,"Sent money to Siddharth Bose",,775.89,,,,,"Siddharth Bose",68844145,,,,,,0.00,,DEBIT,TRANSFER
|
|
||||||
TRANSFER-2235277367,07-07-2026,"07-07-2026 18:05:17.109",10782.00,USD,"Received money from HDR Global Services (Bermuda) with reference INV 2026-06 EXP2687","INV 2026-06 EXP2687",10775.89,,,,"HDR Global Services (Bermuda)",,,,,,,,6.11,,CREDIT,DEPOSIT
|
|
||||||
FEE-TRANSFER-2235277367,07-07-2026,"07-07-2026 18:05:17.108",-6.11,USD,"Wise Charges for: TRANSFER-2235277367","INV 2026-06 EXP2687",-6.11,,,,"HDR Global Services (Bermuda)",,,,,,,,0,,DEBIT,DEPOSIT
|
|
||||||
TRANSFER-2216007380,28-06-2026,"28-06-2026 11:37:55.004",-3968.98,USD,"Sent money to Siddharth Bose (fee: 11.63 USD)",,0.00,USD,AUD,1.44949,,"Siddharth Bose","(939200) 519049940",,,,,,11.63,5753.00,DEBIT,TRANSFER
|
|
||||||
FEE-TRANSFER-2216007380,28-06-2026,"28-06-2026 11:37:55.003",-11.63,USD,"Wise Charges for: TRANSFER-2216007380",,3968.98,,,,,Wise,,,,,,,0,,DEBIT,TRANSFER
|
|
||||||
TRANSFER-2171403032,04-06-2026,"04-06-2026 05:11:15.833",-6776.49,USD,"Sent money to Siddharth Bose (fee: 19.51 USD)",,3980.61,USD,AUD,1.40233,,"Siddharth Bose","(939200) 519049940",,,,,,19.51,9502.88,DEBIT,TRANSFER
|
|
||||||
FEE-TRANSFER-2171403032,04-06-2026,"04-06-2026 05:11:15.832",-19.51,USD,"Wise Charges for: TRANSFER-2171403032",,10757.10,,,,,Wise,,,,,,,0,,DEBIT,TRANSFER
|
|
||||||
TRANSFER-2157538435,28-05-2026,"28-05-2026 17:32:10.213",10782.00,USD,"Received money from HDR Global Services (Bermuda) with reference INV 2026-05 EXP2557","INV 2026-05 EXP2557",10776.61,,,,"HDR Global Services (Bermuda)",,,,,,,,6.11,,CREDIT,DEPOSIT
|
|
||||||
FEE-TRANSFER-2157538435,28-05-2026,"28-05-2026 17:32:10.212",-6.11,USD,"Wise Charges for: TRANSFER-2157538435","INV 2026-05 EXP2557",-5.39,,,,"HDR Global Services (Bermuda)",,,,,,,,0,,DEBIT,DEPOSIT
|
|
||||||
TRANSFER-2143509822,20-05-2026,"20-05-2026 21:01:23.608",-10765.33,USD,"Sent money to Siddharth Bose (fee: 30.67 USD)",,0.72,USD,AUD,1.40351,,"Siddharth Bose","(013040) 408556264",,,,,,30.67,15109.25,DEBIT,TRANSFER
|
|
||||||
FEE-TRANSFER-2143509822,20-05-2026,"20-05-2026 21:01:23.607",-30.67,USD,"Wise Charges for: TRANSFER-2143509822",,10766.05,,,,,Wise,,,,,,,0,,DEBIT,TRANSFER
|
|
||||||
TRANSFER-2128716995,12-05-2026,"12-05-2026 17:33:31.247",10802.83,USD,"Received money from HDR Global Services (Bermuda) with reference INV 2026-04 EXP2421","INV 2026-04 EXP2421",10796.72,,,,"HDR Global Services (Bermuda)",,,,,,,,6.11,,CREDIT,DEPOSIT
|
|
||||||
FEE-TRANSFER-2128716995,12-05-2026,"12-05-2026 17:33:31.246",-6.11,USD,"Wise Charges for: TRANSFER-2128716995","INV 2026-04 EXP2421",-6.11,,,,"HDR Global Services (Bermuda)",,,,,,,,0,,DEBIT,DEPOSIT
|
|
||||||
TRANSFER-2114526979,05-05-2026,"05-05-2026 09:34:50.397",-6835.10,USD,"Sent money to Siddharth Bose (fee: 19.67 USD)",,0.00,USD,AUD,1.39509,,"Siddharth Bose","(939200) 519049940",,,,,,19.67,9535.58,DEBIT,TRANSFER
|
|
||||||
FEE-TRANSFER-2114526979,05-05-2026,"05-05-2026 09:34:50.396",-19.67,USD,"Wise Charges for: TRANSFER-2114526979",,6835.10,,,,,Wise,,,,,,,0,,DEBIT,TRANSFER
|
|
||||||
TRANSFER-2075646899,14-04-2026,"14-04-2026 06:19:35.500",-4000.00,USD,"Sent money to Siddharth Bose",,6854.77,,,,,"Siddharth Bose",68844145,,,,,,0.00,,DEBIT,TRANSFER
|
|
||||||
TRANSFER-2054903037,02-04-2026,"02-04-2026 17:07:38.780",10790.80,USD,"Received money from HDR Global Services (Bermuda) with reference INV 2026-03 EXP2282","INV 2026-03 EXP2282",10854.77,,,,"HDR Global Services (Bermuda)",,,,,,,,6.11,,CREDIT,DEPOSIT
|
|
||||||
FEE-TRANSFER-2054903037,02-04-2026,"02-04-2026 17:07:38.779",-6.11,USD,"Wise Charges for: TRANSFER-2054903037","INV 2026-03 EXP2282",63.97,,,,"HDR Global Services (Bermuda)",,,,,,,,0,,DEBIT,DEPOSIT
|
|
||||||
TRANSFER-2043244817,27-03-2026,"27-03-2026 17:25:48.750",-9971.56,USD,"Sent money to Siddharth Bose (fee: 28.44 USD)",,70.08,USD,AUD,1.45117,,"Siddharth Bose","(939200) 519049940",,,,,,28.44,14470.43,DEBIT,TRANSFER
|
|
||||||
FEE-TRANSFER-2043244817,27-03-2026,"27-03-2026 17:25:48.749",-28.44,USD,"Wise Charges for: TRANSFER-2043244817",,10041.64,,,,,Wise,,,,,,,0,,DEBIT,TRANSFER
|
|
||||||
TRANSFER-2009199370,07-03-2026,"07-03-2026 10:00:47.387",-6000.00,USD,"Sent money to Siddharth Bose",,10070.08,,,,,"Siddharth Bose",68844145,,,,,,0.00,,DEBIT,TRANSFER
|
|
||||||
TRANSFER-2007700796,06-03-2026,"06-03-2026 18:32:12.643",10790.80,USD,"Received money from HDR Global Services (Bermuda) with reference INV 2026-02 EXP2148","INV 2026-02 EXP2148",16070.08,,,,"HDR Global Services (Bermuda)",,,,,,,,6.11,,CREDIT,DEPOSIT
|
|
||||||
FEE-TRANSFER-2007700796,06-03-2026,"06-03-2026 18:32:12.642",-6.11,USD,"Wise Charges for: TRANSFER-2007700796","INV 2026-02 EXP2148",5279.28,,,,"HDR Global Services (Bermuda)",,,,,,,,0,,DEBIT,DEPOSIT
|
|
||||||
TRANSFER-1960000797,07-02-2026,"07-02-2026 00:12:56.532",-25000.00,USD,"Sent money to Siddharth Bose",,5285.39,,,,,"Siddharth Bose",68844145,,,,,,0.00,,DEBIT,TRANSFER
|
|
||||||
TRANSFER-1953505794,03-02-2026,"03-02-2026 18:16:51.173",10790.80,USD,"Received money from HDR Global Services (Bermuda) with reference INV 2026-01 EXP1987","INV 2026-01 EXP1987",30285.39,,,,"HDR Global Services (Bermuda)",,,,,,,,6.11,,CREDIT,DEPOSIT
|
|
||||||
FEE-TRANSFER-1953505794,03-02-2026,"03-02-2026 18:16:51.172",-6.11,USD,"Wise Charges for: TRANSFER-1953505794","INV 2026-01 EXP1987",19494.59,,,,"HDR Global Services (Bermuda)",,,,,,,,0,,DEBIT,DEPOSIT
|
|
||||||
TRANSFER-1950103478,02-02-2026,"02-02-2026 10:12:23.989",-500.00,USD,"Sent money to Siddharth Bose",,19500.70,,,,,"Siddharth Bose",68844145,,,,,,0.00,,DEBIT,TRANSFER
|
|
||||||
TRANSFER-1946979742,31-01-2026,"31-01-2026 00:45:43.330",-2181.00,USD,"Sent money to Siddharth Bose",,20000.70,,,,,"Siddharth Bose",68844145,,,,,,0.00,,DEBIT,TRANSFER
|
|
||||||
TRANSFER-1908177420,07-01-2026,"07-01-2026 18:02:18.983",10790.80,USD,"Received money from HDR Global Services (Bermuda) with reference INV 2025-12 EXP1817","INV 2025-12 EXP1817",22181.70,,,,"HDR Global Services (Bermuda)",,,,,,,,6.11,,CREDIT,DEPOSIT
|
|
||||||
FEE-TRANSFER-1908177420,07-01-2026,"07-01-2026 18:02:18.982",-6.11,USD,"Wise Charges for: TRANSFER-1908177420","INV 2025-12 EXP1817",11390.90,,,,"HDR Global Services (Bermuda)",,,,,,,,0,,DEBIT,DEPOSIT
|
|
||||||
TRANSFER-1847010079,01-12-2025,"01-12-2025 21:17:07.414",10790.69,USD,"Received money from HDR Global Services (Bermuda) with reference INV 2025-11 EXP1683","INV 2025-11 EXP1683",11397.01,,,,"HDR Global Services (Bermuda)",,,,,,,,6.11,,CREDIT,DEPOSIT
|
|
||||||
FEE-TRANSFER-1847010079,01-12-2025,"01-12-2025 21:17:07.413",-6.11,USD,"Wise Charges for: TRANSFER-1847010079","INV 2025-11 EXP1683",606.32,,,,"HDR Global Services (Bermuda)",,,,,,,,0,,DEBIT,DEPOSIT
|
|
||||||
CARD-3157819100,25-11-2025,"25-11-2025 15:16:16.619",-12.65,USD,"Card transaction of 10.99 EUR issued by Mega Limited AUCKLAND (fee: 0.02 USD)",,612.43,USD,EUR,0.86851,,,,"Mega Limited AUCKLAND",4233,"Siddharth Bose",,,0.02,10.99,DEBIT,CARD
|
|
||||||
FEE-CARD-3157819100,25-11-2025,"25-11-2025 15:16:16.618",-0.02,USD,"Wise Charges for: CARD-3157819100",,625.08,,,,,,,"Mega Limited AUCKLAND",4233,"Siddharth Bose",,,0,,DEBIT,CARD
|
|
||||||
TRANSFER-1833504017,24-11-2025,"24-11-2025 01:15:43.299",-10973.71,USD,"Sent money to Siddharth Bose (fee: 26.29 USD)",,625.10,USD,AUD,1.54883,,"Siddharth Bose","(939200) 519049940",,,,,,26.29,16996.41,DEBIT,TRANSFER
|
|
||||||
FEE-TRANSFER-1833504017,24-11-2025,"24-11-2025 01:15:43.298",-26.29,USD,"Wise Charges for: TRANSFER-1833504017",,11598.81,,,,,Wise,,,,,,,0,,DEBIT,TRANSFER
|
|
||||||
CARD-3115289050,13-11-2025,"13-11-2025 20:15:06.123",-34.85,USD,"Card transaction of 30.00 EUR issued by Sta Spa-Ag BOLZANO (fee: 0.10 USD)",,11625.10,USD,EUR,0.86092,,,,"Sta Spa-Ag BOLZANO",8531,"Siddharth Bose",,,0.10,30.00,DEBIT,CARD
|
|
||||||
FEE-CARD-3115289050,13-11-2025,"13-11-2025 20:15:06.122",-0.10,USD,"Wise Charges for: CARD-3115289050",,11659.95,,,,,,,"Sta Spa-Ag BOLZANO",8531,"Siddharth Bose",,,0,,DEBIT,CARD
|
|
||||||
TRANSFER-1808432866,07-11-2025,"07-11-2025 18:13:22.798",10790.69,USD,"Received money from HDR Global Services (Bermuda) with reference INV 2025-10 EXP1512","INV 2025-10 EXP1512",11660.05,,,,"HDR Global Services (Bermuda)",,,,,,,,6.11,,CREDIT,DEPOSIT
|
|
||||||
FEE-TRANSFER-1808432866,07-11-2025,"07-11-2025 18:13:22.797",-6.11,USD,"Wise Charges for: TRANSFER-1808432866","INV 2025-10 EXP1512",869.36,,,,"HDR Global Services (Bermuda)",,,,,,,,0,,DEBIT,DEPOSIT
|
|
||||||
TRANSFER-1805800459,06-11-2025,"06-11-2025 04:53:13.751",-19943.51,USD,"Sent money to Siddharth Bose (fee: 56.49 USD)",,875.47,USD,AUD,1.53692,,"Siddharth Bose","(013040) 408556264",,,,,,56.49,30651.58,DEBIT,TRANSFER
|
|
||||||
FEE-TRANSFER-1805800459,06-11-2025,"06-11-2025 04:53:13.750",-56.49,USD,"Wise Charges for: TRANSFER-1805800459",,20818.98,,,,,Wise,,,,,,,0,,DEBIT,TRANSFER
|
|
||||||
CARD-3088194739,06-11-2025,"06-11-2025 04:37:29.830",-45.92,USD,"Card transaction of 40.00 EUR issued by Via Soana 24 ROMA (fee: 0.13 USD)",,20875.47,USD,EUR,0.87104,,,,"Via Soana 24 ROMA",8531,"Siddharth Bose",,,0.13,40.00,DEBIT,CARD
|
|
||||||
FEE-CARD-3088194739,06-11-2025,"06-11-2025 04:37:29.829",-0.13,USD,"Wise Charges for: CARD-3088194739",,20921.39,,,,,,,"Via Soana 24 ROMA",8531,"Siddharth Bose",,,0,,DEBIT,CARD
|
|
||||||
CARD-3046253352,25-10-2025,"25-10-2025 15:01:15.513",-12.78,USD,"Card transaction of 10.99 EUR issued by Mega Limited AUCKLAND (fee: 0.03 USD)",,20921.52,USD,EUR,0.86014,,,,"Mega Limited AUCKLAND",4233,"Siddharth Bose",,,0.03,10.99,DEBIT,CARD
|
|
||||||
FEE-CARD-3046253352,25-10-2025,"25-10-2025 15:01:15.512",-0.03,USD,"Wise Charges for: CARD-3046253352",,20934.30,,,,,,,"Mega Limited AUCKLAND",4233,"Siddharth Bose",,,0,,DEBIT,CARD
|
|
||||||
TRANSFER-1784386011,24-10-2025,"24-10-2025 10:39:46.041",-6513.98,USD,"Sent money to Siddharth Bose (fee: 18.89 USD)",,20934.33,USD,AUD,1.53516,,"Siddharth Bose","(013040) 408556264",,,,,,18.89,10000.00,DEBIT,TRANSFER
|
|
||||||
FEE-TRANSFER-1784386011,24-10-2025,"24-10-2025 10:39:46.040",-18.89,USD,"Wise Charges for: TRANSFER-1784386011",,27448.31,,,,,Wise,,,,,,,0,,DEBIT,TRANSFER
|
|
||||||
CARD-3027732792,20-10-2025,"20-10-2025 08:58:43.670",549.70,USD,"Card transaction of -549.70 USD issued by Etihad Airw 6072412191144 ABU DHABI",,27467.20,,,,,,,"Etihad Airw 6072412191144 ABU DHABI",4233,"Siddharth Bose",,,0.00,,CREDIT,CARD
|
|
||||||
CARD-3023391491,19-10-2025,"19-10-2025 02:04:15.660",-82.50,USD,"Card transaction of 82.50 USD issued by *Sfo Intl Airport-Itb N SAN FRANCISCO",,26917.50,,,,,,,"*Sfo Intl Airport-Itb N SAN FRANCISCO",8531,"Siddharth Bose",,,0.00,,DEBIT,CARD
|
|
||||||
TRANSFER-1772299455,16-10-2025,"16-10-2025 08:00:56.288",-1500.00,USD,"Sent money to Siddharth Bose",,27000.00,,,,,"Siddharth Bose",68844145,,,,,,0.00,,DEBIT,TRANSFER
|
|
||||||
TRANSFER-1765630070,11-10-2025,"11-10-2025 22:28:23.964",-321.88,USD,"Sent money to Siddharth Bose",,28500.00,,,,,"Siddharth Bose",68844145,,,,,,0.00,,DEBIT,TRANSFER
|
|
||||||
TRANSFER-1755893777,06-10-2025,"06-10-2025 07:59:23.646",-3955.49,USD,"Sent money to Siddharth Bose (fee: 11.74 USD)",,28821.88,USD,AUD,1.51688,,"Siddharth Bose","(033501) 394758",,,,,,11.74,6000.00,DEBIT,TRANSFER
|
|
||||||
FEE-TRANSFER-1755893777,06-10-2025,"06-10-2025 07:59:23.645",-11.74,USD,"Wise Charges for: TRANSFER-1755893777",,32777.37,,,,,Wise,,,,,,,0,,DEBIT,TRANSFER
|
|
||||||
CARD-2962375193,02-10-2025,"02-10-2025 08:41:01.066",4.53,USD,"Card transaction of -4.53 USD issued by Patreon* Membership Internet",,32789.11,,,,,,,"Patreon* Membership Internet",4233,"Siddharth Bose",,,0.00,,CREDIT,CARD
|
|
||||||
TRANSFER-1748256868,01-10-2025,"01-10-2025 18:47:09.850",10790.69,USD,"Received money from HDR Global Services (Bermuda) with reference INV 2025-09 EXP1335","INV 2025-09 EXP1335",32784.58,,,,"HDR Global Services (Bermuda)",,,,,,,,6.11,,CREDIT,DEPOSIT
|
|
||||||
FEE-TRANSFER-1748256868,01-10-2025,"01-10-2025 18:47:09.849",-6.11,USD,"Wise Charges for: TRANSFER-1748256868","INV 2025-09 EXP1335",21993.89,,,,"HDR Global Services (Bermuda)",,,,,,,,0,,DEBIT,DEPOSIT
|
|
||||||
TRANSFER-1742899854,28-09-2025,"28-09-2025 23:23:11.284",-1993.76,USD,"Sent money to Siddharth Bose (fee: 6.24 USD)",,22000.00,USD,AUD,1.52753,,"Siddharth Bose","(939200) 519049940",,,,,,6.24,3045.53,DEBIT,TRANSFER
|
|
||||||
FEE-TRANSFER-1742899854,28-09-2025,"28-09-2025 23:23:11.283",-6.24,USD,"Wise Charges for: TRANSFER-1742899854",,23993.76,,,,,Wise,,,,,,,0,,DEBIT,TRANSFER
|
|
||||||
TRANSFER-1738593468,25-09-2025,"25-09-2025 23:12:15.826",-82.39,USD,"Sent money to Siddharth Bose",,24000.00,,,,,"Siddharth Bose",68844145,,,,,,0.00,,DEBIT,TRANSFER
|
|
||||||
CARD-2937450107,25-09-2025,"25-09-2025 14:53:54.340",-12.91,USD,"Card transaction of 10.99 EUR issued by Mega Limited AUCKLAND (fee: 0.03 USD)",,24082.39,USD,EUR,0.85103,,,,"Mega Limited AUCKLAND",4233,"Siddharth Bose",,,0.03,10.99,DEBIT,CARD
|
|
||||||
FEE-CARD-2937450107,25-09-2025,"25-09-2025 14:53:54.339",-0.03,USD,"Wise Charges for: CARD-2937450107",,24095.30,,,,,,,"Mega Limited AUCKLAND",4233,"Siddharth Bose",,,0,,DEBIT,CARD
|
|
||||||
CARD-2931031224,23-09-2025,"23-09-2025 19:41:24.887",-549.70,USD,"Card transaction of 549.70 USD issued by Etihad Airw 6072412191144 ABU DHABI",,24095.33,,,,,,,"Etihad Airw 6072412191144 ABU DHABI",4233,"Siddharth Bose",,,0.00,,DEBIT,CARD
|
|
||||||
CARD-2929927553,23-09-2025,"23-09-2025 10:05:31.187",-16.50,USD,"Card transaction of 16.50 USD issued by Patreon* Membership Internet",,24645.03,,,,,,,"Patreon* Membership Internet",4233,"Siddharth Bose",,,0.00,,DEBIT,CARD
|
|
||||||
CARD-2928693059,23-09-2025,"23-09-2025 01:24:48.519",-4.53,USD,"Card transaction of 4.53 USD issued by Patreon* Membership Internet",,24661.53,,,,,,,"Patreon* Membership Internet",4233,"Siddharth Bose",,,0.00,,DEBIT,CARD
|
|
||||||
TRANSFER-1706024945,04-09-2025,"04-09-2025 18:17:21.211",-2675.24,USD,"Sent money to Siddharth Bose (fee: 8.15 USD)",,24666.06,USD,AUD,1.53257,,"Siddharth Bose","(033501) 394758",,,,,,8.15,4100.00,DEBIT,TRANSFER
|
|
||||||
FEE-TRANSFER-1706024945,04-09-2025,"04-09-2025 18:17:21.210",-8.15,USD,"Wise Charges for: TRANSFER-1706024945",,27341.30,,,,,Wise,,,,,,,0,,DEBIT,TRANSFER
|
|
||||||
TRANSFER-1702141390,02-09-2025,"02-09-2025 16:47:10.556",10713.76,USD,"Received money from HDR Global Services (Bermuda) with reference INV 2025-08 EXP1167","INV 2025-08 EXP1167",27349.45,,,,"HDR Global Services (Bermuda)",,,,,,,,6.11,,CREDIT,DEPOSIT
|
|
||||||
FEE-TRANSFER-1702141390,02-09-2025,"02-09-2025 16:47:10.555",-6.11,USD,"Wise Charges for: TRANSFER-1702141390","INV 2025-08 EXP1167",16635.69,,,,"HDR Global Services (Bermuda)",,,,,,,,0,,DEBIT,DEPOSIT
|
|
||||||
TRANSFER-1658801843,04-08-2025,"04-08-2025 23:43:36.588",-4985.39,USD,"Sent money to Siddharth Bose (fee: 14.61 USD)",,16641.80,USD,AUD,1.54261,,"Siddharth Bose","(013040) 408556264",,,,,,14.61,7690.51,DEBIT,TRANSFER
|
|
||||||
FEE-TRANSFER-1658801843,04-08-2025,"04-08-2025 23:43:36.587",-14.61,USD,"Wise Charges for: TRANSFER-1658801843",,21627.19,,,,,Wise,,,,,,,0,,DEBIT,TRANSFER
|
|
||||||
TRANSFER-1648433412,29-07-2025,"29-07-2025 17:31:44.230",10789.27,USD,"Received money from HDR Global Services (Bermuda) with reference INV 2025-07 EXP1043","INV 2025-07 EXP1043",21641.80,,,,"HDR Global Services (Bermuda)",,,,,,,,6.11,,CREDIT,DEPOSIT
|
|
||||||
FEE-TRANSFER-1648433412,29-07-2025,"29-07-2025 17:31:44.229",-6.11,USD,"Wise Charges for: TRANSFER-1648433412","INV 2025-07 EXP1043",10852.53,,,,"HDR Global Services (Bermuda)",,,,,,,,0,,DEBIT,DEPOSIT
|
|
||||||
TRANSFER-1626714880,14-07-2025,"14-07-2025 15:47:02.565",10864.75,USD,"Received money from HDR Global Services (Bermuda) with reference INV 2025-05 EXP722","INV 2025-05 EXP722",10858.64,,,,"HDR Global Services (Bermuda)",,,,,,,,6.11,,CREDIT,DEPOSIT
|
|
||||||
FEE-TRANSFER-1626714880,14-07-2025,"14-07-2025 15:47:02.564",-6.11,USD,"Wise Charges for: TRANSFER-1626714880","INV 2025-05 EXP722",-6.11,,,,"HDR Global Services (Bermuda)",,,,,,,,0,,DEBIT,DEPOSIT
|
|
||||||
TRANSFER-1593587151,22-06-2025,"22-06-2025 13:55:31.085",-10827.67,USD,"Sent money to Siddharth Bose (fee: 30.97 USD)","Sent via Wise",0.00,USD,AUD,1.55063,,"Siddharth Bose","(013040) 408556264",,,,,,30.97,16789.71,DEBIT,TRANSFER
|
|
||||||
FEE-TRANSFER-1593587151,22-06-2025,"22-06-2025 13:55:31.084",-30.97,USD,"Wise Charges for: TRANSFER-1593587151","Sent via Wise",10827.67,,,,,Wise,,,,,,,0,,DEBIT,TRANSFER
|
|
||||||
TRANSFER-1565423196,02-06-2025,"02-06-2025 20:32:13.789",10864.75,USD,"Received money from HDR GLOBAL SERVICES (BERMUDA) with reference INV 2025-05 EXP722","INV 2025-05 EXP722",10858.64,,,,"HDR GLOBAL SERVICES (BERMUDA)",,,,,,,,6.11,,CREDIT,DEPOSIT
|
|
||||||
FEE-TRANSFER-1565423196,02-06-2025,"02-06-2025 20:32:13.788",-6.11,USD,"Wise Charges for: TRANSFER-1565423196","INV 2025-05 EXP722",-6.11,,,,"HDR GLOBAL SERVICES (BERMUDA)",,,,,,,,0,,DEBIT,DEPOSIT
|
|
||||||
BALANCE-3505957179,31-05-2025,"31-05-2025 10:32:45.687",-10753.05,USD,"Converted 10,783.16 USD to 16,719.38 AUD (fee: 30.11 USD)",,0.00,USD,AUD,1.55485,,,,,,,,,30.11,16719.38,DEBIT,CONVERSION
|
|
||||||
FEE-BALANCE-3505957179,31-05-2025,"31-05-2025 10:32:45.686",-30.11,USD,"Wise Charges for: BALANCE-3505957179",,10753.05,,,,,,,,,,,,0,,DEBIT,CONVERSION
|
|
||||||
TRANSFER-1541924892,16-05-2025,"16-05-2025 17:06:44.192",10789.27,USD,"Received money from HDR GLOBAL SERVICES (BERMUDA) with reference INV 2025-04 EXP617","INV 2025-04 EXP617",10783.16,,,,"HDR GLOBAL SERVICES (BERMUDA)",,,,,,,,6.11,,CREDIT,DEPOSIT
|
|
||||||
FEE-TRANSFER-1541924892,16-05-2025,"16-05-2025 17:06:44.191",-6.11,USD,"Wise Charges for: TRANSFER-1541924892","INV 2025-04 EXP617",-6.11,,,,"HDR GLOBAL SERVICES (BERMUDA)",,,,,,,,0,,DEBIT,DEPOSIT
|
|
||||||
|
@@ -1,6 +0,0 @@
|
|||||||
"TransferWise ID",Date,"Date Time",Amount,Currency,Description,"Payment Reference","Running Balance","Exchange From","Exchange To","Exchange Rate","Payer Name","Payee Name","Payee Account Number",Merchant,"Card Last Four Digits","Card Holder Full Name",Attachment,Note,"Total fees","Exchange To Amount","Transaction Type","Transaction Details Type"
|
|
||||||
TRANSFER-1562381704,31-05-2025,"31-05-2025 10:35:03.049",-16718.38,AUD,"Sent money to Siddharth Bose (fee: 1.00 AUD)","Sent via Wise",0.00,,,,,"Siddharth Bose",408556264,,,,,,1.00,,DEBIT,TRANSFER
|
|
||||||
FEE-TRANSFER-1562381704,31-05-2025,"31-05-2025 10:35:03.048",-1.00,AUD,"Wise Charges for: TRANSFER-1562381704","Sent via Wise",16718.38,,,,,Wise,,,,,,,0,,DEBIT,TRANSFER
|
|
||||||
BALANCE-3505957179,31-05-2025,"31-05-2025 10:32:45.687",16719.38,AUD,"Converted 10,783.16 USD to 16,719.38 AUD",,16719.38,USD,AUD,1.55485,,,,,,,,,0.00,16719.38,CREDIT,CONVERSION
|
|
||||||
"BANK_DETAILS_ORDER_CHECKOUT-invoice-17067107",22-04-2025,"22-04-2025 21:45:08.441",-22.00,AUD,"Wise bank details acquisition",,0.00,,,,,,,,,,,,0.00,,DEBIT,UNKNOWN
|
|
||||||
TRANSFER-1506981660,22-04-2025,"22-04-2025 21:45:07.288",22.00,AUD,"Topped up account",,22.00,,,,,,,,,,,,0.00,,CREDIT,MONEY_ADDED
|
|
||||||
|
@@ -1,4 +0,0 @@
|
|||||||
"TransferWise ID",Date,"Date Time",Amount,Currency,Description,"Payment Reference","Running Balance","Exchange From","Exchange To","Exchange Rate","Payer Name","Payee Name","Payee Account Number",Merchant,"Card Last Four Digits","Card Holder Full Name",Attachment,Note,"Total fees","Exchange To Amount","Transaction Type","Transaction Details Type"
|
|
||||||
CARD-2958747517,01-10-2025,"01-10-2025 09:03:26.018",-30.00,AUD,"Card transaction of 76.00 AUD issued by Air India Limited Gurugram",,0.00,,,,,,,"Air India Limited Gurugram",7824,"Siddharth Bose",,,0.00,,DEBIT,CARD
|
|
||||||
TRANSFER-1738581938,25-09-2025,"25-09-2025 23:10:05.406",30.09,AUD,"Topped up account",,30.00,,,,,,,,,,,,0.09,,CREDIT,MONEY_ADDED
|
|
||||||
FEE-TRANSFER-1738581938,25-09-2025,"25-09-2025 23:10:05.405",-0.09,AUD,"Wise Charges for: TRANSFER-1738581938",,-0.09,,,,,,,,,,,,0,,DEBIT,MONEY_ADDED
|
|
||||||
|
@@ -1,99 +0,0 @@
|
|||||||
"TransferWise ID",Date,"Date Time",Amount,Currency,Description,"Payment Reference","Running Balance","Exchange From","Exchange To","Exchange Rate","Payer Name","Payee Name","Payee Account Number",Merchant,"Card Last Four Digits","Card Holder Full Name",Attachment,Note,"Total fees","Exchange To Amount","Transaction Type","Transaction Details Type"
|
|
||||||
TRANSFER-2268510041,25-07-2026,"25-07-2026 00:00:53.745",-10000.00,USD,"Sent money to Interactive Brokers LLC (fee: 1.13 USD)",547528752,450.41,,,,,"Interactive Brokers LLC","(021000021) 6******02",,,,,,1.13,,DEBIT,TRANSFER
|
|
||||||
FEE-TRANSFER-2268510041,25-07-2026,"25-07-2026 00:00:53.744",-1.13,USD,"Wise Charges for: TRANSFER-2268510041",547528752,10450.41,,,,,Wise,,,,,,,0,,DEBIT,TRANSFER
|
|
||||||
TRANSFER-2268507611,24-07-2026,"24-07-2026 23:59:52.113",10000.00,USD,"Received money from Siddharth Bose with reference ",,10451.54,,,,"Siddharth Bose",,,,,,,,0.00,,CREDIT,DEPOSIT
|
|
||||||
CARD-3976207925,27-06-2026,"27-06-2026 10:07:35.409",-16.50,USD,"Card transaction of 16.50 USD issued by Patreon* Membership Internet",,451.54,,,,,,,"Patreon* Membership Internet",7824,"Siddharth Bose",,,0.00,,DEBIT,CARD
|
|
||||||
CARD-3841569125,27-05-2026,"27-05-2026 00:39:20.325",-16.50,USD,"Card transaction of 16.50 USD issued by Patreon* Membership Internet",,468.04,,,,,,,"Patreon* Membership Internet",7824,"Siddharth Bose",,,0.00,,DEBIT,CARD
|
|
||||||
CARD-3805642152,18-05-2026,"18-05-2026 10:23:36.446",-1.10,USD,"Card transaction of 1.10 USD issued by Patreon* Membership Internet",,484.54,,,,,,,"Patreon* Membership Internet",7824,"Siddharth Bose",,,0.00,,DEBIT,CARD
|
|
||||||
CARD-3685714866,18-04-2026,"18-04-2026 10:32:14.560",-1.10,USD,"Card transaction of 1.10 USD issued by Patreon* Membership Internet",,485.64,,,,,,,"Patreon* Membership Internet",7824,"Siddharth Bose",,,0.00,,DEBIT,CARD
|
|
||||||
TRANSFER-2075650616,14-04-2026,"14-04-2026 06:21:23.847",-4000.00,USD,"Sent money to Interactive Brokers LLC (fee: 1.13 USD)",,486.74,,,,,"Interactive Brokers LLC","(021000021) 6******02",,,,,,1.13,,DEBIT,TRANSFER
|
|
||||||
FEE-TRANSFER-2075650616,14-04-2026,"14-04-2026 06:21:23.846",-1.13,USD,"Wise Charges for: TRANSFER-2075650616",,4486.74,,,,,Wise,,,,,,,0,,DEBIT,TRANSFER
|
|
||||||
TRANSFER-2075646899,14-04-2026,"14-04-2026 06:19:38.179",4000.00,USD,"Received money from Siddharth Bose with reference ",,4487.87,,,,"Siddharth Bose",,,,,,,,0.00,,CREDIT,DEPOSIT
|
|
||||||
CARD-3567908768,18-03-2026,"18-03-2026 10:28:01.251",-1.10,USD,"Card transaction of 1.10 USD issued by Patreon* Membership Internet",,487.87,,,,,,,"Patreon* Membership Internet",7824,"Siddharth Bose",,,0.00,,DEBIT,CARD
|
|
||||||
TRANSFER-2009203196,07-03-2026,"07-03-2026 10:05:01.880",-6000.00,USD,"Sent money to Interactive Brokers LLC (fee: 1.13 USD)",499493306,488.97,,,,,"Interactive Brokers LLC","(021000021) 6******02",,,,,,1.13,,DEBIT,TRANSFER
|
|
||||||
FEE-TRANSFER-2009203196,07-03-2026,"07-03-2026 10:05:01.879",-1.13,USD,"Wise Charges for: TRANSFER-2009203196",499493306,6488.97,,,,,Wise,,,,,,,0,,DEBIT,TRANSFER
|
|
||||||
TRANSFER-2009199370,07-03-2026,"07-03-2026 10:00:50.551",6000.00,USD,"Received money from Siddharth Bose with reference ",,6490.10,,,,"Siddharth Bose",,,,,,,,0.00,,CREDIT,DEPOSIT
|
|
||||||
CARD-3491856978,25-02-2026,"25-02-2026 10:10:28.993",-3.30,USD,"Card transaction of 3.30 USD issued by Patreon* Membership Internet",,490.10,,,,,,,"Patreon* Membership Internet",7824,"Siddharth Bose",,,0.00,,DEBIT,CARD
|
|
||||||
CARD-3467922012,18-02-2026,"18-02-2026 10:10:19.758",-1.10,USD,"Card transaction of 1.10 USD issued by Patreon* Membership Internet",,493.40,,,,,,,"Patreon* Membership Internet",7824,"Siddharth Bose",,,0.00,,DEBIT,CARD
|
|
||||||
CARD-3453741061,14-02-2026,"14-02-2026 10:15:05.143",-3.30,USD,"Card transaction of 3.30 USD issued by Patreon* Membership Internet",,494.50,,,,,,,"Patreon* Membership Internet",7824,"Siddharth Bose",,,0.00,,DEBIT,CARD
|
|
||||||
TRANSFER-1959996575,07-02-2026,"07-02-2026 00:14:08.112",-25000.00,USD,"Sent money to Interactive Brokers LLC (fee: 1.13 USD)",490625745,497.80,,,,,"Interactive Brokers LLC","(021000021) 6******02",,,,,,1.13,,DEBIT,TRANSFER
|
|
||||||
FEE-TRANSFER-1959996575,07-02-2026,"07-02-2026 00:14:08.111",-1.13,USD,"Wise Charges for: TRANSFER-1959996575",490625745,25497.80,,,,,Wise,,,,,,,0,,DEBIT,TRANSFER
|
|
||||||
TRANSFER-1960000797,07-02-2026,"07-02-2026 00:12:59.295",25000.00,USD,"Received money from Siddharth Bose with reference ",,25498.93,,,,"Siddharth Bose",,,,,,,,0.00,,CREDIT,DEPOSIT
|
|
||||||
CARD-3410915740,02-02-2026,"02-02-2026 13:08:23.820",-5.50,USD,"Card transaction of 5.50 USD issued by Patreon* Membership Internet",,498.93,,,,,,,"Patreon* Membership Internet",7824,"Siddharth Bose",,,0.00,,DEBIT,CARD
|
|
||||||
TRANSFER-1950103478,02-02-2026,"02-02-2026 10:12:26.999",500.00,USD,"Received money from Siddharth Bose with reference ",,504.43,,,,"Siddharth Bose",,,,,,,,0.00,,CREDIT,DEPOSIT
|
|
||||||
CARD-3408417070,01-02-2026,"01-02-2026 21:32:05.683",-1.15,USD,"Card transaction of 1.65 AUD issued by Patreon* Membership Internet (fee: 0.01 USD)",,4.43,USD,AUD,1.43647,,,,"Patreon* Membership Internet",7824,"Siddharth Bose",,,0.01,1.65,DEBIT,CARD
|
|
||||||
FEE-CARD-3408417070,01-02-2026,"01-02-2026 21:32:05.682",-0.01,USD,"Wise Charges for: CARD-3408417070",,5.58,,,,,,,"Patreon* Membership Internet",7824,"Siddharth Bose",,,0,,DEBIT,CARD
|
|
||||||
TRANSFER-1946983328,31-01-2026,"31-01-2026 00:47:24.337",-2440.00,USD,"Sent money to Interactive Brokers LLC (fee: 1.13 USD)",488140942,5.59,,,,,"Interactive Brokers LLC","(021000021) 6******02",,,,,,1.13,,DEBIT,TRANSFER
|
|
||||||
FEE-TRANSFER-1946983328,31-01-2026,"31-01-2026 00:47:24.336",-1.13,USD,"Wise Charges for: TRANSFER-1946983328",488140942,2445.59,,,,,Wise,,,,,,,0,,DEBIT,TRANSFER
|
|
||||||
TRANSFER-1946979742,31-01-2026,"31-01-2026 00:45:46.524",2181.00,USD,"Received money from Siddharth Bose with reference ",,2446.72,,,,"Siddharth Bose",,,,,,,,0.00,,CREDIT,DEPOSIT
|
|
||||||
CARD-3382069917,25-01-2026,"25-01-2026 10:32:05.449",-3.30,USD,"Card transaction of 3.30 USD issued by Patreon* Membership Internet",,265.72,,,,,,,"Patreon* Membership Internet",7824,"Siddharth Bose",,,0.00,,DEBIT,CARD
|
|
||||||
CARD-3374520543,23-01-2026,"23-01-2026 10:25:32.264",-16.50,USD,"Card transaction of 16.50 USD issued by Patreon* Membership Internet",,269.02,,,,,,,"Patreon* Membership Internet",7824,"Siddharth Bose",,,0.00,,DEBIT,CARD
|
|
||||||
CARD-3357157631,18-01-2026,"18-01-2026 10:15:13.990",-1.10,USD,"Card transaction of 1.10 USD issued by Patreon* Membership Internet",,285.52,,,,,,,"Patreon* Membership Internet",7824,"Siddharth Bose",,,0.00,,DEBIT,CARD
|
|
||||||
CARD-3342293626,14-01-2026,"14-01-2026 10:13:23.175",-3.30,USD,"Card transaction of 3.30 USD issued by Patreon* Membership Internet",,286.62,,,,,,,"Patreon* Membership Internet",7824,"Siddharth Bose",,,0.00,,DEBIT,CARD
|
|
||||||
CARD-3299985499,02-01-2026,"02-01-2026 23:06:34.860",-5.29,USD,"Card transaction of 104.51 EUR issued by Sp Nord Studios FORDINGBRIDGE (fee: 0.01 USD)",,289.92,USD,EUR,0.85281,,,,"Sp Nord Studios FORDINGBRIDGE",7824,"Siddharth Bose",,,0.01,4.51,DEBIT,CARD
|
|
||||||
FEE-CARD-3299985499,02-01-2026,"02-01-2026 23:06:34.859",-0.01,USD,"Wise Charges for: CARD-3299985499",,295.21,,,,,,,"Sp Nord Studios FORDINGBRIDGE",7824,"Siddharth Bose",,,0,,DEBIT,CARD
|
|
||||||
CARD-3296046085,01-01-2026,"01-01-2026 22:12:53.296",-5.50,USD,"Card transaction of 5.50 USD issued by Patreon* Membership Internet",,295.22,,,,,,,"Patreon* Membership Internet",7824,"Siddharth Bose",,,0.00,,DEBIT,CARD
|
|
||||||
CARD-3296045671,01-01-2026,"01-01-2026 22:12:45.273",-1.10,USD,"Card transaction of 1.65 AUD issued by Patreon* Membership Internet (fee: 0.01 USD)",,300.72,USD,AUD,1.49869,,,,"Patreon* Membership Internet",7824,"Siddharth Bose",,,0.01,1.65,DEBIT,CARD
|
|
||||||
FEE-CARD-3296045671,01-01-2026,"01-01-2026 22:12:45.272",-0.01,USD,"Wise Charges for: CARD-3296045671",,301.82,,,,,,,"Patreon* Membership Internet",7824,"Siddharth Bose",,,0,,DEBIT,CARD
|
|
||||||
CARD-3268020843,25-12-2025,"25-12-2025 05:42:18.806",-3.30,USD,"Card transaction of 3.30 USD issued by Patreon* Membership Internet",,301.83,,,,,,,"Patreon* Membership Internet",7824,"Siddharth Bose",,,0.00,,DEBIT,CARD
|
|
||||||
CARD-3260621879,23-12-2025,"23-12-2025 10:22:35.011",-16.50,USD,"Card transaction of 16.50 USD issued by Patreon* Membership Internet",,305.13,,,,,,,"Patreon* Membership Internet",7824,"Siddharth Bose",,,0.00,,DEBIT,CARD
|
|
||||||
CARD-3241565056,18-12-2025,"18-12-2025 10:16:09.323",-1.10,USD,"Card transaction of 1.10 USD issued by Patreon* Membership Internet",,321.63,,,,,,,"Patreon* Membership Internet",7824,"Siddharth Bose",,,0.00,,DEBIT,CARD
|
|
||||||
CARD-3227480675,14-12-2025,"14-12-2025 10:22:05.979",-3.30,USD,"Card transaction of 3.30 USD issued by Patreon* Membership Internet",,322.73,,,,,,,"Patreon* Membership Internet",7824,"Siddharth Bose",,,0.00,,DEBIT,CARD
|
|
||||||
CARD-3188378869,07-12-2025,"07-12-2025 00:17:33.286",-7.41,USD,"Card transaction of 27.00 QAR issued by Talabat.com DOHA (fee: 0.06 USD)",,326.03,USD,QAR,3.64480,,,,"Talabat.com DOHA",7824,"Siddharth Bose",,,0.06,27.00,DEBIT,CARD
|
|
||||||
FEE-CARD-3188378869,07-12-2025,"07-12-2025 00:17:33.285",-0.06,USD,"Wise Charges for: CARD-3188378869",,333.44,,,,,,,"Talabat.com DOHA",7824,"Siddharth Bose",,,0,,DEBIT,CARD
|
|
||||||
CARD-3188378869,06-12-2025,"06-12-2025 19:20:41.782",7.48,USD,"Card transaction of 27.00 QAR issued by Talabat.com DOHA (fee: 0.06 USD)",,333.50,USD,QAR,3.64115,,,,"Talabat.com DOHA",7824,"Siddharth Bose",,,0.06,27.00,CREDIT,CARD
|
|
||||||
CARD-3197774302,06-12-2025,"06-12-2025 04:59:25.894",-10.97,USD,"Card transaction of 40.00 QAR issued by Talabat.com DOHA (fee: 0.08 USD)",,326.02,USD,QAR,3.64480,,,,"Talabat.com DOHA",7824,"Siddharth Bose",,,0.08,40.00,DEBIT,CARD
|
|
||||||
FEE-CARD-3197774302,06-12-2025,"06-12-2025 04:59:25.893",-0.08,USD,"Wise Charges for: CARD-3197774302",,336.99,,,,,,,"Talabat.com DOHA",7824,"Siddharth Bose",,,0,,DEBIT,CARD
|
|
||||||
CARD-3195872742,05-12-2025,"05-12-2025 20:14:56.638",-11.52,USD,"Card transaction of 42.00 QAR issued by Talabat.com DOHA (fee: 0.09 USD)",,337.07,USD,QAR,3.64480,,,,"Talabat.com DOHA",7824,"Siddharth Bose",,,0.09,42.00,DEBIT,CARD
|
|
||||||
FEE-CARD-3195872742,05-12-2025,"05-12-2025 20:14:56.637",-0.09,USD,"Wise Charges for: CARD-3195872742",,348.59,,,,,,,"Talabat.com DOHA",7824,"Siddharth Bose",,,0,,DEBIT,CARD
|
|
||||||
CARD-3193767606,05-12-2025,"05-12-2025 04:01:04.690",-12.48,USD,"Card transaction of 45.50 QAR issued by Talabat.com DOHA (fee: 0.09 USD)",,348.68,USD,QAR,3.64490,,,,"Talabat.com DOHA",7824,"Siddharth Bose",,,0.09,45.50,DEBIT,CARD
|
|
||||||
FEE-CARD-3193767606,05-12-2025,"05-12-2025 04:01:04.689",-0.09,USD,"Wise Charges for: CARD-3193767606",,361.16,,,,,,,"Talabat.com DOHA",7824,"Siddharth Bose",,,0,,DEBIT,CARD
|
|
||||||
CARD-3192102297,04-12-2025,"04-12-2025 19:47:04.471",-11.91,USD,"Card transaction of 43.40 QAR issued by Talabat.com DOHA (fee: 0.09 USD)",,361.25,USD,QAR,3.64490,,,,"Talabat.com DOHA",7824,"Siddharth Bose",,,0.09,43.40,DEBIT,CARD
|
|
||||||
FEE-CARD-3192102297,04-12-2025,"04-12-2025 19:47:04.470",-0.09,USD,"Wise Charges for: CARD-3192102297",,373.16,,,,,,,"Talabat.com DOHA",7824,"Siddharth Bose",,,0,,DEBIT,CARD
|
|
||||||
CARD-3190030701,04-12-2025,"04-12-2025 03:27:05.435",-12.35,USD,"Card transaction of 45.00 QAR issued by Talabat.com DOHA (fee: 0.09 USD)",,373.25,USD,QAR,3.64475,,,,"Talabat.com DOHA",7824,"Siddharth Bose",,,0.09,45.00,DEBIT,CARD
|
|
||||||
FEE-CARD-3190030701,04-12-2025,"04-12-2025 03:27:05.434",-0.09,USD,"Wise Charges for: CARD-3190030701",,385.60,,,,,,,"Talabat.com DOHA",7824,"Siddharth Bose",,,0,,DEBIT,CARD
|
|
||||||
CARD-3188378869,03-12-2025,"03-12-2025 19:20:21.222",-7.42,USD,"Card transaction of 27.00 QAR issued by Talabat.com DOHA (fee: 0.06 USD)",,385.69,USD,QAR,3.64115,,,,"Talabat.com DOHA",7824,"Siddharth Bose",,,0.06,27.00,DEBIT,CARD
|
|
||||||
FEE-CARD-3188378869,03-12-2025,"03-12-2025 19:20:21.221",-0.06,USD,"Wise Charges for: CARD-3188378869",,393.11,,,,,,,"Talabat.com DOHA",7824,"Siddharth Bose",,,0,,DEBIT,CARD
|
|
||||||
CARD-3181379836,01-12-2025,"01-12-2025 22:28:23.718",-5.50,USD,"Card transaction of 5.50 USD issued by Patreon* Membership Internet",,393.17,,,,,,,"Patreon* Membership Internet",7824,"Siddharth Bose",,,0.00,,DEBIT,CARD
|
|
||||||
CARD-3181379541,01-12-2025,"01-12-2025 22:28:19.540",-1.08,USD,"Card transaction of 1.65 AUD issued by Patreon* Membership Internet (fee: 0.01 USD)",,398.67,USD,AUD,1.52579,,,,"Patreon* Membership Internet",7824,"Siddharth Bose",,,0.01,1.65,DEBIT,CARD
|
|
||||||
FEE-CARD-3181379541,01-12-2025,"01-12-2025 22:28:19.539",-0.01,USD,"Wise Charges for: CARD-3181379541",,399.75,,,,,,,"Patreon* Membership Internet",7824,"Siddharth Bose",,,0,,DEBIT,CARD
|
|
||||||
CARD-3163094631,27-11-2025,"27-11-2025 01:18:02.955",-15.02,USD,"Card transaction of 15.02 USD issued by Holafly Limited Dublin",,399.76,,,,,,,"Holafly Limited Dublin",7824,"Siddharth Bose",,,0.00,,DEBIT,CARD
|
|
||||||
CARD-3150513905,23-11-2025,"23-11-2025 10:19:47.934",-16.50,USD,"Card transaction of 16.50 USD issued by Patreon* Membership Internet",,414.78,,,,,,,"Patreon* Membership Internet",7824,"Siddharth Bose",,,0.00,,DEBIT,CARD
|
|
||||||
BALANCE-4340683172,19-11-2025,"19-11-2025 02:51:28.940",-115.78,USD,"Converted 116.11 USD to 100.00 EUR (fee: 0.33 USD)",,431.28,USD,EUR,0.86367,,,,,,,,,0.33,100.00,DEBIT,CONVERSION
|
|
||||||
FEE-BALANCE-4340683172,19-11-2025,"19-11-2025 02:51:28.939",-0.33,USD,"Wise Charges for: BALANCE-4340683172",,547.06,,,,,,,,,,,,0,,DEBIT,CONVERSION
|
|
||||||
CARD-3132186281,18-11-2025,"18-11-2025 10:19:06.228",-1.10,USD,"Card transaction of 1.10 USD issued by Patreon* Membership Internet",,547.39,,,,,,,"Patreon* Membership Internet",7824,"Siddharth Bose",,,0.00,,DEBIT,CARD
|
|
||||||
CARD-3127641729,17-11-2025,"17-11-2025 02:39:26.338",-250.84,USD,"Card transaction of 299.70 EUR issued by Bkg*Booking.com Hotel (888)850-3958 (fee: 0.73 USD)",,548.49,USD,EUR,0.86051,,,,"Bkg*Booking.com Hotel (888)850-3958",7824,"Siddharth Bose",,,0.73,215.85,DEBIT,CARD
|
|
||||||
FEE-CARD-3127641729,17-11-2025,"17-11-2025 02:39:26.337",-0.73,USD,"Wise Charges for: CARD-3127641729",,799.33,,,,,,,"Bkg*Booking.com Hotel (888)850-3958",7824,"Siddharth Bose",,,0,,DEBIT,CARD
|
|
||||||
CARD-3117684709,14-11-2025,"14-11-2025 10:19:28.530",-3.30,USD,"Card transaction of 3.30 USD issued by Patreon* Membership Internet",,800.06,,,,,,,"Patreon* Membership Internet",7824,"Siddharth Bose",,,0.00,,DEBIT,CARD
|
|
||||||
BALANCE-4317152848,14-11-2025,"14-11-2025 06:16:50.965",-407.19,USD,"Converted 408.37 USD to 350.00 EUR (fee: 1.18 USD)",,803.36,USD,EUR,0.85955,,,,,,,,,1.18,350.00,DEBIT,CONVERSION
|
|
||||||
FEE-BALANCE-4317152848,14-11-2025,"14-11-2025 06:16:50.964",-1.18,USD,"Wise Charges for: BALANCE-4317152848",,1210.55,,,,,,,,,,,,0,,DEBIT,CONVERSION
|
|
||||||
CARD-3103414412,10-11-2025,"10-11-2025 09:06:17.274",40.70,USD,"Card transaction of -40.70 USD issued by Etihad Airw 6072412191638 ABU DHABI",,1211.73,,,,,,,"Etihad Airw 6072412191638 ABU DHABI",7824,"Siddharth Bose",,,0.00,,CREDIT,CARD
|
|
||||||
CARD-3072261097,01-11-2025,"01-11-2025 21:01:50.003",-5.50,USD,"Card transaction of 5.50 USD issued by Patreon* Membership Internet",,1171.03,,,,,,,"Patreon* Membership Internet",7824,"Siddharth Bose",,,0.00,,DEBIT,CARD
|
|
||||||
CARD-3072260355,01-11-2025,"01-11-2025 21:01:37.857",-1.08,USD,"Card transaction of 1.65 AUD issued by Patreon* Membership Internet (fee: 0.01 USD)",,1176.53,USD,AUD,1.52788,,,,"Patreon* Membership Internet",7824,"Siddharth Bose",,,0.01,1.65,DEBIT,CARD
|
|
||||||
FEE-CARD-3072260355,01-11-2025,"01-11-2025 21:01:37.856",-0.01,USD,"Wise Charges for: CARD-3072260355",,1177.61,,,,,,,"Patreon* Membership Internet",7824,"Siddharth Bose",,,0,,DEBIT,CARD
|
|
||||||
CARD-3059635570,29-10-2025,"29-10-2025 07:59:17.150",-57.55,USD,"Card transaction of 8,768.00 ETB issued by Ethiopian Ai0714402899536 ETHIOPIA (fee: 0.44 USD)",,1177.62,USD,ETB,152.35500,,,,"Ethiopian Ai0714402899536 ETHIOPIA",7824,"Siddharth Bose",,,0.44,8768.00,DEBIT,CARD
|
|
||||||
FEE-CARD-3059635570,29-10-2025,"29-10-2025 07:59:17.149",-0.44,USD,"Wise Charges for: CARD-3059635570",,1235.17,,,,,,,"Ethiopian Ai0714402899536 ETHIOPIA",7824,"Siddharth Bose",,,0,,DEBIT,CARD
|
|
||||||
TRANSFER-1788804021,27-10-2025,"27-10-2025 19:09:13.072",-320.31,USD,"Sent money to USMAN TAHIR (fee: 2.59 USD)",,1235.61,USD,PKR,280.97500,,"USMAN TAHIR","PK64 ALFH 0143 0010 0738 5905",,,,,,2.59,90000.00,DEBIT,TRANSFER
|
|
||||||
FEE-TRANSFER-1788804021,27-10-2025,"27-10-2025 19:09:13.071",-2.59,USD,"Wise Charges for: TRANSFER-1788804021",,1555.92,,,,,Wise,,,,,,,0,,DEBIT,TRANSFER
|
|
||||||
CARD-3027275365,27-10-2025,"27-10-2025 05:07:31.020",-6.00,USD,"Card transaction of 6.00 USD issued by Sq *Sf Ferry Building Sui San Francisco",,1558.51,,,,,,,"Sq *Sf Ferry Building Sui San Francisco",7824,"Siddharth Bose",,,0.00,,DEBIT,CARD
|
|
||||||
CARD-3027275365,25-10-2025,"25-10-2025 04:45:09.096",6.00,USD,"Card transaction of 6.00 USD issued by Sq *Sf Ferry Building Sui San Francisco",,1564.51,,,,,,,"Sq *Sf Ferry Building Sui San Francisco",7824,"Siddharth Bose",,,0.00,,CREDIT,CARD
|
|
||||||
CARD-3038407535,23-10-2025,"23-10-2025 10:08:41.710",-16.50,USD,"Card transaction of 16.50 USD issued by Patreon* Membership Internet",,1558.51,,,,,,,"Patreon* Membership Internet",7824,"Siddharth Bose",,,0.00,,DEBIT,CARD
|
|
||||||
CARD-3037798186,23-10-2025,"23-10-2025 04:35:28.733",-3.00,USD,"Card transaction of 3.00 USD issued by Clipper Systems Mobile #1 CONCORD",,1575.01,,,,,,,"Clipper Systems Mobile #1 CONCORD",7824,"Siddharth Bose",,,0.00,,DEBIT,CARD
|
|
||||||
CARD-3027416520,20-10-2025,"20-10-2025 05:45:30.898",-22.43,USD,"Card transaction of 22.43 USD issued by Tst* Cholita Linda - Ferr SAN FRANCISCO",,1578.01,,,,,,,"Tst* Cholita Linda - Ferr SAN FRANCISCO",7824,"Siddharth Bose",,,0.00,,DEBIT,CARD
|
|
||||||
CARD-3027275365,20-10-2025,"20-10-2025 04:42:14.178",-6.00,USD,"Card transaction of 6.00 USD issued by Sq *Sf Ferry Building Sui San Francisco",,1600.44,,,,,,,"Sq *Sf Ferry Building Sui San Francisco",7824,"Siddharth Bose",,,0.00,,DEBIT,CARD
|
|
||||||
CARD-3027237014,20-10-2025,"20-10-2025 04:26:31.989",-7.61,USD,"Card transaction of 7.61 USD issued by Tst*El Porteno - Ferry B San Francisco",,1606.44,,,,,,,"Tst*El Porteno - Ferry B San Francisco",7824,"Siddharth Bose",,,0.00,,DEBIT,CARD
|
|
||||||
CARD-3024465363,19-10-2025,"19-10-2025 08:57:38.344",-14.01,USD,"Card transaction of 14.01 USD issued by In-N-Outfishermanswhar SAN FRANCISCO",,1614.05,,,,,,,"In-N-Outfishermanswhar SAN FRANCISCO",7824,"Siddharth Bose",,,0.00,,DEBIT,CARD
|
|
||||||
CARD-3024374797,19-10-2025,"19-10-2025 08:05:06.371",-15.00,USD,"Card transaction of 15.00 USD issued by Clipper Systems Mobile #1 CONCORD",,1628.06,,,,,,,"Clipper Systems Mobile #1 CONCORD",7824,"Siddharth Bose",,,0.00,,DEBIT,CARD
|
|
||||||
CARD-3020765939,18-10-2025,"18-10-2025 10:08:02.684",-1.10,USD,"Card transaction of 1.10 USD issued by Patreon* Membership Internet",,1643.06,,,,,,,"Patreon* Membership Internet",7824,"Siddharth Bose",,,0.00,,DEBIT,CARD
|
|
||||||
TRANSFER-1772299455,16-10-2025,"16-10-2025 08:00:59.610",1500.00,USD,"Received money from Siddharth Bose with reference ",,1644.16,,,,"Siddharth Bose",,,,,,,,0.00,,CREDIT,DEPOSIT
|
|
||||||
CARD-3006275078,14-10-2025,"14-10-2025 10:08:06.860",-3.30,USD,"Card transaction of 3.30 USD issued by Patreon* Membership Internet",,144.16,,,,,,,"Patreon* Membership Internet",7824,"Siddharth Bose",,,0.00,,DEBIT,CARD
|
|
||||||
CARD-2997500294,11-10-2025,"11-10-2025 22:30:42.693",-219.70,USD,"Card transaction of 219.70 USD issued by Etihad Airw 6072412191638 ABU DHABI",,147.46,,,,,,,"Etihad Airw 6072412191638 ABU DHABI",7824,"Siddharth Bose",,,0.00,,DEBIT,CARD
|
|
||||||
CARD-2997495723,11-10-2025,"11-10-2025 22:29:34.687",1.31,USD,"Card transaction of 2.00 AUD issued by Google *Chrome Temp cc@google.com",,367.16,USD,AUD,1.54381,,,,"Google *Chrome Temp cc@google.com",7824,"Siddharth Bose",,,0.00,2.00,CREDIT,CARD
|
|
||||||
CARD-2997495723,11-10-2025,"11-10-2025 22:29:33.590",-1.31,USD,"Card transaction of 2.00 AUD issued by Google *Chrome Temp cc@google.com",,365.85,USD,AUD,1.54381,,,,"Google *Chrome Temp cc@google.com",7824,"Siddharth Bose",,,0.00,2.00,DEBIT,CARD
|
|
||||||
TRANSFER-1765630070,11-10-2025,"11-10-2025 22:28:27.692",321.88,USD,"Received money from Siddharth Bose with reference ",,367.16,,,,"Siddharth Bose",,,,,,,,0.00,,CREDIT,DEPOSIT
|
|
||||||
CARD-2960780824,01-10-2025,"01-10-2025 22:51:51.843",-1.09,USD,"Card transaction of 1.65 AUD issued by Patreon* Membership Internet (fee: 0.01 USD)",,45.28,USD,AUD,1.51012,,,,"Patreon* Membership Internet",7824,"Siddharth Bose",,,0.01,1.65,DEBIT,CARD
|
|
||||||
FEE-CARD-2960780824,01-10-2025,"01-10-2025 22:51:51.842",-0.01,USD,"Wise Charges for: CARD-2960780824",,46.37,,,,,,,"Patreon* Membership Internet",7824,"Siddharth Bose",,,0,,DEBIT,CARD
|
|
||||||
CARD-2960780366,01-10-2025,"01-10-2025 22:51:44.881",-5.50,USD,"Card transaction of 5.50 USD issued by Patreon* Membership 833-9728766",,46.38,,,,,,,"Patreon* Membership 833-9728766",7824,"Siddharth Bose",,,0.00,,DEBIT,CARD
|
|
||||||
CARD-2958747517,01-10-2025,"01-10-2025 09:03:26.059",-30.42,USD,"Card transaction of 76.00 AUD issued by Air India Limited Gurugram (fee: 0.09 USD)",,51.88,USD,AUD,1.51194,,,,"Air India Limited Gurugram",7824,"Siddharth Bose",,,0.09,46.00,DEBIT,CARD
|
|
||||||
FEE-CARD-2958747517,01-10-2025,"01-10-2025 09:03:26.058",-0.09,USD,"Wise Charges for: CARD-2958747517",,82.30,,,,,,,"Air India Limited Gurugram",7824,"Siddharth Bose",,,0,,DEBIT,CARD
|
|
||||||
TRANSFER-1738593468,25-09-2025,"25-09-2025 23:13:04.157",82.39,USD,"Received money from Siddharth Bose with reference ",,82.39,,,,"Siddharth Bose",,,,,,,,0.00,,CREDIT,DEPOSIT
|
|
||||||
|
@@ -1,6 +0,0 @@
|
|||||||
"TransferWise ID",Date,"Date Time",Amount,Currency,Description,"Payment Reference","Running Balance","Exchange From","Exchange To","Exchange Rate","Payer Name","Payee Name","Payee Account Number",Merchant,"Card Last Four Digits","Card Holder Full Name",Attachment,Note,"Total fees","Exchange To Amount","Transaction Type","Transaction Details Type"
|
|
||||||
CARD-3299985499,02-01-2026,"02-01-2026 23:06:34.804",-100.00,EUR,"Card transaction of 104.51 EUR issued by Sp Nord Studios FORDINGBRIDGE",,0.00,,,,,,,"Sp Nord Studios FORDINGBRIDGE",7824,"Siddharth Bose",,,0.00,,DEBIT,CARD
|
|
||||||
BALANCE-4340683172,19-11-2025,"19-11-2025 02:51:28.940",100.00,EUR,"Converted 116.11 USD to 100.00 EUR",,100.00,USD,EUR,0.86367,,,,,,,,,0.00,100.00,CREDIT,CONVERSION
|
|
||||||
CARD-3127641729,17-11-2025,"17-11-2025 02:39:26.289",-83.85,EUR,"Card transaction of 299.70 EUR issued by Bkg*Booking.com Hotel (888)850-3958",,0.00,,,,,,,"Bkg*Booking.com Hotel (888)850-3958",7824,"Siddharth Bose",,,0.00,,DEBIT,CARD
|
|
||||||
CARD-3117227825,14-11-2025,"14-11-2025 06:17:54.371",-266.15,EUR,"Card transaction of 266.15 EUR issued by Bkg*Hotel At Booking.c (888)850-3958",,83.85,,,,,,,"Bkg*Hotel At Booking.c (888)850-3958",7824,"Siddharth Bose",,,0.00,,DEBIT,CARD
|
|
||||||
BALANCE-4317152848,14-11-2025,"14-11-2025 06:16:50.965",350.00,EUR,"Converted 408.37 USD to 350.00 EUR",,350.00,USD,EUR,0.85955,,,,,,,,,0.00,350.00,CREDIT,CONVERSION
|
|
||||||
|
@@ -0,0 +1,127 @@
|
|||||||
|
import { NextRequest, NextResponse } from "next/server";
|
||||||
|
import { getCurrentUser } from "@/lib/auth";
|
||||||
|
import { queryRaw } from "@/lib/db";
|
||||||
|
import { getTransactions } from "@/lib/queries";
|
||||||
|
import { evaluateCondition, type Condition, type Actions } from "@/lib/rules";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Dry run: which transactions would this rule touch, and what would change?
|
||||||
|
*
|
||||||
|
* Nothing is written. This exists so a rule can be inspected before it is
|
||||||
|
* applied — the apply path (POST /api/transactions/bulk with action
|
||||||
|
* "apply_rule") takes an explicit list of ids, so the flow is preview, pick,
|
||||||
|
* then apply.
|
||||||
|
*
|
||||||
|
* Matches are split into two groups because they need different attention:
|
||||||
|
* `changes` are rows the rule would actually alter, `noops` already have the
|
||||||
|
* value the rule would set. A merchant-normalisation rule matching 400 rows
|
||||||
|
* where 380 are already correct is 20 changes and 380 rows of noise.
|
||||||
|
*/
|
||||||
|
|
||||||
|
interface Change {
|
||||||
|
field: "category" | "merchant" | "tags" | "split";
|
||||||
|
from: string | null;
|
||||||
|
to: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function GET(
|
||||||
|
req: NextRequest,
|
||||||
|
{ params }: { params: Promise<{ id: string }> }
|
||||||
|
) {
|
||||||
|
const user = await getCurrentUser(req);
|
||||||
|
if (!user) return NextResponse.json({ error: "Unauthorized" }, { status: 403 });
|
||||||
|
|
||||||
|
const { id } = await params;
|
||||||
|
const rules = await queryRaw<{
|
||||||
|
id: number; name: string; conditions: unknown; actions: unknown;
|
||||||
|
}>(
|
||||||
|
`SELECT id, name, conditions, actions FROM rules WHERE id = $1 AND owner_id = $2`,
|
||||||
|
[Number(id), user.id]
|
||||||
|
);
|
||||||
|
if (!rules.length) return NextResponse.json({ error: "Rule not found" }, { status: 404 });
|
||||||
|
|
||||||
|
const rule = rules[0];
|
||||||
|
const conditions = (typeof rule.conditions === "string"
|
||||||
|
? JSON.parse(rule.conditions) : rule.conditions) as Condition[];
|
||||||
|
const actions = (typeof rule.actions === "string"
|
||||||
|
? JSON.parse(rule.actions) : rule.actions) as Actions;
|
||||||
|
|
||||||
|
const { searchParams } = new URL(req.url);
|
||||||
|
const statementId = searchParams.get("statement_id");
|
||||||
|
const limit = Math.min(2000, Math.max(1, Number(searchParams.get("limit") || "500")));
|
||||||
|
|
||||||
|
const { data: transactions } = await getTransactions(user.id, {
|
||||||
|
limit: 100000,
|
||||||
|
offset: 0,
|
||||||
|
...(statementId ? { statement_id: statementId } : {}),
|
||||||
|
});
|
||||||
|
|
||||||
|
// A rule with no conditions matches every transaction. That is how the apply
|
||||||
|
// endpoint behaves too, so the preview must show it rather than hide it —
|
||||||
|
// seeing "matches 3,721" is the point.
|
||||||
|
const matchAll = conditions.length === 0;
|
||||||
|
|
||||||
|
const tagIds = new Set(actions.add_tag_ids ?? []);
|
||||||
|
const splitTarget = actions.apply_split ?? [];
|
||||||
|
|
||||||
|
const changes: unknown[] = [];
|
||||||
|
let noops = 0;
|
||||||
|
|
||||||
|
for (const tx of transactions) {
|
||||||
|
if (!matchAll && !conditions.every((c) => evaluateCondition(c, tx))) continue;
|
||||||
|
|
||||||
|
const diff: Change[] = [];
|
||||||
|
|
||||||
|
if (actions.set_category && tx.effective_category !== actions.set_category) {
|
||||||
|
diff.push({ field: "category", from: tx.effective_category ?? null, to: actions.set_category });
|
||||||
|
}
|
||||||
|
if (actions.set_merchant && tx.effective_merchant !== actions.set_merchant) {
|
||||||
|
diff.push({ field: "merchant", from: tx.effective_merchant ?? null, to: actions.set_merchant });
|
||||||
|
}
|
||||||
|
if (tagIds.size) {
|
||||||
|
const have = new Set((tx.tags ?? []).map((t) => t.id));
|
||||||
|
const missing = [...tagIds].filter((t) => !have.has(t));
|
||||||
|
if (missing.length) {
|
||||||
|
diff.push({ field: "tags", from: null, to: missing.join(",") });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (splitTarget.length) {
|
||||||
|
// Compare the participant/share set the rule would write against what is
|
||||||
|
// already there; a re-run that changes nothing should not look like work.
|
||||||
|
const have = new Map((tx.splits ?? []).map((s) => [s.participant_id, Number(s.share_percent)]));
|
||||||
|
const differs = splitTarget.length !== have.size
|
||||||
|
|| splitTarget.some((s) => have.get(s.participant_id) !== Number(s.share_percent));
|
||||||
|
if (differs) {
|
||||||
|
diff.push({
|
||||||
|
field: "split",
|
||||||
|
from: [...have.entries()].map(([p, s]) => `${p}:${s}%`).join(" ") || null,
|
||||||
|
to: splitTarget.map((s) => `${s.participant_id}:${s.share_percent}%`).join(" "),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (diff.length === 0) { noops++; continue; }
|
||||||
|
|
||||||
|
changes.push({
|
||||||
|
id: tx.id,
|
||||||
|
transaction_date: tx.transaction_date,
|
||||||
|
description: tx.description,
|
||||||
|
amount: tx.amount,
|
||||||
|
amount_aud: tx.amount_aud,
|
||||||
|
currency: tx.currency,
|
||||||
|
bank_name: tx.bank_name,
|
||||||
|
effective_merchant: tx.effective_merchant,
|
||||||
|
effective_category: tx.effective_category,
|
||||||
|
changes: diff,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return NextResponse.json({
|
||||||
|
rule: { id: rule.id, name: rule.name, matches_everything: matchAll },
|
||||||
|
total_matched: changes.length + noops,
|
||||||
|
would_change: changes.length,
|
||||||
|
already_correct: noops,
|
||||||
|
transactions: changes.slice(0, limit),
|
||||||
|
truncated: changes.length > limit,
|
||||||
|
});
|
||||||
|
}
|
||||||
+21
-3
@@ -3,6 +3,7 @@
|
|||||||
import { useState } from "react";
|
import { useState } from "react";
|
||||||
import { useRules, useCreateRule, useUpdateRule, useDeleteRule, useApplyRules, useRuleRuns, useRevertRuleRun, useTags, useParticipants } from "@/lib/hooks";
|
import { useRules, useCreateRule, useUpdateRule, useDeleteRule, useApplyRules, useRuleRuns, useRevertRuleRun, useTags, useParticipants } from "@/lib/hooks";
|
||||||
import { CATEGORIES, formatCategory } from "@/lib/categories";
|
import { CATEGORIES, formatCategory } from "@/lib/categories";
|
||||||
|
import { RulePreviewModal } from "@/components/rule-preview-modal";
|
||||||
|
|
||||||
const FIELDS = [
|
const FIELDS = [
|
||||||
{ value: "merchant_normalized", label: "Merchant" },
|
{ value: "merchant_normalized", label: "Merchant" },
|
||||||
@@ -82,6 +83,7 @@ export default function RulesPage() {
|
|||||||
const [showForm, setShowForm] = useState(false);
|
const [showForm, setShowForm] = useState(false);
|
||||||
const [editingId, setEditingId] = useState<number | null>(null);
|
const [editingId, setEditingId] = useState<number | null>(null);
|
||||||
const [applyResult, setApplyResult] = useState<{ matched: number; transactions_affected: number } | null>(null);
|
const [applyResult, setApplyResult] = useState<{ matched: number; transactions_affected: number } | null>(null);
|
||||||
|
const [preview, setPreview] = useState<{ id: number; name: string } | null>(null);
|
||||||
const [name, setName] = useState("");
|
const [name, setName] = useState("");
|
||||||
const [conditions, setConditions] = useState<Condition[]>([]);
|
const [conditions, setConditions] = useState<Condition[]>([]);
|
||||||
const [actions, setActions] = useState<Actions>(EMPTY_ACTIONS);
|
const [actions, setActions] = useState<Actions>(EMPTY_ACTIONS);
|
||||||
@@ -509,9 +511,17 @@ export default function RulesPage() {
|
|||||||
<p className="text-xs text-zinc-500 mt-1">{humanAction(acts, tagNames, participantNames)}</p>
|
<p className="text-xs text-zinc-500 mt-1">{humanAction(acts, tagNames, participantNames)}</p>
|
||||||
</div>
|
</div>
|
||||||
<div className="flex items-center gap-3 shrink-0">
|
<div className="flex items-center gap-3 shrink-0">
|
||||||
{/* No Apply for quick actions: their conditions are empty, so a
|
{/* Preview is safe for every rule, including quick actions:
|
||||||
bulk apply would hit every transaction. They run from the
|
it writes nothing, and the apply step takes the ids you
|
||||||
transactions page against a selection instead. */}
|
tick rather than re-running the conditions. */}
|
||||||
|
<button
|
||||||
|
onClick={() => setPreview({ id: rule.id, name: rule.name })}
|
||||||
|
className="text-xs text-indigo-400 hover:text-indigo-300"
|
||||||
|
>
|
||||||
|
Preview
|
||||||
|
</button>
|
||||||
|
{/* No blind Apply for quick actions: their conditions are
|
||||||
|
empty, so a bulk apply would hit every transaction. */}
|
||||||
{!rule.manual_only && (
|
{!rule.manual_only && (
|
||||||
<button
|
<button
|
||||||
onClick={() => handleApply(rule.id)}
|
onClick={() => handleApply(rule.id)}
|
||||||
@@ -554,6 +564,14 @@ export default function RulesPage() {
|
|||||||
})}
|
})}
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
|
{preview && (
|
||||||
|
<RulePreviewModal
|
||||||
|
ruleId={preview.id}
|
||||||
|
ruleName={preview.name}
|
||||||
|
onClose={() => setPreview(null)}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,164 @@
|
|||||||
|
"use client";
|
||||||
|
|
||||||
|
import { useEffect, useMemo, useState } from "react";
|
||||||
|
import { useRuleMatches, useApplyRuleToSelection, type RuleMatchChange } from "@/lib/hooks";
|
||||||
|
import { formatCategory } from "@/lib/categories";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Preview what a rule would do, then apply it to a chosen subset.
|
||||||
|
*
|
||||||
|
* The apply path takes explicit transaction ids rather than re-running the
|
||||||
|
* conditions, so what you tick is exactly what changes — a rule whose
|
||||||
|
* conditions are too broad cannot quietly reach further than the preview showed.
|
||||||
|
*/
|
||||||
|
|
||||||
|
function fmt(amount: number, currency = "AUD") {
|
||||||
|
return new Intl.NumberFormat("en-AU", { style: "currency", currency }).format(amount);
|
||||||
|
}
|
||||||
|
|
||||||
|
function describe(c: RuleMatchChange) {
|
||||||
|
if (c.field === "category") return `${formatCategory(c.from)} → ${formatCategory(c.to)}`;
|
||||||
|
if (c.field === "merchant") return `${c.from ?? "—"} → ${c.to}`;
|
||||||
|
if (c.field === "tags") return `+ tags`;
|
||||||
|
return c.from ? `split ${c.from} → ${c.to}` : `split → ${c.to}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function RulePreviewModal({
|
||||||
|
ruleId,
|
||||||
|
ruleName,
|
||||||
|
onClose,
|
||||||
|
}: {
|
||||||
|
ruleId: number;
|
||||||
|
ruleName: string;
|
||||||
|
onClose: () => void;
|
||||||
|
}) {
|
||||||
|
const { data, isLoading, error } = useRuleMatches(ruleId);
|
||||||
|
const apply = useApplyRuleToSelection();
|
||||||
|
const [selected, setSelected] = useState<Set<number>>(new Set());
|
||||||
|
const [done, setDone] = useState<string | null>(null);
|
||||||
|
|
||||||
|
// Default to everything the rule would change — the common case is "yes, all
|
||||||
|
// of these", with deselection as the exception.
|
||||||
|
useEffect(() => {
|
||||||
|
if (data?.transactions) setSelected(new Set(data.transactions.map((t) => t.id)));
|
||||||
|
}, [data]);
|
||||||
|
|
||||||
|
const rows = data?.transactions ?? [];
|
||||||
|
const allSelected = rows.length > 0 && selected.size === rows.length;
|
||||||
|
const totalValue = useMemo(
|
||||||
|
() => rows.filter((r) => selected.has(r.id))
|
||||||
|
.reduce((a, r) => a + Number(r.amount_aud ?? r.amount), 0),
|
||||||
|
[rows, selected]
|
||||||
|
);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="fixed inset-0 bg-black/70 flex items-center justify-center z-50 p-4">
|
||||||
|
<div className="bg-zinc-900 border border-zinc-700 rounded-lg w-full max-w-4xl max-h-[85vh] flex flex-col">
|
||||||
|
<div className="px-5 py-4 border-b border-zinc-800">
|
||||||
|
<h2 className="text-lg font-medium">Preview: {ruleName}</h2>
|
||||||
|
{data && (
|
||||||
|
<p className="text-xs text-zinc-500 mt-1">
|
||||||
|
{data.total_matched} matched · <span className="text-amber-400">{data.would_change} would change</span>
|
||||||
|
{data.already_correct > 0 && ` · ${data.already_correct} already correct`}
|
||||||
|
</p>
|
||||||
|
)}
|
||||||
|
{data?.rule.matches_everything && (
|
||||||
|
<p className="text-xs text-red-400 mt-1">
|
||||||
|
This rule has no conditions — it matches every transaction.
|
||||||
|
</p>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="flex-1 overflow-auto px-5 py-3">
|
||||||
|
{isLoading && <p className="text-sm text-zinc-500">Checking…</p>}
|
||||||
|
{error && <p className="text-sm text-red-400">Failed to load matches.</p>}
|
||||||
|
{data && rows.length === 0 && (
|
||||||
|
<p className="text-sm text-zinc-500">
|
||||||
|
Nothing would change{data.already_correct > 0 && ` — all ${data.already_correct} matching transactions already have these values`}.
|
||||||
|
</p>
|
||||||
|
)}
|
||||||
|
{rows.length > 0 && (
|
||||||
|
<table className="w-full text-xs">
|
||||||
|
<thead className="sticky top-0 bg-zinc-900">
|
||||||
|
<tr className="border-b border-zinc-800 text-zinc-500">
|
||||||
|
<th className="p-2 w-8">
|
||||||
|
<input
|
||||||
|
type="checkbox"
|
||||||
|
checked={allSelected}
|
||||||
|
onChange={(e) =>
|
||||||
|
setSelected(e.target.checked ? new Set(rows.map((r) => r.id)) : new Set())
|
||||||
|
}
|
||||||
|
/>
|
||||||
|
</th>
|
||||||
|
<th className="text-left p-2">Date</th>
|
||||||
|
<th className="text-left p-2">Description</th>
|
||||||
|
<th className="text-right p-2">Amount</th>
|
||||||
|
<th className="text-left p-2">Would change</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{rows.map((r) => (
|
||||||
|
<tr key={r.id} className="border-b border-zinc-800/40 hover:bg-zinc-800/30">
|
||||||
|
<td className="p-2">
|
||||||
|
<input
|
||||||
|
type="checkbox"
|
||||||
|
checked={selected.has(r.id)}
|
||||||
|
onChange={(e) => {
|
||||||
|
const next = new Set(selected);
|
||||||
|
if (e.target.checked) next.add(r.id); else next.delete(r.id);
|
||||||
|
setSelected(next);
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</td>
|
||||||
|
<td className="p-2 text-zinc-500 whitespace-nowrap">{String(r.transaction_date).slice(0, 10)}</td>
|
||||||
|
<td className="p-2 text-zinc-300 max-w-[280px] truncate" title={r.description}>
|
||||||
|
{r.effective_merchant || r.description}
|
||||||
|
<span className="text-zinc-600 ml-2">{r.bank_name}</span>
|
||||||
|
</td>
|
||||||
|
<td className="p-2 text-right tabular-nums text-zinc-400">
|
||||||
|
{fmt(Number(r.amount_aud ?? r.amount))}
|
||||||
|
</td>
|
||||||
|
<td className="p-2 text-amber-400">
|
||||||
|
{r.changes.map((c, i) => <div key={i}>{describe(c)}</div>)}
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
))}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
)}
|
||||||
|
{data?.truncated && (
|
||||||
|
<p className="text-xs text-zinc-500 mt-2">Showing the first {rows.length} — narrow the rule to see the rest.</p>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="px-5 py-3 border-t border-zinc-800 flex items-center justify-between">
|
||||||
|
<span className="text-xs text-zinc-500">
|
||||||
|
{done ?? `${selected.size} selected · ${fmt(totalValue)}`}
|
||||||
|
</span>
|
||||||
|
<div className="flex gap-2">
|
||||||
|
<button onClick={onClose} className="px-3 py-1.5 text-sm text-zinc-400 hover:text-white">
|
||||||
|
Close
|
||||||
|
</button>
|
||||||
|
<button
|
||||||
|
disabled={selected.size === 0 || apply.isPending}
|
||||||
|
onClick={() =>
|
||||||
|
apply.mutate(
|
||||||
|
{ ruleId, ids: Array.from(selected) },
|
||||||
|
{
|
||||||
|
onSuccess: () => {
|
||||||
|
setDone(`Applied to ${selected.size} transaction${selected.size !== 1 ? "s" : ""}`);
|
||||||
|
setSelected(new Set());
|
||||||
|
},
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
className="px-3 py-1.5 bg-emerald-700 hover:bg-emerald-600 disabled:opacity-40 rounded text-sm"
|
||||||
|
>
|
||||||
|
{apply.isPending ? "Applying…" : `Apply to ${selected.size}`}
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -530,6 +530,66 @@ export function useDeleteRule() {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface RuleMatchChange {
|
||||||
|
field: "category" | "merchant" | "tags" | "split";
|
||||||
|
from: string | null;
|
||||||
|
to: string;
|
||||||
|
}
|
||||||
|
export interface RuleMatchRow {
|
||||||
|
id: number;
|
||||||
|
transaction_date: string;
|
||||||
|
description: string;
|
||||||
|
amount: number;
|
||||||
|
amount_aud: number | null;
|
||||||
|
currency: string;
|
||||||
|
bank_name: string;
|
||||||
|
effective_merchant: string;
|
||||||
|
effective_category: string;
|
||||||
|
changes: RuleMatchChange[];
|
||||||
|
}
|
||||||
|
export interface RuleMatches {
|
||||||
|
rule: { id: number; name: string; matches_everything: boolean };
|
||||||
|
total_matched: number;
|
||||||
|
would_change: number;
|
||||||
|
already_correct: number;
|
||||||
|
transactions: RuleMatchRow[];
|
||||||
|
truncated: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Dry run — what a rule would change. Writes nothing. */
|
||||||
|
export function useRuleMatches(ruleId: number | null) {
|
||||||
|
return useQuery<RuleMatches>({
|
||||||
|
queryKey: ["rule-matches", ruleId],
|
||||||
|
enabled: ruleId != null,
|
||||||
|
queryFn: async () => {
|
||||||
|
const res = await fetch(`/api/rules/${ruleId}/matches`);
|
||||||
|
if (!res.ok) throw new Error("Failed to load rule matches");
|
||||||
|
return res.json();
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Apply a rule to a hand-picked set of transactions (conditions ignored). */
|
||||||
|
export function useApplyRuleToSelection() {
|
||||||
|
const qc = useQueryClient();
|
||||||
|
return useMutation({
|
||||||
|
mutationFn: async ({ ruleId, ids }: { ruleId: number; ids: number[] }) => {
|
||||||
|
const res = await fetch("/api/transactions/bulk", {
|
||||||
|
method: "POST",
|
||||||
|
headers: { "Content-Type": "application/json" },
|
||||||
|
body: JSON.stringify({ action: "apply_rule", rule_id: ruleId, ids }),
|
||||||
|
});
|
||||||
|
if (!res.ok) throw new Error((await res.json()).error || "Failed to apply rule");
|
||||||
|
return res.json();
|
||||||
|
},
|
||||||
|
onSuccess: () => {
|
||||||
|
qc.invalidateQueries({ queryKey: ["transactions"] });
|
||||||
|
qc.invalidateQueries({ queryKey: ["rule-matches"] });
|
||||||
|
qc.invalidateQueries({ queryKey: ["rules"] });
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
export function useApplyRules() {
|
export function useApplyRules() {
|
||||||
const qc = useQueryClient();
|
const qc = useQueryClient();
|
||||||
return useMutation({
|
return useMutation({
|
||||||
|
|||||||
Reference in New Issue
Block a user