diff --git a/ios/PerformicsStoreDNA.xcodeproj/project.pbxproj b/ios/PerformicsStoreDNA.xcodeproj/project.pbxproj index aef3177..d97805d 100644 --- a/ios/PerformicsStoreDNA.xcodeproj/project.pbxproj +++ b/ios/PerformicsStoreDNA.xcodeproj/project.pbxproj @@ -263,7 +263,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; - CURRENT_PROJECT_VERSION = 5; + CURRENT_PROJECT_VERSION = 6; DEVELOPMENT_TEAM = JGDHGNH9XY; ENABLE_BITCODE = NO; INFOPLIST_FILE = PerformicsStoreDNA/Info.plist; @@ -272,7 +272,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.5; + MARKETING_VERSION = 1.6; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", @@ -292,7 +292,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; - CURRENT_PROJECT_VERSION = 5; + CURRENT_PROJECT_VERSION = 6; DEVELOPMENT_TEAM = JGDHGNH9XY; INFOPLIST_FILE = PerformicsStoreDNA/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 15.1; @@ -300,7 +300,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.5; + MARKETING_VERSION = 1.6; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", diff --git a/src/navigation/Routes.js b/src/navigation/Routes.js index adeac80..610578c 100644 --- a/src/navigation/Routes.js +++ b/src/navigation/Routes.js @@ -12,6 +12,7 @@ import Dashboard from '../screens/MainScreen/Dashboard'; import FeedbackCategories from '../screens/MainScreen/Feedback/FeedbackCategories'; import { Platform, StatusBar, View } from 'react-native'; import Welcome from '../screens/MainScreen/WelcomePage'; +import Details from '../screens/MainScreen/Dashboard/Details'; const Stack = createNativeStackNavigator(); @@ -38,6 +39,8 @@ const Routes = () => { + + diff --git a/src/screens/MainScreen/Dashboard/Details copy.js b/src/screens/MainScreen/Dashboard/Details copy.js new file mode 100644 index 0000000..b827416 --- /dev/null +++ b/src/screens/MainScreen/Dashboard/Details copy.js @@ -0,0 +1,406 @@ +import React, { useEffect, useState } from 'react'; +import { View, Text, TouchableOpacity, ScrollView, Image, Modal, Platform, StyleSheet, Alert } from 'react-native'; +import { useRoute, useNavigation } from '@react-navigation/native'; +import { post } from '../../../api/ApiService'; +import IMAGES from '../../../constants/Images'; +import { GlobalTheme } from '../../../theme'; +import Loader from '../../../constants/Loader'; +import { SafeAreaView } from 'react-native-safe-area-context'; +import { toastError } from '../../../constants/Toast'; + +const Details = () => { + + const route = useRoute(); + const navigation = useNavigation(); + + const { selectedDetails = [], storeData, year, month, mainTabIndex } = route.params || {}; + const [modalGraphData, setModalGraphData] = useState({}); + const [activePromoTab, setActivePromoTab] = useState('Executed'); + const [allCatData, setAllCatData] = useState([]) + const [selectedCategoryData, setSelectedCategoryData] = useState([]); + const [categoryModalVisible, setCategoryModalVisible] = useState(false); + + useEffect(() => { + if (selectedDetails.length > 0) { + fetchDetailGraphs(selectedDetails); + } + }, [selectedDetails]); + + useEffect(() => { + getAllCatData(); + }, []) + + const getAllCatData = () => { + let data = { + parameters: { + projectid: 41654, + year: year, + monthno: month, + storeid: storeData?.StoreId + }, + } + + const apiUrl = mainTabIndex === 0 + ? 'https://dax.parinaam.in/execute/dabur/detmtd/oos_sku_list_for_all_visits_mtd' + : 'https://dax.parinaam.in/execute/dabur/detlsv/oos_sku_list_on_lsv'; + + post(apiUrl, data) + .then(res => { + setAllCatData(res?.data); + }) + .catch(err => { + console.log('Error =>', err); + }); + } + + const fetchDetailGraphs = async (detailPages) => { + try { + const resultMap = {}; + for (let item of detailPages) { + const response = await post(item.GraphUrl, { + parameters: { + projectid: 41654, + year: year, + monthno: month, + storeid: storeData?.StoreId + }, + }); + resultMap[item.GraphUrl] = response?.data || []; + } + setModalGraphData(resultMap); + } catch (error) { + console.log("❌ Error fetching detail graphs:", error); + } + }; + + const showCategoryDetails = (data) => { + setCategoryModalVisible(!categoryModalVisible) + // Filter SKUs from allCatData where the category name matches + const filteredCategory = allCatData.filter(item => + item.Product_CategoryCategory_Name === data.Product_CategoryCategory_Name + ); + // Save for display + setSelectedCategoryData(filteredCategory); + } + + const isOSATab = selectedDetails.some(item => item.GraphTitle === "OSA - Category"); + + return ( + + + {/* Header */} + + navigation.goBack()} style={{ padding: 5 }}> + + + Details + {/* spacer */} + + + + {selectedDetails.map((detail, index) => { + const values = modalGraphData[detail.GraphUrl] || []; + + if (!modalGraphData[detail.GraphUrl]) { + return ( + + + + ); + } + + switch (detail.GraphType) { + case 'Table': + // Check if it's the Promotion table + const isPromotionTable = + values.length > 0 && + values[0].hasOwnProperty('Product_CategoryCategory_Name') && + values[0].hasOwnProperty('Promotion_MasterPromotion_Definition'); + + if (isPromotionTable) { + // Filter data based on active tab + const filteredValues = values.filter(row => + activePromoTab === 'Executed' + ? row.Executed?.toLowerCase() === 'yes' + : row.Executed?.toLowerCase() === 'no' + ); + // Group data by Product_CategoryCategory_Name + const groupedData = filteredValues.reduce((acc, curr) => { + const category = curr.Product_CategoryCategory_Name || 'Unknown'; + if (!acc[category]) acc[category] = []; + acc[category].push(curr); + return acc; + }, {}); + + return ( + + + {/* Horizontal Tabs - show once at top */} + {index === 0 && ( // ensures only first promotion table renders the toggle + + {['Executed', 'Not Executed'].map(tab => { + const isSelected = activePromoTab === tab; + return ( + setActivePromoTab(tab)} + style={{ + flex: 1, + paddingVertical: 10, + backgroundColor: isSelected ? '#113F8C' : '#E3EBF8', + borderRadius: 8, + marginHorizontal: 5, + alignItems: 'center', + }} + > + + {tab} + + + ); + })} + + )} + + {/* No data message */} + + {filteredValues.length === 0 ? ( + + ) : ( + Object.keys(groupedData).map((categoryName, catIdx) => ( + + {/* Category Header */} + + + {String(categoryName)} + + + + {/* Table Header */} + + + Definition + + + Executed + + + + {/* Table Rows */} + + {groupedData[categoryName].map((row, rowIdx) => ( + + + {String(row.Promotion_MasterPromotion_Definition) || '-'} + + + {row.Executed || '-'} + + + ))} + + + )) + )} + + + ); + } + + let displayKey = null; + let presentKey = null; + if (values.length > 0) { + const presentKeys = Object.keys(values[0]).filter(k => + (typeof values[0][k] === 'string' && ['Yes', 'No'].includes(values[0][k])) || + typeof values[0][k] === 'boolean' || + typeof values[0][k] === 'number' + ); + presentKey = presentKeys.length > 0 ? presentKeys[0] : null; + const displayKeys = Object.keys(values[0]).filter(k => k !== presentKey && typeof values[0][k] === 'string'); + displayKey = displayKeys.length > 0 ? displayKeys[0] : null; + } + + return ( + + + {detail.GraphTitle} + + + + + {displayKey ? displayKey.replace(/_/g, ' ').replace(/([a-z])([A-Z])/g, '$1 $2') : ''} + + + {presentKey ? presentKey.replace(/_/g, ' ').replace(/([a-z])([A-Z])/g, '$1 $2') : ''} + + + + + {values.map((row, idx) => { + const presentKeys = Object.keys(row).filter(k => + (typeof row[k] === 'string' && ['Yes', 'No'].includes(row[k])) || + typeof row[k] === 'boolean' || + typeof row[k] === 'number' + ); + const presentKey = presentKeys.length > 0 ? presentKeys[0] : null; + const displayKeys = Object.keys(row).filter(k => k !== presentKey && typeof row[k] === 'string'); + const displayKey = displayKeys.length > 0 ? displayKeys[0] : null; + + return ( + + {row[displayKey] || '--'} + { + if (row[presentKey] == 100 || row[presentKey] == '100') { + toastError('Alert', 'No Data Available') + } else { + showCategoryDetails(row) + } + }} + style={{ width: '20%', }}> + + {presentKey ? ( + typeof row[presentKey] === 'string' && ['Yes', 'No'].includes(row[presentKey]) ? row[presentKey] : + typeof row[presentKey] === 'boolean' ? (row[presentKey] ? 'Yes' : 'No') : + typeof row[presentKey] === 'number' ? row[presentKey].toFixed(2) : row[presentKey] || '-' + ) : '-'} + + + + ); + })} + + + ); + default: + return ( + + Unsupported GraphType: {detail.GraphType} + + ); + } + })} + + + setCategoryModalVisible(false)} + > + + {/* Header */} + + + + + {selectedCategoryData[0]?.Product_CategoryCategory_Name || 'Category'} + + setCategoryModalVisible(false)} style={{ width: '7%', alignItems: 'center' }}> + + + + + {/* SKU List */} + + {/* OOS SKU details */} + {selectedCategoryData.map((item, idx) => ( + + + {item.Product_MasterProduct_Name} + + {/* + {item['#_of_OOS_SKU_for_all_visits']} + */} + + ))} + + + + + + + ); +}; + +const styled = StyleSheet.create({ + header: { + width: '100%', + backgroundColor: '#113F8C', + padding: 10, + flexDirection: 'row', + justifyContent: 'space-between', + alignItems: 'center' + }, + categoryHeader: { + flexDirection: 'row', + justifyContent: 'space-between', + backgroundColor: '#EDEDED', + paddingVertical: 8, + paddingHorizontal: 10, + borderTopLeftRadius: 8, + borderTopRightRadius: 8, + }, + itemContainer: { + backgroundColor: '#fff', + paddingHorizontal: 10, + borderBottomLeftRadius: 8, + borderBottomRightRadius: 8, + shadowColor: '#000', + shadowOffset: { width: 0, height: 1 }, + shadowOpacity: 0.1, + shadowRadius: 2, + elevation: 2 + } +}) + +export default Details; diff --git a/src/screens/MainScreen/Dashboard/Details.js b/src/screens/MainScreen/Dashboard/Details.js new file mode 100644 index 0000000..1229f3b --- /dev/null +++ b/src/screens/MainScreen/Dashboard/Details.js @@ -0,0 +1,405 @@ +import React, { useEffect, useState } from 'react'; +import { View, Text, TouchableOpacity, ScrollView, Image, Modal, Platform, StyleSheet, Alert } from 'react-native'; +import { useRoute, useNavigation } from '@react-navigation/native'; +import { post } from '../../../api/ApiService'; +import IMAGES from '../../../constants/Images'; +import { GlobalTheme } from '../../../theme'; +import Loader from '../../../constants/Loader'; +import { SafeAreaView } from 'react-native-safe-area-context'; +import { toastError } from '../../../constants/Toast'; + +const Details = () => { + + const route = useRoute(); + const navigation = useNavigation(); + + const { selectedDetails = [], storeData, year, month, mainTabIndex } = route.params || {}; + const [modalGraphData, setModalGraphData] = useState({}); + const [activePromoTab, setActivePromoTab] = useState('Executed'); + const [allCatData, setAllCatData] = useState([]) + const [selectedCategoryData, setSelectedCategoryData] = useState([]); + const [categoryModalVisible, setCategoryModalVisible] = useState(false); + + useEffect(() => { + if (selectedDetails.length > 0) { + fetchDetailGraphs(selectedDetails); + } + }, [selectedDetails]); + + useEffect(() => { + getAllCatData(); + }, []) + + const getAllCatData = () => { + let data = { + parameters: { + projectid: 41654, + year: year, + monthno: month, + storeid: storeData?.StoreId + }, + } + + const apiUrl = mainTabIndex === 0 + ? 'https://dax.parinaam.in/execute/dabur/detmtd/oos_sku_list_for_all_visits_mtd' + : 'https://dax.parinaam.in/execute/dabur/detlsv/oos_sku_list_on_lsv'; + + post(apiUrl, data) + .then(res => { + setAllCatData(res?.data); + }) + .catch(err => { + console.log('Error =>', err); + }); + } + + const fetchDetailGraphs = async (detailPages) => { + try { + const resultMap = {}; + for (let item of detailPages) { + const response = await post(item.GraphUrl, { + parameters: { + projectid: 41654, + year: year, + monthno: month, + storeid: storeData?.StoreId + }, + }); + resultMap[item.GraphUrl] = response?.data || []; + } + setModalGraphData(resultMap); + } catch (error) { + console.log("❌ Error fetching detail graphs:", error); + } + }; + + const showCategoryDetails = (data) => { + setCategoryModalVisible(!categoryModalVisible) + // Filter SKUs from allCatData where the category name matches + const filteredCategory = allCatData.filter(item => + item.Product_CategoryCategory_Name === data.Product_CategoryCategory_Name + ); + // Save for display + setSelectedCategoryData(filteredCategory); + } + + const isOSATab = selectedDetails.some(item => item.GraphTitle === "OSA - Category"); + + return ( + + + {/* Header */} + + navigation.goBack()} style={{ padding: 5 }}> + + + Details + {/* spacer */} + + + + {selectedDetails.map((detail, index) => { + const values = modalGraphData[detail.GraphUrl] || []; + + if (!modalGraphData[detail.GraphUrl]) { + return ( + + + + ); + } + + switch (detail.GraphType) { + case 'Table': + // Check if it's the Promotion table + const isPromotionTable = + values.length > 0 && + values[0].hasOwnProperty('Product_CategoryCategory_Name') && + values[0].hasOwnProperty('Promotion_MasterPromotion_Definition'); + + if (isPromotionTable) { + // Filter data based on active tab + const filteredValues = values.filter(row => + activePromoTab === 'Executed' + ? row.Executed?.toLowerCase() === 'yes' + : row.Executed?.toLowerCase() === 'no' + ); + // Group data by Product_CategoryCategory_Name + const groupedData = filteredValues.reduce((acc, curr) => { + const category = curr.Product_CategoryCategory_Name || 'Unknown'; + if (!acc[category]) acc[category] = []; + acc[category].push(curr); + return acc; + }, {}); + + return ( + + {/* Horizontal Tabs - show once at top */} + {index === 0 && ( // ensures only first promotion table renders the toggle + + {['Executed', 'Not Executed'].map(tab => { + const isSelected = activePromoTab === tab; + return ( + setActivePromoTab(tab)} + style={{ + flex: 1, + paddingVertical: 10, + backgroundColor: isSelected ? '#113F8C' : '#E3EBF8', + borderRadius: 8, + marginHorizontal: 5, + alignItems: 'center', + }} + > + + {tab} + + + ); + })} + + )} + + {/* No data message */} + + {filteredValues.length === 0 ? ( + + ) : ( + Object.keys(groupedData).map((categoryName, catIdx) => ( + + {/* Category Header */} + + + {String(categoryName)} + + + + {/* Table Header */} + + + Definition + + + Executed + + + + {/* Table Rows */} + + {groupedData[categoryName].map((row, rowIdx) => ( + + + {String(row.Promotion_MasterPromotion_Definition) || '-'} + + + {row.Executed || '-'} + + + ))} + + + )) + )} + + + ); + } + + let displayKey = null; + let presentKey = null; + if (values.length > 0) { + const presentKeys = Object.keys(values[0]).filter(k => + (typeof values[0][k] === 'string' && ['Yes', 'No'].includes(values[0][k])) || + typeof values[0][k] === 'boolean' || + typeof values[0][k] === 'number' + ); + presentKey = presentKeys.length > 0 ? presentKeys[0] : null; + const displayKeys = Object.keys(values[0]).filter(k => k !== presentKey && typeof values[0][k] === 'string'); + displayKey = displayKeys.length > 0 ? displayKeys[0] : null; + } + + return ( + + + {detail.GraphTitle} + + + + + {displayKey ? displayKey.replace(/_/g, ' ').replace(/([a-z])([A-Z])/g, '$1 $2') : ''} + + + {presentKey ? presentKey.replace(/_/g, ' ').replace(/([a-z])([A-Z])/g, '$1 $2') : ''} + + + + + {values.map((row, idx) => { + const presentKeys = Object.keys(row).filter(k => + (typeof row[k] === 'string' && ['Yes', 'No'].includes(row[k])) || + typeof row[k] === 'boolean' || + typeof row[k] === 'number' + ); + const presentKey = presentKeys.length > 0 ? presentKeys[0] : null; + const displayKeys = Object.keys(row).filter(k => k !== presentKey && typeof row[k] === 'string'); + const displayKey = displayKeys.length > 0 ? displayKeys[0] : null; + + return ( + + {row[displayKey] || '--'} + { + if (row[presentKey] == 100 || row[presentKey] == '100') { + toastError('Alert', 'No Data Available') + } else { + showCategoryDetails(row) + } + }} + style={{ width: '20%', }}> + + {presentKey ? ( + typeof row[presentKey] === 'string' && ['Yes', 'No'].includes(row[presentKey]) ? row[presentKey] : + typeof row[presentKey] === 'boolean' ? (row[presentKey] ? 'Yes' : 'No') : + typeof row[presentKey] === 'number' ? row[presentKey].toFixed(2) : row[presentKey] || '-' + ) : '-'} + + + + ); + })} + + + ); + default: + return ( + + Unsupported GraphType: {detail.GraphType} + + ); + } + })} + + + setCategoryModalVisible(false)} + > + + {/* Header */} + + + + + {selectedCategoryData[0]?.Product_CategoryCategory_Name || 'Category'} + + setCategoryModalVisible(false)} style={{ width: '7%', alignItems: 'center' }}> + + + + + {/* SKU List */} + + {/* OOS SKU details */} + {selectedCategoryData.map((item, idx) => ( + + + {item.Product_MasterProduct_Name} + + {/* + {item['#_of_OOS_SKU_for_all_visits']} + */} + + ))} + + + + + + + ); +}; + +const styled = StyleSheet.create({ + header: { + width: '100%', + backgroundColor: '#113F8C', + padding: 10, + flexDirection: 'row', + justifyContent: 'space-between', + alignItems: 'center' + }, + categoryHeader: { + flexDirection: 'row', + justifyContent: 'space-between', + backgroundColor: '#EDEDED', + paddingVertical: 8, + paddingHorizontal: 10, + borderTopLeftRadius: 8, + borderTopRightRadius: 8, + }, + itemContainer: { + backgroundColor: '#fff', + paddingHorizontal: 10, + borderBottomLeftRadius: 8, + borderBottomRightRadius: 8, + shadowColor: '#000', + shadowOffset: { width: 0, height: 1 }, + shadowOpacity: 0.1, + shadowRadius: 2, + elevation: 2 + } +}) + +export default Details; diff --git a/src/screens/MainScreen/Dashboard/index.js b/src/screens/MainScreen/Dashboard/index.js index ffede4e..cdad3ed 100644 --- a/src/screens/MainScreen/Dashboard/index.js +++ b/src/screens/MainScreen/Dashboard/index.js @@ -303,7 +303,7 @@ const Dashboard = (props) => { [d2], (tx, results) => { - console.log("results===", results); + // console.log("results===", results); const rows = []; for (let i = 0; i < results.rows.length; i++) { rows.push(results.rows.item(i)); @@ -429,7 +429,7 @@ const Dashboard = (props) => { const openBottomSheet = () => { refRBSheet.current.open() - } + }; const onSelectStore = async (item) => { await insertStoreInfoDNALocal([item]); @@ -442,11 +442,11 @@ const Dashboard = (props) => { getTabData(currentTab?.MainTabData); refRBSheet.current.close() - } + }; const onSelectSubTab = (item) => { setActiveTab(item?.TabId) - } + }; const getFilterStateCity = async () => { try { @@ -516,7 +516,7 @@ const Dashboard = (props) => { setStoreList(resData) setLoading(false) - console.log('storeSearchApi====>', JSON.stringify(resData)); + // console.log('storeSearchApi====>', JSON.stringify(resData)); } catch (error) { setLoading(false) @@ -707,6 +707,9 @@ const Dashboard = (props) => { ); }); + // console.log('mainTabIndex----->',mainTabIndex); + + return ( @@ -914,11 +917,23 @@ const Dashboard = (props) => { {firstItem && ( { + // if (firstItem.clickable === 1 && firstItem.DetailsPage?.length > 0) { + // setSelectedDetails(firstItem.DetailsPage); + // setShowDetailsModal(true); + // fetchDetailGraphs(firstItem.DetailsPage); + // } + // }} + onPress={() => { if (firstItem.clickable === 1 && firstItem.DetailsPage?.length > 0) { - setSelectedDetails(firstItem.DetailsPage); - setShowDetailsModal(true); - fetchDetailGraphs(firstItem.DetailsPage); + navigation.navigate('Details', { + selectedDetails: firstItem.DetailsPage, + storeData, + year, + month, + mainTabIndex + }); } }} > diff --git a/src/screens/MainScreen/Dashboard/mainDisplay.json b/src/screens/MainScreen/Dashboard/mainDisplay.json index 71b0278..61c4b32 100644 --- a/src/screens/MainScreen/Dashboard/mainDisplay.json +++ b/src/screens/MainScreen/Dashboard/mainDisplay.json @@ -17,12 +17,6 @@ "TabRow": 1, "TabCol": 2 }, - // { - // "TabId": 3, - // "TabName": "SOS Compliance", - // "TabRow": 1, - // "TabCol": 3 - // }, { "TabId": 4, "TabName": "OSA", @@ -42,6 +36,9 @@ "TabCol": 6 } ], + + + "graphDetails": [ { "TabId": 1, @@ -61,15 +58,6 @@ "GraphBackground": "#E2C8FE", "GraphOptions": {} }, - // { - // "TabId": 1, - // "GraphId": 3, - // "GraphType": "ScoreCard", - // "GraphTitle": "SOS Compliance", - // "GraphUrl": "https://dax.parinaam.in/execute/dabur/mtd/SOS_Compliance_Perc", - // "GraphBackground": "#FFD7C3", - // "GraphOptions": {} - // }, { "TabId": 1, "GraphId": 4, @@ -262,16 +250,26 @@ "TabId": 6, "GraphId": 9, "GraphType": "Table", - "GraphTitle": "Promotion Availability", - "GraphUrl": "https://dax.parinaam.in/execute/dabur/kpimtd/promotion_availability_mtd", + "GraphTitle": "Promotion Not Executed", + "GraphUrl": "https://dax.parinaam.in/execute/dabur/detmtd/promotion_not_executed_mtd", + "GraphBackground": "#ECFFFA", + "GraphOptions": {} + }, + { + "TabId": 6, + "GraphId": 10, + "GraphType": "Table", + "GraphTitle": "Promotion executed", + "GraphUrl": "https://dax.parinaam.in/execute/dabur/detmtd/promotion_executed_mtd", "GraphBackground": "#ECFFFA", "GraphOptions": {} } + ] }, { "TabId": 6, - "GraphId": 10, + "GraphId": 11, "GraphType": "BarGraph", "GraphTitle": "Promotion", "GraphUrl": "https://dax.parinaam.in/execute/dabur/kpimtd/promotion_trend_perc_mtd", @@ -298,12 +296,6 @@ "TabRow": 1, "TabCol": 2 }, - // { - // "TabId": 3, - // "TabName": "SOS Compliance", - // "TabRow": 1, - // "TabCol": 3 - // }, { "TabId": 4, "TabName": "OSA", @@ -342,15 +334,6 @@ "GraphBackground": "#E2C8FE", "GraphOptions": {} }, - // { - // "TabId": 1, - // "GraphId": 3, - // "GraphType": "ScoreCard", - // "GraphTitle": "SOS Compliance", - // "GraphUrl": "https://dax.parinaam.in/execute/dabur/lsv/sos_compliance_lsv_perc", - // "GraphBackground": "#FFD7C3", - // "GraphOptions": {} - // }, { "TabId": 1, "GraphId": 4, @@ -474,7 +457,7 @@ "TabId": 5, "GraphId": 5, "GraphType": "Table", - "GraphTitle": "Asset Availability", + "GraphTitle": "Visibility", "GraphUrl": "https://dax.parinaam.in/execute/dabur/kpilsv/asset_availability_lsv", "GraphBackground": "#ECFFFA", "GraphOptions": {} @@ -483,7 +466,7 @@ "TabId": 5, "GraphId": 5, "GraphType": "Table", - "GraphTitle": "Asset", + "GraphTitle": "Additional Visibility", "GraphUrl": "https://dax.parinaam.in/execute/dabur/kpilsv/additional_visibility_lsv", "GraphBackground": "#ECFFFA", "GraphOptions": {} @@ -524,7 +507,7 @@ "TabId": 4, "GraphId": 7, "GraphType": "Table", - "GraphTitle": "SOS Actual - Category", + "GraphTitle": "OSA - Category", "GraphUrl": "https://dax.parinaam.in/execute/dabur/detlsv/osa_lsv_perc_on_category", "GraphBackground": "#ECFFFA", "GraphOptions": {} @@ -554,8 +537,17 @@ "TabId": 6, "GraphId": 9, "GraphType": "Table", - "GraphTitle": "Promotion Availability", - "GraphUrl": "https://dax.parinaam.in/execute/dabur/kpilsv/promotion_availability_lsv", + "GraphTitle": "Promotion Not Executed", + "GraphUrl": "https://dax.parinaam.in/execute/dabur/detlsv/promotion_not_executed_lsv", + "GraphBackground": "#ECFFFA", + "GraphOptions": {} + }, + { + "TabId": 6, + "GraphId": 10, + "GraphType": "Table", + "GraphTitle": "Promotion executed", + "GraphUrl": "https://dax.parinaam.in/execute/dabur/detlsv/promotion_executed_lsv", "GraphBackground": "#ECFFFA", "GraphOptions": {} } @@ -563,7 +555,7 @@ }, { "TabId": 6, - "GraphId": 10, + "GraphId": 11, "GraphType": "BarGraph", "GraphTitle": "Promotion", "GraphUrl": "https://dax.parinaam.in/execute/dabur/kpilsv/promotion_trend_lsv_perc",