Skip to content
Draft
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
2 changes: 2 additions & 0 deletions src/CONST/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1241,6 +1241,7 @@ const CONST = {
CARD_REPLACED_VIRTUAL: 'CARDREPLACEDVIRTUAL',
CARD_REPLACED: 'CARDREPLACED',
CARD_ASSIGNED: 'CARDASSIGNED',
PERSONAL_CARD_CONNECTION_BROKEN: 'PERSONALCARDCONNECTIONBROKEN',
CHANGE_FIELD: 'CHANGEFIELD', // OldDot Action
CHANGE_POLICY: 'CHANGEPOLICY',
CREATED_REPORT_FOR_UNAPPROVED_TRANSACTIONS: 'CREATEDREPORTFORUNAPPROVEDTRANSACTIONS',
Expand Down Expand Up @@ -5906,6 +5907,7 @@ const CONST = {
},
RTER_VIOLATION_TYPES: {
BROKEN_CARD_CONNECTION: 'brokenCardConnection',
BROKEN_PERSONAL_CARD_CONNECTION: 'brokenCardConnection',
BROKEN_CARD_CONNECTION_530: 'brokenCardConnection530',
SEVEN_DAY_HOLD: 'sevenDayHold',
},
Expand Down
7 changes: 6 additions & 1 deletion src/ROUTES.ts
Original file line number Diff line number Diff line change
Expand Up @@ -309,7 +309,12 @@ const ROUTES = {
},
SETTINGS_WALLET_PERSONAL_CARD_DETAILS: {
route: 'settings/wallet/personal-card/:cardID',
getRoute: (cardID: string) => `settings/wallet/personal-card/${cardID}` as const,
getRoute: (cardID: string | undefined) => {
if (!cardID) {
Log.warn('Invalid cardID is used to build the SETTINGS_WALLET_PERSONAL_CARD_DETAILS route');
}
return `settings/wallet/personal-card/${cardID}` as const;
},
},
SETTINGS_WALLET_PERSONAL_CARD_EDIT_NAME: {
route: 'settings/wallet/personal-card/:cardID/edit/name',
Expand Down
11 changes: 7 additions & 4 deletions src/components/ReportActionItem/MoneyRequestReceiptView.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,7 @@

const [transaction] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION}${getNonEmptyStringOnyxID(linkedTransactionID)}`, {canBeMissing: true});
const [policy] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY}${moneyRequestReport?.policyID}`, {canBeMissing: true});
const [cardList] = useOnyx(ONYXKEYS.CARD_LIST, {canBeMissing: true});
const transactionViolations = useTransactionViolations(transaction?.transactionID);

const isDistanceRequest = isDistanceRequestTransactionUtils(transaction);
Expand All @@ -137,6 +138,7 @@
const isEditable = !!canUserPerformWriteActionReportUtils(report, isReportArchived) && !readonly;
const canEdit = isMoneyRequestAction(parentReportAction) && canEditMoneyRequest(parentReportAction, isChatReportArchived, moneyRequestReport, policy, transaction) && isEditable;
const companyCardPageURL = `${environmentURL}/${ROUTES.WORKSPACE_COMPANY_CARDS.getRoute(report?.policyID)}`;
const connectionLink = transaction?.cardID ? `${environmentURL}/${ROUTES.SETTINGS_WALLET_PERSONAL_CARD_DETAILS.getRoute(transaction.cardID)}` : undefined;

Check failure on line 141 in src/components/ReportActionItem/MoneyRequestReceiptView.tsx

View workflow job for this annotation

GitHub Actions / typecheck

Argument of type 'number' is not assignable to parameter of type 'string'.

