tango-app-api-payment-subscription 3.5.7 → 3.5.8

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.
@@ -0,0 +1,33 @@
1
+ <tr>
2
+ <td style="background-color:#ffffff;padding:16px 24px 6px 30px;">
3
+ <span style="font-weight:700;color:#121A26;font-size:16px;">Invoice Summary</span>
4
+ </td>
5
+ </tr>
6
+ <tr>
7
+ <td style="background-color:#ffffff;padding:6px 24px 6px 30px;">
8
+ <table border="0" cellpadding="0" cellspacing="0" width="100%" style="border-collapse:collapse;font-size:14px;color:#384860;">
9
+ <thead>
10
+ <tr style="background:#E2E8F0;color:#121A26;">
11
+ <th align="left" style="padding:10px 12px;font-weight:600;">Invoice Number</th>
12
+ <th align="left" style="padding:10px 12px;font-weight:600;">Invoice Date</th>
13
+ <th align="left" style="padding:10px 12px;font-weight:600;">Due Date</th>
14
+ <th align="right" style="padding:10px 12px;font-weight:600;">Total Amount Due</th>
15
+ </tr>
16
+ </thead>
17
+ <tbody>
18
+ {{#each invoices}}
19
+ <tr style="border-bottom:1px solid #E2E8F0;">
20
+ <td style="padding:10px 12px;">{{this.invoiceNumber}}</td>
21
+ <td style="padding:10px 12px;">{{this.invoiceDate}}</td>
22
+ <td style="padding:10px 12px;">{{this.dueDate}}</td>
23
+ <td align="right" style="padding:10px 12px;">{{this.amountDue}}</td>
24
+ </tr>
25
+ {{/each}}
26
+ <tr style="background:#f7f8fa;font-weight:700;color:#121A26;">
27
+ <td colspan="3" align="right" style="padding:12px;">Total Amount Due</td>
28
+ <td align="right" style="padding:12px;">{{totalDue}}</td>
29
+ </tr>
30
+ </tbody>
31
+ </table>
32
+ </td>
33
+ </tr>
@@ -0,0 +1,62 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1">
6
+ <title>Payment Reminder</title>
7
+ </head>
8
+ <body style="margin:0;padding:0;background-color:#dbe5ea;font-family:'Inter',Arial,sans-serif;">
9
+ <table border="0" cellpadding="0" cellspacing="0" width="100%" style="padding:0 10px;">
10
+ <tr>
11
+ <td style="padding:32px 10px 0 10px;">
12
+ <table border="0" cellpadding="0" cellspacing="0" width="100%" style="max-width:680px;margin:0 auto;" align="center">
13
+ <tr>
14
+ <td style="background-color:#ffffff;padding:24px 24px 0 18px;">
15
+ <img src="{{logo}}" width="200" height="100" alt="Tango Eye" style="vertical-align:middle;border:0;height:auto;">
16
+ </td>
17
+ </tr>
18
+ <tr>
19
+ <td style="background-color:#ffffff;padding:0 24px;">
20
+ <p style="border-top:1px solid #CBD5E1;margin:0;"></p>
21
+ </td>
22
+ </tr>
23
+ <tr>
24
+ <td style="background-color:#ffffff;padding:18px 24px 6px 30px;">
25
+ <span style="font-weight:700;color:#121A26;font-size:22px;line-height:32px;">Payment reminder — due on {{dueDate}}</span>
26
+ <div style="margin-top:6px;"><span style="display:inline-block;background:#fdf0d8;color:#92600c;font-size:11px;font-weight:700;padding:3px 10px;border-radius:999px;">Around due</span></div>
27
+ </td>
28
+ </tr>
29
+ <tr>
30
+ <td style="background-color:#ffffff;padding:14px 24px 4px 30px;font-size:16px;line-height:150%;color:#384860;">
31
+ <p style="margin:0;">Hi {{clientName}},</p>
32
+ </td>
33
+ </tr>
34
+ <tr>
35
+ <td style="background-color:#ffffff;padding:10px 24px 6px 30px;font-size:16px;line-height:150%;color:#384860;">
36
+ <p style="margin:0;">Just a quick reminder that your payment is due in a few days. The details are summarised below for your reference.</p>
37
+ </td>
38
+ </tr>
39
+
40
+ {{> invoiceSummaryTable }}
41
+
42
+ <tr>
43
+ <td style="background-color:#ffffff;padding:14px 24px 6px 30px;font-size:16px;line-height:150%;color:#384860;">
44
+ <p style="margin:0;">If your payment is already on its way, please disregard this note. Otherwise, please complete the payment before the due date. For any queries, please reach out to our customer support team.</p>
45
+ </td>
46
+ </tr>
47
+ <tr>
48
+ <td style="background-color:#ffffff;padding:14px 24px 24px 30px;font-size:16px;line-height:150%;color:#384860;">
49
+ <p style="margin:0;">Best regards,<br>{{companyName}}</p>
50
+ </td>
51
+ </tr>
52
+ <tr>
53
+ <td style="background-color:#ffffff;padding:10px 24px 18px 30px;font-size:12px;color:#202B3C;line-height:150%;">
54
+ <p style="margin:0;">© Tango Eye. All rights reserved.</p>
55
+ </td>
56
+ </tr>
57
+ </table>
58
+ </td>
59
+ </tr>
60
+ </table>
61
+ </body>
62
+ </html>
@@ -0,0 +1,62 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1">
6
+ <title>Account Deactivated</title>
7
+ </head>
8
+ <body style="margin:0;padding:0;background-color:#dbe5ea;font-family:'Inter',Arial,sans-serif;">
9
+ <table border="0" cellpadding="0" cellspacing="0" width="100%" style="padding:0 10px;">
10
+ <tr>
11
+ <td style="padding:32px 10px 0 10px;">
12
+ <table border="0" cellpadding="0" cellspacing="0" width="100%" style="max-width:680px;margin:0 auto;" align="center">
13
+ <tr>
14
+ <td style="background-color:#ffffff;padding:24px 24px 0 18px;">
15
+ <img src="{{logo}}" width="200" height="100" alt="Tango Eye" style="vertical-align:middle;border:0;height:auto;">
16
+ </td>
17
+ </tr>
18
+ <tr>
19
+ <td style="background-color:#ffffff;padding:0 24px;">
20
+ <p style="border-top:1px solid #CBD5E1;margin:0;"></p>
21
+ </td>
22
+ </tr>
23
+ <tr>
24
+ <td style="background-color:#ffffff;padding:18px 24px 6px 30px;">
25
+ <span style="font-weight:700;color:#121A26;font-size:22px;line-height:32px;">Final notice: account deactivated — payment 60+ days overdue</span>
26
+ <div style="margin-top:6px;"><span style="display:inline-block;background:#fde3e3;color:#b42318;font-size:11px;font-weight:700;padding:3px 10px;border-radius:999px;">After due</span></div>
27
+ </td>
28
+ </tr>
29
+ <tr>
30
+ <td style="background-color:#ffffff;padding:14px 24px 4px 30px;font-size:16px;line-height:150%;color:#384860;">
31
+ <p style="margin:0;">Hi {{clientName}},</p>
32
+ </td>
33
+ </tr>
34
+ <tr>
35
+ <td style="background-color:#ffffff;padding:10px 24px 6px 30px;font-size:16px;line-height:150%;color:#384860;">
36
+ <p style="margin:0;">Despite our previous reminders, your account has an outstanding amount that has remained unpaid for more than 60 days past its due date. Your account has now been deactivated and access has been disabled. The invoice(s) listed below make up the outstanding amount. Deactivation is based on the oldest unpaid invoice.</p>
37
+ </td>
38
+ </tr>
39
+
40
+ {{> invoiceSummaryTable }}
41
+
42
+ <tr>
43
+ <td style="background-color:#ffffff;padding:14px 24px 6px 30px;font-size:16px;line-height:150%;color:#384860;">
44
+ <p style="margin:0;">To discuss reinstatement and clear the outstanding amount, please contact us. We'd like to help you resolve this and restore your account.</p>
45
+ </td>
46
+ </tr>
47
+ <tr>
48
+ <td style="background-color:#ffffff;padding:14px 24px 24px 30px;font-size:16px;line-height:150%;color:#384860;">
49
+ <p style="margin:0;">Best regards,<br>{{companyName}}</p>
50
+ </td>
51
+ </tr>
52
+ <tr>
53
+ <td style="background-color:#ffffff;padding:10px 24px 18px 30px;font-size:12px;color:#202B3C;line-height:150%;">
54
+ <p style="margin:0;">© Tango Eye. All rights reserved.</p>
55
+ </td>
56
+ </tr>
57
+ </table>
58
+ </td>
59
+ </tr>
60
+ </table>
61
+ </body>
62
+ </html>
@@ -0,0 +1,62 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1">
6
+ <title>Payment Reminder</title>
7
+ </head>
8
+ <body style="margin:0;padding:0;background-color:#dbe5ea;font-family:'Inter',Arial,sans-serif;">
9
+ <table border="0" cellpadding="0" cellspacing="0" width="100%" style="padding:0 10px;">
10
+ <tr>
11
+ <td style="padding:32px 10px 0 10px;">
12
+ <table border="0" cellpadding="0" cellspacing="0" width="100%" style="max-width:680px;margin:0 auto;" align="center">
13
+ <tr>
14
+ <td style="background-color:#ffffff;padding:24px 24px 0 18px;">
15
+ <img src="{{logo}}" width="200" height="100" alt="Tango Eye" style="vertical-align:middle;border:0;height:auto;">
16
+ </td>
17
+ </tr>
18
+ <tr>
19
+ <td style="background-color:#ffffff;padding:0 24px;">
20
+ <p style="border-top:1px solid #CBD5E1;margin:0;"></p>
21
+ </td>
22
+ </tr>
23
+ <tr>
24
+ <td style="background-color:#ffffff;padding:18px 24px 6px 30px;">
25
+ <span style="font-weight:700;color:#121A26;font-size:22px;line-height:32px;">Payment due today — {{totalDue}} outstanding</span>
26
+ <div style="margin-top:6px;"><span style="display:inline-block;background:#fdf0d8;color:#92600c;font-size:11px;font-weight:700;padding:3px 10px;border-radius:999px;">Around due</span></div>
27
+ </td>
28
+ </tr>
29
+ <tr>
30
+ <td style="background-color:#ffffff;padding:14px 24px 4px 30px;font-size:16px;line-height:150%;color:#384860;">
31
+ <p style="margin:0;">Hi {{clientName}},</p>
32
+ </td>
33
+ </tr>
34
+ <tr>
35
+ <td style="background-color:#ffffff;padding:10px 24px 6px 30px;font-size:16px;line-height:150%;color:#384860;">
36
+ <p style="margin:0;">This is a reminder that the amount shown below is due today, {{dueDate}}. To keep your account active, please complete the payment today.</p>
37
+ </td>
38
+ </tr>
39
+
40
+ {{> invoiceSummaryTable }}
41
+
42
+ <tr>
43
+ <td style="background-color:#ffffff;padding:14px 24px 6px 30px;font-size:16px;line-height:150%;color:#384860;">
44
+ <p style="margin:0;">If you've already made the payment, thank you — please ignore this message. For any queries, please reach out to our customer support team.</p>
45
+ </td>
46
+ </tr>
47
+ <tr>
48
+ <td style="background-color:#ffffff;padding:14px 24px 24px 30px;font-size:16px;line-height:150%;color:#384860;">
49
+ <p style="margin:0;">Best regards,<br>{{companyName}}</p>
50
+ </td>
51
+ </tr>
52
+ <tr>
53
+ <td style="background-color:#ffffff;padding:10px 24px 18px 30px;font-size:12px;color:#202B3C;line-height:150%;">
54
+ <p style="margin:0;">© Tango Eye. All rights reserved.</p>
55
+ </td>
56
+ </tr>
57
+ </table>
58
+ </td>
59
+ </tr>
60
+ </table>
61
+ </body>
62
+ </html>
@@ -0,0 +1,62 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1">
6
+ <title>Account On Hold</title>
7
+ </head>
8
+ <body style="margin:0;padding:0;background-color:#dbe5ea;font-family:'Inter',Arial,sans-serif;">
9
+ <table border="0" cellpadding="0" cellspacing="0" width="100%" style="padding:0 10px;">
10
+ <tr>
11
+ <td style="padding:32px 10px 0 10px;">
12
+ <table border="0" cellpadding="0" cellspacing="0" width="100%" style="max-width:680px;margin:0 auto;" align="center">
13
+ <tr>
14
+ <td style="background-color:#ffffff;padding:24px 24px 0 18px;">
15
+ <img src="{{logo}}" width="200" height="100" alt="Tango Eye" style="vertical-align:middle;border:0;height:auto;">
16
+ </td>
17
+ </tr>
18
+ <tr>
19
+ <td style="background-color:#ffffff;padding:0 24px;">
20
+ <p style="border-top:1px solid #CBD5E1;margin:0;"></p>
21
+ </td>
22
+ </tr>
23
+ <tr>
24
+ <td style="background-color:#ffffff;padding:18px 24px 6px 30px;">
25
+ <span style="font-weight:700;color:#121A26;font-size:22px;line-height:32px;">Action needed: payment overdue — your account is on hold</span>
26
+ <div style="margin-top:6px;"><span style="display:inline-block;background:#fde3e3;color:#b42318;font-size:11px;font-weight:700;padding:3px 10px;border-radius:999px;">After due</span></div>
27
+ </td>
28
+ </tr>
29
+ <tr>
30
+ <td style="background-color:#ffffff;padding:14px 24px 4px 30px;font-size:16px;line-height:150%;color:#384860;">
31
+ <p style="margin:0;">Hi {{clientName}},</p>
32
+ </td>
33
+ </tr>
34
+ <tr>
35
+ <td style="background-color:#ffffff;padding:10px 24px 6px 30px;font-size:16px;line-height:150%;color:#384860;">
36
+ <p style="margin:0;">We haven't yet received payment for the amount shown below, which is now past its due date. As a result, your account has been placed on hold. You can still log in and access your historical data, but your account is paused while payment is outstanding.</p>
37
+ </td>
38
+ </tr>
39
+
40
+ {{> invoiceSummaryTable }}
41
+
42
+ <tr>
43
+ <td style="background-color:#ffffff;padding:14px 24px 6px 30px;font-size:16px;line-height:150%;color:#384860;">
44
+ <p style="margin:0;">To take your account off hold, please complete the outstanding payment. For any queries, please reach out to our customer support team.</p>
45
+ </td>
46
+ </tr>
47
+ <tr>
48
+ <td style="background-color:#ffffff;padding:14px 24px 24px 30px;font-size:16px;line-height:150%;color:#384860;">
49
+ <p style="margin:0;">Best regards,<br>{{companyName}}</p>
50
+ </td>
51
+ </tr>
52
+ <tr>
53
+ <td style="background-color:#ffffff;padding:10px 24px 18px 30px;font-size:12px;color:#202B3C;line-height:150%;">
54
+ <p style="margin:0;">© Tango Eye. All rights reserved.</p>
55
+ </td>
56
+ </tr>
57
+ </table>
58
+ </td>
59
+ </tr>
60
+ </table>
61
+ </body>
62
+ </html>
@@ -0,0 +1,62 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1">
6
+ <title>Account Suspended</title>
7
+ </head>
8
+ <body style="margin:0;padding:0;background-color:#dbe5ea;font-family:'Inter',Arial,sans-serif;">
9
+ <table border="0" cellpadding="0" cellspacing="0" width="100%" style="padding:0 10px;">
10
+ <tr>
11
+ <td style="padding:32px 10px 0 10px;">
12
+ <table border="0" cellpadding="0" cellspacing="0" width="100%" style="max-width:680px;margin:0 auto;" align="center">
13
+ <tr>
14
+ <td style="background-color:#ffffff;padding:24px 24px 0 18px;">
15
+ <img src="{{logo}}" width="200" height="100" alt="Tango Eye" style="vertical-align:middle;border:0;height:auto;">
16
+ </td>
17
+ </tr>
18
+ <tr>
19
+ <td style="background-color:#ffffff;padding:0 24px;">
20
+ <p style="border-top:1px solid #CBD5E1;margin:0;"></p>
21
+ </td>
22
+ </tr>
23
+ <tr>
24
+ <td style="background-color:#ffffff;padding:18px 24px 6px 30px;">
25
+ <span style="font-weight:700;color:#121A26;font-size:22px;line-height:32px;">Important: account suspended — payment 30+ days overdue</span>
26
+ <div style="margin-top:6px;"><span style="display:inline-block;background:#fde3e3;color:#b42318;font-size:11px;font-weight:700;padding:3px 10px;border-radius:999px;">After due</span></div>
27
+ </td>
28
+ </tr>
29
+ <tr>
30
+ <td style="background-color:#ffffff;padding:14px 24px 4px 30px;font-size:16px;line-height:150%;color:#384860;">
31
+ <p style="margin:0;">Hi {{clientName}},</p>
32
+ </td>
33
+ </tr>
34
+ <tr>
35
+ <td style="background-color:#ffffff;padding:10px 24px 6px 30px;font-size:16px;line-height:150%;color:#384860;">
36
+ <p style="margin:0;">Your account has an outstanding amount that has remained unpaid for more than 30 days past its due date. As a result, your account has now been suspended and you will not be able to log in until the amount is cleared. The invoice(s) listed below make up the outstanding amount. Suspension is based on the oldest unpaid invoice, so some items may be more recent.</p>
37
+ </td>
38
+ </tr>
39
+
40
+ {{> invoiceSummaryTable }}
41
+
42
+ <tr>
43
+ <td style="background-color:#ffffff;padding:14px 24px 6px 30px;font-size:16px;line-height:150%;color:#384860;">
44
+ <p style="margin:0;">To reactivate your account, please complete the outstanding payment as soon as possible. For any queries, please reach out to our customer support team.</p>
45
+ </td>
46
+ </tr>
47
+ <tr>
48
+ <td style="background-color:#ffffff;padding:14px 24px 24px 30px;font-size:16px;line-height:150%;color:#384860;">
49
+ <p style="margin:0;">Best regards,<br>{{companyName}}</p>
50
+ </td>
51
+ </tr>
52
+ <tr>
53
+ <td style="background-color:#ffffff;padding:10px 24px 18px 30px;font-size:12px;color:#202B3C;line-height:150%;">
54
+ <p style="margin:0;">© Tango Eye. All rights reserved.</p>
55
+ </td>
56
+ </tr>
57
+ </table>
58
+ </td>
59
+ </tr>
60
+ </table>
61
+ </body>
62
+ </html>
@@ -2,6 +2,7 @@ import express from 'express';
2
2
  export const billingRouter = express.Router();
3
3
  import { accessVerification, isAllowedSessionHandler, validate } from 'tango-app-api-middleware';
4
4
  import { getPaymentReminder, savePaymentReminder } from '../controllers/paymentReminder.controller.js';
5
+ import { triggerPaymentReminders } from '../controllers/paymentReminderTrigger.controller.js';
5
6
  import { createBillingGroup, deleteBillingGroup, getAllBillingGroups, getBillingGroups, getClientProducts, getInvoices, getLeadProducts, onetimePayment, subscribedStoreList, updateBillingGroup, gstinLookup } from '../controllers/billing.controllers.js';
6
7
  import { billingGroupSchema, clientProductsValid, createBillingGroupsSchema, deleteBillingGroupsSchema, getBillingGroupsSchema, getInvoiceSchema, leadProductsValid, onetimeFeeValid, subscribedStoreListSchema, updateBillingGroupsSchema } from '../dtos/validation.dtos.js';
7
8
 
@@ -33,3 +34,7 @@ billingRouter.get( '/gst-lookup/:gstin', isAllowedSessionHandler, accessVerifica
33
34
  // Payment reminder config (Billing Settings page), one document per brand.
34
35
  billingRouter.get( '/payment-reminder/:clientId', isAllowedSessionHandler, accessVerification( { userType: [ 'tango' ], access: [ { featureName: 'Global', name: 'Billing', permissions: [ 'isAdd' ] } ] } ), getPaymentReminder );
35
36
  billingRouter.post( '/payment-reminder', isAllowedSessionHandler, accessVerification( { userType: [ 'tango' ], access: [ { featureName: 'Global', name: 'Billing', permissions: [ 'isAdd' ] } ] } ), savePaymentReminder );
37
+
38
+ // Cron-triggered: sends the configured payment reminder emails. Unauthenticated
39
+ // like the other cron endpoints; protect at the network / scheduler layer.
40
+ billingRouter.post( '/payment-reminder/trigger', triggerPaymentReminders );
@@ -3,7 +3,7 @@ import { createInvoice, invoiceDownload, invoiceDownloadBulk, clientInvoiceList,
3
3
  import { isAllowedSessionHandler, accessVerification, validate } from 'tango-app-api-middleware';
4
4
  import { getInvoiceHeads, updateInvoiceHeads } from '../controllers/applicationDefault.controllers.js';
5
5
  import { uploadBankStatement, bankTransactionList, resolveOptions, resolveBankTransaction } from '../controllers/bankTransaction.controller.js';
6
- import { estimateList, createEstimate, getEstimate, estimateStatusUpdate, deleteEstimate, downloadEstimate } from '../controllers/estimate.controller.js';
6
+ import { estimateList, createEstimate, updateEstimate, getEstimate, estimateStatusUpdate, deleteEstimate, downloadEstimate } from '../controllers/estimate.controller.js';
7
7
  import { updateInvoiceHeadsSchema } from '../dtos/validation.dtos.js';
8
8
  export const invoiceRouter = express.Router();
9
9
 
@@ -57,6 +57,7 @@ invoiceRouter.post( '/bankStatement/resolve', isAllowedSessionHandler, superadmi
57
57
  // lifecycle. List/get are read; create/status/delete need edit rights.
58
58
  invoiceRouter.post( '/estimate/list', isAllowedSessionHandler, superadminBypass( { userType: [ 'tango' ], access: [ { featureName: 'TangoAdmin', name: 'invoiceApproval', permissions: [] } ] } ), estimateList );
59
59
  invoiceRouter.post( '/estimate/create', isAllowedSessionHandler, superadminBypass( { userType: [ 'tango' ], access: [ { featureName: 'TangoAdmin', name: 'invoiceApproval', permissions: [ 'isEdit' ] } ] } ), createEstimate );
60
+ invoiceRouter.post( '/estimate/update', isAllowedSessionHandler, superadminBypass( { userType: [ 'tango' ], access: [ { featureName: 'TangoAdmin', name: 'invoiceApproval', permissions: [ 'isEdit' ] } ] } ), updateEstimate );
60
61
  invoiceRouter.post( '/estimate/download/:estimateId', isAllowedSessionHandler, superadminBypass( { userType: [ 'tango' ], access: [ { featureName: 'TangoAdmin', name: 'invoiceApproval', permissions: [] } ] } ), downloadEstimate );
61
62
  invoiceRouter.get( '/estimate/:estimateId', isAllowedSessionHandler, superadminBypass( { userType: [ 'tango' ], access: [ { featureName: 'TangoAdmin', name: 'invoiceApproval', permissions: [] } ] } ), getEstimate );
62
63
  invoiceRouter.post( '/estimate/statusUpdate', isAllowedSessionHandler, superadminBypass( { userType: [ 'tango' ], access: [ { featureName: 'TangoAdmin', name: 'invoiceApproval', permissions: [ 'isEdit' ] } ] } ), estimateStatusUpdate );
@@ -7,3 +7,7 @@ export const findOne = async ( query = {}, projection = {} ) => {
7
7
  export const upsert = async ( filter, update ) => {
8
8
  return await model.paymentReminderModel.updateOne( filter, { $set: update }, { upsert: true } );
9
9
  };
10
+
11
+ export const find = async ( query = {}, projection = {} ) => {
12
+ return await model.paymentReminderModel.find( query, projection );
13
+ };
@@ -9,6 +9,7 @@ export const CURRENCY_SYMBOLS = {
9
9
  dollar: '$',
10
10
  singaporedollar: 'S$',
11
11
  euro: '€',
12
+ aed: 'AED',
12
13
  };
13
14
 
14
15
  export const symbolFor = ( currency ) => CURRENCY_SYMBOLS[currency] ?? '$';