Skip to content
Binary file modified assets/pdfs/PDSAndFSG.pdf
Binary file not shown.
1 change: 1 addition & 0 deletions cspell.json
Original file line number Diff line number Diff line change
Expand Up @@ -668,6 +668,7 @@
"idempotently",
"idfa",
"ifdef",
"illion",
"imagebutton",
"inbetweenCompo",
"initialises",
Expand Down
89 changes: 82 additions & 7 deletions src/components/SubStepForms/AgreementsFullStep.tsx
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
import CheckboxWithLabel from '@components/CheckboxWithLabel';
import FormProvider from '@components/Form/FormProvider';
import InputWrapper from '@components/Form/InputWrapper';
import type {FormInputErrors, FormOnyxKeys, FormOnyxValues} from '@components/Form/types';
import type {FormInputErrors, FormOnyxKeys, FormOnyxValues, FormRef} from '@components/Form/types';
import InteractiveStepWrapper from '@components/InteractiveStepWrapper';
import RenderHTML from '@components/RenderHTML';
import Text from '@components/Text';
import UploadFile from '@components/UploadFile';

import useLocalize from '@hooks/useLocalize';
import useThemeStyles from '@hooks/useThemeStyles';
Expand All @@ -13,11 +14,14 @@ import {getFieldRequiredErrors, isRequiredFulfilled} from '@libs/ValidationUtils

import requiresDocusignStep from '@pages/ReimbursementAccount/NonUSD/utils/requiresDocusignStep';

import {clearErrors} from '@userActions/FormActions';
import {clearErrorFields, clearErrors, setDraftValues, setErrorFields} from '@userActions/FormActions';

import CONST from '@src/CONST';
import type {OnyxFormValuesMapping} from '@src/ONYXKEYS';
import type {FileObject} from '@src/types/utils/Attachment';

import React, {useCallback, useMemo} from 'react';
import React, {useCallback, useMemo, useRef, useState} from 'react';
import {View} from 'react-native';

