Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails'
import useExpenseActions from '@hooks/useExpenseActions';
import useExportActions from '@hooks/useExportActions';
import useHoldRejectActions from '@hooks/useHoldRejectActions';
import useLastWorkspaceNumber from '@hooks/useLastWorkspaceNumber';
import {useMemoizedLazyExpensifyIcons} from '@hooks/useLazyAsset';
import useLifecycleActions from '@hooks/useLifecycleActions';
import useLocalize from '@hooks/useLocalize';
Expand All @@ -36,6 +37,7 @@ import useSearchShouldCalculateTotals from '@hooks/useSearchShouldCalculateTotal
import useStyleUtils from '@hooks/useStyleUtils';
import useThemeStyles from '@hooks/useThemeStyles';
import useTransactionsAndViolationsForReport from '@hooks/useTransactionsAndViolationsForReport';
import {generateDefaultWorkspaceName} from '@libs/actions/Policy/Policy';
import {search} from '@libs/actions/Search';
import getNonEmptyStringOnyxID from '@libs/getNonEmptyStringOnyxID';
import getPlatform from '@libs/getPlatform';
Expand Down Expand Up @@ -106,6 +108,7 @@ function MoneyReportHeaderSecondaryActionsInner({reportID, primaryAction, isRepo

const {isOffline} = useNetwork();
const activePolicy = usePolicy(activePolicyID);
const lastWorkspaceNumber = useLastWorkspaceNumber();

const {isBetaEnabled} = usePermissions();
const isASAPSubmitBetaEnabled = isBetaEnabled(CONST.BETAS.ASAP_SUBMIT);
Expand Down Expand Up @@ -167,6 +170,7 @@ function MoneyReportHeaderSecondaryActionsInner({reportID, primaryAction, isRepo
activePolicy,
betas,
isSelfTourViewed,
defaultWorkspaceName: generateDefaultWorkspaceName(email ?? '', lastWorkspaceNumber, translate),
});
} else {
startAnimation();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import useActiveAdminPolicies from '@hooks/useActiveAdminPolicies';
import useConfirmModal from '@hooks/useConfirmModal';
import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails';
import useExportActions from '@hooks/useExportActions';
import useLastWorkspaceNumber from '@hooks/useLastWorkspaceNumber';
import {useMemoizedLazyExpensifyIcons} from '@hooks/useLazyAsset';
import useLifecycleActions from '@hooks/useLifecycleActions';
import useLocalize from '@hooks/useLocalize';
Expand All @@ -36,6 +37,7 @@ import useSearchShouldCalculateTotals from '@hooks/useSearchShouldCalculateTotal
import useSelectedTransactionsActions from '@hooks/useSelectedTransactionsActions';
import useTransactionsAndViolationsForReport from '@hooks/useTransactionsAndViolationsForReport';
import useTransactionThreadReport from '@hooks/useTransactionThreadReport';
import {generateDefaultWorkspaceName} from '@libs/actions/Policy/Policy';
import {search} from '@libs/actions/Search';
import getNonEmptyStringOnyxID from '@libs/getNonEmptyStringOnyxID';
import {getTotalAmountForIOUReportPreviewButton} from '@libs/MoneyRequestReportUtils';
Expand Down Expand Up @@ -77,6 +79,7 @@ function MoneyReportHeaderSelectionDropdown({reportID, primaryAction, isReportIn
const isASAPSubmitBetaEnabled = isBetaEnabled(CONST.BETAS.ASAP_SUBMIT);
const isBulkSubmitApprovePayBetaEnabled = isBetaEnabled(CONST.BETAS.BULK_SUBMIT_APPROVE_PAY);
const activeAdminPolicies = useActiveAdminPolicies();
const lastWorkspaceNumber = useLastWorkspaceNumber();

const {selectedTransactionIDs, currentSearchQueryJSON, currentSearchKey, currentSearchResults} = useSearchStateContext();
const {clearSelectedTransactions} = useSearchActionsContext();
Expand Down Expand Up @@ -251,6 +254,7 @@ function MoneyReportHeaderSelectionDropdown({reportID, primaryAction, isReportIn
activePolicy,
betas,
isSelfTourViewed,
defaultWorkspaceName: generateDefaultWorkspaceName(email ?? '', lastWorkspaceNumber, translate),
});
} else {
payMoneyRequest({
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,15 @@ import {useSearchStateContext} from '@components/Search/SearchContext';
import AnimatedSettlementButton from '@components/SettlementButton/AnimatedSettlementButton';
import type {PaymentActionParams} from '@components/SettlementButton/types';
import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails';
import useLastWorkspaceNumber from '@hooks/useLastWorkspaceNumber';
import useLocalize from '@hooks/useLocalize';
import useNetwork from '@hooks/useNetwork';
import useOnyx from '@hooks/useOnyx';
import useParticipantsInvoiceReport from '@hooks/useParticipantsInvoiceReport';
import usePolicy from '@hooks/usePolicy';
import useSearchShouldCalculateTotals from '@hooks/useSearchShouldCalculateTotals';
import useTransactionsAndViolationsForReport from '@hooks/useTransactionsAndViolationsForReport';
import {generateDefaultWorkspaceName} from '@libs/actions/Policy/Policy';
import {search} from '@libs/actions/Search';
import getNonEmptyStringOnyxID from '@libs/getNonEmptyStringOnyxID';
import {getTotalAmountForIOUReportPreviewButton} from '@libs/MoneyRequestReportUtils';
Expand All @@ -35,9 +38,11 @@ type PayPrimaryActionProps = {
function PayPrimaryAction({reportID, chatReportID}: PayPrimaryActionProps) {
const {isPaidAnimationRunning, isApprovedAnimationRunning, stopAnimation, startAnimation, startApprovedAnimation} = usePaymentAnimationsContext();
const {isOffline} = useNetwork();
const {translate} = useLocalize();
const {accountID, email} = useCurrentUserPersonalDetails();
const {isDelegateAccessRestricted} = useDelegateNoAccessState();
const {showDelegateNoAccessModal} = useDelegateNoAccessActions();
const lastWorkspaceNumber = useLastWorkspaceNumber();

const {moneyRequestReport, chatReport, transaction} = useTransactionThreadData(reportID, chatReportID);

Expand Down Expand Up @@ -112,6 +117,7 @@ function PayPrimaryAction({reportID, chatReportID}: PayPrimaryActionProps) {
activePolicy,
betas,
isSelfTourViewed,
defaultWorkspaceName: generateDefaultWorkspaceName(email ?? '', lastWorkspaceNumber, translate),
});
} else {
startAnimation();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,15 @@ import {useDelegateNoAccessActions, useDelegateNoAccessState} from '@components/
import AnimatedSettlementButton from '@components/SettlementButton/AnimatedSettlementButton';
import type {PaymentActionParams} from '@components/SettlementButton/types';
import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails';
import useLastWorkspaceNumber from '@hooks/useLastWorkspaceNumber';
import useLocalize from '@hooks/useLocalize';
import useNetwork from '@hooks/useNetwork';
import useOnyx from '@hooks/useOnyx';
import useParticipantsInvoiceReport from '@hooks/useParticipantsInvoiceReport';
import usePermissions from '@hooks/usePermissions';
import usePolicy from '@hooks/usePolicy';
import useReportTransactionsCollection from '@hooks/useReportTransactionsCollection';
import {generateDefaultWorkspaceName} from '@libs/actions/Policy/Policy';
import {getTotalAmountForIOUReportPreviewButton} from '@libs/MoneyRequestReportUtils';
import {hasHeldExpenses as hasHeldExpensesReportUtils, hasUpdatedTotal, hasViolations as hasViolationsReportUtils, isInvoiceReport as isInvoiceReportUtils} from '@libs/ReportUtils';
import {payInvoice, payMoneyRequest} from '@userActions/IOU/PayMoneyRequest';
Expand Down Expand Up @@ -52,12 +55,14 @@ function PayActionButton({
reportPreviewAction,
}: PayActionButtonProps) {
const {isOffline} = useNetwork();
const {translate} = useLocalize();
const currentUserDetails = useCurrentUserPersonalDetails();
const currentUserAccountID = currentUserDetails.accountID;
const currentUserEmail = currentUserDetails.email ?? '';
const {isBetaEnabled} = usePermissions();
const {isDelegateAccessRestricted} = useDelegateNoAccessState();
const {showDelegateNoAccessModal} = useDelegateNoAccessActions();
const lastWorkspaceNumber = useLastWorkspaceNumber();

const [activePolicyID] = useOnyx(ONYXKEYS.NVP_ACTIVE_POLICY_ID);
const activePolicy = usePolicy(activePolicyID);
Expand Down Expand Up @@ -149,6 +154,7 @@ function PayActionButton({
activePolicy,
betas,
isSelfTourViewed,
defaultWorkspaceName: generateDefaultWorkspaceName(currentUserEmail, lastWorkspaceNumber, translate),
});
} else {
payMoneyRequest({
Expand Down
7 changes: 6 additions & 1 deletion src/hooks/useSelectionModeReportActions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import type {PaymentActionParams} from '@components/SettlementButton/types';
import {payInvoice, payMoneyRequest} from '@libs/actions/IOU/PayMoneyRequest';
import {approveMoneyRequest, canApproveIOU, canIOUBePaid as canIOUBePaidAction, submitReport} from '@libs/actions/IOU/ReportWorkflow';
import {turnOffMobileSelectionMode} from '@libs/actions/MobileSelectionMode';
import {generateDefaultWorkspaceName} from '@libs/actions/Policy/Policy';
import {search} from '@libs/actions/Search';
import getPlatform from '@libs/getPlatform';
import {getTotalAmountForIOUReportPreviewButton} from '@libs/MoneyRequestReportUtils';
Expand Down Expand Up @@ -46,6 +47,7 @@ import type {PaymentMethodType} from '@src/types/onyx/OriginalMessage';
import useActiveAdminPolicies from './useActiveAdminPolicies';
import useConfirmPendingRTERAndProceed from './useConfirmPendingRTERAndProceed';
import useCurrentUserPersonalDetails from './useCurrentUserPersonalDetails';
import useLastWorkspaceNumber from './useLastWorkspaceNumber';
import {useMemoizedLazyExpensifyIcons} from './useLazyAsset';
import useLocalize from './useLocalize';
import useNetwork from './useNetwork';
Expand Down Expand Up @@ -116,6 +118,7 @@ function useSelectionModeReportActions({
);
const existingB2BInvoiceReport = useParticipantsInvoiceReport(activePolicyID, CONST.REPORT.INVOICE_RECEIVER_TYPE.BUSINESS, chatReport?.policyID);
const activeAdminPolicies = useActiveAdminPolicies();
const lastWorkspaceNumber = useLastWorkspaceNumber();

const isChatReportArchived = useReportIsArchived(chatReport?.reportID);

Expand Down Expand Up @@ -352,21 +355,23 @@ function useSelectionModeReportActions({
setIsHoldMenuVisible(true);
}
} else if (isInvoiceReport) {
const email = currentUserEmail ?? '';
payInvoice({
paymentMethodType: type,
chatReport,
invoiceReport: report,
invoiceReportCurrentNextStepDeprecated: nextStep,
introSelected,
currentUserAccountIDParam: currentUserAccountID,
currentUserEmailParam: currentUserEmail ?? '',
currentUserEmailParam: email,
payAsBusiness,
existingB2BInvoiceReport,
methodID,
paymentMethod,
activePolicy,
betas,
isSelfTourViewed,
defaultWorkspaceName: generateDefaultWorkspaceName(email, lastWorkspaceNumber, translate),
});
clearSelectedTransactions(true);
turnOffMobileSelectionMode();
Expand Down
8 changes: 7 additions & 1 deletion src/libs/actions/IOU/PayMoneyRequest.ts
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ type PayInvoiceArgs = {
activePolicy?: OnyxTypes.Policy;
betas: OnyxEntry<OnyxTypes.Beta[]>;
isSelfTourViewed: boolean | undefined;
defaultWorkspaceName: string;
};

type PayMoneyRequestData = {
Expand Down Expand Up @@ -112,6 +113,7 @@ function getPayMoneyRequestParams({
iouReportCurrentNextStepDeprecated,
betas,
isSelfTourViewed,
defaultWorkspaceName,
}: {
initialChatReport: OnyxTypes.Report;
iouReport: OnyxEntry<OnyxTypes.Report>;
Expand All @@ -131,6 +133,7 @@ function getPayMoneyRequestParams({
iouReportCurrentNextStepDeprecated: OnyxEntry<OnyxTypes.ReportNextStepDeprecated>;
betas: OnyxEntry<OnyxTypes.Beta[]>;
isSelfTourViewed: boolean | undefined;
defaultWorkspaceName?: string;
}): PayMoneyRequestData {
const deprecatedCurrentUserEmail = getCurrentUserEmail();
const allTransactionViolations = getAllTransactionViolations();
Expand All @@ -153,7 +156,7 @@ function getPayMoneyRequestParams({
successData: [],
failureData: [],
};
const shouldCreatePolicy = !activePolicy || !isPolicyAdmin(activePolicy) || !isPaidGroupPolicy(activePolicy);
const shouldCreatePolicy = (!activePolicy || !isPolicyAdmin(activePolicy) || !isPaidGroupPolicy(activePolicy)) && defaultWorkspaceName;
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Preserve policy creation when default workspace name is unavailable

This change makes policy creation depend on a non-empty defaultWorkspaceName (shouldCreatePolicy = ... && defaultWorkspaceName), but callers now derive that value from generateDefaultWorkspaceName(email ?? '', ...). In this codebase email can be temporarily undefined (the current-user context defaults to account-only data), so the generated name can be ''; in a pay-as-business invoice flow without an eligible active policy, that skips workspace creation entirely and proceeds without a business policy, which can break payment. Previously, buildPolicyData() would still generate a fallback name from session email, so this is a regression in reliability for that edge case.

Useful? React with 👍 / 👎.


if (isIndividualInvoiceRoom(chatReport) && payAsBusiness && shouldCreatePolicy) {
payerPolicyID = generatePolicyID();
Expand All @@ -164,6 +167,7 @@ function getPayMoneyRequestParams({
params,
} = buildPolicyData({
policyOwnerEmail: deprecatedCurrentUserEmail,
policyName: defaultWorkspaceName,
makeMeAdmin: true,
policyID: payerPolicyID,
currentUserAccountIDParam: currentUserAccountIDParam ?? CONST.DEFAULT_NUMBER_ID,
Expand Down Expand Up @@ -793,6 +797,7 @@ function payInvoice({
invoiceReportCurrentNextStepDeprecated,
betas,
isSelfTourViewed,
defaultWorkspaceName,
}: PayInvoiceArgs) {
const recipient = {accountID: invoiceReport?.ownerAccountID ?? CONST.DEFAULT_NUMBER_ID};
const {
Expand Down Expand Up @@ -825,6 +830,7 @@ function payInvoice({
introSelected,
betas,
isSelfTourViewed,
defaultWorkspaceName,
});

const paymentSelected = paymentMethodType === CONST.IOU.PAYMENT_TYPE.VBBA ? CONST.IOU.PAYMENT_SELECTED.BBA : CONST.IOU.PAYMENT_SELECTED.PBA;
Expand Down
Loading
Loading