npm-pkg-hook 1.3.8 → 1.4.0
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/.babelrc +2 -10
- package/.env +5 -1
- package/dist/index.js +17953 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +17711 -0
- package/dist/index.mjs.map +1 -0
- package/eslint.config.mjs +154 -0
- package/expire.json +1 -0
- package/index.d.ts +2 -0
- package/jest.config.ts +9 -0
- package/package.json +45 -36
- package/src/config/client/errors.ts +39 -0
- package/src/config/content/en.json +5 -0
- package/src/config/content/es.json +5 -0
- package/src/config/content/index.ts +16 -0
- package/src/hooks/addTenMinutes/index.ts +14 -0
- package/src/hooks/calculateLogLatHaversine/index.ts +41 -0
- package/src/hooks/completeSchedules/index.ts +22 -0
- package/src/hooks/convertToMilitaryTime/index.ts +18 -0
- package/src/hooks/generateStoreURL/index.ts +41 -0
- package/src/hooks/generateTemplate/index.ts +66 -0
- package/src/hooks/getCardType/index.ts +24 -0
- package/src/hooks/getCategoriesWithProduct/{index.js → index.ts} +7 -7
- package/src/hooks/getGlobalSession/index.ts +69 -0
- package/src/hooks/getSession/index.ts +72 -0
- package/src/hooks/getTodayTimestamps/index.ts +70 -0
- package/src/hooks/getTotalHours/index.ts +76 -0
- package/src/hooks/handleLogin/index.ts +14 -0
- package/src/hooks/index.ts +154 -0
- package/src/hooks/isTokenExpired/index.ts +17 -0
- package/src/hooks/newMessageSubscription/index.ts +28 -0
- package/src/hooks/newStoreOrderSubscription/index.ts +26 -0
- package/src/hooks/{useStatusOpenStore/helpers/index.js → statusOpenStores/helpers/index.ts} +24 -1
- package/src/hooks/statusOpenStores/index.ts +221 -0
- package/src/hooks/updateExtProductFoodsOptional/{index.js → index.ts} +15 -6
- package/src/hooks/useAcumulateDate/index.ts +18 -0
- package/src/hooks/useAllStoresPendingToRegister/index.ts +37 -0
- package/src/hooks/useAmountInput/index.ts +127 -0
- package/src/hooks/useAnimationText/{index.jsx → index.ts} +2 -2
- package/src/hooks/useAsideCart/index.ts +217 -0
- package/src/hooks/useBanner/{index.js → index.ts} +2 -1
- package/src/hooks/useCart/{queries.js → queries.ts} +11 -1
- package/src/hooks/useCart/useCart/helpers/{index.js → index.ts} +10 -6
- package/src/hooks/useCart/useCart/{index.js → index.ts} +58 -44
- package/src/hooks/useCart/useGetCart/{index.js → index.ts} +6 -3
- package/src/hooks/useCatWithProduct/{index.js → index.ts} +17 -7
- package/src/hooks/useCatWithProduct/{queries.js → queries.ts} +50 -23
- package/src/hooks/useCatWithProduct/types/index.ts +104 -0
- package/src/hooks/useCatWithProductClient/{index.js → index.ts} +19 -18
- package/src/hooks/useCatWithProductClient/{queries.js → queries.ts} +1 -0
- package/src/hooks/useCategoriesProduct/{index.js → index.ts} +3 -1
- package/src/hooks/useCategoriesProduct/{queries.js → queries.ts} +2 -2
- package/src/hooks/useCategoryInStore/index.ts +167 -0
- package/src/hooks/useCategoryInStore/{queries.js → queries.ts} +2 -2
- package/src/hooks/useCategoryStore/{index.js → index.ts} +4 -3
- package/src/hooks/useCategoryStore/{queries.js → queries.ts} +2 -2
- package/src/hooks/useChartData/{index.js → index.ts} +31 -34
- package/src/hooks/useChartData/useChartData/{index.js → index.ts} +31 -30
- package/src/hooks/useChartData/useChartDataAllOrders/{index.js → index.ts} +4 -4
- package/src/hooks/useChatRoomSubscription/index.ts +28 -0
- package/src/hooks/useCheckbox/{index.js → index.ts} +1 -1
- package/src/hooks/useCities/index.ts +14 -0
- package/src/hooks/useCities/queries.ts +12 -0
- package/src/hooks/useClients/{index.js → index.ts} +36 -10
- package/src/hooks/useClients/queries.ts +215 -0
- package/src/hooks/useColorByLetters/helpers/alea.ts +73 -0
- package/src/hooks/useColorByLetters/helpers/colors.ts +45 -0
- package/src/hooks/useColorByLetters/helpers/index.ts +24 -0
- package/src/hooks/useColorByLetters/helpers/mersenne_twister.ts +118 -0
- package/src/hooks/useColorByLetters/index.ts +24 -0
- package/src/hooks/useConnection/index.ts +24 -0
- package/src/hooks/useCountries/index.ts +20 -0
- package/src/hooks/useCountries/queries.ts +12 -0
- package/src/hooks/useCreateDeliveryTime/index.ts +51 -0
- package/src/hooks/useCreateOrderStatusType/index.ts +134 -0
- package/src/hooks/useCreateProduct/helpers/index.ts +23 -0
- package/src/hooks/useCreateProduct/helpers/manageCacheDataCatProduct/{index.js → index.ts} +1 -1
- package/src/hooks/useCreateProduct/helpers/useEditImageProduct/{index.js → index.ts} +14 -8
- package/src/hooks/useCreateProduct/index.ts +337 -0
- package/src/hooks/useCreateStorePendingToRegister/index.ts +17 -0
- package/src/hooks/useCreateStorePendingToRegister/queries.ts +10 -0
- package/src/hooks/useDashboardComponents/index.ts +50 -0
- package/src/hooks/useDeleteExtraProductFoods/index.ts +13 -0
- package/src/hooks/useDeleteSubProductOptional/{index.js → index.ts} +5 -3
- package/src/hooks/useDeliveryTime/index.ts +29 -0
- package/src/hooks/useDepartments/index.ts +14 -0
- package/src/hooks/useDepartments/queries.ts +13 -0
- package/src/hooks/useDessert/{index.js → index.ts} +162 -114
- package/src/hooks/useDessertWithPrice/helpers/index.ts +76 -0
- package/src/hooks/useDessertWithPrice/index.ts +381 -0
- package/src/hooks/useDessertWithPrice/queries.ts +18 -0
- package/src/hooks/useDevWS/index.ts +53 -0
- package/src/hooks/useDevices/index.ts +2 -0
- package/src/hooks/useDevices/queries.ts +28 -0
- package/src/hooks/useDevices/useGetDevices.ts +28 -0
- package/src/hooks/useDevices/useRegisterDevices.ts +75 -0
- package/src/hooks/useDownloadReports/helpers/downloadFileFromResponse.ts +21 -0
- package/src/hooks/useDownloadReports/index.ts +2 -0
- package/src/hooks/useDownloadReports/useDownloadReportByDay/index.ts +105 -0
- package/src/hooks/useDownloadReports/useGetReportByDateRange/index.ts +116 -0
- package/src/hooks/useDrag/{index.js → index.ts} +16 -0
- package/src/hooks/useDropzone/{index.js → index.ts} +2 -2
- package/src/hooks/useDynamicAuth/{index.js → index.ts} +2 -1
- package/src/hooks/useEditCategory/{index.js → index.ts} +14 -14
- package/src/hooks/useEditOneExtProductFoodOptional/index.ts +28 -0
- package/src/hooks/useEditOneExtProductFoodOptional/{queries.js → queries.ts} +2 -2
- package/src/hooks/useEditSubProductOptional/index.ts +12 -0
- package/src/hooks/useEmployee/index.ts +18 -0
- package/src/hooks/useEmployee/queries.ts +85 -0
- package/src/hooks/useEmployee/useCreateEmployee.ts +90 -0
- package/src/hooks/useEvent/{index.js → index.ts} +1 -0
- package/src/hooks/useFavoriteStores/index.ts +31 -0
- package/src/hooks/useFavoriteStores/queries.ts +54 -0
- package/src/hooks/useFetchMoreInteractions/index.jsx +26 -26
- package/src/hooks/useFilterConfigs/index.ts +173 -0
- package/src/hooks/useFingerprintjs/{index.js → index.ts} +32 -7
- package/src/hooks/useFormTools/index.ts +143 -0
- package/src/hooks/useFormatDate/index.ts +91 -0
- package/src/hooks/useFullScreenMode/{index.js → index.ts} +1 -5
- package/src/hooks/useGetAllLocationUser/index.ts +13 -0
- package/src/hooks/useGetAllLocationUser/queries.ts +44 -0
- package/src/hooks/{useSales/useGetAllSales/index.js → useGetAllSales/index.ts} +3 -2
- package/src/hooks/useGetCookies/index.ts +43 -0
- package/src/hooks/useGetExtProductFoodsSubOptionalAll/{index.js → index.ts} +2 -1
- package/src/hooks/useGetFoodRecomended/{index.js → index.ts} +2 -1
- package/src/hooks/useGetMessagesToRoom/index.ts +23 -0
- package/src/hooks/useGetMinPrice/{index.js → index.ts} +2 -1
- package/src/hooks/useGetOneStoreRating/{index.js → index.ts} +2 -1
- package/src/hooks/useGetSalesAmountToday/index.ts +31 -0
- package/src/hooks/useGetStoreCookie/index.ts +21 -0
- package/src/hooks/useGoogleLogin/{index.js → index.ts} +14 -5
- package/src/hooks/useHover/{index.js → index.ts} +3 -0
- package/src/hooks/useImageOptimization/{index.js → index.ts} +4 -0
- package/src/hooks/useImageUploaderProduct/helper/canvasUtils.ts +146 -0
- package/src/hooks/useImageUploaderProduct/helper/getOrientation.ts +54 -0
- package/src/hooks/useImageUploaderProduct/helper/index.ts +5 -0
- package/src/hooks/useImageUploaderProduct/index.ts +295 -0
- package/src/hooks/useImageWeight/{index.js → index.ts} +4 -0
- package/src/hooks/useImagesStore/index.ts +227 -0
- package/src/hooks/useImagesStore/{queries.js → queries.ts} +4 -68
- package/src/hooks/useImagesStore/utils/index.ts +4 -0
- package/src/hooks/useIncomingOrders/index.ts +11 -0
- package/src/hooks/useIncomingOrders/queries.ts +87 -0
- package/src/hooks/useIntersection/{index.js → index.ts} +1 -1
- package/src/hooks/useInventory/index.ts +2 -0
- package/src/hooks/useInventory/queries.ts +58 -0
- package/src/hooks/useInventory/useGetProductsInStock.ts +16 -0
- package/src/hooks/useInventory/useUpdateManageStock.ts +41 -0
- package/src/hooks/useLazyScript/{index.js → index.ts} +3 -0
- package/src/hooks/useLocalBackendIp/index.ts +34 -0
- package/src/hooks/useLocalSorage/{index.js → index.ts} +3 -3
- package/src/hooks/useLocationManager/index.ts +63 -0
- package/src/hooks/useLoginEmployeeInStore/index.ts +38 -0
- package/src/hooks/useLogout/helpers/BroadcastChannel.ts +74 -0
- package/src/hooks/useLogout/helpers/apiBaseUrl.ts +12 -0
- package/src/hooks/useLogout/helpers/fetchData.ts +37 -0
- package/src/hooks/useLogout/helpers/getCsrfToken.ts +37 -0
- package/src/hooks/useLogout/helpers/index.ts +65 -0
- package/src/hooks/useLogout/helpers/logger.ts +88 -0
- package/src/hooks/useLogout/helpers/parseUrl.ts +39 -0
- package/src/hooks/useLogout/index.ts +105 -0
- package/src/hooks/useManageNewOrder/helpers/index.ts +45 -0
- package/src/hooks/useManageNewOrder/index.ts +104 -0
- package/src/hooks/useManageQueryParams/index.ts +120 -0
- package/src/hooks/useMobile/index.ts +65 -0
- package/src/hooks/useModules/helpers/index.ts +1 -0
- package/src/hooks/useModules/helpers/validateModules.ts +43 -0
- package/src/hooks/useModules/index.ts +124 -0
- package/src/hooks/useMouse/index.ts +55 -0
- package/src/hooks/useOrderStatusTypes/index.ts +2 -0
- package/src/hooks/useOrderStatusTypes/useOrderStatusTypes/index.ts +133 -0
- package/src/hooks/useOrderStatusTypes/useUpdateOrderStatusPriorities/index.ts +99 -0
- package/src/hooks/useOrders/index.ts +3 -0
- package/src/hooks/useOrders/queries.ts +99 -0
- package/src/hooks/useOrders/useChangeOrderState/index.ts +128 -0
- package/src/hooks/useOrders/{index.js → useOrdersFromStore/index.ts} +20 -18
- package/src/hooks/usePWAInstall/index.ts +38 -0
- package/src/hooks/usePaymentMethod/index.ts +3 -0
- package/src/hooks/usePaymentMethod/paymentMethod.gql.ts +62 -0
- package/src/hooks/usePaymentMethod/paymentMethod.types.ts +28 -0
- package/src/hooks/usePaymentMethod/useCreatePaymentMethod/index.ts +25 -0
- package/src/hooks/usePaymentMethod/useGetAllPaymentMethods/index.ts +19 -0
- package/src/hooks/usePaymentMethod/useGetPaymentMethod/index.ts +26 -0
- package/src/hooks/usePortFetcher/index.ts +33 -0
- package/src/hooks/usePrintSaleTicket/index.ts +68 -0
- package/src/hooks/useProductsFood/index.ts +341 -0
- package/src/hooks/useProductsFood/{queriesStore.js → queriesStore.ts} +151 -84
- package/src/hooks/useProductsFood/types/index.ts +0 -0
- package/src/hooks/useProductsFood/useEditProduct.ts +49 -0
- package/src/hooks/useProductsFood/usetagsProducts.ts +101 -0
- package/src/hooks/useProviders/useProvidersCreateStore/{index.js → index.ts} +2 -1
- package/src/hooks/useProviders/useProvidersDataStore/{index.js → index.ts} +2 -1
- package/src/hooks/useProvidersStore/{index.js → index.ts} +2 -1
- package/src/hooks/usePushNotificationOrder/index.ts +52 -0
- package/src/hooks/usePushNotifications/helpers/index.ts +123 -0
- package/src/hooks/usePushNotifications/index.ts +150 -0
- package/src/hooks/useQueryLocationsMap/index.ts +20 -0
- package/src/hooks/useQueryLocationsMap/queries.ts +40 -0
- package/src/hooks/useRatingArrayData/{index.js → index.ts} +4 -4
- package/src/hooks/useRatingArrayData/{queries.js → queries.ts} +1 -1
- package/src/hooks/useReactToPrint/index.ts +4 -0
- package/src/hooks/useRemoveExtraProductFoodsOptional/{index.js → index.ts} +2 -1
- package/src/hooks/useRemoveExtraProductFoodsOptional/{queries.js → queries.ts} +4 -4
- package/src/hooks/useReport/{index.js → index.ts} +5 -5
- package/src/hooks/useReport/{queries.js → queries.ts} +4 -55
- package/src/hooks/useRestaurant/helpers/index.ts +28 -0
- package/src/hooks/useRestaurant/helpers/manageStatusOpen.ts +26 -0
- package/src/hooks/useRestaurant/index.ts +71 -0
- package/src/hooks/useRestaurant/{queries.js → queries.ts} +2 -1
- package/src/hooks/useRoads/index.ts +20 -0
- package/src/hooks/useRoads/queries.ts +13 -0
- package/src/hooks/useRoles/index.ts +4 -0
- package/src/hooks/useRoles/queries.ts +70 -0
- package/src/hooks/useRoles/useCreateRole.ts +40 -0
- package/src/hooks/useRoles/useGetRoles.ts +37 -0
- package/src/hooks/useRoles/useRemoveRoles.ts +40 -0
- package/src/hooks/useRoles/useUpdateRolesPriority.ts +44 -0
- package/src/hooks/useSales/helpers/add-product.utils.ts +120 -0
- package/src/hooks/useSales/helpers/apply-discount-to-cart.utils.ts +292 -0
- package/src/hooks/useSales/helpers/comment-product.utils.ts +41 -0
- package/src/hooks/useSales/helpers/constants/index.ts +38 -0
- package/src/hooks/useSales/helpers/extras.utils.ts +42 -0
- package/src/hooks/useSales/helpers/filterProductsByCarProId.utils.ts +17 -0
- package/src/hooks/useSales/helpers/increment-product-quantity.utils.ts +76 -0
- package/src/hooks/useSales/helpers/index.ts +3 -0
- package/src/hooks/useSales/helpers/initializer.utils.ts +22 -0
- package/src/hooks/useSales/helpers/isStockInsufficient.ts +3 -0
- package/src/hooks/useSales/helpers/remove-product.utils.test.ts +49 -0
- package/src/hooks/useSales/helpers/remove-product.utils.ts +34 -0
- package/src/hooks/useSales/helpers/resolveProduct.ts +29 -0
- package/src/hooks/useSales/helpers/useAddToCart.ts +64 -0
- package/src/hooks/useSales/index.ts +1418 -0
- package/src/hooks/useSales/{queries.js → queries.ts} +256 -166
- package/src/hooks/useSales/types/index.ts +206 -0
- package/src/hooks/useSales/types/use-sales.types.ts +8 -0
- package/src/hooks/useSales/useGetSale.ts +21 -0
- package/src/hooks/useSales/useTotalSales.ts +24 -0
- package/src/hooks/useSaveAvailableProduct/helpers/{index.js → index.ts} +4 -4
- package/src/hooks/useSaveAvailableProduct/{index.js → index.ts} +7 -1
- package/src/hooks/useSaveLocation/index.ts +17 -0
- package/src/hooks/useSaveLocation/queries.ts +19 -0
- package/src/hooks/useSchedule/{index.jsx → index.ts} +16 -4
- package/src/hooks/useSchedule/{index.js → schedule.ts} +22 -15
- package/src/hooks/useScheduleData/{index.js → index.ts} +21 -9
- package/src/hooks/useSetImageProducts/index.ts +59 -0
- package/src/hooks/useSetImageProducts/queries.ts +18 -0
- package/src/hooks/useSetSession/{index.js → index.ts} +16 -17
- package/src/hooks/useSetupSchedule/helpers/index.ts +85 -0
- package/src/hooks/useSetupSchedule/index.ts +284 -0
- package/src/hooks/useStatusOpenStore/helpers/index.ts +124 -0
- package/src/hooks/useStatusOpenStore/{index.js → index.ts} +39 -16
- package/src/hooks/useStatusOrdersClient/{index.js → index.ts} +3 -2
- package/src/hooks/useStatusOrdersClient/{queries.js → queries.ts} +2 -2
- package/src/hooks/useStock/index.ts +1 -0
- package/src/hooks/useStock/useStockUpdatedAllSubscription.ts +40 -0
- package/src/hooks/useStockMovements/helpers/index.ts +16 -0
- package/src/hooks/useStockMovements/index.ts +39 -0
- package/src/hooks/useStore/index.ts +83 -0
- package/src/hooks/useStore/{queries.js → queries.ts} +71 -71
- package/src/hooks/useStoreContacts/{index.js → index.ts} +11 -5
- package/src/hooks/useStoreTable/index.ts +2 -0
- package/src/hooks/useStoreTable/queries.ts +47 -0
- package/src/hooks/useStoreTable/useStoreTableCreate.ts +77 -0
- package/src/hooks/useStoreTable/useStoreTables.ts +15 -0
- package/src/hooks/useSubscriptionValidation/index.ts +112 -0
- package/src/hooks/useTagProducts/index.ts +3 -0
- package/src/hooks/useTagProducts/useDeleteOneTag.ts +106 -0
- package/src/hooks/useTagProducts/useGetAllTags.ts +68 -0
- package/src/hooks/useTagProducts/useRegisterMultipleTags.ts +157 -0
- package/src/hooks/useTheme/index.ts +65 -0
- package/src/hooks/useTimeAgo/{useTimeAgo.js → useTimeAgo.ts} +7 -7
- package/src/hooks/useTokenCards/index.ts +45 -0
- package/src/hooks/useTopProductsMovements/index.ts +27 -0
- package/src/hooks/useTotalAllSales/index.ts +25 -0
- package/src/hooks/useTotalProductsInStock/index.ts +23 -0
- package/src/hooks/useTotalProductsSold/index.ts +23 -0
- package/src/hooks/useTotalProductsSolded/index.ts +20 -0
- package/src/hooks/useUpdateCart/{index.js → index.ts} +3 -2
- package/src/hooks/useUpdateCartCookie/index.ts +60 -0
- package/src/hooks/useUpdateDashboardComponent/index.ts +91 -0
- package/src/hooks/useUpdateExistingOrders/{index.js → index.ts} +5 -11
- package/src/hooks/useUpdateExtProductFoodsSubOptional/index.ts +61 -0
- package/src/hooks/useUpdateModuleOrder/index.ts +37 -0
- package/src/hooks/useUpdateMultipleExtProduct/index.ts +34 -0
- package/src/hooks/useUpdateMultipleExtProduct/queries.ts +33 -0
- package/src/hooks/useUpdateMultipleProducts/index.ts +117 -0
- package/src/hooks/useUpdateMultipleProducts/queries.ts +51 -0
- package/src/hooks/useUploadProducts/helpers/index.ts +1 -0
- package/src/hooks/useUploadProducts/helpers/parseNumber.ts +37 -0
- package/src/hooks/useUploadProducts/helpers/validateProductDataExcel.ts +73 -0
- package/src/hooks/useUploadProducts/index.ts +442 -0
- package/src/hooks/useUpsertGoal/index.ts +68 -0
- package/src/hooks/useUser/{index.js → index.ts} +11 -4
- package/src/hooks/useUser/{queries.js → queries.ts} +9 -4
- package/src/hooks/useWeeklyStockMovement/helpers/index.ts +32 -0
- package/src/hooks/useWeeklyStockMovement/index.ts +52 -0
- package/src/hooks/useWindowSize/{index.js → index.ts} +9 -2
- package/src/index.ts +12 -0
- package/src/security/index.ts +1 -0
- package/src/services/index.ts +1 -0
- package/src/utils/UtilDateRange.ts +56 -0
- package/src/utils/generateCode.ts +222 -0
- package/src/utils/index.ts +2 -0
- package/src/utils/utils.ts +344 -0
- package/tsconfig.eslint.json +17 -0
- package/tsconfig.json +21 -0
- package/tsup.config.ts +24 -0
- package/.eslintrc.js +0 -38
- package/.eslintrc.json +0 -127
- package/next.config.js +0 -126
- package/src/config/client/errors.js +0 -26
- package/src/hooks/getGlobalSession/index.js +0 -49
- package/src/hooks/getSession/index.js +0 -18
- package/src/hooks/handleLogin/index.js +0 -10
- package/src/hooks/index.js +0 -77
- package/src/hooks/useAcumulateDate/index.js +0 -16
- package/src/hooks/useAsideCart/index.js +0 -155
- package/src/hooks/useCategoryInStore/index.js +0 -98
- package/src/hooks/useClients/queries.js +0 -127
- package/src/hooks/useConnection/index.js +0 -22
- package/src/hooks/useCreateProduct/index.js +0 -291
- package/src/hooks/useDevices/index.js +0 -35
- package/src/hooks/useDevices/queries.js +0 -19
- package/src/hooks/useEditOneExtProductFoodOptional/index.js +0 -28
- package/src/hooks/useEditSubProductOptional/index.js +0 -11
- package/src/hooks/useEmployee/index.js +0 -13
- package/src/hooks/useEmployee/queries.js +0 -17
- package/src/hooks/useFavoriteStores/index.js +0 -19
- package/src/hooks/useFavoriteStores/queries.js +0 -47
- package/src/hooks/useFormTools/index.js +0 -100
- package/src/hooks/useFormatDate/index.js +0 -33
- package/src/hooks/useGetStoreCookie/index.js +0 -22
- package/src/hooks/useImagesStore/index.js +0 -183
- package/src/hooks/useLogout/helpers/BroadcastChannel.js +0 -32
- package/src/hooks/useLogout/helpers/apiBaseUrl.js +0 -8
- package/src/hooks/useLogout/helpers/fetchData.js +0 -29
- package/src/hooks/useLogout/helpers/getCsrfToken.js +0 -30
- package/src/hooks/useLogout/helpers/index.js +0 -54
- package/src/hooks/useLogout/helpers/logger.js +0 -72
- package/src/hooks/useLogout/helpers/parseUrl.js +0 -36
- package/src/hooks/useLogout/index.js +0 -46
- package/src/hooks/useManageQueryParams/index.js +0 -37
- package/src/hooks/useMobile/index.js +0 -39
- package/src/hooks/useOrders/queries.js +0 -328
- package/src/hooks/useProductsFood/index.js +0 -234
- package/src/hooks/useProductsFood/useEditProduct.js +0 -8
- package/src/hooks/useProductsFood/usetagsProducts.js +0 -94
- package/src/hooks/useRestaurant/index.js +0 -19
- package/src/hooks/useSales/helpers/index.js +0 -8
- package/src/hooks/useSales/index.js +0 -1102
- package/src/hooks/useSales/useGetSale.js +0 -13
- package/src/hooks/useSales/useTotalSales.js +0 -24
- package/src/hooks/useStore/index.js +0 -70
- package/src/hooks/useUpdateExtProductFoodsSubOptional/index.js +0 -38
- package/src/index.jsx +0 -4
- package/src/utils/index.js +0 -141
- /package/src/config/client/{index.js → index.ts} +0 -0
- /package/src/hooks/getCategoriesWithProduct/helpers/{index.js → index.ts} +0 -0
- /package/src/hooks/useAnimationFrame/{index.js → index.ts} +0 -0
- /package/src/hooks/useAsideCart/helpers/{index.js → index.ts} +0 -0
- /package/src/hooks/useAsideCart/{queries.js → queries.ts} +0 -0
- /package/src/hooks/useCart/{index.js → index.ts} +0 -0
- /package/src/hooks/useDeleteSubProductOptional/{queries.js → queries.ts} +0 -0
- /package/src/hooks/useDessert/helpers/{index.js → index.ts} +0 -0
- /package/src/hooks/useDynamicAuth/{queries.js → queries.ts} +0 -0
- /package/src/hooks/useEditSubProductOptional/{queries.js → queries.ts} +0 -0
- /package/src/hooks/useFetchJson/{index.js → index.ts} +0 -0
- /package/src/hooks/useFormatNumberPhone/{index.js → index.ts} +0 -0
- /package/src/hooks/useGenerateNumberArray/{index.js → index.ts} +0 -0
- /package/src/hooks/useGetFoodRecomended/{queries.js → queries.ts} +0 -0
- /package/src/hooks/useGetMinPrice/{queries.js → queries.ts} +0 -0
- /package/src/hooks/useGetOneStoreRating/{queries.js → queries.ts} +0 -0
- /package/src/hooks/useGoogleLogin/{loadScript.js → loadScript.ts} +0 -0
- /package/src/hooks/useGoogleLogin/{removeScript.js → removeScript.ts} +0 -0
- /package/src/hooks/useInnerHtml/{index.js → index.ts} +0 -0
- /package/src/hooks/useKeypress/{index.js → index.ts} +0 -0
- /package/src/hooks/useLocationNavigate/{index.js → index.ts} +0 -0
- /package/src/{security/index.js → hooks/useManageNewOrder/helpers/mock.ts} +0 -0
- /package/src/hooks/useMutateHeight/{index.js → index.ts} +0 -0
- /package/src/hooks/useOrderClient/{index.js → index.ts} +0 -0
- /package/src/hooks/useProviders/{index.js → index.ts} +0 -0
- /package/src/hooks/useProviders/{queries.js → queries.ts} +0 -0
- /package/src/hooks/useProvidersStore/{queries.js → queries.ts} +0 -0
- /package/src/hooks/useReactToPrint/{index.js → index.txt} +0 -0
- /package/src/hooks/useSaveAvailableProduct/{queries.js → queries.ts} +0 -0
- /package/src/hooks/useSchedule/{queries.js → queries.ts} +0 -0
- /package/src/hooks/useScroll/{index.js → index.ts} +0 -0
- /package/src/hooks/useScrollRotate/{index.js → index.ts} +0 -0
- /package/src/hooks/useSetState/{index.js → index.ts} +0 -0
- /package/src/hooks/useStatusOrdersClient/helpers/{index.js → index.ts} +0 -0
- /package/src/hooks/useStoreCalendar/{index.js → index.ts} +0 -0
- /package/src/hooks/useStoreContacts/{queries.js → queries.ts} +0 -0
- /package/src/mock/dessert/{index.js → index.ts} +0 -0
- /package/src/mock/{index.js → index.ts} +0 -0
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { gql } from '@apollo/client'
|
|
2
|
+
|
|
3
|
+
export const GET_ALL_ROLES = gql`
|
|
4
|
+
query getRoles($idStore: ID, $search: String, $min: Int, $max: Int, $fromDate: DateTime, $toDate: DateTime, $page: Int) {
|
|
5
|
+
getRoles(idStore: $idStore, search: $search, min: $min, max: $max, fromDate: $fromDate, toDate: $toDate, page: $page) {
|
|
6
|
+
success
|
|
7
|
+
message
|
|
8
|
+
errors {
|
|
9
|
+
path
|
|
10
|
+
message
|
|
11
|
+
type
|
|
12
|
+
context {
|
|
13
|
+
limit
|
|
14
|
+
value
|
|
15
|
+
label
|
|
16
|
+
key
|
|
17
|
+
}
|
|
18
|
+
__typename
|
|
19
|
+
}
|
|
20
|
+
pagination {
|
|
21
|
+
totalRecords
|
|
22
|
+
totalPages
|
|
23
|
+
currentPage
|
|
24
|
+
__typename
|
|
25
|
+
}
|
|
26
|
+
data {
|
|
27
|
+
idRole
|
|
28
|
+
name
|
|
29
|
+
priority
|
|
30
|
+
description
|
|
31
|
+
permissions
|
|
32
|
+
createdAt
|
|
33
|
+
updatedAt
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
`
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Mutación para crear un nuevo rol
|
|
41
|
+
*/
|
|
42
|
+
export const CREATE_ROLE_MUTATION = gql`
|
|
43
|
+
mutation createRoleMutation($input: IRole!) {
|
|
44
|
+
createRoleMutation(input: $input) {
|
|
45
|
+
success
|
|
46
|
+
message
|
|
47
|
+
errors {
|
|
48
|
+
path
|
|
49
|
+
message
|
|
50
|
+
type
|
|
51
|
+
context {
|
|
52
|
+
limit
|
|
53
|
+
value
|
|
54
|
+
label
|
|
55
|
+
key
|
|
56
|
+
}
|
|
57
|
+
__typename
|
|
58
|
+
}
|
|
59
|
+
data {
|
|
60
|
+
idRole
|
|
61
|
+
name
|
|
62
|
+
priority
|
|
63
|
+
description
|
|
64
|
+
permissions
|
|
65
|
+
createdAt
|
|
66
|
+
updatedAt
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
`
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { useMutation } from '@apollo/client'
|
|
2
|
+
|
|
3
|
+
import { CREATE_ROLE_MUTATION } from './queries'
|
|
4
|
+
/**
|
|
5
|
+
* Custom hook para crear un nuevo rol
|
|
6
|
+
* @param root0
|
|
7
|
+
* @param root0.sendNotification
|
|
8
|
+
* @returns {Object} - Estado de la mutación, incluyendo loading, error, data y la función createRoleMutation
|
|
9
|
+
*/
|
|
10
|
+
export const useCreateRole = ({
|
|
11
|
+
sendNotification = () => {
|
|
12
|
+
return {
|
|
13
|
+
title: '',
|
|
14
|
+
description: '',
|
|
15
|
+
backgroundColor: ''
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
} = {
|
|
19
|
+
sendNotification: () => {
|
|
20
|
+
}
|
|
21
|
+
}) => {
|
|
22
|
+
const [createRoleMutation, { loading, error, data }] = useMutation(CREATE_ROLE_MUTATION, {
|
|
23
|
+
onError: () => {
|
|
24
|
+
sendNotification({
|
|
25
|
+
title: 'Error',
|
|
26
|
+
description: 'Ocurrió un error inesperado',
|
|
27
|
+
backgroundColor: 'error'
|
|
28
|
+
})
|
|
29
|
+
},
|
|
30
|
+
onCompleted: () => {
|
|
31
|
+
return null
|
|
32
|
+
}
|
|
33
|
+
})
|
|
34
|
+
|
|
35
|
+
return [createRoleMutation, {
|
|
36
|
+
loading,
|
|
37
|
+
error,
|
|
38
|
+
data: data?.createRoleMutation ?? null
|
|
39
|
+
}]
|
|
40
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { useQuery } from '@apollo/client'
|
|
2
|
+
|
|
3
|
+
import { GET_ALL_ROLES } from './queries'
|
|
4
|
+
|
|
5
|
+
export const useGetRoles = ({
|
|
6
|
+
max,
|
|
7
|
+
order = 'DESC',
|
|
8
|
+
search,
|
|
9
|
+
sendNotification = () => { }
|
|
10
|
+
} = {}) => {
|
|
11
|
+
const {
|
|
12
|
+
loading,
|
|
13
|
+
error,
|
|
14
|
+
called,
|
|
15
|
+
data,
|
|
16
|
+
refetch
|
|
17
|
+
} = useQuery(GET_ALL_ROLES, {
|
|
18
|
+
onError: () => {
|
|
19
|
+
sendNotification({
|
|
20
|
+
title: 'Error',
|
|
21
|
+
description: 'Algo salió mal',
|
|
22
|
+
backgroundColor: 'error'
|
|
23
|
+
})
|
|
24
|
+
},
|
|
25
|
+
variables: {
|
|
26
|
+
search,
|
|
27
|
+
max: max || 25,
|
|
28
|
+
order
|
|
29
|
+
}
|
|
30
|
+
})
|
|
31
|
+
return [data?.getRoles, {
|
|
32
|
+
loading: called ? false : loading,
|
|
33
|
+
buttonLoading: loading,
|
|
34
|
+
error,
|
|
35
|
+
refetch
|
|
36
|
+
}]
|
|
37
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { useMutation, gql } from '@apollo/client'
|
|
2
|
+
|
|
3
|
+
// Define the GraphQL mutation
|
|
4
|
+
const REMOVE_ROLES_MUTATION = gql`
|
|
5
|
+
mutation removeRoles($roleIds: [ID!]!) {
|
|
6
|
+
removeRoles(roleIds: $roleIds) {
|
|
7
|
+
success
|
|
8
|
+
message
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
`
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Custom hook to call removeRoles mutation.
|
|
15
|
+
*
|
|
16
|
+
* @returns {Object} An object containing the mutation function and the loading/error state.
|
|
17
|
+
*/
|
|
18
|
+
export function useRemoveRoles () {
|
|
19
|
+
const [removeRoles, { loading, error, data }] = useMutation(REMOVE_ROLES_MUTATION, {
|
|
20
|
+
onError: (err) => {
|
|
21
|
+
console.error('Error removing roles:', err)
|
|
22
|
+
}
|
|
23
|
+
})
|
|
24
|
+
|
|
25
|
+
const removeRolesHandler = async ({ roleIds = [] }) => {
|
|
26
|
+
try {
|
|
27
|
+
const { data } = await removeRoles({ variables: { roleIds } })
|
|
28
|
+
return data.removeRoles
|
|
29
|
+
} catch (err) {
|
|
30
|
+
console.error('Error removing roles:', err)
|
|
31
|
+
throw err
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
return [removeRolesHandler, {
|
|
36
|
+
loading,
|
|
37
|
+
error,
|
|
38
|
+
data
|
|
39
|
+
}]
|
|
40
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { useMutation, gql } from '@apollo/client'
|
|
2
|
+
|
|
3
|
+
// Define the mutation
|
|
4
|
+
const UPDATE_ROLES_PRIORITY = gql`
|
|
5
|
+
mutation updateRolesPriority($roles: [IParamsPriority]!) {
|
|
6
|
+
updateRolesPriority(roles: $roles) {
|
|
7
|
+
success
|
|
8
|
+
message
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
`
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Custom hook to update roles priority
|
|
15
|
+
* @returns {Object} - Returns the mutation function and the mutation state
|
|
16
|
+
*/
|
|
17
|
+
export const useUpdateRolesPriority = () => {
|
|
18
|
+
const [updateRolesPriority, { data, loading, error }] = useMutation(UPDATE_ROLES_PRIORITY)
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Function to update the priority of roles
|
|
22
|
+
* @param {Array} roles - The array of roles with their priorities to be updated
|
|
23
|
+
* @returns {Promise<void>}
|
|
24
|
+
*/
|
|
25
|
+
const handleUpdateRolesPriority = async (roles) => {
|
|
26
|
+
try {
|
|
27
|
+
const response = await updateRolesPriority({
|
|
28
|
+
variables: { roles }
|
|
29
|
+
})
|
|
30
|
+
|
|
31
|
+
// You can handle the response or any additional logic here
|
|
32
|
+
return response
|
|
33
|
+
} catch (err) {
|
|
34
|
+
// Handle the error as needed
|
|
35
|
+
console.error('Error updating roles priority:', err)
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
return [handleUpdateRolesPriority, {
|
|
40
|
+
data,
|
|
41
|
+
loading,
|
|
42
|
+
error
|
|
43
|
+
}]
|
|
44
|
+
}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { NotificationPayload } from '../types'
|
|
2
|
+
|
|
3
|
+
import { isStockInsufficient } from './isStockInsufficient'
|
|
4
|
+
|
|
5
|
+
interface AddToCartProps {
|
|
6
|
+
state: any
|
|
7
|
+
action: any
|
|
8
|
+
product: any
|
|
9
|
+
sendNotification?: (args: NotificationPayload) => any
|
|
10
|
+
sendAlertStock: (stock: number) => void
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Adds a product to the cart with maximum performance.
|
|
15
|
+
* Avoids full array scans and minimizes object cloning.
|
|
16
|
+
* @param {any} state - Current reducer state.
|
|
17
|
+
* @param {any} action - Action containing product data.
|
|
18
|
+
* @returns {any} Updated state.
|
|
19
|
+
*/
|
|
20
|
+
export const addToCartFunc = ({
|
|
21
|
+
state = {},
|
|
22
|
+
action = {},
|
|
23
|
+
product,
|
|
24
|
+
sendNotification = () => { },
|
|
25
|
+
sendAlertStock = () => { }
|
|
26
|
+
}: AddToCartProps) => {
|
|
27
|
+
const payload = action?.payload ?? {}
|
|
28
|
+
const {
|
|
29
|
+
pId,
|
|
30
|
+
pName,
|
|
31
|
+
getOneTags,
|
|
32
|
+
stock,
|
|
33
|
+
ProDescription,
|
|
34
|
+
ProImage,
|
|
35
|
+
ProPrice,
|
|
36
|
+
ProDescuento
|
|
37
|
+
} = payload
|
|
38
|
+
|
|
39
|
+
// Validate basic stock
|
|
40
|
+
if (stock === 0) {
|
|
41
|
+
sendNotification({
|
|
42
|
+
title: 'Sin stock',
|
|
43
|
+
backgroundColor: 'warning',
|
|
44
|
+
description: 'Producto sin stock disponible en tu inventario'
|
|
45
|
+
})
|
|
46
|
+
return state
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// PRE-FETCH product references (only ONCE)
|
|
50
|
+
const productExistIndex = state.PRODUCT.findIndex((item: any) => {return item.pId === pId})
|
|
51
|
+
const productExist = productExistIndex !== -1 ? state.PRODUCT[productExistIndex] : null
|
|
52
|
+
if (!product) return state
|
|
53
|
+
|
|
54
|
+
// Check stock handling rules
|
|
55
|
+
const currentQty = productExist?.ProQuantity ?? 0
|
|
56
|
+
if (product.manageStock && isStockInsufficient(currentQty, product.stock)) {
|
|
57
|
+
sendAlertStock(stock)
|
|
58
|
+
return state
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
const isFree = productExist?.free ?? false
|
|
62
|
+
const newQuantity = productExist ? currentQty + 1 : 1
|
|
63
|
+
|
|
64
|
+
// Calculate new unit price only once
|
|
65
|
+
const unitPrice = product.ProPrice ?? 0
|
|
66
|
+
|
|
67
|
+
// Calculate final price respecting 'free' mode
|
|
68
|
+
const newPrice = isFree ? 0 : newQuantity * unitPrice
|
|
69
|
+
|
|
70
|
+
// COMMON STATE UPDATES
|
|
71
|
+
const baseState = {
|
|
72
|
+
...state,
|
|
73
|
+
counter: state.counter + 1,
|
|
74
|
+
totalAmount: state.totalAmount + ProPrice,
|
|
75
|
+
startAnimateUp: 'start-animate-up'
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// CASE 1: Product does NOT exist → add it
|
|
79
|
+
if (!productExist) {
|
|
80
|
+
const newProduct = {
|
|
81
|
+
pId,
|
|
82
|
+
pName,
|
|
83
|
+
editing: false,
|
|
84
|
+
getOneTags,
|
|
85
|
+
unitPrice,
|
|
86
|
+
manageStock: product.manageStock ?? false,
|
|
87
|
+
ProDescription,
|
|
88
|
+
ProImage,
|
|
89
|
+
ProPrice,
|
|
90
|
+
stock,
|
|
91
|
+
ProDescuento,
|
|
92
|
+
ProQuantity: 1,
|
|
93
|
+
free: false
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
return {
|
|
97
|
+
...baseState,
|
|
98
|
+
PRODUCT: [...state.PRODUCT, newProduct]
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// CASE 2: Product already exists → update only ONE item
|
|
103
|
+
const newList = [...state.PRODUCT]
|
|
104
|
+
|
|
105
|
+
newList[productExistIndex] = {
|
|
106
|
+
...productExist,
|
|
107
|
+
getOneTags: product.genderTags,
|
|
108
|
+
unitPrice,
|
|
109
|
+
editing: false,
|
|
110
|
+
oldQuantity: newQuantity,
|
|
111
|
+
ProPrice: newPrice,
|
|
112
|
+
ProQuantity: newQuantity,
|
|
113
|
+
free: isFree
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
return {
|
|
117
|
+
...baseState,
|
|
118
|
+
PRODUCT: newList
|
|
119
|
+
}
|
|
120
|
+
}
|
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
export enum TypeDiscount {
|
|
2
|
+
PERCENT = 'PERCENT',
|
|
3
|
+
AMOUNT = 'AMOUNT'
|
|
4
|
+
}
|
|
5
|
+
interface DiscountPayload {
|
|
6
|
+
type: TypeDiscount
|
|
7
|
+
value: number
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Apply a discount to the reducer state in a mathematically-exact way.
|
|
12
|
+
*
|
|
13
|
+
* - Supports two discount types: "PERCENT" (0-100) and "AMOUNT" (fixed currency amount).
|
|
14
|
+
* - Works in integer cents to avoid floating point errors, distributes rounding
|
|
15
|
+
* remainders using the Largest Remainder Method so allocations sum exactly.
|
|
16
|
+
* - BEFORE applying a new discount, restores original prices if they were previously saved
|
|
17
|
+
* (originalProPrice and originalNewExtraPrice). This prevents stacking discounts.
|
|
18
|
+
* - Applies discount first to `ProPrice` (base) and, if needed, to `dataExtra[].newExtraPrice`
|
|
19
|
+
* proportionally, never producing negative prices.
|
|
20
|
+
* - Returns a new state (immutable) and sets metadata: discountType, discountPercent,
|
|
21
|
+
* discountAmount, discountBreakdown and preserves original prices in `originalProPrice`
|
|
22
|
+
* and `dataExtra[].originalNewExtraPrice`.
|
|
23
|
+
*
|
|
24
|
+
* NOTE: Uses optional `sendNotification` to report errors/success.
|
|
25
|
+
*
|
|
26
|
+
* @param {any} state - current reducer state
|
|
27
|
+
* @param {{ type: string, value: number }} payload - { type: 'PERCENT'|'AMOUNT', value: number }
|
|
28
|
+
* @param {(notification: {title:string,backgroundColor:'success'|'error'|'warning'|'info',description:string}) => void} sendNotification
|
|
29
|
+
* @returns {any} new state with discounts applied (idempotent w.r.t repeated calls)
|
|
30
|
+
*/
|
|
31
|
+
export const applyDiscountToCart = (
|
|
32
|
+
state: any,
|
|
33
|
+
payload: DiscountPayload,
|
|
34
|
+
sendNotification?: (notification: {
|
|
35
|
+
title: string
|
|
36
|
+
backgroundColor: 'success' | 'error' | 'warning' | 'info'
|
|
37
|
+
description: string
|
|
38
|
+
}) => void
|
|
39
|
+
) => {
|
|
40
|
+
const discountType = (payload?.type ?? TypeDiscount.PERCENT).toString().toUpperCase()
|
|
41
|
+
const rawValue = Number(payload?.value)
|
|
42
|
+
|
|
43
|
+
// Basic validations
|
|
44
|
+
if (!Array.isArray(state?.PRODUCT) || state.PRODUCT.length === 0) {
|
|
45
|
+
sendNotification?.({
|
|
46
|
+
title: 'Warning',
|
|
47
|
+
backgroundColor: 'warning',
|
|
48
|
+
description: 'No items in cart to apply discount.'
|
|
49
|
+
})
|
|
50
|
+
return {
|
|
51
|
+
...state,
|
|
52
|
+
discountType,
|
|
53
|
+
discountPercent: 0,
|
|
54
|
+
discountAmount: 0,
|
|
55
|
+
discountBreakdown: []
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
if (Number.isNaN(rawValue) || rawValue < 0) {
|
|
60
|
+
sendNotification?.({
|
|
61
|
+
title: 'Error',
|
|
62
|
+
backgroundColor: 'error',
|
|
63
|
+
description: 'Invalid discount value.'
|
|
64
|
+
})
|
|
65
|
+
return state
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
if (discountType !== TypeDiscount.PERCENT && discountType !== TypeDiscount.AMOUNT) {
|
|
69
|
+
sendNotification?.({
|
|
70
|
+
title: 'Error',
|
|
71
|
+
backgroundColor: 'error',
|
|
72
|
+
description: 'Invalid discount type.'
|
|
73
|
+
})
|
|
74
|
+
return state
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
if (discountType === TypeDiscount.PERCENT && (rawValue < 0 || rawValue > 100)) {
|
|
78
|
+
sendNotification?.({
|
|
79
|
+
title: 'Error',
|
|
80
|
+
backgroundColor: 'warning',
|
|
81
|
+
description: 'Percentage must be between 0 and 100.'
|
|
82
|
+
})
|
|
83
|
+
return state
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// Helpers - work in cents to preserve exactness
|
|
87
|
+
const toCents = (n: number) => {return Math.round((Number(n) || 0) * 100)}
|
|
88
|
+
const fromCents = (c: number) => {return c / 100}
|
|
89
|
+
|
|
90
|
+
// --- Normalize / Restore originals to avoid stacking discounts ---
|
|
91
|
+
// For each product, use saved original prices if present; otherwise use current as "original"
|
|
92
|
+
const normalizedItems = state.PRODUCT.map((item: any) => {
|
|
93
|
+
// Determine original base price (prefer originalProPrice if present)
|
|
94
|
+
const origBaseRaw =
|
|
95
|
+
item.originalProPrice !== undefined && item.originalProPrice !== null
|
|
96
|
+
? Number(item.originalProPrice)
|
|
97
|
+
: Number(item.ProPrice || 0)
|
|
98
|
+
|
|
99
|
+
const baseCents = toCents(origBaseRaw)
|
|
100
|
+
|
|
101
|
+
// Normalize extras: preserve originalNewExtraPrice if exists, else take current newExtraPrice
|
|
102
|
+
const extrasRaw = Array.isArray(item.dataExtra) ? item.dataExtra : []
|
|
103
|
+
const extrasNormalized = extrasRaw.map((ex: any) => {
|
|
104
|
+
const origExRaw =
|
|
105
|
+
ex.originalNewExtraPrice !== undefined && ex.originalNewExtraPrice !== null
|
|
106
|
+
? Number(ex.originalNewExtraPrice)
|
|
107
|
+
: Number(ex.newExtraPrice || 0)
|
|
108
|
+
return {
|
|
109
|
+
originalExtraObject: ex,
|
|
110
|
+
originalNewExtraPriceRaw: origExRaw,
|
|
111
|
+
originalNewExtraPriceCents: toCents(origExRaw)
|
|
112
|
+
}
|
|
113
|
+
})
|
|
114
|
+
|
|
115
|
+
const extrasCentsList = extrasNormalized.map((e: any) => {return e.originalNewExtraPriceCents})
|
|
116
|
+
const extrasTotalCents = extrasCentsList.reduce((s: number, v: number) => {return s + v}, 0)
|
|
117
|
+
const itemTotalCents = baseCents + extrasTotalCents
|
|
118
|
+
|
|
119
|
+
return {
|
|
120
|
+
originalItem: item,
|
|
121
|
+
baseCents,
|
|
122
|
+
extrasNormalized,
|
|
123
|
+
extrasCentsList,
|
|
124
|
+
extrasTotalCents,
|
|
125
|
+
itemTotalCents
|
|
126
|
+
}
|
|
127
|
+
})
|
|
128
|
+
|
|
129
|
+
const cartTotalCents = normalizedItems.reduce((s: number, it: any) => {return s + it.itemTotalCents}, 0)
|
|
130
|
+
|
|
131
|
+
if (cartTotalCents === 0) {
|
|
132
|
+
sendNotification?.({
|
|
133
|
+
title: 'Warning',
|
|
134
|
+
backgroundColor: 'warning',
|
|
135
|
+
description: 'Cart total is zero; nothing to discount.'
|
|
136
|
+
})
|
|
137
|
+
return {
|
|
138
|
+
...state,
|
|
139
|
+
discountType,
|
|
140
|
+
discountPercent: 0,
|
|
141
|
+
discountAmount: 0,
|
|
142
|
+
discountBreakdown: []
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// Determine requested total discount in cents
|
|
147
|
+
let totalDiscountCents = 0
|
|
148
|
+
if (discountType === TypeDiscount.PERCENT) {
|
|
149
|
+
totalDiscountCents = Math.round((cartTotalCents * rawValue) / 100)
|
|
150
|
+
} else {
|
|
151
|
+
totalDiscountCents = toCents(rawValue)
|
|
152
|
+
// Cap to cart total
|
|
153
|
+
if (totalDiscountCents > cartTotalCents) {
|
|
154
|
+
totalDiscountCents = cartTotalCents
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
// If no discount to apply
|
|
159
|
+
if (totalDiscountCents <= 0) {
|
|
160
|
+
sendNotification?.({
|
|
161
|
+
title: 'Notice',
|
|
162
|
+
backgroundColor: 'info',
|
|
163
|
+
description: 'No discount applied.'
|
|
164
|
+
})
|
|
165
|
+
return {
|
|
166
|
+
...state,
|
|
167
|
+
discountType,
|
|
168
|
+
discountPercent: discountType === TypeDiscount.PERCENT ? rawValue : +((totalDiscountCents / cartTotalCents) * 100).toFixed(2),
|
|
169
|
+
discountAmount: fromCents(totalDiscountCents),
|
|
170
|
+
discountBreakdown: []
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
// ---- Allocation using Largest Remainder Method (exact cents) ----
|
|
175
|
+
const rawAllocs = normalizedItems.map((it: any) => {return (it.itemTotalCents * totalDiscountCents) / cartTotalCents})
|
|
176
|
+
const floorAllocs = rawAllocs.map((v: any) => {return Math.floor(v)})
|
|
177
|
+
const remainders = rawAllocs.map((v: any, i: number) => {return { idx: i, rem: v - floorAllocs[i] }})
|
|
178
|
+
const sumFloor = floorAllocs.reduce((s: number, v: number) => {return s + v}, 0)
|
|
179
|
+
let remainingCents = totalDiscountCents - sumFloor
|
|
180
|
+
|
|
181
|
+
remainders.sort((a: any, b: any) => {return b.rem - a.rem})
|
|
182
|
+
const finalAllocs = [...floorAllocs]
|
|
183
|
+
for (let i = 0; i < remainders.length && remainingCents > 0; i++) {
|
|
184
|
+
finalAllocs[remainders[i].idx] += 1
|
|
185
|
+
remainingCents -= 1
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
// ---- Apply allocations to restored originals (base first, then extras) ----
|
|
189
|
+
const breakdown: { pId: string | number; discountAmount: number }[] = []
|
|
190
|
+
const newProducts = normalizedItems.map((it: any, idx: number) => {
|
|
191
|
+
const allocated = finalAllocs[idx] // cents
|
|
192
|
+
let remainingToTake = allocated
|
|
193
|
+
|
|
194
|
+
// Apply on base
|
|
195
|
+
const origBaseCents = it.baseCents
|
|
196
|
+
const usedOnBase = Math.min(origBaseCents, remainingToTake)
|
|
197
|
+
const baseAfter = origBaseCents - usedOnBase
|
|
198
|
+
remainingToTake -= usedOnBase
|
|
199
|
+
|
|
200
|
+
// Apply on extras proportionally if needed
|
|
201
|
+
let newExtrasCentsList = it.extrasCentsList.slice() // copy
|
|
202
|
+
if (remainingToTake > 0 && it.extrasTotalCents > 0) {
|
|
203
|
+
const extrasTotal = it.extrasTotalCents
|
|
204
|
+
// raw per-extra allocation
|
|
205
|
+
const rawExtraAllocs = newExtrasCentsList.map((exCents: number) => {return (exCents / extrasTotal) * remainingToTake})
|
|
206
|
+
const floorExtraAllocs = rawExtraAllocs.map((v: number) => {return Math.floor(v)})
|
|
207
|
+
const usedExtraFloor = floorExtraAllocs.reduce((s: number, v: number) => {return s + v}, 0)
|
|
208
|
+
let rest = remainingToTake - usedExtraFloor
|
|
209
|
+
|
|
210
|
+
const extraRemainders = rawExtraAllocs.map((v: number, i: number) => {return { idx: i, rem: v - floorExtraAllocs[i] }})
|
|
211
|
+
extraRemainders.sort((a: any, b: any) => {return b.rem - a.rem})
|
|
212
|
+
const finalExtraAllocs = [...floorExtraAllocs]
|
|
213
|
+
for (let k = 0; k < extraRemainders.length && rest > 0; k++) {
|
|
214
|
+
finalExtraAllocs[extraRemainders[k].idx] += 1
|
|
215
|
+
rest -= 1
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
// apply finalExtraAllocs with cap
|
|
219
|
+
newExtrasCentsList = newExtrasCentsList.map((exCents: number, i: number) => {
|
|
220
|
+
const reduceBy = Math.min(exCents, finalExtraAllocs[i])
|
|
221
|
+
return exCents - reduceBy
|
|
222
|
+
})
|
|
223
|
+
|
|
224
|
+
remainingToTake = 0
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
// Build updated product object:
|
|
228
|
+
const newBaseCents = baseAfter
|
|
229
|
+
const newProPrice = fromCents(newBaseCents)
|
|
230
|
+
|
|
231
|
+
const originalExtrasObjects = it.extrasNormalized.map((e: any) => {return e.originalExtraObject || {}})
|
|
232
|
+
const newDataExtra = originalExtrasObjects.map((exObj: any, i: number) => {
|
|
233
|
+
const newExtraPrice = fromCents(newExtrasCentsList[i] || 0)
|
|
234
|
+
// preserve originalNewExtraPrice on each extra (if not already)
|
|
235
|
+
return {
|
|
236
|
+
...exObj,
|
|
237
|
+
originalNewExtraPrice: exObj.originalNewExtraPrice !== undefined ? exObj.originalNewExtraPrice : exObj.newExtraPrice,
|
|
238
|
+
newExtraPrice
|
|
239
|
+
}
|
|
240
|
+
})
|
|
241
|
+
|
|
242
|
+
const appliedDiscountCents = allocated - remainingToTake
|
|
243
|
+
breakdown.push({ pId: it.originalItem.pId, discountAmount: fromCents(appliedDiscountCents) })
|
|
244
|
+
|
|
245
|
+
const itemTotalCentsBefore = it.itemTotalCents || 0
|
|
246
|
+
const itemDiscountPercent = itemTotalCentsBefore > 0 ? +((appliedDiscountCents / itemTotalCentsBefore) * 100).toFixed(4) : 0
|
|
247
|
+
|
|
248
|
+
return {
|
|
249
|
+
...it.originalItem,
|
|
250
|
+
// save originalProPrice if not present (so future calls can restore)
|
|
251
|
+
originalProPrice:
|
|
252
|
+
it.originalItem.originalProPrice !== undefined && it.originalItem.originalProPrice !== null
|
|
253
|
+
? it.originalItem.originalProPrice
|
|
254
|
+
: fromCents(it.baseCents),
|
|
255
|
+
ProPrice: newProPrice,
|
|
256
|
+
dataExtra: newDataExtra,
|
|
257
|
+
// per-item metadata
|
|
258
|
+
discountAmount: fromCents(appliedDiscountCents),
|
|
259
|
+
discountPercent: itemDiscountPercent
|
|
260
|
+
}
|
|
261
|
+
})
|
|
262
|
+
|
|
263
|
+
// Final safety check & tiny correction if needed
|
|
264
|
+
const allocatedSumCents = breakdown.reduce((s, b) => {return s + toCents(Number(b.discountAmount) || 0)}, 0)
|
|
265
|
+
if (allocatedSumCents !== totalDiscountCents) {
|
|
266
|
+
const diff = totalDiscountCents - allocatedSumCents
|
|
267
|
+
if (newProducts.length > 0 && diff !== 0) {
|
|
268
|
+
const first = newProducts[0]
|
|
269
|
+
first.discountAmount = Number(first.discountAmount || 0) + fromCents(diff)
|
|
270
|
+
const adjustOnBase = Math.min(toCents(first.ProPrice), diff)
|
|
271
|
+
first.ProPrice = fromCents(Math.max(0, toCents(first.ProPrice) - adjustOnBase))
|
|
272
|
+
breakdown[0].discountAmount = Number(breakdown[0].discountAmount || 0) + fromCents(diff)
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
const overallPercent = +((totalDiscountCents / cartTotalCents) * 100).toFixed(4)
|
|
277
|
+
|
|
278
|
+
sendNotification?.({
|
|
279
|
+
title: 'Discount applied',
|
|
280
|
+
backgroundColor: 'success',
|
|
281
|
+
description: `${discountType === TypeDiscount.PERCENT ? rawValue + '%' : fromCents(totalDiscountCents)} discount applied successfully.`
|
|
282
|
+
})
|
|
283
|
+
|
|
284
|
+
return {
|
|
285
|
+
...state,
|
|
286
|
+
PRODUCT: newProducts,
|
|
287
|
+
discountType,
|
|
288
|
+
discountPercent: discountType === TypeDiscount.PERCENT ? rawValue : overallPercent,
|
|
289
|
+
discountAmount: fromCents(totalDiscountCents),
|
|
290
|
+
discountBreakdown: breakdown
|
|
291
|
+
}
|
|
292
|
+
}
|