fix(sales): Filter only sellable items.

fix(queries): Invalidate queries after mutations.
This commit is contained in:
a.bouhuolia
2021-03-14 16:31:21 +02:00
parent 88eaaa3968
commit 0b59a44a4c
25 changed files with 911 additions and 464 deletions

View File

@@ -32,13 +32,6 @@ function CustomerFormProvider({ customerId, ...props }) {
enabled: !!contactId, enabled: !!contactId,
}, },
); );
// Handle fetch customers data table
const {
data: { customers },
isFetching: isCustomersLoading,
} = useCustomers();
// Handle fetch Currencies data table // Handle fetch Currencies data table
const { data: currencies, isFetching: isCurrenciesLoading } = useCurrencies(); const { data: currencies, isFetching: isCurrenciesLoading } = useCurrencies();
@@ -54,14 +47,12 @@ function CustomerFormProvider({ customerId, ...props }) {
const provider = { const provider = {
customerId, customerId,
customer, customer,
customers,
currencies, currencies,
contactDuplicate, contactDuplicate,
submitPayload, submitPayload,
isNewMode, isNewMode,
isCustomerLoading, isCustomerLoading,
isCustomersLoading,
isCurrenciesLoading, isCurrenciesLoading,
setSubmitPayload, setSubmitPayload,

View File

@@ -25,11 +25,19 @@ function BillFormProvider({ billId, ...props }) {
isFetching: isVendorsLoading, isFetching: isVendorsLoading,
} = useVendors({ page_size: 10000 }); } = useVendors({ page_size: 10000 });
// Filter all purchasable items only.
const stringifiedFilterRoles = React.useMemo(() => JSON.stringify(
[{ "fieldKey": "purchasable", "value":true, "condition":"equals"}]
), []);
// Handle fetch Items data table or list // Handle fetch Items data table or list
const { const {
data: { items }, data: { items },
isFetching: isItemsLoading, isFetching: isItemsLoading,
} = useItems({ page_size: 10000 }); } = useItems({
page_size: 10000,
stringified_filter_roles: stringifiedFilterRoles
});
// Handle fetch bill details. // Handle fetch bill details.
const { data: bill, isFetching: isBillLoading } = useBill(billId, { const { data: bill, isFetching: isBillLoading } = useBill(billId, {

View File

@@ -19,11 +19,19 @@ function EstimateFormProvider({ estimateId, ...props }) {
estimateId, { enabled: !!estimateId } estimateId, { enabled: !!estimateId }
); );
// Filter all sellable items only.
const stringifiedFilterRoles = React.useMemo(() => JSON.stringify(
[{ "fieldKey": "sellable", "value":true, "condition":"equals"}]
), []);
// Handle fetch Items data table or list // Handle fetch Items data table or list
const { const {
data: { items }, data: { items },
isFetching: isItemsFetching, isFetching: isItemsFetching,
} = useItems({ page_size: 10000 }); } = useItems({
page_size: 10000,
stringified_filter_roles: stringifiedFilterRoles
});
// Handle fetch customers data table or list // Handle fetch customers data table or list
const { const {

View File

@@ -38,11 +38,19 @@ function InvoiceFormProvider({ invoiceId, ...props }) {
}) })
: []; : [];
// Filter all sellable items only.
const stringifiedFilterRoles = React.useMemo(() => JSON.stringify(
[{ "fieldKey": "sellable", "value":true, "condition":"equals"}]
), []);
// Handle fetching the items table based on the given query. // Handle fetching the items table based on the given query.
const { const {
data: { items }, data: { items },
isLoading: isItemsLoading, isLoading: isItemsLoading,
} = useItems({ page_size: 10000 }); } = useItems({
page_size: 10000,
stringified_filter_roles: stringifiedFilterRoles
});
// Handle fetch customers data table or list // Handle fetch customers data table or list
const { const {

View File

@@ -32,11 +32,19 @@ function ReceiptFormProvider({ receiptId, ...props }) {
isFetching: isCustomersLoading, isFetching: isCustomersLoading,
} = useCustomers({ page_size: 10000 }); } = useCustomers({ page_size: 10000 });
// Filter all sellable items only.
const stringifiedFilterRoles = React.useMemo(() => JSON.stringify(
[{ "fieldKey": "sellable", "value":true, "condition":"equals"}]
), []);
// Handle fetch Items data table or list // Handle fetch Items data table or list
const { const {
data: { items }, data: { items },
isFetching: isItemsLoading, isFetching: isItemsLoading,
} = useItems({ page_size: 10000 }); } = useItems({
page_size: 10000,
stringified_filter_roles: stringifiedFilterRoles
});
// Fetch receipt settings. // Fetch receipt settings.
const { isLoading: isSettingLoading } = useSettingsReceipts(); const { isLoading: isSettingLoading } = useSettingsReceipts();

View File

@@ -1,50 +1,62 @@
import { useMutation, useQuery, useQueryClient } from 'react-query'; import { useMutation, useQuery, useQueryClient } from 'react-query';
import { defaultTo } from 'lodash';
import useApiRequest from '../useRequest'; import useApiRequest from '../useRequest';
import t from './types';
// Transform the account. // Transform the account.
const transformAccount = (response) => { const transformAccount = (response) => {
return response.data.account; return response.data.account;
}; };
const commonInvalidateQueries = (query) => {
// Invalidate accounts.
query.invalidateQueries(t.ACCOUNTS);
// Invalidate financial reports.
query.invalidateQueries(t.FINANCIAL_REPORT);
}
/** /**
* Retrieve accounts list. * Retrieve accounts list.
*/ */
export function useAccounts(query, props) { export function useAccounts(query, props) {
const apiRequest = useApiRequest(); const apiRequest = useApiRequest();
const states = useQuery( return useQuery(
['ACCOUNTS', query], [t.ACCOUNTS, query],
() => apiRequest.get('accounts', { params: query }), () => apiRequest.get('accounts', { params: query }),
{ {
select: (response) => { select: (response) => {
return response.data.accounts; return response.data.accounts;
}, },
initialDataUpdatedAt: 0,
initialData: {
data: {
accounts: []
},
},
...props, ...props,
}, },
); );
return {
...states,
data: defaultTo(states.data, []),
};
} }
/** /**
* Retrieve the given account details. * Retrieve the given account details.
* @param {number} id - * @param {number} id - Account id.
*/ */
export function useAccount(id, props) { export function useAccount(id, props) {
const apiRequest = useApiRequest(); const apiRequest = useApiRequest();
const states = useQuery( return useQuery(
['ACCOUNT', id], [t.ACCOUNT, id],
() => apiRequest.get(`accounts/${id}`).then(transformAccount), () => apiRequest.get(`accounts/${id}`).then(transformAccount),
props, {
initialDataUpdatedAt: 0,
initialData: {
data: { account: {} }
},
...props
},
); );
return {
...states,
data: defaultTo(states.data, {}),
};
} }
/** /**
@@ -53,18 +65,20 @@ export function useAccount(id, props) {
export function useAccountsTypes(props) { export function useAccountsTypes(props) {
const apiRequest = useApiRequest(); const apiRequest = useApiRequest();
const states = useQuery( return useQuery(
['ACCOUNTS_TYPES'], [t.ACCOUNTS_TYPES],
() => apiRequest.get('account_types'), () => apiRequest.get('account_types'),
{ {
select: (res) => res.data.account_types, select: (res) => res.data.account_types,
initialData: {
data: {
account_types: [],
},
},
initialDataUpdatedAt: 0,
...props, ...props,
}, },
); );
return {
...states,
data: defaultTo(states.data, {}),
};
} }
/** /**
@@ -76,7 +90,8 @@ export function useCreateAccount(props) {
return useMutation((values) => apiRequest.post('accounts', values), { return useMutation((values) => apiRequest.post('accounts', values), {
onSuccess: () => { onSuccess: () => {
client.invalidateQueries('ACCOUNTS'); // Common invalidate queries.
commonInvalidateQueries(client);
}, },
...props, ...props,
}); });
@@ -86,14 +101,15 @@ export function useCreateAccount(props) {
* Edits the given account. * Edits the given account.
*/ */
export function useEditAccount(props) { export function useEditAccount(props) {
const query = useQueryClient(); const client = useQueryClient();
const apiRequest = useApiRequest(); const apiRequest = useApiRequest();
return useMutation( return useMutation(
([id, values]) => apiRequest.post(`accounts/${id}`, values), ([id, values]) => apiRequest.post(`accounts/${id}`, values),
{ {
onSuccess: () => { onSuccess: () => {
query.invalidateQueries('ACCOUNTS'); // Common invalidate queries.
commonInvalidateQueries(client);
}, },
...props, ...props,
}, },
@@ -104,12 +120,13 @@ export function useEditAccount(props) {
* Edits the given account. * Edits the given account.
*/ */
export function useDeleteAccount(props) { export function useDeleteAccount(props) {
const query = useQueryClient(); const client = useQueryClient();
const apiRequest = useApiRequest(); const apiRequest = useApiRequest();
return useMutation((id) => apiRequest.delete(`accounts/${id}`), { return useMutation((id) => apiRequest.delete(`accounts/${id}`), {
onSuccess: () => { onSuccess: () => {
query.invalidateQueries('ACCOUNTS'); // Common invalidate queries.
commonInvalidateQueries(client);
}, },
...props, ...props,
}); });
@@ -119,12 +136,13 @@ export function useDeleteAccount(props) {
* Actiavte the give account. * Actiavte the give account.
*/ */
export function useActivateAccount(props) { export function useActivateAccount(props) {
const query = useQueryClient(); const client = useQueryClient();
const apiRequest = useApiRequest(); const apiRequest = useApiRequest();
return useMutation((id) => apiRequest.post(`accounts/${id}/activate`), { return useMutation((id) => apiRequest.post(`accounts/${id}/activate`), {
onSuccess: () => { onSuccess: () => {
query.invalidateQueries('ACCOUNTS'); // Common invalidate queries.
commonInvalidateQueries(client);
}, },
...props, ...props,
}); });
@@ -139,7 +157,8 @@ export function useInactivateAccount(props) {
return useMutation((id) => apiRequest.post(`accounts/${id}/inactivate`), { return useMutation((id) => apiRequest.post(`accounts/${id}/inactivate`), {
onSuccess: () => { onSuccess: () => {
query.invalidateQueries('ACCOUNTS'); // Common invalidate queries.
commonInvalidateQueries(query);
}, },
...props, ...props,
}); });

View File

@@ -2,6 +2,27 @@ import { useQueryClient, useQuery, useMutation } from 'react-query';
import { defaultTo } from 'lodash'; import { defaultTo } from 'lodash';
import { transformPagination } from 'utils'; import { transformPagination } from 'utils';
import useApiRequest from '../useRequest'; import useApiRequest from '../useRequest';
import t from './types';
const commonInvalidateQueries = (queryClient) => {
// Invalidate bills.
queryClient.invalidateQueries(t.BILLS);
// Invalidate items.
queryClient.invalidateQueries(t.ITEMS);
queryClient.invalidateQueries(t.ITEM);
// Invalidate vendors.
queryClient.invalidateQueries([t.VENDORS]);
queryClient.invalidateQueries(t.VENDOR);
// Invalidate accounts.
queryClient.invalidateQueries(t.ACCOUNTS);
queryClient.invalidateQueries(t.ACCOUNT);
// Invalidate financial reports.
queryClient.invalidateQueries(t.FINANCIAL_REPORT);
};
/** /**
* Creates a new sale invoice. * Creates a new sale invoice.
@@ -12,10 +33,8 @@ export function useCreateBill(props) {
return useMutation((values) => apiRequest.post('purchases/bills', values), { return useMutation((values) => apiRequest.post('purchases/bills', values), {
onSuccess: (res, values) => { onSuccess: (res, values) => {
queryClient.invalidateQueries('BILLS'); // Common invalidate queries.
queryClient.invalidateQueries('BILL'); commonInvalidateQueries(queryClient);
queryClient.invalidateQueries(['VENDORS']);
queryClient.invalidateQueries(['VENDOR', values.vendor_id]);
}, },
...props, ...props,
}); });
@@ -32,10 +51,27 @@ export function useEditBill(props) {
([id, values]) => apiRequest.post(`purchases/bills/${id}`, values), ([id, values]) => apiRequest.post(`purchases/bills/${id}`, values),
{ {
onSuccess: (res, [id, values]) => { onSuccess: (res, [id, values]) => {
queryClient.invalidateQueries('BILLS'); // Common invalidate queries.
queryClient.invalidateQueries('BILL'); commonInvalidateQueries(queryClient);
queryClient.invalidateQueries(['VENDORS']); },
queryClient.invalidateQueries(['VENDOR', values.vendor_id]); ...props,
},
);
}
/**
* Marks the given bill as open.
*/
export function useOpenBill(props) {
const queryClient = useQueryClient();
const apiRequest = useApiRequest();
return useMutation(
(id) => apiRequest.post(`purchases/bills/${id}/open`),
{
onSuccess: (res, id) => {
// Common invalidate queries.
commonInvalidateQueries(queryClient);
}, },
...props, ...props,
}, },
@@ -51,9 +87,8 @@ export function useDeleteBill(props) {
return useMutation((id) => apiRequest.delete(`purchases/bills/${id}`), { return useMutation((id) => apiRequest.delete(`purchases/bills/${id}`), {
onSuccess: (res, id) => { onSuccess: (res, id) => {
queryClient.invalidateQueries('BILLS'); // Common invalidate queries.
queryClient.invalidateQueries('BILL'); commonInvalidateQueries(queryClient);
queryClient.invalidateQueries(['VENDORS']);
}, },
...props, ...props,
}); });
@@ -66,7 +101,7 @@ export function useBills(query, props) {
const apiRequest = useApiRequest(); const apiRequest = useApiRequest();
const states = useQuery( const states = useQuery(
['BILLS', query], [t.BILLS, query],
() => () =>
apiRequest.get('purchases/bills', { params: query }), apiRequest.get('purchases/bills', { params: query }),
{ {
@@ -101,7 +136,7 @@ export function useBill(id, props) {
const apiRequest = useApiRequest(); const apiRequest = useApiRequest();
const states = useQuery( const states = useQuery(
['BILL', id], [t.BILL, id],
() => apiRequest.get(`/purchases/bills/${id}`), () => apiRequest.get(`/purchases/bills/${id}`),
{ {
select: (res) => res.data.bill, select: (res) => res.data.bill,
@@ -115,34 +150,15 @@ export function useBill(id, props) {
} }
} }
/**
* Marks the given bill as open.
*/
export function useOpenBill(props) {
const queryClient = useQueryClient();
const apiRequest = useApiRequest();
return useMutation(
(id) => apiRequest.post(`purchases/bills/${id}/open`),
{
onSuccess: () => {
queryClient.invalidateQueries('BILLS');
queryClient.invalidateQueries(['VENDORS']);
},
...props,
},
);
}
/** /**
* Retrieve the due bills of the given vendor id. * Retrieve the due bills of the given vendor id.
* @param {number} vendorId - * @param {number} vendorId -
*/ */
export function useDueBills(vendorId, props) { export function useDueBills(vendorId, props) {
const apiRequest = useApiRequest(); const apiRequest = useApiRequest();
const states = useQuery( const states = useQuery(
['BILLS_DUE', vendorId], [t.BILLS, t.BILLS_DUE, vendorId],
() => () =>
apiRequest.get(`purchases/bills/due`, { apiRequest.get(`purchases/bills/due`, {
params: { vendor_id: vendorId }, params: { vendor_id: vendorId },

View File

@@ -1,6 +1,6 @@
import { useMutation, useQueryClient, useQuery } from 'react-query'; import { useMutation, useQueryClient, useQuery } from 'react-query';
import { defaultTo } from 'lodash';
import useApiRequest from '../useRequest'; import useApiRequest from '../useRequest';
import t from './types';
/** /**
* Create a new currency. * Create a new currency.
@@ -11,7 +11,8 @@ export function useCreateCurrency(props) {
return useMutation((values) => apiRequest.post('currencies', values), { return useMutation((values) => apiRequest.post('currencies', values), {
onSuccess: () => { onSuccess: () => {
queryClient.invalidateQueries('CURRENCIES'); // Invalidate currencies.
queryClient.invalidateQueries(t.CURRENCIES);
}, },
...props, ...props,
}); });
@@ -29,7 +30,8 @@ export function useEditCurrency(props) {
apiRequest.post(`currencies/${currencyCode}`, values), apiRequest.post(`currencies/${currencyCode}`, values),
{ {
onSuccess: () => { onSuccess: () => {
queryClient.invalidateQueries('CURRENCIES'); // Invalidate currencies.
queryClient.invalidateQueries(t.CURRENCIES);
}, },
...props, ...props,
}, },
@@ -47,7 +49,8 @@ export function useDeleteCurrency(props) {
(currencyCode) => apiRequest.delete(`currencies/${currencyCode}`), (currencyCode) => apiRequest.delete(`currencies/${currencyCode}`),
{ {
onSuccess: () => { onSuccess: () => {
queryClient.invalidateQueries('CURRENCIES'); // Invalidate currencies.
queryClient.invalidateQueries(t.CURRENCIES);
}, },
...props, ...props,
}, },
@@ -60,14 +63,13 @@ export function useDeleteCurrency(props) {
export function useCurrencies(props) { export function useCurrencies(props) {
const apiRequest = useApiRequest(); const apiRequest = useApiRequest();
const states = useQuery( return useQuery(
['CURRENCIES'], [t.CURRENCIES],
() => apiRequest.get('currencies').then((res) => res.data.currencies), () => apiRequest.get('currencies').then((res) => res.data.currencies),
props, {
initialDataUpdatedAt: 0,
initialData: [],
...props
},
); );
return {
...states,
data: defaultTo(states.data, []),
};
} }

View File

@@ -1,7 +1,7 @@
import { useMutation, useQuery, useQueryClient } from 'react-query'; import { useMutation, useQuery, useQueryClient } from 'react-query';
import { defaultTo } from 'lodash';
import { transformPagination } from 'utils'; import { transformPagination } from 'utils';
import useApiRequest from '../useRequest'; import useApiRequest from '../useRequest';
import t from './types';
const defaultPagination = { const defaultPagination = {
pageSize: 12, pageSize: 12,
@@ -9,33 +9,44 @@ const defaultPagination = {
pagesCount: 0, pagesCount: 0,
}; };
const commonInvalidateQueries = (queryClient) => {
// Invalidate customers.
queryClient.invalidateQueries(t.CUSTOMERS);
// Invalidate the financial reports.
queryClient.invalidateQueries(t.ACCOUNTS);
queryClient.invalidateQueries(t.ACCOUNT);
// Invalidate the financial reports.
queryClient.invalidateQueries(t.FINANCIAL_REPORT);
};
/** /**
* Retrieve customers list with pagination meta. * Retrieve customers list with pagination meta.
*/ */
export function useCustomers(query, props) { export function useCustomers(query, props) {
const apiRequest = useApiRequest(); const apiRequest = useApiRequest();
const states = useQuery( return useQuery(
['CUSTOMERS', query], [t.CUSTOMERS, query],
() => apiRequest.get(`customers`, { params: query }), () => apiRequest.get(`customers`, { params: query }),
{ {
select: (response) => ({ select: (response) => ({
customers: response.data.customers, customers: response.data.customers,
pagination: transformPagination(response.data.pagination), pagination: transformPagination(response.data.pagination),
filterMeta: response.data.filter_meta filterMeta: response.data.filter_meta,
}), }),
initialDataUpdatedAt: 0,
initialData: {
data: {
customers: [],
pagination: defaultPagination,
filter_meta: {},
}
},
...props, ...props,
}, },
); );
return {
...states,
data: defaultTo(states.data, {
customers: [],
pagination: defaultPagination,
filterMeta: {},
})
}
} }
/** /**
@@ -49,9 +60,12 @@ export function useEditCustomer(props) {
return useMutation( return useMutation(
([id, values]) => apiRequest.post(`customers/${id}`, values), ([id, values]) => apiRequest.post(`customers/${id}`, values),
{ {
onSuccess: () => { onSuccess: (res, [id, values]) => {
queryClient.invalidateQueries('CUSTOMERS'); // Invalidate specific customer.
queryClient.invalidateQueries('CUSTOMER'); queryClient.invalidateQueries([t.CUSTOMER, id]);
// Common invalidate queries.
commonInvalidateQueries(queryClient);
}, },
...props ...props
}, },
@@ -68,9 +82,12 @@ export function useDeleteCustomer(props) {
return useMutation( return useMutation(
(id) => apiRequest.delete(`customers/${id}`), (id) => apiRequest.delete(`customers/${id}`),
{ {
onSuccess: () => { onSuccess: (res, id) => {
queryClient.invalidateQueries('CUSTOMERS'); // Invalidate specific customer.
queryClient.invalidateQueries('CUSTOMER'); queryClient.invalidateQueries([t.CUSTOMER, id]);
// Common invalidate queries.
commonInvalidateQueries(queryClient);
}, },
...props, ...props,
} }
@@ -88,8 +105,8 @@ export function useCreateCustomer(props) {
(values) => apiRequest.post('customers', values), (values) => apiRequest.post('customers', values),
{ {
onSuccess: () => { onSuccess: () => {
queryClient.invalidateQueries('CUSTOMERS'); // Common invalidate queries.
queryClient.invalidateQueries('CUSTOMER'); commonInvalidateQueries(queryClient);
}, },
...props ...props
}); });
@@ -99,14 +116,19 @@ export function useCreateCustomer(props) {
* Retrieve the customer details. * Retrieve the customer details.
*/ */
export function useCustomer(id, props) { export function useCustomer(id, props) {
const queryClient = useQueryClient();
const apiRequest = useApiRequest(); const apiRequest = useApiRequest();
return useQuery( return useQuery(
['CUSTOMER', id], [t.CUSTOMER, id],
() => apiRequest.get(`customers/${id}`), () => apiRequest.get(`customers/${id}`),
{ {
select: (res) => res.data.customer, select: (res) => res.data.customer,
initialDataUpdatedAt: 0,
initialData: {
data: {
customer: {}
}
},
...props ...props
}, },
); );

View File

@@ -1,7 +1,13 @@
import { useQueryClient, useQuery, useMutation } from 'react-query'; import { useQueryClient, useQuery, useMutation } from 'react-query';
import { defaultTo } from 'lodash';
import useApiRequest from '../useRequest'; import useApiRequest from '../useRequest';
import { transformPagination } from 'utils'; import { transformPagination } from 'utils';
import t from './types';
const commonInvalidateQueries = (queryClient) => {
// Invalidate estimates.
queryClient.invalidateQueries(t.SALE_ESTIMATES);
};
/** /**
* Creates a new sale estimate. * Creates a new sale estimate.
@@ -12,8 +18,11 @@ export function useCreateEstimate(props) {
return useMutation((values) => apiRequest.post('sales/estimates', values), { return useMutation((values) => apiRequest.post('sales/estimates', values), {
onSuccess: () => { onSuccess: () => {
queryClient.invalidateQueries('SALE_ESTIMATES'); // Common invalidate queries.
queryClient.invalidateQueries(['SETTINGS', 'ESTIMATES']); commonInvalidateQueries(queryClient);
// Invalidate the settings.
queryClient.invalidateQueries([t.SETTING, t.SETTING_ESTIMATES]);
}, },
...props, ...props,
}); });
@@ -29,8 +38,12 @@ export function useEditEstimate(props) {
return useMutation( return useMutation(
([id, values]) => apiRequest.post(`sales/estimates/${id}`, values), ([id, values]) => apiRequest.post(`sales/estimates/${id}`, values),
{ {
onSuccess: () => { onSuccess: (res, [id, values]) => {
queryClient.invalidateQueries('SALE_ESTIMATES'); // Common invalidate queries.
commonInvalidateQueries(queryClient);
// Invalidate specific sale estimate.
queryClient.invalidateQueries([t.SALE_ESTIMATE, id]);
}, },
...props, ...props,
}, },
@@ -43,19 +56,18 @@ export function useEditEstimate(props) {
export function useEstimate(id, props) { export function useEstimate(id, props) {
const apiRequest = useApiRequest(); const apiRequest = useApiRequest();
const states = useQuery( return useQuery(
['SALE_ESTIMATE', id], [t.SALE_ESTIMATE, id],
() => apiRequest.get(`sales/estimates/${id}`), () => apiRequest.get(`sales/estimates/${id}`),
{ {
select: (res) => res.data.estimate, select: (res) => res.data.estimate,
initialDataUpdatedAt: 0,
initialData: {
data: { estimate: {} },
},
...props, ...props,
}, },
); );
return {
...states,
data: defaultTo(states.data, {}),
};
} }
/** /**
@@ -64,8 +76,8 @@ export function useEstimate(id, props) {
export function useEstimates(query, props) { export function useEstimates(query, props) {
const apiRequest = useApiRequest(); const apiRequest = useApiRequest();
const states = useQuery( return useQuery(
['SALE_ESTIMATES', query], [t.SALE_ESTIMATES, query],
() => apiRequest.get('sales/estimates', { params: query }), () => apiRequest.get('sales/estimates', { params: query }),
{ {
select: (res) => ({ select: (res) => ({
@@ -73,22 +85,21 @@ export function useEstimates(query, props) {
pagination: transformPagination(res.data.pagination), pagination: transformPagination(res.data.pagination),
filterMeta: res.data.filter_meta, filterMeta: res.data.filter_meta,
}), }),
initialDataUpdatedAt: 0,
initialData: {
data:{
sales_estimates: [],
pagination: {
page: 1,
pageSize: 12,
total: 0,
},
filter_meta: {},
}
},
...props, ...props,
}, },
); );
return {
...states,
data: defaultTo(states.data, {
estimates: [],
pagination: {
page: 1,
pageSize: 12,
total: 0,
},
filterMeta: {},
}),
};
} }
/** /**
@@ -99,8 +110,12 @@ export function useDeleteEstimate(props) {
const apiRequest = useApiRequest(); const apiRequest = useApiRequest();
return useMutation((id) => apiRequest.delete(`sales/estimates/${id}`), { return useMutation((id) => apiRequest.delete(`sales/estimates/${id}`), {
onSuccess: () => { onSuccess: (res, id) => {
queryClient.invalidateQueries('SALE_ESTIMATES'); // Common invalidate queries.
commonInvalidateQueries(queryClient);
// Invalidate specific sale estimate.
queryClient.invalidateQueries([t.SALE_ESTIMATE, id]);
}, },
...props, ...props,
}); });
@@ -116,8 +131,12 @@ export function useDeliverEstimate(props) {
return useMutation( return useMutation(
(id) => apiRequest.post(`sales/estimates/${id}/deliver`), (id) => apiRequest.post(`sales/estimates/${id}/deliver`),
{ {
onSuccess: () => { onSuccess: (res, id) => {
queryClient.invalidateQueries('SALE_ESTIMATES'); // Common invalidate queries.
commonInvalidateQueries(queryClient);
// Invalidate specific sale estimate.
queryClient.invalidateQueries([t.SALE_ESTIMATE, id]);
}, },
...props, ...props,
}, },
@@ -134,8 +153,12 @@ export function useApproveEstimate(props) {
return useMutation( return useMutation(
(id) => apiRequest.post(`sales/estimates/${id}/approve`), (id) => apiRequest.post(`sales/estimates/${id}/approve`),
{ {
onSuccess: () => { onSuccess: (res, id) => {
queryClient.invalidateQueries('SALE_ESTIMATES'); // Common invalidate queries.
commonInvalidateQueries(queryClient);
// Invalidate specific sale estimate.
queryClient.invalidateQueries([t.SALE_ESTIMATE, id]);
}, },
...props, ...props,
}, },
@@ -152,8 +175,12 @@ export function useRejectEstimate(props) {
return useMutation( return useMutation(
(id) => apiRequest.post(`sales/estimates/${id}/reject`), (id) => apiRequest.post(`sales/estimates/${id}/reject`),
{ {
onSuccess: () => { onSuccess: (res, id) => {
queryClient.invalidateQueries('SALE_ESTIMATES'); // Common invalidate queries.
commonInvalidateQueries(queryClient);
// Invalidate specific sale estimate.
queryClient.invalidateQueries([t.SALE_ESTIMATE, id]);
}, },
...props, ...props,
}, },

View File

@@ -1,7 +1,7 @@
import { useQuery, useMutation, useQueryClient } from 'react-query'; import { useQuery, useMutation, useQueryClient } from 'react-query';
import { defaultTo } from 'lodash';
import useApiRequest from '../useRequest'; import useApiRequest from '../useRequest';
import { transformPagination } from 'utils'; import { transformPagination } from 'utils';
import t from './types';
const defaultPagination = { const defaultPagination = {
pageSize: 12, pageSize: 12,
@@ -9,14 +9,27 @@ const defaultPagination = {
pagesCount: 0, pagesCount: 0,
}; };
// Common invalidate queries.
const commonInvalidateQueries = (queryClient) => {
// Invalidate expenses.
queryClient.invalidateQueries(t.EXPENSES);
// Invalidate accounts.
queryClient.invalidateQueries(t.ACCOUNTS);
queryClient.invalidateQueries(t.ACCOUNT);
// Invalidate financial reports.
queryClient.invalidateQueries(t.FINANCIAL_REPORT);
};
/** /**
* Retrieve the expenses list. * Retrieve the expenses list.
*/ */
export function useExpenses(query, props) { export function useExpenses(query, props) {
const apiRequest = useApiRequest(); const apiRequest = useApiRequest();
const states = useQuery( return useQuery(
['EXPENSES', query], [t.EXPENSES, query],
() => apiRequest.get(`expenses`, { params: { ...query } }), () => apiRequest.get(`expenses`, { params: { ...query } }),
{ {
select: (response) => ({ select: (response) => ({
@@ -24,18 +37,17 @@ export function useExpenses(query, props) {
pagination: transformPagination(response.data.pagination), pagination: transformPagination(response.data.pagination),
filterMeta: response.data.filter_meta, filterMeta: response.data.filter_meta,
}), }),
initialDataUpdatedAt: 0,
initialData: {
data: {
expenses: [],
pagination: defaultPagination,
filter_meta: {},
},
},
...props, ...props,
}, },
); );
return {
...states,
data: defaultTo(states.data, {
customers: [],
pagination: defaultPagination,
filterMeta: {},
}),
};
} }
/** /**
@@ -45,19 +57,20 @@ export function useExpenses(query, props) {
export function useExpense(id, props) { export function useExpense(id, props) {
const apiRequest = useApiRequest(); const apiRequest = useApiRequest();
const states = useQuery( return useQuery(
['EXPENSE', id], [t.EXPENSE, id],
() => apiRequest.get(`expenses/${id}`), () => apiRequest.get(`expenses/${id}`),
{ {
select: (res) => res.data.expense, select: (res) => res.data.expense,
initialDataUpdatedAt: 0,
initialData: {
data: {
expense: {},
}
},
...props, ...props,
}, },
); );
return {
...states,
data: defaultTo(states.data, {}),
};
} }
/** /**
@@ -68,9 +81,12 @@ export function useDeleteExpense(props) {
const queryClient = useQueryClient(); const queryClient = useQueryClient();
return useMutation((id) => apiRequest.delete(`expenses/${id}`), { return useMutation((id) => apiRequest.delete(`expenses/${id}`), {
onSuccess: () => { onSuccess: (res, id) => {
queryClient.invalidateQueries('EXPENSES'); // Invalidate specific expense.
queryClient.invalidateQueries('EXPENSE'); queryClient.invalidateQueries([t.EXPENSE, id]);
// Common invalidate queries.
commonInvalidateQueries(queryClient);
}, },
...props, ...props,
}); });
@@ -86,9 +102,12 @@ export function useEditExpense(props) {
return useMutation( return useMutation(
([id, values]) => apiRequest.post(`expenses/${id}`, values), ([id, values]) => apiRequest.post(`expenses/${id}`, values),
{ {
onSuccess: () => { onSuccess: (res, [id, values]) => {
queryClient.invalidateQueries('EXPENSES'); // Invalidate specific expense.
queryClient.invalidateQueries('EXPENSE'); queryClient.invalidateQueries([t.EXPENSE, id]);
// Common invalidate queries.
commonInvalidateQueries(queryClient);
}, },
...props, ...props,
}, },
@@ -103,9 +122,9 @@ export function useCreateExpense(props) {
const apiRequest = useApiRequest(); const apiRequest = useApiRequest();
return useMutation((values) => apiRequest.post('expenses', values), { return useMutation((values) => apiRequest.post('expenses', values), {
onSuccess: () => { onSuccess: (res, [values]) => {
queryClient.invalidateQueries('EXPENSES'); // Common invalidate queries.
queryClient.invalidateQueries('EXPENSE'); commonInvalidateQueries(queryClient);
}, },
...props, ...props,
}); });
@@ -119,9 +138,12 @@ export function usePublishExpense(props) {
const apiRequest = useApiRequest(); const apiRequest = useApiRequest();
return useMutation((id) => apiRequest.post(`expenses/${id}/publish`), { return useMutation((id) => apiRequest.post(`expenses/${id}/publish`), {
onSuccess: () => { onSuccess: (res, id) => {
queryClient.invalidateQueries('EXPENSES'); // Invalidate specific expense.
queryClient.invalidateQueries('EXPENSE'); queryClient.invalidateQueries([t.EXPENSE, id]);
// Common invalidate queries.
commonInvalidateQueries(queryClient);
}, },
...props, ...props,
}); });

View File

@@ -10,6 +10,7 @@ import {
APAgingSummaryTableRowsMapper APAgingSummaryTableRowsMapper
} from 'containers/FinancialStatements/reducers'; } from 'containers/FinancialStatements/reducers';
import useApiRequest from '../useRequest'; import useApiRequest from '../useRequest';
import t from './types';
/** /**
* Retrieve balance sheet. * Retrieve balance sheet.
@@ -18,7 +19,7 @@ export function useBalanceSheet(query, props) {
const apiRequest = useApiRequest(); const apiRequest = useApiRequest();
const states = useQuery( const states = useQuery(
['FINANCIAL-REPORT', 'BALANCE-SHEET', query], [t.FINANCIAL_REPORT, t.BALANCE_SHEET, query],
() => () =>
apiRequest.get('/financial_statements/balance_sheet', { apiRequest.get('/financial_statements/balance_sheet', {
params: query, params: query,
@@ -50,7 +51,7 @@ export function useTrialBalanceSheet(query, props) {
const apiRequest = useApiRequest(); const apiRequest = useApiRequest();
const states = useQuery( const states = useQuery(
['FINANCIAL-REPORT', 'TRIAL-BALANCE-SHEET', query], [t.FINANCIAL_REPORT, t.TRIAL_BALANCE_SHEET, query],
() => () =>
apiRequest.get('/financial_statements/trial_balance_sheet', { apiRequest.get('/financial_statements/trial_balance_sheet', {
params: query, params: query,
@@ -81,7 +82,7 @@ export function useProfitLossSheet(query, props) {
const apiRequest = useApiRequest(); const apiRequest = useApiRequest();
const states = useQuery( const states = useQuery(
['FINANCIAL-REPORT', 'PROFIT-LOSS-SHEET', query], [t.FINANCIAL_REPORT, t.PROFIT_LOSS_SHEET, query],
() => () =>
apiRequest.get('/financial_statements/profit_loss_sheet', { apiRequest.get('/financial_statements/profit_loss_sheet', {
params: query, params: query,
@@ -112,7 +113,7 @@ export function useGeneralLedgerSheet(query, props) {
const apiRequest = useApiRequest(); const apiRequest = useApiRequest();
const states = useQuery( const states = useQuery(
['FINANCIAL-REPORT', 'GENERAL-LEDGER', query], [t.FINANCIAL_REPORT, t.GENERAL_LEDGER, query],
() => () =>
apiRequest.get('/financial_statements/general_ledger', { apiRequest.get('/financial_statements/general_ledger', {
params: query, params: query,
@@ -143,7 +144,7 @@ export function useJournalSheet(query, props) {
const apiRequest = useApiRequest(); const apiRequest = useApiRequest();
const states = useQuery( const states = useQuery(
['FINANCIAL-REPORT', 'JOURNAL', query], [t.FINANCIAL_REPORT, t.JOURNAL, query],
() => apiRequest.get('/financial_statements/journal', { params: query }), () => apiRequest.get('/financial_statements/journal', { params: query }),
{ {
select: (res) => ({ select: (res) => ({
@@ -165,13 +166,13 @@ export function useJournalSheet(query, props) {
} }
/** /**
* Retrieve AR aging summary report. * Retrieve A/R aging summary report.
*/ */
export function useARAgingSummaryReport(query, props) { export function useARAgingSummaryReport(query, props) {
const apiRequest = useApiRequest(); const apiRequest = useApiRequest();
return useQuery( return useQuery(
['FINANCIAL-REPORT', 'AR-AGING-SUMMARY', query], [t.FINANCIAL_REPORT, t.AR_AGING_SUMMARY, query],
() => () =>
apiRequest.get('/financial_statements/receivable_aging_summary', { apiRequest.get('/financial_statements/receivable_aging_summary', {
params: query, params: query,
@@ -204,13 +205,13 @@ export function useARAgingSummaryReport(query, props) {
} }
/** /**
* Retrieve AP aging summary report. * Retrieve A/P aging summary report.
*/ */
export function useAPAgingSummaryReport(query, props) { export function useAPAgingSummaryReport(query, props) {
const apiRequest = useApiRequest(); const apiRequest = useApiRequest();
return useQuery( return useQuery(
['FINANCIAL-REPORT', 'AP-AGING-SUMMARY', query], [t.FINANCIAL_REPORT, t.AP_AGING_SUMMARY, query],
() => () =>
apiRequest.get('/financial_statements/payable_aging_summary', { apiRequest.get('/financial_statements/payable_aging_summary', {
params: query, params: query,

View File

@@ -1,13 +1,23 @@
import { useMutation, useQuery, useQueryClient } from 'react-query'; import { useMutation, useQuery, useQueryClient } from 'react-query';
import { defaultTo } from 'lodash';
import { transformPagination } from 'utils'; import { transformPagination } from 'utils';
import useApiRequest from '../useRequest'; import useApiRequest from '../useRequest';
import t from './types';
const invalidateQueries = (queryClient) => {
queryClient.invalidateQueries('INVENTORY_ADJUSTMENTS');
queryClient.invalidateQueries('ITEMS'); const commonInvalidateQueries = (queryClient) => {
queryClient.invalidateQueries('ITEM'); // Invalidate inventory adjustments.
queryClient.invalidateQueries(t.INVENTORY_ADJUSTMENTS);
// Invalidate items.
queryClient.invalidateQueries(t.ITEMS);
queryClient.invalidateQueries(t.ITEM);
// Invalidate accounts.
queryClient.invalidateQueries(t.ACCOUNTS);
queryClient.invalidateQueries(t.ACCOUNT);
// Invalidate financial reports.
queryClient.invalidateQueries(t.FINANCIAL_REPORT);
}; };
/** /**
@@ -21,7 +31,8 @@ export function useCreateInventoryAdjustment(props) {
(values) => apiRequest.post('inventory_adjustments/quick', values), (values) => apiRequest.post('inventory_adjustments/quick', values),
{ {
onSuccess: () => { onSuccess: () => {
invalidateQueries(queryClient) // Common invalidate queries.
commonInvalidateQueries(queryClient);
}, },
...props, ...props,
}, },
@@ -38,8 +49,9 @@ export function useDeleteInventoryAdjustment(props) {
return useMutation( return useMutation(
(id) => apiRequest.delete(`inventory_adjustments/${id}`), (id) => apiRequest.delete(`inventory_adjustments/${id}`),
{ {
onSuccess: () => { onSuccess: (res, id) => {
invalidateQueries(queryClient) // Common invalidate queries.
commonInvalidateQueries(queryClient);
}, },
...props ...props
}, },
@@ -59,22 +71,24 @@ const inventoryAdjustmentsTransformer = (response) => {
export function useInventoryAdjustments(query, props) { export function useInventoryAdjustments(query, props) {
const apiRequest = useApiRequest(); const apiRequest = useApiRequest();
const states = useQuery( return useQuery(
['INVENTORY_ADJUSTMENTS', query], ['INVENTORY_ADJUSTMENTS', query],
() => apiRequest.get('inventory_adjustments', { params: query }) () => apiRequest.get('inventory_adjustments', { params: query })
.then(inventoryAdjustmentsTransformer), .then(inventoryAdjustmentsTransformer),
props, {
initialDataUpdatedAt: 0,
initialData: {
data: {
transactions: [],
pagination: {
page: 1,
pageSize: 12,
total: 0,
pagesCount: 0,
},
}
},
...props
},
); );
return {
...states,
data: defaultTo(states.data, {
transactions: [],
pagination: {
page: 1,
pageSize: 12,
total: 0,
pagesCount: 0,
}
})
}
} }

View File

@@ -1,7 +1,30 @@
import { defaultTo } from 'lodash';
import { useQueryClient, useQuery, useMutation } from 'react-query'; import { useQueryClient, useQuery, useMutation } from 'react-query';
import { transformPagination } from 'utils'; import { transformPagination } from 'utils';
import useApiRequest from '../useRequest'; import useApiRequest from '../useRequest';
import t from './types';
// Common invalidate queries.
const commonInvalidateQueries = (queryClient) => {
// Invalidate invoices.
queryClient.invalidateQueries(t.SALE_INVOICES);
// Invalidate customers.
queryClient.invalidateQueries(t.CUSTOMERS);
// Invalidate accounts.
queryClient.invalidateQueries(t.ITEMS);
queryClient.invalidateQueries(t.ITEM);
// Invalidate settings.
queryClient.invalidateQueries([t.SETTING, t.SETTING_INVOICES]);
// Invalidate financial reports.
queryClient.invalidateQueries(t.FINANCIAL_REPORT);
// Invalidate accounts.
queryClient.invalidateQueries(t.ACCOUNTS);
queryClient.invalidateQueries(t.ACCOUNT);
};
/** /**
* Creates a new sale invoice. * Creates a new sale invoice.
@@ -11,13 +34,12 @@ export function useCreateInvoice(props) {
const apiRequest = useApiRequest(); const apiRequest = useApiRequest();
return useMutation((values) => apiRequest.post('sales/invoices', values), { return useMutation((values) => apiRequest.post('sales/invoices', values), {
onSuccess: (values) => { onSuccess: (res, values) => {
queryClient.invalidateQueries('SALE_INVOICES'); // Invalidate invoice customer.
queryClient.invalidateQueries([t.CUSTOMER, values.customer_id]);
queryClient.invalidateQueries('CUSTOMERS'); // Common invalidate queries.
queryClient.invalidateQueries(['CUSTOMER', values.customer_id]); commonInvalidateQueries(queryClient);
queryClient.invalidateQueries(['SETTINGS', 'INVOICES']);
}, },
...props, ...props,
}); });
@@ -34,10 +56,14 @@ export function useEditInvoice(props) {
([id, values]) => apiRequest.post(`sales/invoices/${id}`, values), ([id, values]) => apiRequest.post(`sales/invoices/${id}`, values),
{ {
onSuccess: (res, [id, values]) => { onSuccess: (res, [id, values]) => {
queryClient.invalidateQueries('SALE_INVOICES'); // Invalidate specific sale invoice.
queryClient.invalidateQueries(['SALE_INVOICE', id]); queryClient.invalidateQueries([t.SALE_INVOICE, id]);
queryClient.invalidateQueries('CUSTOMERS');
queryClient.invalidateQueries(['CUSTOMER', values.customer_id]); // Invalidate invoice customer.
queryClient.invalidateQueries([t.CUSTOMER, values.customer_id]);
// Common invalidate queries.
commonInvalidateQueries(queryClient);
}, },
...props, ...props,
}, },
@@ -53,9 +79,11 @@ export function useDeleteInvoice(props) {
return useMutation((id) => apiRequest.delete(`sales/invoices/${id}`), { return useMutation((id) => apiRequest.delete(`sales/invoices/${id}`), {
onSuccess: (res, id) => { onSuccess: (res, id) => {
queryClient.invalidateQueries('SALE_INVOICES'); // Invalidate specific invoice.
queryClient.invalidateQueries(['SALE_INVOICE', id]); queryClient.invalidateQueries([t.SALE_INVOICE, id]);
queryClient.invalidateQueries('CUSTOMERS');
// Common invalidate queries.
commonInvalidateQueries(queryClient);
}, },
...props, ...props,
}); });
@@ -67,8 +95,8 @@ export function useDeleteInvoice(props) {
export function useInvoices(query, props) { export function useInvoices(query, props) {
const apiRequest = useApiRequest(); const apiRequest = useApiRequest();
const states = useQuery( return useQuery(
['SALE_INVOICES', query], [t.SALE_INVOICES, query],
() => apiRequest.get('sales/invoices', { params: query }), () => apiRequest.get('sales/invoices', { params: query }),
{ {
select: (res) => ({ select: (res) => ({
@@ -76,22 +104,21 @@ export function useInvoices(query, props) {
pagination: transformPagination(res.data.pagination), pagination: transformPagination(res.data.pagination),
filterMeta: res.data.filter_meta, filterMeta: res.data.filter_meta,
}), }),
initialDataUpdatedAt: 0,
initialData: {
data: {
sales_invoices: [],
pagination: {
page: 1,
pageSize: 12,
total: 0,
},
filter_meta: {},
},
},
...props, ...props,
}, },
); );
return {
...states,
data: defaultTo(states.data, {
invoices: [],
pagination: {
page: 1,
pageSize: 12,
total: 0,
},
filterMeta: {},
}),
};
} }
/** /**
@@ -101,35 +128,42 @@ export function useDeliverInvoice(props) {
const queryClient = useQueryClient(); const queryClient = useQueryClient();
const apiRequest = useApiRequest(); const apiRequest = useApiRequest();
return useMutation((id) => apiRequest.post(`sales/invoices/${id}/deliver`), { return useMutation(
onSuccess: (res, id) => { (invoiceId) => apiRequest.post(`sales/invoices/${invoiceId}/deliver`),
queryClient.invalidateQueries('SALE_INVOICES'); {
queryClient.invalidateQueries(['SALE_INVOICE', id]); onSuccess: (res, invoiceId) => {
queryClient.invalidateQueries('CUSTOMERS'); // Invalidate specific invoice.
queryClient.invalidateQueries([t.SALE_INVOICE, invoiceId]);
// Common invalidate queries.
commonInvalidateQueries(queryClient);
},
...props,
}, },
...props, );
});
} }
/** /**
* Retrieve the sale invoice details. * Retrieve the sale invoice details.
* @param {number} invoiceId - Invoice id.
*/ */
export function useInvoice(id, props) { export function useInvoice(invoiceId, props) {
const apiRequest = useApiRequest(); const apiRequest = useApiRequest();
const states = useQuery( return useQuery(
['SALE_INVOICE', id], [t.SALE_INVOICE, invoiceId],
() => apiRequest.get(`sales/invoices/${id}`), () => apiRequest.get(`sales/invoices/${invoiceId}`),
{ {
select: (res) => res.data.sale_invoice, select: (res) => res.data.sale_invoice,
initialDataUpdatedAt: 0,
initialData: {
data: {
sale_invoice: {}
},
},
...props, ...props,
}, },
); );
return {
...states,
data: defaultTo(states.data, {}),
};
} }
/** /**
@@ -139,8 +173,8 @@ export function useInvoice(id, props) {
export function useDueInvoices(customerId, props) { export function useDueInvoices(customerId, props) {
const apiRequest = useApiRequest(); const apiRequest = useApiRequest();
const states = useQuery( return useQuery(
['SALE_INVOICE_DUE', customerId], [t.SALE_INVOICES, t.SALE_INVOICES_DUE, customerId],
() => () =>
apiRequest.get(`sales/invoices/payable`, { apiRequest.get(`sales/invoices/payable`, {
params: { customer_id: customerId }, params: { customer_id: customerId },
@@ -156,9 +190,4 @@ export function useDueInvoices(customerId, props) {
...props, ...props,
}, },
); );
return {
...states,
data: defaultTo(states.data, []),
};
} }

View File

@@ -1,14 +1,23 @@
import { useMutation, useQuery, useQueryClient } from 'react-query'; import { useMutation, useQuery, useQueryClient } from 'react-query';
import { defaultTo } from 'lodash';
import { transformPagination, transformResponse } from 'utils'; import { transformPagination, transformResponse } from 'utils';
import useApiRequest from '../useRequest'; import useApiRequest from '../useRequest';
import t from './types';
const defaultPagination = { const DEFAULT_PAGINATION = {
pageSize: 12, pageSize: 12,
page: 0, page: 0,
pagesCount: 0, pagesCount: 0,
}; };
// Common invalidate queries.
const commonInvalidateQueries = (queryClient) => {
// Invalidate items.
queryClient.invalidateQueries(t.ITEMS);
// Invalidate items categories.
queryClient.invalidateQueries(t.ITEMS_CATEGORIES);
};
/** /**
* Creates a new item. * Creates a new item.
*/ */
@@ -17,9 +26,8 @@ export function useCreateItem(props) {
const apiRequest = useApiRequest(); const apiRequest = useApiRequest();
return useMutation((values) => apiRequest.post('items', values), { return useMutation((values) => apiRequest.post('items', values), {
onSuccess: () => { onSuccess: (res, values) => {
queryClient.invalidateQueries('ITEMS'); commonInvalidateQueries(queryClient);
queryClient.invalidateQueries('ITEMS_CATEGORIES');
}, },
...props, ...props,
}); });
@@ -33,10 +41,12 @@ export function useEditItem(props) {
const apiRequest = useApiRequest(); const apiRequest = useApiRequest();
return useMutation(([id, values]) => apiRequest.post(`items/${id}`, values), { return useMutation(([id, values]) => apiRequest.post(`items/${id}`, values), {
onSuccess: () => { onSuccess: (res, [id, values]) => {
queryClient.invalidateQueries('ITEMS'); // Invalidate specific item.
queryClient.invalidateQueries('ITEM'); queryClient.invalidateQueries([t.ITEM, id]);
queryClient.invalidateQueries('ITEMS_CATEGORIES');
// Common invalidate queries.
commonInvalidateQueries(queryClient);
}, },
...props, ...props,
}); });
@@ -50,10 +60,50 @@ export function useDeleteItem(props) {
const apiRequest = useApiRequest(); const apiRequest = useApiRequest();
return useMutation((id) => apiRequest.delete(`items/${id}`), { return useMutation((id) => apiRequest.delete(`items/${id}`), {
onSuccess: () => { onSuccess: (res, id) => {
queryClient.invalidateQueries('ITEMS'); // Invalidate specific item.
queryClient.invalidateQueries('ITEM'); queryClient.invalidateQueries([t.ITEM, id]);
queryClient.invalidateQueries('ITEMS_CATEGORIES');
// Common invalidate queries.
commonInvalidateQueries(queryClient);
},
...props,
});
}
/**
* Activate the given item.
*/
export function useActivateItem(props) {
const queryClient = useQueryClient();
const apiRequest = useApiRequest();
return useMutation((id) => apiRequest.post(`items/${id}/activate`), {
onSuccess: (res, id) => {
// Invalidate specific item.
queryClient.invalidateQueries([t.ITEM, id]);
// Common invalidate queries.
commonInvalidateQueries(queryClient);
},
...props,
});
}
/**
* Inactivate the given item.
*/
export function useInactivateItem(props) {
const queryClient = useQueryClient();
const apiRequest = useApiRequest();
return useMutation((id) => apiRequest.post(`items/${id}/inactivate`), {
onSuccess: (res, id) => {
// Invalidate specific item.
queryClient.invalidateQueries([t.ITEM, id]);
// Common invalidate queries.
commonInvalidateQueries(queryClient);
}, },
...props, ...props,
}); });
@@ -76,21 +126,19 @@ const transformItemsResponse = (response) => {
export function useItems(query, props) { export function useItems(query, props) {
const apiRequest = useApiRequest(); const apiRequest = useApiRequest();
const result = useQuery( return useQuery(
['ITEMS', query], ['ITEMS', query],
() => () => apiRequest.get(`items`, { params: query }).then(transformItemsResponse),
apiRequest.get(`items`, { params: query }).then(transformItemsResponse), {
props, initialDataUpdatedAt: 0,
initialData: {
items: [],
pagination: DEFAULT_PAGINATION,
filterMeta: {},
},
...props,
}
); );
return {
...result,
data: defaultTo(result.data, {
items: [],
pagination: defaultPagination,
filterMeta: {},
}),
};
} }
/** /**
@@ -103,38 +151,10 @@ export function useItem(id, props) {
return useQuery( return useQuery(
['ITEM', id], ['ITEM', id],
() => apiRequest.get(`items/${id}`).then((response) => response.data.item), () => apiRequest.get(`items/${id}`).then((response) => response.data.item),
props, {
initialDataUpdatedAt: 0,
initialData: {},
...props
},
); );
} }
/**
* Activate the given item.
*/
export function useActivateItem(props) {
const queryClient = useQueryClient();
const apiRequest = useApiRequest();
return useMutation((id) => apiRequest.post(`items/${id}/activate`), {
onSuccess: () => {
queryClient.invalidateQueries('ITEMS');
queryClient.invalidateQueries('ITEM');
},
...props,
});
}
/**
* Inactivate the given item.
*/
export function useInactivateItem(props) {
const queryClient = useQueryClient();
const apiRequest = useApiRequest();
return useMutation((id) => apiRequest.post(`items/${id}/inactivate`), {
onSuccess: () => {
queryClient.invalidateQueries('ITEMS');
queryClient.invalidateQueries('ITEM');
},
...props,
});
}

View File

@@ -1,6 +1,14 @@
import { useQuery, useMutation, useQueryClient } from 'react-query'; import { useQuery, useMutation, useQueryClient } from 'react-query';
import { defaultTo } from 'lodash';
import useApiRequest from '../useRequest'; import useApiRequest from '../useRequest';
import t from './types';
const commonInvalidateQueries = (queryClient) => {
// Invalidate items categories.
queryClient.invalidateQueries(t.ITEMS_CATEGORIES);
// Invalidate items.
queryClient.invalidateQueries(t.ITEMS);
};
/** /**
* Creates a new item category. * Creates a new item category.
@@ -11,7 +19,8 @@ export function useCreateItemCategory(props) {
return useMutation((values) => apiRequest.post('item_categories', values), { return useMutation((values) => apiRequest.post('item_categories', values), {
onSuccess: () => { onSuccess: () => {
queryClient.invalidateQueries('ITEMS_CATEGORIES'); // Common invalidate queries.
commonInvalidateQueries(queryClient);
}, },
...props, ...props,
}); });
@@ -27,9 +36,12 @@ export function useEditItemCategory(props) {
return useMutation( return useMutation(
([id, values]) => apiRequest.post(`item_categories/${id}`, values), ([id, values]) => apiRequest.post(`item_categories/${id}`, values),
{ {
onSuccess: () => { onSuccess: (res, [id, values]) => {
queryClient.invalidateQueries('ITEMS_CATEGORIES'); // Invalidate specific item category.
queryClient.invalidateQueries('ITEMS'); queryClient.invalidateQueries([t.ITEM_CATEGORY, id]);
// Common invalidate queries.
commonInvalidateQueries(queryClient);
}, },
...props, ...props,
}, },
@@ -44,44 +56,41 @@ export function useDeleteItemCategory(props) {
const apiRequest = useApiRequest(); const apiRequest = useApiRequest();
return useMutation((id) => apiRequest.delete(`item_categories/${id}`), { return useMutation((id) => apiRequest.delete(`item_categories/${id}`), {
onSuccess: () => { onSuccess: (res, id) => {
queryClient.invalidateQueries('ITEMS_CATEGORIES'); // Invalidate specific item category.
queryClient.invalidateQueries('ITEMS'); queryClient.invalidateQueries([t.ITEM_CATEGORY, id]);
// Common invalidate queries.
commonInvalidateQueries(queryClient);
}, },
...props, ...props,
}); });
} }
// Transforms items categories.
const transformItemsCategories = (response) => {
return {
itemsCategories: response.data.item_categories,
pagination: response.data.pagination,
};
};
/** /**
* Retrieve the items categories. * Retrieve the items categories.
*/ */
export function useItemsCategories(query, props) { export function useItemsCategories(query, props) {
const apiRequest = useApiRequest(); const apiRequest = useApiRequest();
const states = useQuery( return useQuery(
['ITEMS_CATEGORIES', query], [t.ITEMS_CATEGORIES, query],
() => () => apiRequest.get(`item_categories`, { params: query }),
apiRequest.get(`item_categories`, { params: query }).then( {
transformItemsCategories, select: (response) => ({
), itemsCategories: response.data.item_categories,
props, pagination: response.data.pagination,
}),
initialDataUpdatedAt: 0,
initialData: {
data: {
item_categories: [],
pagination: {}
},
},
...props,
},
); );
return {
...states,
data: defaultTo(states.data, {
itemsCategories: [],
pagination: {},
}),
};
} }
/** /**
@@ -91,15 +100,14 @@ export function useItemsCategories(query, props) {
export function useItemCategory(id, props) { export function useItemCategory(id, props) {
const apiRequest = useApiRequest(); const apiRequest = useApiRequest();
const states = useQuery( return useQuery(
['ITEMS_CATEGORY', id], [t.ITEM_CATEGORY, id],
() => () =>
apiRequest.get(`item_categories/${id}`).then((res) => res.data.category), apiRequest.get(`item_categories/${id}`).then((res) => res.data.category),
props, {
initialDataUpdatedAt: 0,
initialData: {},
...props,
},
); );
return {
...states,
data: defaultTo(states.data, {}),
};
} }

View File

@@ -2,6 +2,27 @@ import { defaultTo } from 'lodash';
import { useMutation, useQuery, useQueryClient } from 'react-query'; import { useMutation, useQuery, useQueryClient } from 'react-query';
import { transformPagination } from 'utils'; import { transformPagination } from 'utils';
import useApiRequest from '../useRequest'; import useApiRequest from '../useRequest';
import t from './types';
const commonInvalidateQueries = (client) => {
// Invalidate manual journals.
client.invalidateQueries(t.MANUAL_JOURNALS);
// Invalidate customers.
client.invalidateQueries(t.CUSTOMERS);
client.invalidateQueries(t.CUSTOMER);
// Invalidate vendors.
client.invalidateQueries(t.VENDORS);
client.invalidateQueries(t.VENDOR);
// Invalidate accounts.
client.invalidateQueries(t.ACCOUNTS);
client.invalidateQueries(t.ACCOUNT);
// Invalidate financial reports.
client.invalidateQueries(t.FINANCIAL_REPORT);
};
/** /**
* Creates a new manual journal. * Creates a new manual journal.
@@ -14,7 +35,8 @@ export function useCreateJournal(props) {
(values) => apiRequest.post('manual-journals', values), (values) => apiRequest.post('manual-journals', values),
{ {
onSuccess: () => { onSuccess: () => {
queryClient.invalidateQueries('JOURNALS'); // Common invalidate queries.
commonInvalidateQueries(queryClient);
}, },
...props ...props
}, },
@@ -32,8 +54,11 @@ export function useEditJournal(props) {
([id, values]) => apiRequest.post(`manual-journals/${id}`, values), ([id, values]) => apiRequest.post(`manual-journals/${id}`, values),
{ {
onSuccess: (res, [id]) => { onSuccess: (res, [id]) => {
queryClient.invalidateQueries('JOURNALS'); // Invalidate specific manual journal.
queryClient.invalidateQueries('JOURNAL', id); queryClient.invalidateQueries(t.MANUAL_JOURNAL, id);
// Common invalidate queries.
commonInvalidateQueries(queryClient);
}, },
...props ...props
}, },
@@ -51,8 +76,10 @@ export function useDeleteJournal(props) {
(id) => apiRequest.delete(`manual-journals/${id}`), (id) => apiRequest.delete(`manual-journals/${id}`),
{ {
onSuccess: (res, id) => { onSuccess: (res, id) => {
queryClient.invalidateQueries('JOURNALS'); // Invalidate specific manual journal.
queryClient.invalidateQueries('JOURNAL', id); queryClient.invalidateQueries(t.MANUAL_JOURNAL, id);
commonInvalidateQueries(queryClient);
}, },
...props ...props
}, },
@@ -70,8 +97,10 @@ export function usePublishJournal(props) {
(id) => apiRequest.post(`manual-journals/${id}/publish`), (id) => apiRequest.post(`manual-journals/${id}/publish`),
{ {
onSuccess: (res, id) => { onSuccess: (res, id) => {
queryClient.invalidateQueries('JOURNALS'); // Invalidate specific manual journal.
queryClient.invalidateQueries('JOURNAL', id); queryClient.invalidateQueries(t.MANUAL_JOURNAL, id);
commonInvalidateQueries(queryClient);
}, },
...props ...props
}, },
@@ -85,7 +114,7 @@ export function useJournals(query, props) {
const apiRequest = useApiRequest(); const apiRequest = useApiRequest();
const states = useQuery( const states = useQuery(
['JOURNALS', query], [t.MANUAL_JOURNALS, query],
() => apiRequest.get('manual-journals', { params: query }), () => apiRequest.get('manual-journals', { params: query }),
{ {
select: (response) => ({ select: (response) => ({
@@ -114,7 +143,7 @@ export function useJournal(id, props) {
const apiRequest = useApiRequest(); const apiRequest = useApiRequest();
return useQuery( return useQuery(
['JOURNAL', id], [t.MANUAL_JOURNAL, id],
() => apiRequest.get(`manual-journals/${id}`), () => apiRequest.get(`manual-journals/${id}`),
{ {
select: (res) => res.data.manual_journal, select: (res) => res.data.manual_journal,

View File

@@ -2,6 +2,32 @@ import { defaultTo } from 'lodash';
import { useMutation, useQuery, useQueryClient } from 'react-query'; import { useMutation, useQuery, useQueryClient } from 'react-query';
import { transformPagination } from 'utils'; import { transformPagination } from 'utils';
import useApiRequest from '../useRequest'; import useApiRequest from '../useRequest';
import t from './types';
const commonInvalidateQueries = (client) => {
// Invalidate payment mades.
client.invalidateQueries(t.PAYMENT_MADES);
// Invalidate payment made new entries.
client.invalidateQueries(t.PAYMENT_MADE_NEW_ENTRIES);
client.invalidateQueries(t.PAYMENT_MADE_EDIT_PAGE);
// Invalidate financial reports.
client.invalidateQueries(t.FINANCIAL_REPORT);
// Invalidate accounts.
client.invalidateQueries(t.ACCOUNTS);
client.invalidateQueries(t.ACCOUNT);
// Invalidate bills.
client.invalidateQueries(t.BILLS);
client.invalidateQueries(t.BILL);
// Invalidate vendors.
client.invalidateQueries(t.VENDORS);
client.invalidateQueries(t.VENDOR);
};
/** /**
* Retrieve payment mades list. * Retrieve payment mades list.
@@ -10,7 +36,7 @@ export function usePaymentMades(query, props) {
const apiRequest = useApiRequest(); const apiRequest = useApiRequest();
const states = useQuery( const states = useQuery(
['PAYMENT_MADES', query], [t.PAYMENT_MADES, query],
() => apiRequest.get('purchases/bill_payments', { params: query }), () => apiRequest.get('purchases/bill_payments', { params: query }),
{ {
select: (res) => ({ select: (res) => ({
@@ -43,8 +69,8 @@ export function useCreatePaymentMade(props) {
(values) => apiRequest.post('purchases/bill_payments', values), (values) => apiRequest.post('purchases/bill_payments', values),
{ {
onSuccess: (res, values) => { onSuccess: (res, values) => {
client.invalidateQueries('PAYMENT_MADES'); // Common invalidation queries.
client.invalidateQueries(['PAYMENT_MADE_NEW_PAGE_ENTRIES', values.vendor_id]); commonInvalidateQueries(client);
}, },
...props, ...props,
}, },
@@ -62,10 +88,11 @@ export function useEditPaymentMade(props) {
([id, values]) => apiRequest.post(`purchases/bill_payments/${id}`, values), ([id, values]) => apiRequest.post(`purchases/bill_payments/${id}`, values),
{ {
onSuccess: (res, [id, values]) => { onSuccess: (res, [id, values]) => {
client.invalidateQueries('PAYMENT_MADES'); // Common invalidation queries.
client.invalidateQueries(['PAYMENT_MADE', id]); commonInvalidateQueries(client);
client.invalidateQueries(['PAYMENT_MADE_NEW_PAGE_ENTRIES', values.vendor_id]); // Invalidate specific payment made.
client.invalidateQueries([t.PAYMENT_MADE, id]);
}, },
...props, ...props,
}, },
@@ -83,9 +110,11 @@ export function useDeletePaymentMade(props) {
(id) => apiRequest.delete(`purchases/bill_payments/${id}`), (id) => apiRequest.delete(`purchases/bill_payments/${id}`),
{ {
onSuccess: (res, id) => { onSuccess: (res, id) => {
client.invalidateQueries('PAYMENT_MADES'); // Common invalidation queries.
client.invalidateQueries(['PAYMENT_MADE', id]); commonInvalidateQueries(client);
// Invalidate specific payment made.
client.invalidateQueries([t.PAYMENT_MADE, id]);
}, },
...props, ...props,
}, },
@@ -99,7 +128,7 @@ export function usePaymentMadeEditPage(id, props) {
const apiRequest = useApiRequest(); const apiRequest = useApiRequest();
const states = useQuery( const states = useQuery(
['PAYMENT_MADE', id], [t.PAYMENT_MADE_EDIT_PAGE, id],
() => apiRequest.get(`purchases/bill_payments/${id}/edit-page`), () => apiRequest.get(`purchases/bill_payments/${id}/edit-page`),
{ {
select: (res) => ({ select: (res) => ({
@@ -124,7 +153,7 @@ export function usePaymentMadeNewPageEntries(vendorId, props) {
const apiRequest = useApiRequest(); const apiRequest = useApiRequest();
return useQuery( return useQuery(
['PAYMENT_MADE_NEW_PAGE_ENTRIES', vendorId], [t.PAYMENT_MADE_NEW_ENTRIES, vendorId],
() => () =>
apiRequest.get(`purchases/bill_payments/new-page/entries`, { apiRequest.get(`purchases/bill_payments/new-page/entries`, {
params: { vendor_id: vendorId }, params: { vendor_id: vendorId },
@@ -135,7 +164,7 @@ export function usePaymentMadeNewPageEntries(vendorId, props) {
initialData: { initialData: {
data: { data: {
entries: [], entries: [],
} },
}, },
...props, ...props,
}, },

View File

@@ -2,6 +2,29 @@ import { useMutation, useQuery, useQueryClient } from 'react-query';
import { defaultTo } from 'lodash'; import { defaultTo } from 'lodash';
import useApiRequest from '../useRequest'; import useApiRequest from '../useRequest';
import { transformPagination, saveInvoke } from 'utils'; import { transformPagination, saveInvoke } from 'utils';
import t from './types';
// Common invalidate queries.
const commonInvalidateQueries = (client) => {
// Invalidate payment receives.
client.invalidateQueries(t.PAYMENT_RECEIVES);
client.invalidateQueries(t.PAYMENT_RECEIVE_EDIT_PAGE);
// Invalidate invoices.
client.invalidateQueries(t.SALE_INVOICES);
client.invalidateQueries(t.SALE_INVOICE);
// Invalidate accounts.
client.invalidateQueries(t.ACCOUNTS);
client.invalidateQueries(t.ACCOUNT);
// Invalidate financial reports.
client.invalidateQueries(t.FINANCIAL_REPORT);
// Invalidate customers.
client.invalidateQueries(t.CUSTOMERS);
client.invalidateQueries(t.CUSTOMER);
};
/** /**
* Retrieve accounts list. * Retrieve accounts list.
@@ -10,7 +33,7 @@ export function usePaymentReceives(query, props) {
const apiRequest = useApiRequest(); const apiRequest = useApiRequest();
const states = useQuery( const states = useQuery(
['PAYMENT_RECEIVES', query], [t.PAYMENT_RECEIVES, query],
() => apiRequest.get('sales/payment_receives', { params: query }), () => apiRequest.get('sales/payment_receives', { params: query }),
{ {
select: (res) => ({ select: (res) => ({
@@ -47,11 +70,11 @@ export function useCreatePaymentReceive(props) {
(values) => apiRequest.post('sales/payment_receives', values), (values) => apiRequest.post('sales/payment_receives', values),
{ {
onSuccess: (data, values) => { onSuccess: (data, values) => {
client.invalidateQueries('PAYMENT_RECEIVES'); // Invalidate specific payment receive.
client.invalidateQueries('SALE_INVOICE_DUE'); commonInvalidateQueries(client);
client.invalidateQueries('SALE_INVOICES');
client.invalidateQueries('SALE_INVOICE'); // Invalidate payment receive settings.
client.invalidateQueries(['SETTINGS', 'PAYMENT_RECEIVES']); client.invalidateQueries([t.SETTING, t.SETTING_PAYMENT_RECEIVES]);
saveInvoke(props?.onSuccess, data); saveInvoke(props?.onSuccess, data);
}, },
@@ -70,12 +93,12 @@ export function useEditPaymentReceive(props) {
return useMutation( return useMutation(
([id, values]) => apiRequest.post(`sales/payment_receives/${id}`, values), ([id, values]) => apiRequest.post(`sales/payment_receives/${id}`, values),
{ {
onSuccess: (data) => { onSuccess: (data, [id, values]) => {
client.invalidateQueries('PAYMENT_RECEIVES'); // Invalidate specific payment receive.
client.invalidateQueries('SALE_INVOICE_DUE'); client.invalidateQueries([t.PAYMENT_RECEIVE, id]);
client.invalidateQueries('SALE_INVOICES');
client.invalidateQueries('SALE_INVOICE'); // Common invalidate queries.
client.invalidateQueries(['SETTINGS', 'PAYMENT_RECEIVES']); commonInvalidateQueries(client);
saveInvoke(props?.onSuccess, data); saveInvoke(props?.onSuccess, data);
}, },
@@ -94,11 +117,11 @@ export function useDeletePaymentReceive(props) {
return useMutation( return useMutation(
(id) => apiRequest.delete(`sales/payment_receives/${id}`), (id) => apiRequest.delete(`sales/payment_receives/${id}`),
{ {
onSuccess: (data, [id]) => { onSuccess: (data, id) => {
client.invalidateQueries('PAYMENT_RECEIVES'); // Invalidate specific payment receive.
client.invalidateQueries('SALE_INVOICE_DUE'); client.invalidateQueries([t.PAYMENT_RECEIVE, id]);
client.invalidateQueries('SALE_INVOICES');
client.invalidateQueries('SALE_INVOICE'); commonInvalidateQueries(client);
saveInvoke(props?.onSuccess, data); saveInvoke(props?.onSuccess, data);
}, },
@@ -115,7 +138,7 @@ export function usePaymentReceive(id, props) {
const apiRequest = useApiRequest(); const apiRequest = useApiRequest();
const states = useQuery( const states = useQuery(
['PAYMENT_RECEIVE', id], [t.PAYMENT_RECEIVE, id],
() => apiRequest.get(`sales/payment_receives/${id}`), () => apiRequest.get(`sales/payment_receives/${id}`),
{ {
select: (res) => ({ select: (res) => ({
@@ -139,7 +162,7 @@ export function usePaymentReceiveEditPage(id, props) {
const apiRequest = useApiRequest(); const apiRequest = useApiRequest();
const states = useQuery( const states = useQuery(
['PAYMENT_RECEIVE_EDIT_PAGE', id], [t.PAYMENT_RECEIVE_EDIT_PAGE, id],
() => apiRequest.get(`sales/payment_receives/${id}/edit-page`), () => apiRequest.get(`sales/payment_receives/${id}/edit-page`),
{ {
select: (res) => ({ select: (res) => ({

View File

@@ -2,6 +2,26 @@ import { useQueryClient, useQuery, useMutation } from 'react-query';
import { defaultTo } from 'lodash'; import { defaultTo } from 'lodash';
import useApiRequest from '../useRequest'; import useApiRequest from '../useRequest';
import { transformPagination } from 'utils'; import { transformPagination } from 'utils';
import t from './types';
const commonInvalidateQueries = (queryClient) => {
// Invalidate receipts.
queryClient.invalidateQueries(t.SALE_RECEIPTS);
// Invalidate accounts.
queryClient.invalidateQueries(t.ITEMS);
queryClient.invalidateQueries(t.ITEM);
// Invalidate accounts.
queryClient.invalidateQueries(t.ACCOUNTS);
queryClient.invalidateQueries(t.ACCOUNT);
// Invalidate financial reports.
queryClient.invalidateQueries(t.FINANCIAL_REPORT);
// Invalidate the settings.
queryClient.invalidateQueries([t.SETTING, t.SETTING_RECEIPTS]);
};
/** /**
* Creates a new sale invoice. * Creates a new sale invoice.
@@ -12,8 +32,8 @@ export function useCreateReceipt(props) {
return useMutation((values) => apiRequest.post('sales/receipts', values), { return useMutation((values) => apiRequest.post('sales/receipts', values), {
onSuccess: () => { onSuccess: () => {
queryClient.invalidateQueries('SALE_RECEIPTS'); // Invalidate queries.
queryClient.invalidateQueries(['SETTINGS', 'RECEIPTS']); commonInvalidateQueries(queryClient);
}, },
...props, ...props,
}); });
@@ -29,9 +49,12 @@ export function useEditReceipt(props) {
return useMutation( return useMutation(
([id, values]) => apiRequest.post(`sales/receipts/${id}`, values), ([id, values]) => apiRequest.post(`sales/receipts/${id}`, values),
{ {
onSuccess: () => { onSuccess: (res, [id, values]) => {
queryClient.invalidateQueries('SALE_RECEIPTS'); // Invalidate specific receipt.
queryClient.invalidateQueries(['SETTINGS', 'RECEIPTS']); queryClient.invalidateQueries([t.SALE_RECEIPT, id]);
// Invalidate queries.
commonInvalidateQueries(queryClient);
}, },
...props, ...props,
}, },
@@ -46,8 +69,12 @@ export function useDeleteReceipt(props) {
const apiRequest = useApiRequest(); const apiRequest = useApiRequest();
return useMutation((id) => apiRequest.delete(`sales/receipts/${id}`), { return useMutation((id) => apiRequest.delete(`sales/receipts/${id}`), {
onSuccess: () => { onSuccess: (res, id) => {
queryClient.invalidateQueries('SALE_RECEIPTS'); // Invalidate specific receipt.
queryClient.invalidateQueries([t.SALE_RECEIPT, id]);
// Invalidate queries.
commonInvalidateQueries(queryClient);
}, },
...props, ...props,
}); });
@@ -61,8 +88,11 @@ export function useCloseReceipt(props) {
const apiRequest = useApiRequest(); const apiRequest = useApiRequest();
return useMutation((id) => apiRequest.post(`sales/receipts/${id}/close`), { return useMutation((id) => apiRequest.post(`sales/receipts/${id}/close`), {
onSuccess: () => { onSuccess: (res, id) => {
queryClient.invalidateQueries('SALE_RECEIPTS'); queryClient.invalidateQueries([t.SALE_RECEIPT, id]);
// Invalidate queries.
commonInvalidateQueries(queryClient);
}, },
...props, ...props,
}); });

View File

@@ -13,7 +13,7 @@ export function useSaveSettings(props) {
return useMutation((settings) => apiRequest.post('settings', settings), { return useMutation((settings) => apiRequest.post('settings', settings), {
onSuccess: () => { onSuccess: () => {
queryClient.invalidateQueries('SETTINGS'); queryClient.invalidateQueries(t.SETTING);
}, },
...props, ...props,
}); });
@@ -51,7 +51,7 @@ function useSettingsQuery(key, query, props) {
* Retrieve the all settings of the organization. * Retrieve the all settings of the organization.
*/ */
export function useSettings() { export function useSettings() {
return useSettingsQuery(['SETTINGS', 'ALL'], {}); return useSettingsQuery([t.SETTING, 'ALL'], {});
} }
/** /**
@@ -59,7 +59,7 @@ export function useSettings() {
*/ */
export function useSettingsInvoices(props) { export function useSettingsInvoices(props) {
return useSettingsQuery( return useSettingsQuery(
['SETTINGS', 'INVOICES'], [t.SETTING, t.SETTING_INVOICES],
{ group: 'sale_invoices' }, { group: 'sale_invoices' },
props, props,
); );
@@ -70,7 +70,7 @@ export function useSettingsInvoices(props) {
*/ */
export function useSettingsEstimates(props) { export function useSettingsEstimates(props) {
return useSettingsQuery( return useSettingsQuery(
['SETTINGS', 'ESTIMATES'], [t.SETTING, t.SETTING_ESTIMATES],
{ group: 'sale_estimates' }, { group: 'sale_estimates' },
props, props,
); );
@@ -81,7 +81,7 @@ export function useSettingsEstimates(props) {
*/ */
export function useSettingsPaymentReceives(props) { export function useSettingsPaymentReceives(props) {
return useSettingsQuery( return useSettingsQuery(
['SETTINGS', 'PAYMENT_RECEIVES'], [t.SETTING, t.SETTING_PAYMENT_RECEIVES],
{ group: 'payment_receives' }, { group: 'payment_receives' },
props, props,
); );
@@ -93,7 +93,7 @@ export function useSettingsPaymentReceives(props) {
*/ */
export function useSettingsReceipts(props) { export function useSettingsReceipts(props) {
return useSettingsQuery( return useSettingsQuery(
['SETTINGS', 'RECEIPTS'], [t.SETTING, t.SETTING_RECEIPTS],
{ group: 'sale_receipts' }, { group: 'sale_receipts' },
props, props,
); );
@@ -105,7 +105,7 @@ export function useSettingsReceipts(props) {
*/ */
export function useSettingsManualJournals(props) { export function useSettingsManualJournals(props) {
return useSettingsQuery( return useSettingsQuery(
['SETTINGS', 'MANUAL_JOURNALS'], [t.SETTING, t.SETTING_MANUAL_JOURNALS],
{ group: 'sale_receipts' }, { group: 'sale_receipts' },
props, props,
); );

View File

@@ -0,0 +1,108 @@
const ACCOUNTS = {
ACCOUNT: 'ACCOUNT',
ACCOUNTS: 'ACCOUNTS',
ACCOUNTS_TYPES: 'ACCOUNTS_TYPES'
};
const FINANCIAL_REPORTS = {
FINANCIAL_REPORT: 'FINANCIAL-REPORT',
BALANCE_SHEET: 'BALANCE-SHEET',
TRIAL_BALANCE_SHEET: 'TRIAL-BALANCE-SHEET',
PROFIT_LOSS_SHEET: 'PROFIT-LOSS-SHEET',
GENERAL_LEDGER: 'GENERAL-LEDGER',
JOURNAL: 'JOURNAL',
AR_AGING_SUMMARY: 'AR-AGING-SUMMARY',
AP_AGING_SUMMARY: 'AP-AGING-SUMMARY',
};
const BILLS = {
BILLS: 'BILLS',
BILL: 'BILL',
BILLS_DUE: 'BILLS_DUE'
};
const VENDORS = {
VENDORS: 'VENDORS',
VENDOR: 'VENDOR',
};
const CUSTOMERS = {
CUSTOMERS: 'CUSTOMERS',
CUSTOMER: 'CUSTOMER',
};
const ITEMS = {
ITEMS: 'ITEMS',
ITEM: 'ITEM',
ITEMS_CATEGORIES: 'ITEMS_CATEGORIES',
};
const SALE_ESTIMATES = {
SALE_ESTIMATES: 'SALE_ESTIMATES',
SALE_ESTIMATE: 'SALE_ESTIMATE',
};
const SALE_RECEIPTS = {
SALE_RECEIPTS: 'SALE_RECEIPTS',
SALE_RECEIPT: 'SALE_RECEIPT',
}
const INVENTORY_ADJUSTMENTS = {
INVENTORY_ADJUSTMENTS: 'INVENTORY_ADJUSTMENTS',
};
const CURRENCIES = {
CURRENCIES: 'CURRENCIES',
};
const PAYMENT_MADES = {
PAYMENT_MADES: 'PAYMENT_MADES',
PAYMENT_MADE: 'PAYMENT_MADE',
PAYMENT_MADE_NEW_ENTRIES: 'PAYMENT_MADE_NEW_ENTRIES',
PAYMENT_MADE_EDIT_PAGE: 'PAYMENT_MADE_EDIT_PAGE',
};
const PAYMENT_RECEIVES = {
PAYMENT_RECEIVES: 'PAYMENT_RECEIVES',
PAYMENT_RECEIVE: 'PAYMENT_RECEIVE',
PAYMENT_RECEIVE_NEW_ENTRIES: 'PAYMENT_RECEIVE_NEW_ENTRIES',
PAYMENT_RECEIVE_EDIT_PAGE: 'PAYMENT_RECEIVE_EDIT_PAGE',
};
const SALE_INVOICES = {
SALE_INVOICES: 'SALE_INVOICES',
SALE_INVOICE: 'SALE_INVOICE',
SALE_INVOICES_DUE: 'SALE_INVOICES_DUE',
};
const USERS = {
USERS: 'USERS',
USER: 'USER'
};
const SETTING = {
SETTING: 'SETTING',
SETTING_INVOICES: 'SETTING_INVOICES',
SETTING_ESTIMATES: 'SETTING_ESTIMATES',
SETTING_RECEIPTS: 'SETTING_RECEIPTS',
SETTING_PAYMENT_RECEIVES: 'SETTING_PAYMENT_RECEIVES',
SETTING_MANUAL_JOURNALS: 'SETTING_MANUAL_JOURNALS',
};
export default {
...ACCOUNTS,
...BILLS,
...VENDORS,
...CUSTOMERS,
...FINANCIAL_REPORTS,
...ITEMS,
...SALE_ESTIMATES,
...INVENTORY_ADJUSTMENTS,
...CURRENCIES,
...SALE_RECEIPTS,
...PAYMENT_MADES,
...PAYMENT_RECEIVES,
...SALE_INVOICES,
...USERS,
...SETTING
}

View File

@@ -1,7 +1,12 @@
import { useMutation, useQueryClient, useQuery } from 'react-query'; import { useMutation, useQueryClient, useQuery } from 'react-query';
import { defaultTo } from 'lodash'; import { defaultTo } from 'lodash';
import useApiRequest from '../useRequest'; import useApiRequest from '../useRequest';
import t from './types';
// Common invalidate queries.
const commonInvalidateQueries = (queryClient) => {
queryClient.invalidateQueries(t.USERS);
};
/** /**
* Create a new invite user. * Create a new invite user.
@@ -12,7 +17,8 @@ export function useCreateInviteUser(props) {
return useMutation((values) => apiRequest.post('invite/send', values), { return useMutation((values) => apiRequest.post('invite/send', values), {
onSuccess: () => { onSuccess: () => {
queryClient.invalidateQueries('USERS'); // Common invalidate queries.
commonInvalidateQueries(queryClient);
}, },
...props, ...props,
}); });
@@ -27,8 +33,11 @@ export function useEditUser(props) {
const apiRequest = useApiRequest(); const apiRequest = useApiRequest();
return useMutation(([id, values]) => apiRequest.post(`users/${id}`, values), { return useMutation(([id, values]) => apiRequest.post(`users/${id}`, values), {
onSuccess: () => { onSuccess: (res, [id, values]) => {
queryClient.invalidateQueries('USERS'); queryClient.invalidateQueries([t.USER, id]);
// Common invalidate queries.
commonInvalidateQueries(queryClient);
}, },
...props, ...props,
}); });
@@ -42,9 +51,11 @@ export function useDeleteUser(props) {
const apiRequest = useApiRequest(); const apiRequest = useApiRequest();
return useMutation((id) => apiRequest.delete(`users/${id}`), { return useMutation((id) => apiRequest.delete(`users/${id}`), {
onSuccess: () => { onSuccess: (res, id) => {
queryClient.invalidateQueries('USERS'); queryClient.invalidateQueries([t.USER, id]);
queryClient.invalidateQueries('USER');
// Common invalidate queries.
commonInvalidateQueries(queryClient);
}, },
...props, ...props,
}); });
@@ -57,7 +68,7 @@ export function useUsers(props) {
const apiRequest = useApiRequest(); const apiRequest = useApiRequest();
const result = useQuery( const result = useQuery(
['USERS'], [t.USERS],
() => apiRequest.get(`USERS`).then((response) => response.data.users), () => apiRequest.get(`USERS`).then((response) => response.data.users),
props, props,
); );

View File

@@ -1,16 +1,29 @@
import { useMutation, useQuery, useQueryClient } from 'react-query'; import { useMutation, useQuery, useQueryClient } from 'react-query';
import { defaultTo } from 'lodash'; import t from './types';
import { transformPagination } from 'utils'; import { transformPagination } from 'utils';
import useApiRequest from '../useRequest'; import useApiRequest from '../useRequest';
// Common invalidate queries.
const commonInvalidateQueries = (queryClient) => {
// Invalidate vendors list.
queryClient.invalidateQueries(t.VENDORS);
// Invalidate financial reports.
queryClient.invalidateQueries(t.ACCOUNTS);
queryClient.invalidateQueries(t.ACCOUNT);
// Invalidate financial reports.
queryClient.invalidateQueries(t.FINANCIAL_REPORT);
};
/** /**
* Retrieve vendors list. * Retrieve vendors list.
*/ */
export function useVendors(query, props) { export function useVendors(query, props) {
const apiRequest = useApiRequest(); const apiRequest = useApiRequest();
const states = useQuery( return useQuery(
['VENDORS', query], [t.VENDORS, query],
() => apiRequest.get(`vendors`, { params: query }), () => apiRequest.get(`vendors`, { params: query }),
{ {
select: (res) => ({ select: (res) => ({
@@ -18,18 +31,17 @@ export function useVendors(query, props) {
pagination: transformPagination(res.data.pagination), pagination: transformPagination(res.data.pagination),
filterMeta: res.data.filter_meta, filterMeta: res.data.filter_meta,
}), }),
initialDataUpdatedAt: 0,
initialData: {
data: {
vendors: [],
pagination: {},
filter_meta: {},
},
},
...props, ...props,
}, },
); );
return {
...states,
data: defaultTo(states.data, {
vendors: [],
pagination: {},
filterMeta: {}
}),
};
} }
/** /**
@@ -42,11 +54,14 @@ export function useEditVendor(props) {
return useMutation( return useMutation(
([id, values]) => apiRequest.post(`vendors/${id}`, values), ([id, values]) => apiRequest.post(`vendors/${id}`, values),
{ {
onSuccess: () => { onSuccess: (res, [id, values]) => {
queryClient.invalidateQueries('VENDORS'); // Invalidate specific vendor.
queryClient.invalidateQueries('VENDOR'); queryClient.invalidateQueries([t.VENDOR, id]);
// Common invalidate queries.
commonInvalidateQueries(queryClient);
}, },
...props ...props,
}, },
); );
} }
@@ -58,15 +73,16 @@ export function useDeleteVendor(props) {
const queryClient = useQueryClient(); const queryClient = useQueryClient();
const apiRequest = useApiRequest(); const apiRequest = useApiRequest();
return useMutation( return useMutation((id) => apiRequest.delete(`vendors/${id}`), {
(id) => apiRequest.delete(`vendors/${id}`), onSuccess: (res, id) => {
{ // Invalidate specific vendor.
onSuccess: () => { queryClient.invalidateQueries([t.VENDOR, id]);
queryClient.invalidateQueries('VENDORS');
queryClient.invalidateQueries('VENDOR'); // Common invalidate queries.
}, commonInvalidateQueries(queryClient);
...props },
}); ...props,
});
} }
/** /**
@@ -76,15 +92,13 @@ export function useCreateVendor(props) {
const queryClient = useQueryClient(); const queryClient = useQueryClient();
const apiRequest = useApiRequest(); const apiRequest = useApiRequest();
return useMutation( return useMutation((values) => apiRequest.post('vendors', values), {
(values) => apiRequest.post('vendors', values), onSuccess: () => {
{ // Common invalidate queries.
onSuccess: () => { commonInvalidateQueries(queryClient);
queryClient.invalidateQueries('VENDORS'); },
}, ...props,
...props });
}
);
} }
/** /**
@@ -93,12 +107,12 @@ export function useCreateVendor(props) {
export function useVendor(id, props) { export function useVendor(id, props) {
const apiRequest = useApiRequest(); const apiRequest = useApiRequest();
return useQuery( return useQuery([t.VENDOR, id], () => apiRequest.get(`vendors/${id}`), {
['VENDOR', id], select: (res) => res.data.vendor,
() => apiRequest.get(`vendors/${id}`), initialDataUpdatedAt: 0,
{ initialData: {
select: (res) => res.data.vendor, data: { vendor: {} },
...props
}, },
); ...props,
});
} }

View File

@@ -59,7 +59,7 @@
font-size: 15px; font-size: 15px;
&:not([class*="bp3-intent-"]):not(.bp3-minimal) { &:not([class*="bp3-intent-"]):not(.bp3-minimal) {
color: rgba(255, 255, 255, 0.8); color: rgba(255, 255, 255, 0.85);
} }
&:hover, &:hover,
&:focus, &:focus,