const canEditReceipt =
isEditable && canEditFieldOfMoneyRequest(parentReportAction, CONST.EDIT_REQUEST_FIELD.RECEIPT, undefined, isChatReportArchived, undefined, transaction, moneyRequestReport, policy);
Expand Down Expand Up @@ -173,16 +175,17 @@
for (const violation of filteredViolations) {
const isReceiptFieldViolation = receiptFieldViolationNames.has(violation.name);
const isReceiptImageViolation = receiptImageViolationNames.has(violation.name);
if (isReceiptFieldViolation || isReceiptImageViolation) {
const violationMessage = ViolationsUtils.getViolationTranslation(violation, translate, canEdit, undefined, companyCardPageURL);
const isRTERViolation = violation.name === CONST.VIOLATIONS.RTER;
if (isReceiptFieldViolation || isReceiptImageViolation || isRTERViolation) {
const violationMessage = ViolationsUtils.getViolationTranslation(violation, translate, canEdit, undefined, companyCardPageURL, connectionLink, cardList);
allViolations.push(violationMessage);
if (isReceiptImageViolation) {
if (isReceiptImageViolation || isRTERViolation) {
imageViolations.push(violationMessage);
}
}
}
return [imageViolations, allViolations];
}, [transactionViolations, translate, canEdit, companyCardPageURL]);
}, [transactionViolations, translate, canEdit, companyCardPageURL, connectionLink, cardList]);

const receiptRequiredViolation = transactionViolations?.some((violation) => violation.name === CONST.VIOLATIONS.RECEIPT_REQUIRED);
const itemizedReceiptRequiredViolation = transactionViolations?.some((violation) => violation.name === CONST.VIOLATIONS.ITEMIZED_RECEIPT_REQUIRED);
Expand Down
5 changes: 4 additions & 1 deletion src/components/ReportActionItem/MoneyRequestView.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -232,6 +232,7 @@
const allPolicyTags = usePolicyTags();
const policyTagList = allPolicyTags?.[`${ONYXKEYS.COLLECTION.POLICY_TAGS}${targetPolicyID}`];
const [nonPersonalAndWorkspaceCards] = useOnyx(ONYXKEYS.DERIVED.NON_PERSONAL_AND_WORKSPACE_CARD_LIST, {canBeMissing: true});
const [cardList] = useOnyx(ONYXKEYS.CARD_LIST, {canBeMissing: true});

const [transactionBackup] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION_BACKUP}${getNonEmptyStringOnyxID(linkedTransactionID)}`, {canBeMissing: true});
const transactionViolations = useTransactionViolations(transaction?.transactionID);
Expand Down Expand Up @@ -327,6 +328,7 @@
const isEditable = !!canUserPerformWriteActionReportUtils(transactionThreadReport, isReportArchived) && !readonly;
const canEdit = isMoneyRequestAction(parentReportAction) && canEditMoneyRequest(parentReportAction, isChatReportArchived, moneyRequestReport, policy, transaction) && isEditable;
const companyCardPageURL = `${environmentURL}/${ROUTES.WORKSPACE_COMPANY_CARDS.getRoute(transactionThreadReport?.policyID)}`;
const connectionLink = transaction?.cardID ? `${environmentURL}/${ROUTES.SETTINGS_WALLET_PERSONAL_CARD_DETAILS.getRoute(transaction.cardID)}` : undefined;

Check failure on line 331 in src/components/ReportActionItem/MoneyRequestView.tsx

View workflow job for this annotation

GitHub Actions / typecheck

Argument of type 'number' is not assignable to parameter of type 'string'.
const [originalTransaction] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION}${getNonEmptyStringOnyxID(transaction?.comment?.originalTransactionID)}`, {canBeMissing: true});
const {isExpenseSplit} = getOriginalTransactionWithSplitInfo(transaction, originalTransaction);
const [transactionReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${transaction?.reportID}`, {canBeMissing: true});
Expand Down Expand Up @@ -568,7 +570,7 @@
// Return violations if there are any
if (field !== 'merchant' && hasViolations(field, data, policyHasDependentTags, tagValue)) {
const violations = getViolationsForField(field, data, policyHasDependentTags, tagValue);
return `${violations.map((violation) => ViolationsUtils.getViolationTranslation(violation, translate, canEdit, undefined, companyCardPageURL)).join('. ')}.`;
return `${violations.map((violation) => ViolationsUtils.getViolationTranslation(violation, translate, canEdit, undefined, companyCardPageURL, connectionLink, cardList)).join('. ')}.`;
}

if (field === 'attendees' && isMissingAttendeesViolation) {
Expand Down Expand Up @@ -1125,6 +1127,7 @@
isLast
canEdit={canEdit}
companyCardPageURL={companyCardPageURL}
connectionLink={connectionLink}
/>
)}
</View>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@
);
const {amount, comment: requestComment, merchant, tag, category, currency: requestCurrency} = transactionDetails;
const [originalTransaction] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION}${getNonEmptyStringOnyxID(transaction?.comment?.originalTransactionID)}`, {canBeMissing: true});
const [cardList] = useOnyx(ONYXKEYS.CARD_LIST, {canBeMissing: true});