function IsAuthorizedToUseBankAccountLabel() {
const {translate} = useLocalize();
Expand Down Expand Up @@ -71,6 +75,12 @@ type AgreementsFullStepProps<TFormID extends keyof OnyxFormValuesMapping> = {

/** Index of currently active step in header */
startStepIndex: number;

/** ID of the bank statement file upload input. When provided, a required bank statement upload is rendered. */
bankStatementInputID?: FormOnyxKeys<TFormID>;

/** Default value for the bank statement file upload input */
bankStatementDefaultValue?: FileObject[];
};

function AgreementsFullStep<TFormID extends keyof OnyxFormValuesMapping>({
Expand All @@ -83,15 +93,53 @@ function AgreementsFullStep<TFormID extends keyof OnyxFormValuesMapping>({
currency,
stepNames,
startStepIndex,
bankStatementInputID,
bankStatementDefaultValue,
}: AgreementsFullStepProps<TFormID>) {
const {translate} = useLocalize();
const styles = useThemeStyles();

const formRef = useRef<FormRef | null>(null);
const [uploadedBankStatement, setUploadedBankStatement] = useState<FileObject[]>(bankStatementDefaultValue ?? []);

const isDocusignStepRequired = requiresDocusignStep(currency);
const stepFields = useMemo(
() => [inputIDs.authorizedToBindClientToAgreement, inputIDs.provideTruthfulInformation, inputIDs.agreeToTermsAndConditions, inputIDs.consentToPrivacyNotice],
[inputIDs.authorizedToBindClientToAgreement, inputIDs.provideTruthfulInformation, inputIDs.agreeToTermsAndConditions, inputIDs.consentToPrivacyNotice],
);
const stepFields = useMemo(() => {
const fields = [inputIDs.authorizedToBindClientToAgreement, inputIDs.provideTruthfulInformation, inputIDs.agreeToTermsAndConditions, inputIDs.consentToPrivacyNotice];
if (bankStatementInputID) {
fields.push(bankStatementInputID);
}
return fields;
}, [inputIDs.authorizedToBindClientToAgreement, inputIDs.provideTruthfulInformation, inputIDs.agreeToTermsAndConditions, inputIDs.consentToPrivacyNotice, bankStatementInputID]);

const handleSelectBankStatement = (files: FileObject[]) => {
if (!bankStatementInputID) {
return;
}
setDraftValues(formID, {[bankStatementInputID]: [...uploadedBankStatement, ...files]});
setUploadedBankStatement((prev) => [...prev, ...files]);
};

const handleRemoveBankStatement = (fileName: string) => {
if (!bankStatementInputID) {
return;
}
const newUploadedFiles = uploadedBankStatement.filter((file) => file.name !== fileName);
setDraftValues(formID, {[bankStatementInputID]: newUploadedFiles});
setUploadedBankStatement(newUploadedFiles);
};

const setBankStatementError = (error: string) => {
if (!bankStatementInputID) {
return;
}
if (!error) {
clearErrorFields(formID);
return;
}
formRef.current?.resetFormFieldError(String(bankStatementInputID));
clearErrors(formID);
setErrorFields(formID, {[bankStatementInputID]: {onUpload: error}});
};

const handleBackButtonPress = () => {
clearErrors(formID);
Expand Down Expand Up @@ -132,6 +180,7 @@ function AgreementsFullStep<TFormID extends keyof OnyxFormValuesMapping>({
startStepIndex={startStepIndex}
>
<FormProvider
ref={formRef}
formID={formID}
onSubmit={onSubmit}
validate={validate}
Expand Down Expand Up @@ -178,6 +227,32 @@ function AgreementsFullStep<TFormID extends keyof OnyxFormValuesMapping>({
defaultValue={defaultValues[inputIDs.consentToPrivacyNotice]}
shouldSaveDraft
/>
{!!bankStatementInputID && (
<>
<View style={[styles.sectionDividerLine, styles.mt6, styles.mb6]} />
<Text style={[styles.mutedTextLabel, styles.mb3]}>{translate('agreementsStep.bankStatement')}</Text>
<InputWrapper
InputComponent={UploadFile}
buttonText={translate('common.chooseFile')}
uploadedFiles={uploadedBankStatement}
onUpload={(files) => {
handleSelectBankStatement(files);
}}
onRemove={(fileName) => {
handleRemoveBankStatement(fileName);
}}
acceptedFileTypes={[...CONST.CORPAY_DOCUMENT.ALLOWED_FILE_TYPES]}
value={uploadedBankStatement}
inputID={String(bankStatementInputID)}
setError={(error) => {
setBankStatementError(error);
}}
fileLimit={1}
maxFileSize={CONST.CORPAY_DOCUMENT.MAX_FILE_SIZE}
/>
<Text style={[styles.mutedTextLabel, styles.mt6]}>{translate('agreementsStep.bankStatementDescription')}</Text>
</>
)}
</FormProvider>
</InteractiveStepWrapper>
);
Expand Down
13 changes: 9 additions & 4 deletions src/languages/de.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4248,6 +4248,9 @@ ${amount} für ${merchant} – ${date}`,
proofOf: 'Nachweis der Privatadresse',
enterOneEmail: (companyName: string) => `Gib die E-Mail-Adresse einer Geschäftsführungsperson von ${companyName} ein`,
regulationRequiresOneMoreDirector: 'Vorschriften erfordern mindestens eine weitere:n Geschäftsführer:in als Unterzeichner:in.',
bothSignersMustBeOnIllionReport:
'Beide Unterzeichner müssen im illion-Bericht des Unternehmens als Direktoren aufgeführt sein. Es können nicht beliebige zwei Personen im Unternehmen sein.',
signerMustBeOnIllionReport: 'Die als Unterzeichner hinzugefügte Geschäftsführungsperson muss im illion-Bericht des Unternehmens aufgeführt sein.',
hangTight: 'Einen Moment bitte ...',
enterTwoEmails: (companyName: string) => `Gib die E-Mail-Adressen von zwei Direktoren bei ${companyName} ein`,
sendReminder: 'Erinnerung senden',
Expand All @@ -4258,11 +4261,11 @@ ${amount} für ${merchant} – ${date}`,
proofOfDirectorsDescription: 'Beispiele: Oncorp-Unternehmensprofil oder Unternehmensregistrierung.',
codiceFiscale: 'Steuernummer',
codiceFiscaleDescription: 'Codice Fiscale für Unterzeichnende, Bevollmächtigte und wirtschaftlich Berechtigte.',
PDSandFSG: 'PDS- und FSG-Offenlegungsunterlagen',
PDSandFSG: 'PDS-, FSG- und TMD-Offenlegungsunterlagen',
PDSandFSGDescription: Str.dedent(`
Unsere Partnerschaft mit Corpay nutzt eine API-Verbindung, um deren umfangreiches Netzwerk internationaler Bankpartner zu verwenden und so Globale Erstattungen in Expensify zu ermöglichen. Gemäß den australischen Vorschriften stellen wir Ihnen den Financial Services Guide (FSG) und die Product Disclosure Statement (PDS) von Corpay zur Verfügung.
Unsere Partnerschaft mit Corpay nutzt eine API-Verbindung, um das umfangreiche Netzwerk internationaler Bankpartner zu verwenden, das Globale Rückerstattungen in Expensify ermöglicht. Gemäß den australischen Vorschriften stellen wir Ihnen den Financial Services Guide (FSG), das Product Disclosure Statement (PDS) und die Target Market Determination (TMD) von Corpay zur Verfügung.

Bitte lesen Sie die FSG- und PDS-Dokumente sorgfältig, da sie vollständige Details und wichtige Informationen zu den Produkten und Dienstleistungen enthalten, die Corpay anbietet. Bewahren Sie diese Dokumente für zukünftige Referenzzwecke auf.
Bitte lesen Sie die FSG-, PDS- und TMD-Dokumente sorgfältig, da sie vollständige Details und wichtige Informationen zu den Produkten und Dienstleistungen enthalten, die Corpay anbietet. Bewahren Sie diese Dokumente für eine spätere Bezugnahme auf.
`),
pleaseUpload: 'Bitte laden Sie unten zusätzliche Unterlagen hoch, damit wir Ihre Identität als Geschäftsführer*in des Unternehmens verifizieren können.',
enterSignerInfo: 'Unterzeichnerinformationen eingeben',
Expand All @@ -4274,6 +4277,8 @@ ${amount} für ${merchant} – ${date}`,
},
},
agreementsStep: {
bankStatement: 'Kontoauszug',
bankStatementDescription: 'Bitte laden Sie einen aktuellen Kontoauszug hoch, der innerhalb der letzten drei Monate ausgestellt wurde, für das Geschäftskonto, das Sie verbinden.',
agreements: 'Vereinbarungen',
pleaseConfirm: 'Bitte bestätige die folgenden Vereinbarungen',
regulationRequiresUs: 'Vorschriften verpflichten uns, die Identität jeder Person zu überprüfen, die mehr als 25 % des Unternehmens besitzt.',
Expand All @@ -4282,7 +4287,7 @@ ${amount} für ${merchant} – ${date}`,
iAcceptTheTermsAndConditions: `Ich akzeptiere die <a href="https://www.corpay.com/cross-border/terms">Allgemeinen Geschäftsbedingungen</a>.`,
iAcceptTheTermsAndConditionsAccessibility: 'Ich akzeptiere die Geschäftsbedingungen.',
accept: 'Akzeptieren und Bankkonto hinzufügen',
iConsentToThePrivacyNotice: 'Ich stimme der <a href="https://payments.corpay.com/compliance">Datenschutzerklärung</a> zu.',
iConsentToThePrivacyNotice: 'Ich stimme der <a href="https://www.corpay.com/privacy-policy">Datenschutzerklärung</a> zu.',
iConsentToThePrivacyNoticeAccessibility: 'Ich stimme der Datenschutzerklärung zu.',
error: {
authorized: 'Sie müssen eine vertretungsberechtigte Führungskraft mit Vollmacht zur Führung des Geschäftskontos sein',
Expand Down
14 changes: 10 additions & 4 deletions src/languages/el.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4310,6 +4310,9 @@ ${amount} για ${merchant} - ${date}`,
proofOf: 'Απόδειξη προσωπικής διεύθυνσης',
enterOneEmail: (companyName: string) => `Εισαγάγετε το email ενός διευθυντή στην ${companyName}`,
regulationRequiresOneMoreDirector: 'Η νομοθεσία απαιτεί τουλάχιστον έναν ακόμη διευθυντή ως υπογράφοντα.',
bothSignersMustBeOnIllionReport:
'Και οι δύο υπογράφοντες πρέπει να αναφέρονται ως διευθυντές στην αναφορά illion της εταιρείας. Δεν μπορούν να είναι οποιοιδήποτε δύο άτομα στην επιχείρηση.',
signerMustBeOnIllionReport: 'Ο διευθυντής που προσθέτετε ως υπογράφοντα πρέπει να αναγράφεται στην αναφορά illion της εταιρείας.',
hangTight: 'Μισό λεπτό...',
enterTwoEmails: (companyName: string) => `Εισαγάγετε τα email δύο διευθυντών στην ${companyName}`,
sendReminder: 'Αποστολή υπενθύμισης',
Expand All @@ -4320,11 +4323,11 @@ ${amount} για ${merchant} - ${date}`,
proofOfDirectorsDescription: 'Παραδείγματα: εταιρικό προφίλ Oncorp ή καταχώριση επιχείρησης.',
codiceFiscale: 'Κωδικός Φορολογικού Μητρώου',
codiceFiscaleDescription: 'Codice Fiscale για υπογράφοντες, εξουσιοδοτημένους χρήστες και πραγματικούς δικαιούχους.',
PDSandFSG: 'Έγγραφα γνωστοποίησης PDS + FSG',
PDSandFSG: 'Έγγραφα γνωστοποίησης PDS, FSG και TMD',
PDSandFSGDescription: Str.dedent(`
Η συνεργασία μας με την Corpay χρησιμοποιεί σύνδεση API ώστε να αξιοποιήσει το εκτεταμένο δίκτυο διεθνών τραπεζικών συνεργατών της για να υποστηρίξει τις Παγκόσμιες Αποζημιώσεις στην Expensify. Σύμφωνα με την αυστραλιανή νομοθεσία, σας παρέχουμε τον Οδηγό Χρηματοοικονομικών Υπηρεσιών (Financial Services Guide, FSG) και τη Δήλωση Αποκάλυψης Προϊόντος (Product Disclosure Statement, PDS) της Corpay.
Η συνεργασία μας με την Corpay χρησιμοποιεί σύνδεση API για να αξιοποιήσει το εκτεταμένο δίκτυο διεθνών τραπεζικών συνεργατών της, ώστε να υποστηρίξει τις παγκόσμιες επιστροφές χρημάτων στο Expensify. Σύμφωνα με τους κανονισμούς της Αυστραλίας, σάς παρέχουμε τον Οδηγό Χρηματοοικονομικών Υπηρεσιών (FSG), το Έγγραφο Γνωστοποίησης Προϊόντος (PDS) και τον Καθορισμό Στόχου Αγοράς (TMD) της Corpay.

Παρακαλούμε διαβάστε προσεκτικά τα έγγραφα FSG και PDS, καθώς περιέχουν πλήρεις λεπτομέρειες και σημαντικές πληροφορίες για τα προϊόντα και τις υπηρεσίες που προσφέρει η Corpay. Διατηρήστε αυτά τα έγγραφα για μελλοντική αναφορά.
Παρακαλούμε διαβάστε προσεκτικά τα έγγραφα FSG, PDS και TMD, καθώς περιέχουν πλήρεις λεπτομέρειες και σημαντικές πληροφορίες σχετικά με τα προϊόντα και τις υπηρεσίες που προσφέρει η Corpay. Κρατήστε αυτά τα έγγραφα για μελλοντική αναφορά.
`),
pleaseUpload: 'Παρακαλούμε ανεβάστε επιπλέον έγγραφα παρακάτω, ώστε να μας βοηθήσετε να επαληθεύσουμε την ταυτότητά σας ως διευθυντή της επιχείρησης.',
enterSignerInfo: 'Εισαγάγετε τα στοιχεία υπογράφοντα',
Expand All @@ -4336,6 +4339,9 @@ ${amount} για ${merchant} - ${date}`,
},
},
agreementsStep: {
bankStatement: 'Απόσπασμα κίνησης λογαριασμού',
bankStatementDescription:
'Παρακαλούμε προσκομίστε ένα πρόσφατο αντίγραφο κίνησης τραπεζικού λογαριασμού, εκδοθέν μέσα στους τελευταίους τρεις μήνες, για τον επαγγελματικό τραπεζικό λογαριασμό που συνδέετε.',
agreements: 'Συμφωνίες',
pleaseConfirm: 'Παρακαλούμε επιβεβαιώστε τις παρακάτω συμφωνίες',
regulationRequiresUs: 'Οι κανονισμοί απαιτούν να επαληθεύουμε την ταυτότητα κάθε ατόμου που κατέχει πάνω από 25% της επιχείρησης.',
Expand All @@ -4344,7 +4350,7 @@ ${amount} για ${merchant} - ${date}`,
iAcceptTheTermsAndConditions: `Αποδέχομαι τους <a href="https://www.corpay.com/cross-border/terms">όρους και τις προϋποθέσεις</a>.`,
iAcceptTheTermsAndConditionsAccessibility: 'Αποδέχομαι τους όρους και τις προϋποθέσεις.',
accept: 'Αποδοχή και προσθήκη τραπεζικού λογαριασμού',
iConsentToThePrivacyNotice: 'Συναινώ στην <a href="https://payments.corpay.com/compliance">ειδοποίηση απορρήτου</a>.',
iConsentToThePrivacyNotice: 'Συναινώ με την <a href="https://www.corpay.com/privacy-policy">ειδοποίηση απορρήτου</a>.',
iConsentToThePrivacyNoticeAccessibility: 'Συναινώ στην ειδοποίηση απορρήτου.',
error: {
authorized: 'Πρέπει να είστε υπεύθυνος αξιωματούχος με εξουσιοδότηση να διαχειρίζεστε τον επαγγελματικό τραπεζικό λογαριασμό',
Expand Down
Loading
Loading