tango-app-api-payment-subscription 3.0.38-dev → 3.0.40-dev
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.
- package/package.json +3 -3
- package/src/controllers/paymentSubscription.controllers.js +90 -40
- package/src/dtos/validation.dtos.js +24 -8
- package/src/hbs/revisedPriceEmail.hbs +15 -3
- package/src/hbs/trialCreditNoteEmail.hbs +14 -2
- package/src/hbs/trialSubscriptionEmail.hbs +1 -1
- package/src/routes/paymentSubscription.routes.js +1 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "tango-app-api-payment-subscription",
|
|
3
|
-
"version": "3.0.
|
|
3
|
+
"version": "3.0.40-dev",
|
|
4
4
|
"description": "paymentSubscription",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"type": "module",
|
|
@@ -25,8 +25,8 @@
|
|
|
25
25
|
"nodemon": "^3.1.0",
|
|
26
26
|
"pdfmake": "^0.2.10",
|
|
27
27
|
"swagger-ui-express": "^5.0.0",
|
|
28
|
-
"tango-api-schema": "^2.0.
|
|
29
|
-
"tango-app-api-middleware": "^1.0.
|
|
28
|
+
"tango-api-schema": "^2.0.89",
|
|
29
|
+
"tango-app-api-middleware": "^1.0.58-dev",
|
|
30
30
|
"winston": "^3.12.0",
|
|
31
31
|
"winston-daily-rotate-file": "^5.0.0"
|
|
32
32
|
},
|
|
@@ -16,6 +16,7 @@ import path from 'path';
|
|
|
16
16
|
import { JSDOM } from 'jsdom';
|
|
17
17
|
import pdfMake from 'pdfmake';
|
|
18
18
|
import htmlToPdfmake from 'html-to-pdfmake';
|
|
19
|
+
import axios from 'axios';
|
|
19
20
|
|
|
20
21
|
export const addBilling = async ( req, res ) => {
|
|
21
22
|
try {
|
|
@@ -323,7 +324,7 @@ async function calculatePricing( req, res ) {
|
|
|
323
324
|
}
|
|
324
325
|
finalPrice = Math.ceil( finalPrice / 10 ) * 10; // for round off to 10 position
|
|
325
326
|
if ( input.currencyType && input.currencyType == 'dollar' ) {
|
|
326
|
-
dollerprice = ( ( finalPrice * 50 ) / 100 );
|
|
327
|
+
let dollerprice = ( ( finalPrice * 50 ) / 100 );
|
|
327
328
|
finalPrice = ( dollerprice + finalPrice ) / 84;
|
|
328
329
|
dollerpriceOriginal = ( ( OriginalPrice * 50 ) / 100 );
|
|
329
330
|
OriginalPrice = ( dollerpriceOriginal + OriginalPrice ) / 84;
|
|
@@ -695,7 +696,7 @@ export const invoiceDetails = async ( req, res ) => {
|
|
|
695
696
|
|
|
696
697
|
export const updateInvoiceDetails = async ( req, res ) => {
|
|
697
698
|
try {
|
|
698
|
-
let clientInvoiceDetails = await paymentService.findOne( { clientId: req.params.clientId
|
|
699
|
+
let clientInvoiceDetails = await paymentService.findOne( { clientId: req.params.clientId }, { paymentInvoice: 1 } );
|
|
699
700
|
if ( !clientInvoiceDetails ) {
|
|
700
701
|
return res.sendError( 'no data found', 204 );
|
|
701
702
|
}
|
|
@@ -1053,6 +1054,15 @@ export const productSubscribe = async ( req, res ) => {
|
|
|
1053
1054
|
}
|
|
1054
1055
|
clientInfo.planDetails.product = product;
|
|
1055
1056
|
clientInfo.save().then( async () => {
|
|
1057
|
+
let storeProduct = await storeService.find( { clientId: clientInfo.clientId }, { _id: 0, storeId: 1, product: 1 } );
|
|
1058
|
+
storeProduct = storeProduct.map( ( item ) => {
|
|
1059
|
+
return { id: item.storeId, product: item.product };
|
|
1060
|
+
} );
|
|
1061
|
+
await axios.post( `${appConfig.url.oldapidomain}/oldBulkStoreUpdate`, storeProduct, { headers: { Authorization: 'Bearer d47433f8-9a33-47c7-ba43-1a0fbac28f66' } } ).then( ( response ) => {
|
|
1062
|
+
logger.info( 'store Updated Successfully' );
|
|
1063
|
+
} ).catch( ( error ) => {
|
|
1064
|
+
logger.error( { error: error, function: 'oldBulkStoreUpdate' } );
|
|
1065
|
+
} );
|
|
1056
1066
|
updatePricing( req, res, true );
|
|
1057
1067
|
} );
|
|
1058
1068
|
const logObj = {
|
|
@@ -1570,6 +1580,11 @@ export const invoiceList = async ( req, res ) => {
|
|
|
1570
1580
|
delete item.products;
|
|
1571
1581
|
} );
|
|
1572
1582
|
}
|
|
1583
|
+
invoiceDetails[0].data.forEach( ( item ) => {
|
|
1584
|
+
if ( req.body?.client?.paymentInvoice?.currencyType == 'dollar' ) {
|
|
1585
|
+
item.amount = convertINRtoUSD( item.amount );
|
|
1586
|
+
}
|
|
1587
|
+
} );
|
|
1573
1588
|
let data = {
|
|
1574
1589
|
data: invoiceDetails[0].data,
|
|
1575
1590
|
count: invoiceDetails[0].count[0].count,
|
|
@@ -1585,12 +1600,13 @@ export const invoiceList = async ( req, res ) => {
|
|
|
1585
1600
|
if ( item.status == 'free' ) {
|
|
1586
1601
|
item.amount = 'Free';
|
|
1587
1602
|
}
|
|
1603
|
+
item.products = item.products.map( ( item ) => item.product.product );
|
|
1588
1604
|
exportData.push( {
|
|
1589
1605
|
'Invoice': item.invoice,
|
|
1590
1606
|
'Billing Date': item.billingDate,
|
|
1591
1607
|
'Stores': item.stores,
|
|
1592
1608
|
...( req.user.userType == 'tango' ? { 'Products': item.products } : {} ),
|
|
1593
|
-
'Amount': item.amount,
|
|
1609
|
+
'Amount': req.body?.client?.paymentInvoice?.currencyType == 'dollar' ? item.amount : item.amount,
|
|
1594
1610
|
...( req.user.userType == 'client' ? { 'Payment Method': item.paymentMethod } : {} ),
|
|
1595
1611
|
'Status': item.status,
|
|
1596
1612
|
} );
|
|
@@ -1685,8 +1701,8 @@ export const priceList = async ( req, res ) => {
|
|
|
1685
1701
|
} );
|
|
1686
1702
|
} );
|
|
1687
1703
|
data = temp;
|
|
1688
|
-
let discountPrice =
|
|
1689
|
-
let discountPercentage = discountPrice > 0 ? ( discountPrice /
|
|
1704
|
+
let discountPrice = originalTotalPrice - discountTotalPrice;
|
|
1705
|
+
let discountPercentage = discountPrice > 0 ? ( discountPrice / originalTotalPrice ) * 100 : 0;
|
|
1690
1706
|
let gstAmount = discountTotalPrice * ( 18 / 100 );
|
|
1691
1707
|
let finalValue = parseFloat( discountTotalPrice ) + gstAmount;
|
|
1692
1708
|
let result = {
|
|
@@ -1728,6 +1744,11 @@ export const pricingListUpdate = async ( req, res ) => {
|
|
|
1728
1744
|
if ( req.body?.products && req.body?.products?.length ) {
|
|
1729
1745
|
productList = JSON.parse( JSON.stringify( req.body ) );
|
|
1730
1746
|
let amount =0;
|
|
1747
|
+
let origPrice=0;
|
|
1748
|
+
let IGST = 18;
|
|
1749
|
+
let CGST = 9;
|
|
1750
|
+
let SGST = 9;
|
|
1751
|
+
let gst = req.body.client.paymentInvoice.currencyType == 'dollar' ? IGST : ( CGST + SGST );
|
|
1731
1752
|
productList.products.forEach( ( item ) => {
|
|
1732
1753
|
let [ firstWord, secondWord ] = item.productName.replace( /([a-z])([A-Z])/g, '$1 $2' ).split( ' ' );
|
|
1733
1754
|
firstWord = firstWord.charAt( 0 ).toUpperCase() + firstWord.slice( 1 );
|
|
@@ -1736,17 +1757,28 @@ export const pricingListUpdate = async ( req, res ) => {
|
|
|
1736
1757
|
item.basePrice = convertINRtoUSD( item.basePrice );
|
|
1737
1758
|
item.price = convertINRtoUSD( item.price );
|
|
1738
1759
|
}
|
|
1739
|
-
|
|
1760
|
+
let count = item.storeCount;
|
|
1761
|
+
if ( req.body.type == 'step' ) {
|
|
1740
1762
|
item.storeCount = item.storeRange;
|
|
1763
|
+
let rangeSplit = item.storeRange.split( '-' );
|
|
1764
|
+
count = parseInt( rangeSplit[1] ) - parseInt( rangeSplit[0] );
|
|
1741
1765
|
}
|
|
1742
1766
|
amount = amount + item.price;
|
|
1767
|
+
origPrice = origPrice + ( item.basePrice * count );
|
|
1768
|
+
item.price = item.price.toFixed( 2 );
|
|
1743
1769
|
} );
|
|
1770
|
+
let discountAmount = origPrice - amount;
|
|
1771
|
+
let discountPercentage = ( discountAmount / origPrice ) * 100;
|
|
1744
1772
|
productList = {
|
|
1745
1773
|
...productList,
|
|
1746
|
-
amount: amount,
|
|
1774
|
+
amount: amount.toFixed( 2 ),
|
|
1747
1775
|
currencyType: req.body.client.paymentInvoice.currencyType == 'dollar' ? '$' : '₹',
|
|
1748
1776
|
total: amount.toFixed( 2 ),
|
|
1749
|
-
|
|
1777
|
+
final: ( parseFloat( amount ) + parseFloat( ( amount * gst ) / 100 ) ).toFixed( 2 ),
|
|
1778
|
+
discount: `${discountPercentage.toFixed( 2 )}% (-${discountAmount.toFixed( 2 )})`,
|
|
1779
|
+
IGST: req.body.client.paymentInvoice.currencyType == 'dollar' ? IGST : 0,
|
|
1780
|
+
CGST: req.body.client.paymentInvoice.currencyType == 'inr' ? CGST : 0,
|
|
1781
|
+
SGST: req.body.client.paymentInvoice.currencyType == 'inr' ? SGST : 0,
|
|
1750
1782
|
};
|
|
1751
1783
|
req.body.products.forEach( ( item ) => {
|
|
1752
1784
|
delete item.originalPrice;
|
|
@@ -1767,24 +1799,26 @@ export const pricingListUpdate = async ( req, res ) => {
|
|
|
1767
1799
|
getPriceInfo.step = req.body.products;
|
|
1768
1800
|
}
|
|
1769
1801
|
getPriceInfo.save().then( async () => {
|
|
1770
|
-
let clientDetails = await paymentService.findOne( { clientId: req.body.clientId }, { priceType: 1 } );
|
|
1802
|
+
let clientDetails = await paymentService.findOne( { clientId: req.body.clientId }, { priceType: 1, paymentInvoice: 1 } );
|
|
1771
1803
|
clientDetails.priceType = req.body.type;
|
|
1772
1804
|
|
|
1773
1805
|
clientDetails.save();
|
|
1774
1806
|
|
|
1775
|
-
let userDetails= await userService.findOne( { clientId: req.body.clientId, role: 'superadmin' } );
|
|
1776
|
-
if (
|
|
1777
|
-
|
|
1778
|
-
|
|
1779
|
-
|
|
1780
|
-
|
|
1781
|
-
|
|
1782
|
-
|
|
1783
|
-
|
|
1784
|
-
|
|
1785
|
-
|
|
1786
|
-
|
|
1787
|
-
|
|
1807
|
+
// let userDetails= await userService.findOne( { clientId: req.body.clientId, role: 'superadmin' } );
|
|
1808
|
+
if ( clientDetails?.paymentInvoice?.paymentAgreementTo?.length ) {
|
|
1809
|
+
clientDetails.paymentInvoice.paymentAgreementTo.forEach( ( email ) => {
|
|
1810
|
+
const templateHtml = fs.readFileSync( path.resolve( path.dirname( '' ) ) + '/src/hbs/revisedPriceEmail.hbs', 'utf8' );
|
|
1811
|
+
const template = Handlebars.compile( templateHtml );
|
|
1812
|
+
const html = template( { data: productList } );
|
|
1813
|
+
let params = {
|
|
1814
|
+
toEmail: email,
|
|
1815
|
+
mailSubject: 'Invoice Revised',
|
|
1816
|
+
htmlBody: html,
|
|
1817
|
+
attachment: '',
|
|
1818
|
+
sourceEmail: appConfig.cloud.aws.ses.adminEmail,
|
|
1819
|
+
};
|
|
1820
|
+
sendEmailWithSES( params.toEmail, params.mailSubject, params.htmlBody, params.attachment, params.sourceEmail );
|
|
1821
|
+
} );
|
|
1788
1822
|
}
|
|
1789
1823
|
let keys = [];
|
|
1790
1824
|
if ( req.body.type == 'standard' ) {
|
|
@@ -1819,7 +1853,7 @@ async function updatePricing( req, res, update ) {
|
|
|
1819
1853
|
let clientDetails = await paymentService.findOne( { clientId: req.body.clientId } );
|
|
1820
1854
|
if ( clientDetails ) {
|
|
1821
1855
|
let products = clientDetails.planDetails.product.map( ( item ) => item.productName );
|
|
1822
|
-
let
|
|
1856
|
+
let subscriptionProduct = clientDetails.planDetails.product.filter( ( item ) => item.status == 'live' );
|
|
1823
1857
|
let standardList = [];
|
|
1824
1858
|
let stepList = [];
|
|
1825
1859
|
products.forEach( ( product ) => {
|
|
@@ -1856,7 +1890,11 @@ async function updatePricing( req, res, update ) {
|
|
|
1856
1890
|
}
|
|
1857
1891
|
let product = [];
|
|
1858
1892
|
let clientId = req.body.clientId;
|
|
1893
|
+
let paymentInvoice = clientDetails.paymentInvoice;
|
|
1859
1894
|
if ( !update ) {
|
|
1895
|
+
let userDetails= await userService.findOne( { clientId: invoiceDetails.clientId, role: 'superadmin' } );
|
|
1896
|
+
paymentInvoice.invoiceTo = [ userDetails.email ];
|
|
1897
|
+
paymentInvoice.paymentAgreementTo = [ userDetails.email ];
|
|
1860
1898
|
clientDetails.planDetails.product.forEach( ( item ) => {
|
|
1861
1899
|
product.push( {
|
|
1862
1900
|
productName: item.productName,
|
|
@@ -1877,7 +1915,7 @@ async function updatePricing( req, res, update ) {
|
|
|
1877
1915
|
};
|
|
1878
1916
|
let pricingDetails = await calculatePricing( req, res );
|
|
1879
1917
|
let paymentStatus = clientDetails?.subscriptionType == 'free' ? 'free' : 'trial';
|
|
1880
|
-
if (
|
|
1918
|
+
if ( subscriptionProduct.length ) {
|
|
1881
1919
|
let invoiceCount = await invoiceService.count( { clientId: req.params.clientId, status: 'pending' } );
|
|
1882
1920
|
if ( invoiceCount ) {
|
|
1883
1921
|
paymentStatus ='due';
|
|
@@ -1890,6 +1928,7 @@ async function updatePricing( req, res, update ) {
|
|
|
1890
1928
|
'planDetails.paymentStatus': clientDetails?.subscriptionType == 'free' ? 'free' : paymentStatus,
|
|
1891
1929
|
'planDetails.product': product,
|
|
1892
1930
|
'price': pricingDetails.price,
|
|
1931
|
+
'paymentInvoice': paymentInvoice,
|
|
1893
1932
|
};
|
|
1894
1933
|
await paymentService.updateOne( { clientId: clientId }, details );
|
|
1895
1934
|
}
|
|
@@ -1905,11 +1944,15 @@ export const updatedRevisedPrice = async ( req, res ) => {
|
|
|
1905
1944
|
invoiceDetails.revisedAmount = req.body.revisedAmount;
|
|
1906
1945
|
invoiceDetails.discount = req.body.discount;
|
|
1907
1946
|
invoiceDetails.save().then( async () => {
|
|
1908
|
-
let
|
|
1909
|
-
|
|
1947
|
+
let clientDetails = await paymentService.findOne( { clientId: invoiceDetails.clientId } );
|
|
1948
|
+
// let userDetails= await userService.findOne( { clientId: invoiceDetails.clientId, role: 'superadmin' } );
|
|
1949
|
+
if ( clientDetails.paymentInvoice.invoiceTo.length ) {
|
|
1910
1950
|
let invoiceInfo;
|
|
1911
|
-
let clientDetails = await paymentService.findOne( { clientId: invoiceDetails.clientId } );
|
|
1912
1951
|
let amount = 0;
|
|
1952
|
+
let IGST = 18;
|
|
1953
|
+
let CGST = 9;
|
|
1954
|
+
let SGST = 9;
|
|
1955
|
+
let gst = clientDetails?.paymentInvoice?.currencyType == 'dollar' ? IGST : ( CGST + SGST );
|
|
1913
1956
|
invoiceDetails.products.forEach( ( item ) => {
|
|
1914
1957
|
let [ firstWord, secondWord ] = item.product.product.replace( /([a-z])([A-Z])/g, '$1 $2' ).split( ' ' );
|
|
1915
1958
|
firstWord = firstWord.charAt( 0 ).toUpperCase() + firstWord.slice( 1 );
|
|
@@ -1926,6 +1969,7 @@ export const updatedRevisedPrice = async ( req, res ) => {
|
|
|
1926
1969
|
let invoiceDate= dayjs( invoiceDetails.createdAt ).format( 'DD MMM, YYYY' );
|
|
1927
1970
|
let days = clientDetails?.paymentInvoice?.extendPaymentPeriodDays || 10;
|
|
1928
1971
|
let dueDate = invoiceDetails?.dueDate ? dayjs( invoiceDetails?.dueDate ).format( 'DD MMM, YYYY' ) : dayjs().add( days, 'days' ).format( 'DD MMM, YYYY' );
|
|
1972
|
+
let discountAmount = ( amount * req.body.discount ) / 100;
|
|
1929
1973
|
invoiceInfo = {
|
|
1930
1974
|
...invoiceDetails._doc,
|
|
1931
1975
|
clientName: clientDetails.clientName,
|
|
@@ -1933,22 +1977,28 @@ export const updatedRevisedPrice = async ( req, res ) => {
|
|
|
1933
1977
|
address: clientDetails.billingDetails.billingAddress,
|
|
1934
1978
|
amount: amount.toFixed( 2 ),
|
|
1935
1979
|
currencyType: clientDetails.paymentInvoice.currencyType == 'dollar' ? '$' : '₹',
|
|
1936
|
-
discount: req.body.discount
|
|
1937
|
-
total:
|
|
1980
|
+
discount: `${req.body.discount.toFixed( 2 )}% (-${discountAmount.toFixed( 2 )})`,
|
|
1981
|
+
total: ( parseFloat( amount ) + parseFloat( ( amount * gst ) / 100 ) ).toFixed( 2 ),
|
|
1982
|
+
final: req.body.revisedAmount.toFixed( 2 ),
|
|
1983
|
+
IGST: clientDetails.paymentInvoice.currencyType == 'dollar' ? IGST : 0,
|
|
1984
|
+
CGST: clientDetails.paymentInvoice.currencyType == 'inr' ? CGST : 0,
|
|
1985
|
+
SGST: clientDetails.paymentInvoice.currencyType == 'inr' ? SGST : 0,
|
|
1938
1986
|
invoiceDate,
|
|
1939
1987
|
dueDate,
|
|
1940
1988
|
};
|
|
1941
|
-
|
|
1942
|
-
|
|
1943
|
-
|
|
1944
|
-
|
|
1945
|
-
|
|
1946
|
-
|
|
1947
|
-
|
|
1948
|
-
|
|
1949
|
-
|
|
1950
|
-
|
|
1951
|
-
|
|
1989
|
+
clientDetails.paymentInvoice.invoiceTo.forEach( ( email ) => {
|
|
1990
|
+
const templateHtml = fs.readFileSync( path.resolve( path.dirname( '' ) ) + '/src/hbs/trialCreditNoteEmail.hbs', 'utf8' );
|
|
1991
|
+
const template = Handlebars.compile( templateHtml );
|
|
1992
|
+
const html = template( { data: invoiceInfo } );
|
|
1993
|
+
let params = {
|
|
1994
|
+
toEmail: email,
|
|
1995
|
+
mailSubject: 'Credit Note',
|
|
1996
|
+
htmlBody: html,
|
|
1997
|
+
attachment: '',
|
|
1998
|
+
sourceEmail: appConfig.cloud.aws.ses.adminEmail,
|
|
1999
|
+
};
|
|
2000
|
+
sendEmailWithSES( params.toEmail, params.mailSubject, params.htmlBody, params.attachment, params.sourceEmail );
|
|
2001
|
+
} );
|
|
1952
2002
|
}
|
|
1953
2003
|
const logObj = {
|
|
1954
2004
|
clientId: req.body.clientId,
|
|
@@ -192,39 +192,55 @@ export const validateUpdateSubscriptionParams = {
|
|
|
192
192
|
body: validateUpdateSubscriptionSchema,
|
|
193
193
|
};
|
|
194
194
|
|
|
195
|
-
export const dailyPricingSchema = {
|
|
195
|
+
export const dailyPricingSchema = joi.object( {
|
|
196
196
|
clientId: joi.array().required(),
|
|
197
197
|
date: joi.string().required(),
|
|
198
|
-
};
|
|
198
|
+
} );
|
|
199
199
|
|
|
200
200
|
export const dailyPricingParams = {
|
|
201
201
|
body: dailyPricingSchema,
|
|
202
202
|
};
|
|
203
203
|
|
|
204
|
-
export const invoiceGenerateSchema = {
|
|
204
|
+
export const invoiceGenerateSchema = joi.object( {
|
|
205
205
|
clientId: joi.array().required(),
|
|
206
206
|
fromDate: joi.string().required(),
|
|
207
207
|
toDate: joi.string().required(),
|
|
208
|
-
};
|
|
208
|
+
} );
|
|
209
209
|
|
|
210
210
|
export const invoiceGenerateParams = {
|
|
211
211
|
body: invoiceGenerateSchema,
|
|
212
212
|
};
|
|
213
213
|
|
|
214
|
-
export const invoiceUpdateSchema = {
|
|
214
|
+
export const invoiceUpdateSchema = joi.object( {
|
|
215
215
|
amount: joi.number().required(),
|
|
216
216
|
paymentType: joi.string().required(),
|
|
217
217
|
paymentReferenceId: joi.string().required(),
|
|
218
|
-
};
|
|
218
|
+
} );
|
|
219
|
+
|
|
219
220
|
export const invoiceUpdateParams = {
|
|
220
221
|
body: invoiceUpdateSchema,
|
|
221
222
|
};
|
|
222
223
|
|
|
223
224
|
|
|
224
|
-
export const invoiceRevisedSchema = {
|
|
225
|
+
export const invoiceRevisedSchema = joi.object( {
|
|
225
226
|
invoiceId: joi.string().required(),
|
|
226
|
-
};
|
|
227
|
+
} );
|
|
228
|
+
|
|
227
229
|
export const invoiceRevisedParams = {
|
|
228
230
|
params: invoiceRevisedSchema,
|
|
229
231
|
};
|
|
230
232
|
|
|
233
|
+
export const validateInvoiceUpdateSchema = joi.object( {
|
|
234
|
+
proRate: joi.string().required(),
|
|
235
|
+
paymenttype: joi.string().required(),
|
|
236
|
+
paymentCycle: joi.string().required(),
|
|
237
|
+
currencyType: joi.string().required(),
|
|
238
|
+
invoiceTo: joi.array().items( joi.string().email().message( 'Enter valid Email' ) ).required(),
|
|
239
|
+
paymentAgreementTo: joi.array().items( joi.string().email().message( 'Enter valid Email' ) ).required(),
|
|
240
|
+
invoiceOn: joi.string().required(),
|
|
241
|
+
extendPaymentPeriodDays: joi.number().required(),
|
|
242
|
+
} );
|
|
243
|
+
|
|
244
|
+
export const validateInvoiceUpdateParams = {
|
|
245
|
+
body: validateInvoiceUpdateSchema,
|
|
246
|
+
};
|
|
@@ -211,7 +211,19 @@
|
|
|
211
211
|
<td class="invoicesub" style="padding-left:30px; line-height: 24px;">IGST</td>
|
|
212
212
|
<td></td>
|
|
213
213
|
<td></td>
|
|
214
|
-
<td class="invoicesub">
|
|
214
|
+
<td class="invoicesub">{{data.IGST}}%</td>
|
|
215
|
+
</tr>
|
|
216
|
+
<tr bgcolor="#ffffff" style="border:none;margin-top:0px;">
|
|
217
|
+
<td class="invoicesub" style="padding-left:30px; line-height: 24px;">CGST</td>
|
|
218
|
+
<td></td>
|
|
219
|
+
<td></td>
|
|
220
|
+
<td class="invoicesub">{{data.CGST}}%</td>
|
|
221
|
+
</tr>
|
|
222
|
+
<tr bgcolor="#ffffff" style="border:none;margin-top:0px;">
|
|
223
|
+
<td class="invoicesub" style="padding-left:30px; line-height: 24px;">SGST</td>
|
|
224
|
+
<td></td>
|
|
225
|
+
<td></td>
|
|
226
|
+
<td class="invoicesub">{{data.SGST}}%</td>
|
|
215
227
|
</tr>
|
|
216
228
|
<tr bgcolor="#ffffff" style="border:none;margin-top:0px;">
|
|
217
229
|
<td class="invoicesub" style="padding-left:30px; line-height: 24px;">Total</td>
|
|
@@ -223,7 +235,7 @@
|
|
|
223
235
|
<td class="invoicesub" style="padding-left:30px; line-height: 24px;">Discount</td>
|
|
224
236
|
<td></td>
|
|
225
237
|
<td></td>
|
|
226
|
-
<td class="invoicesub">{{data.discount}}
|
|
238
|
+
<td class="invoicesub">{{data.discount}}</td>
|
|
227
239
|
</tr>
|
|
228
240
|
<tr>
|
|
229
241
|
<td colspan="4" align="left" bgcolor="#ffffff"
|
|
@@ -236,7 +248,7 @@
|
|
|
236
248
|
<td class="invoicesub" style="padding-left:30px; ">Final Value</td>
|
|
237
249
|
<td></td>
|
|
238
250
|
<td></td>
|
|
239
|
-
<td class="invoicesub">{{data.currencyType}} {{data.
|
|
251
|
+
<td class="invoicesub">{{data.currencyType}} {{data.final}}</td>
|
|
240
252
|
</tr>
|
|
241
253
|
</table>
|
|
242
254
|
</td>
|
|
@@ -514,7 +514,19 @@
|
|
|
514
514
|
<td class="invoicesub">IGST</td>
|
|
515
515
|
<td></td>
|
|
516
516
|
<td></td>
|
|
517
|
-
<td class="invoicesub">
|
|
517
|
+
<td class="invoicesub">{{data.IGST}}%</td>
|
|
518
|
+
</tr>
|
|
519
|
+
<tr style="border:none;margin-top:10px;">
|
|
520
|
+
<td class="invoicesub">CGST</td>
|
|
521
|
+
<td></td>
|
|
522
|
+
<td></td>
|
|
523
|
+
<td class="invoicesub">{{data.CGST}}%</td>
|
|
524
|
+
</tr>
|
|
525
|
+
<tr style="border:none;margin-top:10px;">
|
|
526
|
+
<td class="invoicesub">SGST</td>
|
|
527
|
+
<td></td>
|
|
528
|
+
<td></td>
|
|
529
|
+
<td class="invoicesub">{{data.SGST}}%</td>
|
|
518
530
|
</tr>
|
|
519
531
|
<tr style="border:none;margin-top:10px;">
|
|
520
532
|
<td class="invoicesub">Total</td>
|
|
@@ -539,7 +551,7 @@
|
|
|
539
551
|
<td class="invoicesub">Final Value</td>
|
|
540
552
|
<td></td>
|
|
541
553
|
<td></td>
|
|
542
|
-
<td class="invoicesub">{{data.currencyType}} {{data.
|
|
554
|
+
<td class="invoicesub">{{data.currencyType}} {{data.final}}</td>
|
|
543
555
|
</tr>
|
|
544
556
|
</table>
|
|
545
557
|
</td>
|
|
@@ -147,7 +147,7 @@
|
|
|
147
147
|
<tr>
|
|
148
148
|
<td align="left" bgcolor="#ffffff"
|
|
149
149
|
style="padding-left: 26px;padding-right: 24px;padding-top:25px; font-size: 16px; line-height: 24px;font-weight:400;color:#384860">
|
|
150
|
-
<p style="margin: 0;">Best, <br>Team Tango
|
|
150
|
+
<p style="margin: 0;">Best, <br>Team Tango
|
|
151
151
|
</p>
|
|
152
152
|
</td>
|
|
153
153
|
</tr>
|
|
@@ -60,7 +60,7 @@ paymentSubscriptionRouter.put( '/update/InvoiceDetails/:clientId', isAllowedSess
|
|
|
60
60
|
userType: [ 'tango' ], access: [
|
|
61
61
|
{ featureName: 'settings', name: 'paymentSubscriptions', permissions: [ 'isEdit' ] },
|
|
62
62
|
],
|
|
63
|
-
} ), validate( validationDtos.
|
|
63
|
+
} ), validate( validationDtos.validateInvoiceUpdateParams ), paymentController.updateInvoiceDetails );
|
|
64
64
|
|
|
65
65
|
paymentSubscriptionRouter.get( '/admin/notificationList', isAllowedSessionHandler, authorize( {
|
|
66
66
|
userType: [ 'tango' ], access: [
|