const managerID = report?.managerID ?? reportPreviewAction?.childManagerAccountID ?? CONST.DEFAULT_NUMBER_ID;
const ownerAccountID = report?.ownerAccountID ?? reportPreviewAction?.childOwnerAccountID ?? CONST.DEFAULT_NUMBER_ID;
Expand Down Expand Up @@ -118,7 +119,10 @@
const isIOUActionType = isMoneyRequestAction(action);
const canEdit = isIOUActionType && canEditMoneyRequest(action, isChatReportArchived, report, policy, transaction);
const companyCardPageURL = `${environmentURL}/${ROUTES.WORKSPACE_COMPANY_CARDS.getRoute(report?.policyID)}`;
const violationMessage = firstViolation ? ViolationsUtils.getViolationTranslation(firstViolation, translate, canEdit, undefined, companyCardPageURL) : undefined;
const connectionLink = transaction?.cardID ? `${environmentURL}/${ROUTES.SETTINGS_WALLET_PERSONAL_CARD_DETAILS.getRoute(transaction.cardID)}` : undefined;

Check failure on line 122 in src/components/ReportActionItem/TransactionPreview/TransactionPreviewContent.tsx

View workflow job for this annotation

GitHub Actions / typecheck

Argument of type 'number' is not assignable to parameter of type 'string'.
const violationMessage = firstViolation
? ViolationsUtils.getViolationTranslation(firstViolation, translate, canEdit, undefined, companyCardPageURL, connectionLink, cardList)
: undefined;

const previewText = useMemo(
() =>
Expand Down
4 changes: 4 additions & 0 deletions src/components/TransactionItemRow/TransactionItemRowRBR.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
import type {ViewStyle} from 'react-native';
import {View} from 'react-native';
import Icon from '@components/Icon';
import {DotIndicator} from '@components/Icon/Expensicons';

Check warning on line 5 in src/components/TransactionItemRow/TransactionItemRowRBR.tsx

View workflow job for this annotation

GitHub Actions / Changed files ESLint check

'@components/Icon/Expensicons' import is restricted from being used by a pattern. Direct imports from Icon/Expensicons are deprecated. Please use lazy loading hooks instead. Use `useMemoizedLazyExpensifyIcons` from @hooks/useLazyAsset. See docs/LAZY_ICONS_AND_ILLUSTRATIONS.md for details

Check warning on line 5 in src/components/TransactionItemRow/TransactionItemRowRBR.tsx

View workflow job for this annotation

GitHub Actions / Changed files ESLint check

'@components/Icon/Expensicons' import is restricted from being used. Direct imports from @components/Icon/Expensicons are deprecated. Please use lazy loading hooks instead. Use `useMemoizedLazyExpensifyIcons` from @hooks/useLazyAsset. See docs/LAZY_ICONS_AND_ILLUSTRATIONS.md for details
import RenderHTML from '@components/RenderHTML';
import useEnvironment from '@hooks/useEnvironment';
import useLocalize from '@hooks/useLocalize';
Expand Down Expand Up @@ -44,7 +44,9 @@
canBeMissing: true,
});
const companyCardPageURL = `${environmentURL}/${ROUTES.WORKSPACE_COMPANY_CARDS.getRoute(report?.policyID)}`;
const connectionLink = transaction?.cardID ? `${environmentURL}/${ROUTES.SETTINGS_WALLET_PERSONAL_CARD_DETAILS.getRoute(transaction.cardID)}` : undefined;

Check failure on line 47 in src/components/TransactionItemRow/TransactionItemRowRBR.tsx

View workflow job for this annotation

GitHub Actions / typecheck

Argument of type 'number' is not assignable to parameter of type 'string'.
const [policyTags] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_TAGS}${report?.policyID}`, {canBeMissing: true});
const [cardList] = useOnyx(ONYXKEYS.CARD_LIST, {canBeMissing: true});
const transactionThreadId = reportActions ? getIOUActionForTransactionID(Object.values(reportActions ?? {}), transaction.transactionID)?.childReportID : undefined;
const [transactionThreadActions] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${transactionThreadId}`, {
canBeMissing: true,
Expand All @@ -58,6 +60,8 @@
Object.values(transactionThreadActions ?? {}),
policyTags,
companyCardPageURL,
connectionLink,
cardList,
);

return (
Expand Down
14 changes: 11 additions & 3 deletions src/components/ViolationMessages.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,10 @@ import React, {useMemo} from 'react';
import {View} from 'react-native';
import type {StyleProp, TextStyle, ViewStyle} from 'react-native';
import useLocalize from '@hooks/useLocalize';
import useOnyx from '@hooks/useOnyx';
import useThemeStyles from '@hooks/useThemeStyles';
import ViolationsUtils, {filterReceiptViolations} from '@libs/Violations/ViolationsUtils';
import ONYXKEYS from '@src/ONYXKEYS';
import type {TransactionViolation} from '@src/types/onyx';
import Text from './Text';

Expand All @@ -14,17 +16,23 @@ type ViolationMessagesProps = {
textStyle?: StyleProp<TextStyle>;
canEdit: boolean;
companyCardPageURL?: string;
connectionLink?: string;
};

export default function ViolationMessages({violations, isLast, containerStyle, textStyle, canEdit, companyCardPageURL}: ViolationMessagesProps) {
export default function ViolationMessages({violations, isLast, containerStyle, textStyle, canEdit, companyCardPageURL, connectionLink}: ViolationMessagesProps) {
const styles = useThemeStyles();
const {translate} = useLocalize();
const [cardList] = useOnyx(ONYXKEYS.CARD_LIST, {canBeMissing: true});

const filteredViolations = useMemo(() => filterReceiptViolations(violations), [violations]);

const violationMessages = useMemo(
() => filteredViolations.map((violation) => [violation.name, ViolationsUtils.getViolationTranslation(violation, translate, canEdit, undefined, companyCardPageURL)]),
[canEdit, translate, filteredViolations, companyCardPageURL],
() =>
filteredViolations.map((violation) => [
violation.name,
ViolationsUtils.getViolationTranslation(violation, translate, canEdit, undefined, companyCardPageURL, connectionLink, cardList),
]),
[canEdit, translate, filteredViolations, companyCardPageURL, connectionLink, cardList],
);

return (
Expand Down
13 changes: 12 additions & 1 deletion src/languages/de.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import type en from './en';
import type {
ChangeFieldParams,
ConciergeBrokenCardConnectionParams,
ConnectionNameParams,
CreatedReportForUnapprovedTransactionsParams,
DelegateRoleParams,
Expand Down Expand Up @@ -2139,6 +2140,11 @@
password: 'Bitte geben Sie Ihr Expensify-Passwort ein',
},
},
personalCard: {

Check failure on line 2143 in src/languages/de.ts

View workflow job for this annotation

GitHub Actions / typecheck

Property 'fixCard' is missing in type '{ brokenConnection: string; conciergeBrokenConnection: ({ cardName, connectionLink }: ConciergeBrokenCardConnectionParams) => string; }' but required in type 'TranslationDeepObject<{ brokenConnection: string; fixCard: string; conciergeBrokenConnection: ({ cardName, connectionLink }: ConciergeBrokenCardConnectionParams) => string; }>'.
brokenConnection: 'Ihre Kartenverbindung ist unterbrochen.',
conciergeBrokenConnection: ({cardName, connectionLink}: ConciergeBrokenCardConnectionParams) =>
`Die Verbindung zu Ihrer Karte ${cardName} ist unterbrochen. <a href="${connectionLink}">Melden Sie sich bei Ihrem Online-Banking an</a>, um die Karte zu reparieren.`,
},
walletPage: {
balance: 'Kontostand',
paymentMethodsTitle: 'Zahlungsmethoden',
Expand Down Expand Up @@ -7537,7 +7543,7 @@
},
customRules: ({message}: ViolationsCustomRulesParams) => message,
reviewRequired: 'Überprüfung erforderlich',
rter: ({brokenBankConnection, isAdmin, isTransactionOlderThan7Days, member, rterType, companyCardPageURL}: ViolationsRterParams) => {
rter: ({brokenBankConnection, isAdmin, isTransactionOlderThan7Days, member, rterType, companyCardPageURL, connectionLink}: ViolationsRterParams) => {
if (rterType === CONST.RTER_VIOLATION_TYPES.BROKEN_CARD_CONNECTION_530) {
return 'Beleg kann aufgrund einer unterbrochenen Bankverbindung nicht automatisch zugeordnet werden';
}
Expand All @@ -7549,6 +7555,11 @@
if (!isTransactionOlderThan7Days) {
return isAdmin ? `Bitte ${member} bitten, es als Barzahlung zu markieren, oder warte 7 Tage und versuche es erneut` : 'Ausstehende Zusammenführung mit Kartenumsatz.';
}
if (rterType === CONST.RTER_VIOLATION_TYPES.BROKEN_PERSONAL_CARD_CONNECTION) {

Check failure on line 7558 in src/languages/de.ts

View workflow job for this annotation

GitHub Actions / typecheck

This comparison appears to be unintentional because the types '"sevenDayHold" | undefined' and '"brokenCardConnection"' have no overlap.
return isAdmin
? `Der Beleg kann aufgrund einer fehlerhaften Kartenverbindung nicht automatisch zugeordnet werden. Markieren Sie ihn als Bargeld, um ihn zu ignorieren, oder <a href="${connectionLink}">korrigieren Sie die Kartenverbindung</a>, damit er zum Beleg passt.`
: 'Automatischer Abgleich des Belegs aufgrund einer unterbrochenen Kartenverbindung nicht möglich.';
}
return '';
},
brokenConnection530Error: 'Beleg ausstehend aufgrund einer unterbrochenen Bankverbindung',
Expand Down
14 changes: 13 additions & 1 deletion src/languages/en.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import type {OriginalMessageSettlementAccountLocked, PolicyRulesModifiedFields}
import ObjectUtils from '@src/types/utils/ObjectUtils';
import type {
ChangeFieldParams,
ConciergeBrokenCardConnectionParams,
ConnectionNameParams,
CreatedReportForUnapprovedTransactionsParams,
DelegateRoleParams,
Expand Down Expand Up @@ -2182,6 +2183,12 @@ const translations = {
password: 'Please enter your Expensify password',
},
},
personalCard: {
brokenConnection: 'Your card connection is broken',
fixCard: 'Fix card',
conciergeBrokenConnection: ({cardName, connectionLink}: ConciergeBrokenCardConnectionParams) =>
`Your ${cardName} card connection is broken. <a href="${connectionLink}">Log into your bank</a> to fix the card.`,
},
walletPage: {
balance: 'Balance',
paymentMethodsTitle: 'Payment methods',
Expand Down Expand Up @@ -7543,10 +7550,15 @@ const translations = {
},
customRules: ({message}: ViolationsCustomRulesParams) => message,
reviewRequired: 'Review required',
rter: ({brokenBankConnection, isAdmin, isTransactionOlderThan7Days, member, rterType, companyCardPageURL}: ViolationsRterParams) => {
rter: ({brokenBankConnection, isAdmin, isTransactionOlderThan7Days, member, rterType, companyCardPageURL, connectionLink, isPersonalCard}: ViolationsRterParams) => {
if (rterType === CONST.RTER_VIOLATION_TYPES.BROKEN_CARD_CONNECTION_530) {
return "Can't auto-match receipt due to broken bank connection";
}
if (isPersonalCard && (rterType === CONST.RTER_VIOLATION_TYPES.BROKEN_CARD_CONNECTION || brokenBankConnection)) {
return isAdmin
? `Can't auto-match receipt due to broken card connection. Mark as cash to ignore, or <a href="${connectionLink}">fix the card</a> to match the receipt.`
: "Can't auto-match receipt due to broken card connection.";
}
if (brokenBankConnection || rterType === CONST.RTER_VIOLATION_TYPES.BROKEN_CARD_CONNECTION) {
return isAdmin
? `Bank connection broken. <a href="${companyCardPageURL}">Reconnect to match receipt</a>`
Expand Down
22 changes: 20 additions & 2 deletions src/languages/es.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,14 @@
import type {OriginalMessageSettlementAccountLocked, PolicyRulesModifiedFields} from '@src/types/onyx/OriginalMessage';
import ObjectUtils from '@src/types/utils/ObjectUtils';
import type en from './en';
import type {CreatedReportForUnapprovedTransactionsParams, PaidElsewhereParams, RoutedDueToDEWParams, SplitDateRangeParams, ViolationsRterParams} from './params';
import type {
ConciergeBrokenCardConnectionParams,
CreatedReportForUnapprovedTransactionsParams,
PaidElsewhereParams,
RoutedDueToDEWParams,
SplitDateRangeParams,
ViolationsRterParams,
} from './params';
import type {TranslationDeepObject} from './types';

/* eslint-disable max-len */
Expand Down Expand Up @@ -1910,6 +1917,12 @@
password: 'Por favor, introduce tu contraseña de Expensify',
},
},
personalCard: {
brokenConnection: 'La conexión de tu tarjeta está rota',
fixCard: 'Reparar tarjeta',
conciergeBrokenConnection: ({cardName, connectionLink}: ConciergeBrokenCardConnectionParams) =>
`La conexión de tu tarjeta ${cardName} está interrumpida. <a href="${connectionLink}">Inicia sesión en tu banco</a> para reparar la tarjeta.`,
},
walletPage: {
balance: 'Saldo',
paymentMethodsTitle: 'Métodos de pago',
Expand Down Expand Up @@ -7689,7 +7702,7 @@
},
customRules: ({message}) => message,
reviewRequired: 'Revisión requerida',
rter: ({brokenBankConnection, isAdmin, isTransactionOlderThan7Days, member, rterType, companyCardPageURL}: ViolationsRterParams) => {
rter: ({brokenBankConnection, isAdmin, isTransactionOlderThan7Days, member, rterType, companyCardPageURL, connectionLink}: ViolationsRterParams) => {
if (rterType === CONST.RTER_VIOLATION_TYPES.BROKEN_CARD_CONNECTION_530) {
return 'No se puede emparejar automáticamente el recibo debido a una conexión bancaria interrumpida.';
}
Expand All @@ -7703,6 +7716,11 @@
? `Pide a ${member} que marque la transacción como efectivo o espera 7 días e inténtalo de nuevo`
: 'Esperando a adjuntar automáticamente la transacción de tarjeta de crédito';
}
if (rterType === CONST.RTER_VIOLATION_TYPES.BROKEN_PERSONAL_CARD_CONNECTION) {

Check failure on line 7719 in src/languages/es.ts

View workflow job for this annotation

GitHub Actions / typecheck

This comparison appears to be unintentional because the types '"sevenDayHold" | undefined' and '"brokenCardConnection"' have no overlap.
return isAdmin
? `No se puede vincular automáticamente el recibo debido a una conexión de tarjeta defectuosa. Márquelo como efectivo para ignorarlo o <a href="${connectionLink}">arregle la tarjeta</a> para que coincida con el recibo.`
: 'No se puede hacer coincidir automáticamente el recibo debido a una conexión de tarjeta rota.';
}
return '';
},
brokenConnection530Error: 'Recibo pendiente debido a una conexión bancaria rota',
Expand Down
Loading
Loading