Merge branch 'master' into develop

This commit is contained in:
Vitalii Kiiko
2025-09-12 10:06:43 +02:00
13 changed files with 215 additions and 143 deletions

View File

@@ -154,6 +154,10 @@
} }
} }
} }
&.hidden {
display: none;
}
} }
.appForm__field--required.appForm__field--required { .appForm__field--required.appForm__field--required {

View File

@@ -4,6 +4,7 @@ import { Controller } from 'react-hook-form';
import { is, isEmpty } from 'ramda'; import { is, isEmpty } from 'ramda';
import { InputNumber } from 'primereact/inputnumber'; import { InputNumber } from 'primereact/inputnumber';
import { isNaN } from 'mathjs';
const NumberInput = ({ const NumberInput = ({
fieldName, fieldName,
@@ -29,13 +30,13 @@ const NumberInput = ({
const input = <Controller const input = <Controller
name={fieldName} name={fieldName}
control={control} control={control}
defaultValue={is(Number, defaultValue) ? defaultValue : ''} defaultValue={is(Number, defaultValue) || (!is(Number, defaultValue) && !isNaN(parseFloat(defaultValue))) ? defaultValue : ''}
rules={config} rules={config}
render={({ field, fieldState }) => ( render={({ field, fieldState }) => (
<InputNumber inputId={field.name} <InputNumber inputId={field.name}
disabled={disabled} disabled={disabled}
readOnly={readOnly} readOnly={readOnly}
value={is(Number, field.value) ? field.value : ''} value={is(Number, field.value) || (!is(Number, field.value) && !isNaN(parseFloat(field.value))) ? field.value : ''}
onValueChange={(e) => field.onChange(e.value)} onValueChange={(e) => field.onChange(e.value)}
min={minAttr} min={minAttr}
max={maxAttr} max={maxAttr}

View File

@@ -42,7 +42,7 @@ const FormField = (props) => {
const Comp = !isNil(fields[props.type]) ? fields[props.type] : null; const Comp = !isNil(fields[props.type]) ? fields[props.type] : null;
return (!isNil(Comp) return (!isNil(Comp)
? <div className={classNames(['appForm__field', props.type])}> ? <div className={classNames(['appForm__field', props.type, props.additionalClass])}>
<Comp {...props} /> <Comp {...props} />
</div> </div>
: null : null

View File

@@ -5,25 +5,22 @@ import CodiceFiscale from 'codice-fiscale-js';
export const isPIVA = (v) => { export const isPIVA = (v) => {
const regexp = new RegExp(/^[0-9]{11}$/); const regexp = new RegExp(/^[0-9]{11}$/);
//console.log('isPIVA', !isEmpty(match(regexp, String(v)))) //console.log('isPIVA', !isEmpty(match(regexp, String(v))))
return !isEmpty(match(regexp, String(v))); return v && !isEmpty(v) && !isEmpty(match(regexp, String(v)));
} }
// example: DSDDSD99P23B352G // example: DSDDSD99P23B352G
export const isCodiceFiscale = (v) => { export const isCodiceFiscale = (v) => {
//const regexp = new RegExp(/^(?:[A-Z][AEIOU][AEIOUX]|[AEIOU]X{2}|[B-DF-HJ-NP-TV-Z]{2}[A-Z]){2}(?:[\dLMNP-V]{2}(?:[A-EHLMPR-T](?:[04LQ][1-9MNP-V]|[15MR][\dLMNP-V]|[26NS][0-8LMNP-U])|[DHPS][37PT][0L]|[ACELMRT][37PT][01LM]|[AC-EHLMPR-T][26NS][9V])|(?:[02468LNQSU][048LQU]|[13579MPRTV][26NS])B[26NS][9V])(?:[A-MZ][1-9MNP-V][\dLMNP-V]{2}|[A-M][0L](?:[1-9MNP-V][\dLMNP-V]|[0L][1-9MNP-V]))[A-Z]$/, 'i') return v && !isEmpty(v) && CodiceFiscale.check(v);
//return !isEmpty(match(regexp, v));
//console.log('isCodiceFiscale', CodiceFiscale.check(v))
return CodiceFiscale.check(v);
} }
export const isCAP = (v) => { export const isCAP = (v) => {
const regexp = new RegExp(/^[0-9]{5}$/); const regexp = new RegExp(/^[0-9]{5}$/);
return !isEmpty(match(regexp, String(v))); return v && !isEmpty(v) && !isEmpty(match(regexp, String(v)));
} }
export const isIBAN = (v) => { export const isIBAN = (v) => {
const regexp = new RegExp(/^((NO)[0-9A-Z]{2}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}[ ][0-9A-Z]{3}|(NO)[0-9A-Z]{13}|(BE)[0-9A-Z]{2}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}|(BE)[0-9A-Z]{14}|(DK|FO|FI|GL|NL)[0-9A-Z]{2}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}[ ][0-9A-Z]{2}|(DK|FO|FI|GL|NL)[0-9A-Z]{16}|(MK|SI)[0-9A-Z]{2}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}[ ][0-9A-Z]{3}|(MK|SI)[0-9A-Z]{17}|(BA|EE|KZ|LT|LU|AT)[0-9A-Z]{2}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}|(BA|EE|KZ|LT|LU|AT)[0-9A-Z]{18}|(HR|LI|LV|CH)[0-9A-Z]{2}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}[ ][0-9A-Z]{1}|(HR|LI|LV|CH)[0-9A-Z]{19}|(BG|DE|IE|ME|RS|GB)[0-9A-Z]{2}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}[ ][0-9A-Z]{2}|(BG|DE|IE|ME|RS|GB)[0-9A-Z]{20}|(GI|IL)[0-9A-Z]{2}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}[ ][0-9A-Z]{3}|(GI|IL)[0-9A-Z]{21}|(AD|CZ|SA|RO|SK|ES|SE|TN)[0-9A-Z]{2}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}|(AD|CZ|SA|RO|SK|ES|SE|TN)[0-9A-Z]{22}|(PT)[0-9A-Z]{2}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}[ ][0-9A-Z]{1}|(PT)[0-9A-Z]{23}|(IS|TR)[0-9A-Z]{2}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}[ ][0-9A-Z]{2}|(IS|TR)[0-9A-Z]{24}|(FR|GR|IT|MC|SM)[0-9A-Z]{2}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}[ ][0-9A-Z]{3}|(FR|GR|IT|MC|SM)[0-9A-Z]{25}|(AL|CY|HU|LB|PL)[0-9A-Z]{2}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}|(AL|CY|HU|LB|PL)[0-9A-Z]{26}|(MU)[0-9A-Z]{2}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}[ ][0-9A-Z]{2}|(MU)[0-9A-Z]{28}|(MT)[0-9A-Z]{2}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}[ ][0-9A-Z]{3}|(MT)[0-9A-Z]{29})$/) const regexp = new RegExp(/^((NO)[0-9A-Z]{2}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}[ ][0-9A-Z]{3}|(NO)[0-9A-Z]{13}|(BE)[0-9A-Z]{2}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}|(BE)[0-9A-Z]{14}|(DK|FO|FI|GL|NL)[0-9A-Z]{2}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}[ ][0-9A-Z]{2}|(DK|FO|FI|GL|NL)[0-9A-Z]{16}|(MK|SI)[0-9A-Z]{2}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}[ ][0-9A-Z]{3}|(MK|SI)[0-9A-Z]{17}|(BA|EE|KZ|LT|LU|AT)[0-9A-Z]{2}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}|(BA|EE|KZ|LT|LU|AT)[0-9A-Z]{18}|(HR|LI|LV|CH)[0-9A-Z]{2}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}[ ][0-9A-Z]{1}|(HR|LI|LV|CH)[0-9A-Z]{19}|(BG|DE|IE|ME|RS|GB)[0-9A-Z]{2}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}[ ][0-9A-Z]{2}|(BG|DE|IE|ME|RS|GB)[0-9A-Z]{20}|(GI|IL)[0-9A-Z]{2}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}[ ][0-9A-Z]{3}|(GI|IL)[0-9A-Z]{21}|(AD|CZ|SA|RO|SK|ES|SE|TN)[0-9A-Z]{2}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}|(AD|CZ|SA|RO|SK|ES|SE|TN)[0-9A-Z]{22}|(PT)[0-9A-Z]{2}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}[ ][0-9A-Z]{1}|(PT)[0-9A-Z]{23}|(IS|TR)[0-9A-Z]{2}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}[ ][0-9A-Z]{2}|(IS|TR)[0-9A-Z]{24}|(FR|GR|IT|MC|SM)[0-9A-Z]{2}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}[ ][0-9A-Z]{3}|(FR|GR|IT|MC|SM)[0-9A-Z]{25}|(AL|CY|HU|LB|PL)[0-9A-Z]{2}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}|(AL|CY|HU|LB|PL)[0-9A-Z]{26}|(MU)[0-9A-Z]{2}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}[ ][0-9A-Z]{2}|(MU)[0-9A-Z]{28}|(MT)[0-9A-Z]{2}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}[ ][0-9A-Z]{4}[ ][0-9A-Z]{3}|(MT)[0-9A-Z]{29})$/)
return !isEmpty(match(regexp, v)); return v && !isEmpty(v) && !isEmpty(match(regexp, v));
} }
export const isEmail = (v) => { export const isEmail = (v) => {
@@ -58,7 +55,7 @@ export const isUrl = (v) => {
export const isMarcaDaBollo = (v) => { export const isMarcaDaBollo = (v) => {
const regexp = new RegExp(/^[0-9]{14}$/); const regexp = new RegExp(/^[0-9]{14}$/);
return !isEmpty(match(regexp, String(v))); return v && !isEmpty(match(regexp, String(v)));
} }
export const minChecks = (v, num) => { export const minChecks = (v, num) => {

View File

@@ -52,6 +52,7 @@ import { defaultMaxFileSize } from '../../configData';
const REACT_APP_HUB_ID = process.env.REACT_APP_HUB_ID; const REACT_APP_HUB_ID = process.env.REACT_APP_HUB_ID;
const BandoApplication = () => { const BandoApplication = () => {
const antiMoneyLaundryCalls = useStoreValue('antiMoneyLaundryCalls');
const chosenCompanyId = useStoreValue('chosenCompanyId'); const chosenCompanyId = useStoreValue('chosenCompanyId');
const { id } = useParams(); const { id } = useParams();
const [isExpired, setIsExpired] = useState(false); const [isExpired, setIsExpired] = useState(false);
@@ -460,7 +461,7 @@ const BandoApplication = () => {
type="button" type="button"
disabled={'SUBMIT' === applicationStatus || isExpired} disabled={'SUBMIT' === applicationStatus || isExpired}
onClick={onValidate} onClick={onValidate}
label={__('Convalidare', 'gepafin')} label={__('Convalida per la firma', 'gepafin')}
icon="pi pi-check" icon="pi pi-check"
iconPos="right"/> iconPos="right"/>
</div> </div>
@@ -572,6 +573,7 @@ const BandoApplication = () => {
formData.map((o) => { formData.map((o) => {
const variable = head(o.settings.filter(o => o.name === 'variable')); const variable = head(o.settings.filter(o => o.name === 'variable'));
const formula = head(o.settings.filter(o => o.name === 'formula')); const formula = head(o.settings.filter(o => o.name === 'formula'));
const isRequestedAmount = head(o.settings.filter(o => o.name === 'isRequestedAmount'));
if (formula && !isEmpty(formula.value)) { if (formula && !isEmpty(formula.value)) {
try { try {
@@ -600,6 +602,10 @@ const BandoApplication = () => {
? pathOr(0, [o.id, 'total'], updatedFormValues) ? pathOr(0, [o.id, 'total'], updatedFormValues)
: pathOr(0, [o.id], updatedFormValues); : pathOr(0, [o.id], updatedFormValues);
} }
if (REACT_APP_HUB_ID !== 't7jh5wfg9QXylNaTZkPoE' && antiMoneyLaundryCalls.includes(bandoId) && isRequestedAmount && isRequestedAmount.value) {
updatedFormValues[o.id] = 100;
}
}); });
if (!isEmpty(updatedFormValues) && !equal(updatedFormValues, formValues)) { if (!isEmpty(updatedFormValues) && !equal(updatedFormValues, formValues)) {
@@ -713,6 +719,7 @@ const BandoApplication = () => {
{'DRAFT' === applicationStatus {'DRAFT' === applicationStatus
/*|| 'AWAITING' === applicationStatus*/ /*|| 'AWAITING' === applicationStatus*/
? formData.map(o => { ? formData.map(o => {
const isRequestedAmount = head(o.settings.filter(o => o.name === 'isRequestedAmount'));
const label = head(o.settings.filter(o => o.name === 'label')); const label = head(o.settings.filter(o => o.name === 'label'));
const text = head(o.settings.filter(o => o.name === 'text')); const text = head(o.settings.filter(o => o.name === 'text'));
const placeholder = head(o.settings.filter(o => o.name === 'placeholder')); const placeholder = head(o.settings.filter(o => o.name === 'placeholder'));
@@ -756,6 +763,7 @@ const BandoApplication = () => {
/*if (o.name === 'fileselect') { /*if (o.name === 'fileselect') {
console.log('options::', options) console.log('options::', options)
}*/ }*/
const hideField = REACT_APP_HUB_ID !== 't7jh5wfg9QXylNaTZkPoE' && antiMoneyLaundryCalls.includes(bandoId) && isRequestedAmount && isRequestedAmount.value
return ['paragraph'].includes(o.name) && text return ['paragraph'].includes(o.name) && text
? <div key={o.id}> ? <div key={o.id}>
@@ -765,6 +773,7 @@ const BandoApplication = () => {
</div> </div>
: <FormField : <FormField
key={o.id} key={o.id}
additionalClass={hideField ? 'hidden' : ''}
disabled={isExpired} disabled={isExpired}
readOnly={formula && !isEmpty(formula.value)} readOnly={formula && !isEmpty(formula.value)}
type={o.name} type={o.name}

View File

@@ -35,6 +35,7 @@ const ElementSetting = ({ setting, changeFn, updateDataFn, bandoStatus }) => {
step: __('Numero Decimali', 'gepafin'), step: __('Numero Decimali', 'gepafin'),
isRequestedAmount: __('Importo richiesto', 'gepafin'), isRequestedAmount: __('Importo richiesto', 'gepafin'),
isDelegation: __('Delega', 'gepafin'), isDelegation: __('Delega', 'gepafin'),
isPecEmail: __('PEC email', 'gepafin'),
options: __('Opzioni', 'gepafin'), options: __('Opzioni', 'gepafin'),
mime: __('Tipo di file', 'gepafin'), mime: __('Tipo di file', 'gepafin'),
documentCategories: __('Categorie dei documenti', 'gepafin'), documentCategories: __('Categorie dei documenti', 'gepafin'),
@@ -130,7 +131,7 @@ const ElementSetting = ({ setting, changeFn, updateDataFn, bandoStatus }) => {
name={setting.name} name={setting.name}
bandoStatus={bandoStatus} bandoStatus={bandoStatus}
setDataFn={updateDataFn}/> setDataFn={updateDataFn}/>
} else if (['isRequestedAmount', 'isDelegation', 'isChecklistItem'].includes(setting.name)) { } else if (['isRequestedAmount', 'isDelegation', 'isPecEmail', 'isChecklistItem'].includes(setting.name)) {
return <InputSwitch return <InputSwitch
checked={setting.value} checked={setting.value}
onChange={(e) => changeFn(e.value, setting.name)}/> onChange={(e) => changeFn(e.value, setting.name)}/>

View File

@@ -36,6 +36,7 @@ const REACT_APP_HUB_ID = process.env.REACT_APP_HUB_ID;
const BandoViewBeneficiario = () => { const BandoViewBeneficiario = () => {
const isAsyncRequest = useStoreValue('isAsyncRequest'); const isAsyncRequest = useStoreValue('isAsyncRequest');
const chosenCompanyId = useStoreValue('chosenCompanyId'); const chosenCompanyId = useStoreValue('chosenCompanyId');
const antiMoneyLaundryCalls = useStoreValue('antiMoneyLaundryCalls');
const { id } = useParams(); const { id } = useParams();
const navigate = useNavigate(); const navigate = useNavigate();
const [data, setData] = useState({}); const [data, setData] = useState({});
@@ -98,7 +99,7 @@ const BandoViewBeneficiario = () => {
if (REACT_APP_HUB_ID === 't7jh5wfg9QXylNaTZkPoE') { if (REACT_APP_HUB_ID === 't7jh5wfg9QXylNaTZkPoE') {
return __('Presenta domanda', 'gepafin'); return __('Presenta domanda', 'gepafin');
} else { } else {
if(data.allowMultipleApplications){ if (data.allowMultipleApplications) {
return __('Presenta domanda', 'gepafin'); return __('Presenta domanda', 'gepafin');
} else { } else {
if (applicationObj && applicationObj.id) { if (applicationObj && applicationObj.id) {
@@ -115,10 +116,10 @@ const BandoViewBeneficiario = () => {
if (REACT_APP_HUB_ID === 't7jh5wfg9QXylNaTZkPoE') { if (REACT_APP_HUB_ID === 't7jh5wfg9QXylNaTZkPoE') {
return 'pi pi-save'; return 'pi pi-save';
} else { } else {
if(data.allowMultipleApplications){ if (data.allowMultipleApplications) {
return 'pi pi-save'; return 'pi pi-save';
} else { } else {
if (applicationObj && applicationObj.id) { if (applicationObj && applicationObj.id) {
return 'pi pi-arrow-right'; return 'pi pi-arrow-right';
} else { } else {
return 'pi pi-save'; return 'pi pi-save';
@@ -132,7 +133,7 @@ const BandoViewBeneficiario = () => {
if (data.confidi) { if (data.confidi) {
if ((data.id === 6 && REACT_APP_HUB_ID === 'p4lk3bcx1RStqTaIVVbXs') || role === 'ROLE_CONFIDI') { if ((data.id === 6 && REACT_APP_HUB_ID === 'p4lk3bcx1RStqTaIVVbXs') || role === 'ROLE_CONFIDI') {
if(data.allowMultipleApplications){ if (data.allowMultipleApplications) {
const bandoId = getBandoId(); const bandoId = getBandoId();
ApplicationService.createApplication(bandoId, {}, createApplCallback, errCreateApplCallback, [['companyId', chosenCompanyId]]); ApplicationService.createApplication(bandoId, {}, createApplCallback, errCreateApplCallback, [['companyId', chosenCompanyId]]);
} else { } else {
@@ -151,7 +152,7 @@ const BandoViewBeneficiario = () => {
const bandoId = getBandoId(); const bandoId = getBandoId();
ApplicationService.createApplication(bandoId, {}, createApplCallback, errCreateApplCallback, [['companyId', chosenCompanyId]]); ApplicationService.createApplication(bandoId, {}, createApplCallback, errCreateApplCallback, [['companyId', chosenCompanyId]]);
} else { } else {
if(data.allowMultipleApplications){ if (data.allowMultipleApplications) {
const bandoId = getBandoId(); const bandoId = getBandoId();
ApplicationService.createApplication(bandoId, {}, createApplCallback, errCreateApplCallback, [['companyId', chosenCompanyId]]); ApplicationService.createApplication(bandoId, {}, createApplCallback, errCreateApplCallback, [['companyId', chosenCompanyId]]);
} else { } else {
@@ -397,51 +398,57 @@ const BandoViewBeneficiario = () => {
</div> </div>
</div> </div>
<div className="appPageSection__row"> {REACT_APP_HUB_ID !== 't7jh5wfg9QXylNaTZkPoE' && antiMoneyLaundryCalls.includes(data.id)
<div className="appPageSection__withBorder"> ? null
<p className="appPageSection__pMeta"> : <div className="appPageSection__row">
<span>{__('Importo totale', 'gepafin')}</span> <div className="appPageSection__withBorder">
<span>{getNumberWithCurrency(data.amount)}</span> <p className="appPageSection__pMeta">
</p> <span>{__('Importo totale', 'gepafin')}</span>
<p className="appPageSection__pMeta"> <span>{getNumberWithCurrency(data.amount)}</span>
<span>{__('Importo minimo per progetto', 'gepafin')}</span> </p>
<span>{getNumberWithCurrency(data.amountMin)}</span> <p className="appPageSection__pMeta">
</p> <span>{__('Importo minimo per progetto', 'gepafin')}</span>
<p className="appPageSection__pMeta"> <span>{getNumberWithCurrency(data.amountMin)}</span>
<span>{__('Importo massimo per progetto', 'gepafin')}</span> </p>
<span>{getNumberWithCurrency(data.amountMax)}</span> <p className="appPageSection__pMeta">
</p> <span>{__('Importo massimo per progetto', 'gepafin')}</span>
</div> <span>{getNumberWithCurrency(data.amountMax)}</span>
</p>
</div>
<div className="appPageSection__withBorder"> <div className="appPageSection__withBorder">
<p className="appPageSection__pMeta"> <p className="appPageSection__pMeta">
<span>{__('Data apertura', 'gepafin')}</span> <span>{__('Data apertura', 'gepafin')}</span>
<span>{getDateFromISOstring(data.dates[0])} {data.startTime}</span> <span>{getDateFromISOstring(data.dates[0])} {data.startTime}</span>
</p> </p>
<p className="appPageSection__pMeta"> <p className="appPageSection__pMeta">
<span>{__('Data chiusura', 'gepafin')}</span> <span>{__('Data chiusura', 'gepafin')}</span>
<span>{getDateFromISOstring(data.dates[1])} {data.endTime}</span> <span>{getDateFromISOstring(data.dates[1])} {data.endTime}</span>
</p> </p>
</div> </div>
</div> </div>}
<div className="appPageSection__withBorder"> {REACT_APP_HUB_ID !== 't7jh5wfg9QXylNaTZkPoE' && antiMoneyLaundryCalls.includes(data.id)
<h2>{__('Descrizione dettagliata', 'gepafin')}</h2> ? null
<div className="ql-editor"> : <div className="appPageSection__withBorder">
{renderHtmlContent(data.descriptionLong)} <h2>{__('Descrizione dettagliata', 'gepafin')}</h2>
</div> <div className="ql-editor">
</div> {renderHtmlContent(data.descriptionLong)}
</div>
</div>}
<div className="appPageSection__withBorder"> {REACT_APP_HUB_ID !== 't7jh5wfg9QXylNaTZkPoE' && antiMoneyLaundryCalls.includes(data.id)
<h2>{__('Requisiti di Partecipazione', 'gepafin')}</h2> ? null
<div className="row rowContent"> : <div className="appPageSection__withBorder">
<ul> <h2>{__('Requisiti di Partecipazione', 'gepafin')}</h2>
{data.aimedTo.map((o, i) => <li key={i}> <div className="row rowContent">
{o.value} <ul>
</li>)} {data.aimedTo.map((o, i) => <li key={i}>
</ul> {o.value}
</div> </li>)}
</div> </ul>
</div>
</div>}
<div className="appPageSection__withBorder"> <div className="appPageSection__withBorder">
<h2>{__('Documentazione richiesta', 'gepafin')}</h2> <h2>{__('Documentazione richiesta', 'gepafin')}</h2>
@@ -461,18 +468,20 @@ const BandoViewBeneficiario = () => {
</div> </div>
</div>*/} </div>*/}
<div className="appPageSection__withBorder"> {REACT_APP_HUB_ID !== 't7jh5wfg9QXylNaTZkPoE' && antiMoneyLaundryCalls.includes(data.id)
<h2>{__('Allegati', 'gepafin')}</h2> ? null
<div className="row rowContent"> : <div className="appPageSection__withBorder">
<ul> <h2>{__('Allegati', 'gepafin')}</h2>
{data.docs <div className="row rowContent">
.filter(o => o.source === 'CALL' && o.type === 'DOCUMENT') <ul>
.map((o, i) => <li key={i}> {data.docs
<a href={o.filePath} target="_blank" rel="noreferrer">{o.name}</a> .filter(o => o.source === 'CALL' && o.type === 'DOCUMENT')
</li>)} .map((o, i) => <li key={i}>
</ul> <a href={o.filePath} target="_blank" rel="noreferrer">{o.name}</a>
</div> </li>)}
</div> </ul>
</div>
</div>}
<div className="appPageSection"> <div className="appPageSection">
<h2>{__('FAQ', 'gepafin')}</h2> <h2>{__('FAQ', 'gepafin')}</h2>
@@ -534,7 +543,9 @@ const BandoViewBeneficiario = () => {
: null} : null}
<div className="appPageSection"> <div className="appPageSection">
<h2>{__('Download Documenti', 'gepafin')}</h2> {REACT_APP_HUB_ID !== 't7jh5wfg9QXylNaTZkPoE' && antiMoneyLaundryCalls.includes(data.id)
? null
: <h2>{__('Download Documenti', 'gepafin')}</h2>}
<div className="appPageSection__actions"> <div className="appPageSection__actions">
{/* <Button {/* <Button
type="button" type="button"
@@ -543,13 +554,15 @@ const BandoViewBeneficiario = () => {
onClick={scaricaBando} onClick={scaricaBando}
label={__('Scarica Bando Completo', 'gepafin')} label={__('Scarica Bando Completo', 'gepafin')}
icon="pi pi-download" iconPos="right"/>*/} icon="pi pi-download" iconPos="right"/>*/}
<Button {REACT_APP_HUB_ID !== 't7jh5wfg9QXylNaTZkPoE' && antiMoneyLaundryCalls.includes(data.id)
? null
: <Button
type="button" type="button"
disabled={isExpired} disabled={isExpired}
outlined outlined
onClick={scaricaModulistica} onClick={scaricaModulistica}
label={__('Scarica Bando Completo e Modulistica', 'gepafin')} label={__('Scarica Bando Completo e Modulistica', 'gepafin')}
icon="pi pi-download" iconPos="right"/> icon="pi pi-download" iconPos="right"/>}
{applicationObj.status && applicationObj.status === 'APPROVED' {applicationObj.status && applicationObj.status === 'APPROVED'
? null ? null
: <Button : <Button
@@ -558,7 +571,9 @@ const BandoViewBeneficiario = () => {
onClick={submitApplication} onClick={submitApplication}
label={submitBtnLabel()} label={submitBtnLabel()}
icon={submitBtnIcon()} iconPos="right"/>} icon={submitBtnIcon()} iconPos="right"/>}
<Button {REACT_APP_HUB_ID !== 't7jh5wfg9QXylNaTZkPoE' && antiMoneyLaundryCalls.includes(data.id)
? null
: <Button
type="button" type="button"
disabled={isExpired} disabled={isExpired}
outlined={isNil(data.preferredCallId)} outlined={isNil(data.preferredCallId)}
@@ -567,7 +582,7 @@ const BandoViewBeneficiario = () => {
label={isNil(data.preferredCallId) label={isNil(data.preferredCallId)
? __('Aggiungi a preferiti', 'gepafin') ? __('Aggiungi a preferiti', 'gepafin')
: __('Rimuovi dai preferiti', 'gepafin')} : __('Rimuovi dai preferiti', 'gepafin')}
icon="pi pi-heart" iconPos="left"/> icon="pi pi-heart" iconPos="left"/>}
</div> </div>
</div> </div>

View File

@@ -26,6 +26,7 @@ const REACT_APP_HUB_ID = process.env.REACT_APP_HUB_ID;
const BandoViewPreInstructor = () => { const BandoViewPreInstructor = () => {
const isAsyncRequest = useStoreValue('isAsyncRequest'); const isAsyncRequest = useStoreValue('isAsyncRequest');
const antiMoneyLaundryCalls = useStoreValue('antiMoneyLaundryCalls');
const { id } = useParams(); const { id } = useParams();
const [data, setData] = useState({}); const [data, setData] = useState({});
const [newQuestion, setNewQuestion] = useState(''); const [newQuestion, setNewQuestion] = useState('');
@@ -97,51 +98,57 @@ const BandoViewPreInstructor = () => {
</div> </div>
</div> </div>
<div className="appPageSection__row"> {REACT_APP_HUB_ID !== 't7jh5wfg9QXylNaTZkPoE' && antiMoneyLaundryCalls.includes(data.id)
<div className="appPageSection__withBorder"> ? null
<p className="appPageSection__pMeta"> : <div className="appPageSection__row">
<span>{__('Importo totale', 'gepafin')}</span> <div className="appPageSection__withBorder">
<span>{getNumberWithCurrency(data.amount)}</span> <p className="appPageSection__pMeta">
</p> <span>{__('Importo totale', 'gepafin')}</span>
<p className="appPageSection__pMeta"> <span>{getNumberWithCurrency(data.amount)}</span>
<span>{__('Importo minimo per progetto', 'gepafin')}</span> </p>
<span>{getNumberWithCurrency(data.amountMin)}</span> <p className="appPageSection__pMeta">
</p> <span>{__('Importo minimo per progetto', 'gepafin')}</span>
<p className="appPageSection__pMeta"> <span>{getNumberWithCurrency(data.amountMin)}</span>
<span>{__('Importo massimo per progetto', 'gepafin')}</span> </p>
<span>{getNumberWithCurrency(data.amountMax)}</span> <p className="appPageSection__pMeta">
</p> <span>{__('Importo massimo per progetto', 'gepafin')}</span>
</div> <span>{getNumberWithCurrency(data.amountMax)}</span>
</p>
</div>
<div className="appPageSection__withBorder"> <div className="appPageSection__withBorder">
<p className="appPageSection__pMeta"> <p className="appPageSection__pMeta">
<span>{__('Data apertura', 'gepafin')}</span> <span>{__('Data apertura', 'gepafin')}</span>
<span>{getDateFromISOstring(data.dates[0])} {data.startTime}</span> <span>{getDateFromISOstring(data.dates[0])} {data.startTime}</span>
</p> </p>
<p className="appPageSection__pMeta"> <p className="appPageSection__pMeta">
<span>{__('Data chiusura', 'gepafin')}</span> <span>{__('Data chiusura', 'gepafin')}</span>
<span>{getDateFromISOstring(data.dates[1])} {data.endTime}</span> <span>{getDateFromISOstring(data.dates[1])} {data.endTime}</span>
</p> </p>
</div> </div>
</div> </div>}
<div className="appPageSection__withBorder"> {REACT_APP_HUB_ID !== 't7jh5wfg9QXylNaTZkPoE' && antiMoneyLaundryCalls.includes(data.id)
<h2>{__('Descrizione dettagliata', 'gepafin')}</h2> ? null
<div className="ql-editor"> : <div className="appPageSection__withBorder">
{renderHtmlContent(data.descriptionLong)} <h2>{__('Descrizione dettagliata', 'gepafin')}</h2>
</div> <div className="ql-editor">
</div> {renderHtmlContent(data.descriptionLong)}
</div>
</div>}
<div className="appPageSection__withBorder"> {REACT_APP_HUB_ID !== 't7jh5wfg9QXylNaTZkPoE' && antiMoneyLaundryCalls.includes(data.id)
<h2>{__('Requisiti di Partecipazione', 'gepafin')}</h2> ? null
<div className="row rowContent"> : <div className="appPageSection__withBorder">
<ul> <h2>{__('Requisiti di Partecipazione', 'gepafin')}</h2>
{data.aimedTo.map((o, i) => <li key={i}> <div className="row rowContent">
{o.value} <ul>
</li>)} {data.aimedTo.map((o, i) => <li key={i}>
</ul> {o.value}
</div> </li>)}
</div> </ul>
</div>
</div>}
<div className="appPageSection__withBorder"> <div className="appPageSection__withBorder">
<h2>{__('Documentazione richiesta', 'gepafin')}</h2> <h2>{__('Documentazione richiesta', 'gepafin')}</h2>
@@ -161,18 +168,20 @@ const BandoViewPreInstructor = () => {
</div> </div>
</div>*/} </div>*/}
<div className="appPageSection__withBorder"> {REACT_APP_HUB_ID !== 't7jh5wfg9QXylNaTZkPoE' && antiMoneyLaundryCalls.includes(data.id)
<h2>{__('Allegati', 'gepafin')}</h2> ? null
<div className="row rowContent"> : <div className="appPageSection__withBorder">
<ul> <h2>{__('Allegati', 'gepafin')}</h2>
{data.docs <div className="row rowContent">
.filter(o => o.source === 'CALL' && o.type === 'DOCUMENT') <ul>
.map((o, i) => <li key={i}> {data.docs
<a href={o.filePath} target="_blank" rel="noreferrer">{o.name}</a> .filter(o => o.source === 'CALL' && o.type === 'DOCUMENT')
</li>)} .map((o, i) => <li key={i}>
</ul> <a href={o.filePath} target="_blank" rel="noreferrer">{o.name}</a>
</div> </li>)}
</div> </ul>
</div>
</div>}
<div className="appPageSection"> <div className="appPageSection">
<h2>{__('FAQ', 'gepafin')}</h2> <h2>{__('FAQ', 'gepafin')}</h2>

View File

@@ -30,10 +30,19 @@ import { Tag } from 'primereact/tag';
import { Calendar } from 'primereact/calendar'; import { Calendar } from 'primereact/calendar';
import { isNil } from 'ramda'; import { isNil } from 'ramda';
const LatestBandiBeneficiarioTableAsync = () => { const REACT_APP_HUB_ID = process.env.REACT_APP_HUB_ID;
const LatestBandiBeneficiarioTableAsync = ({ isAntiMoneylaundry = false }) => {
const chosenCompanyId = useStoreValue('chosenCompanyId'); const chosenCompanyId = useStoreValue('chosenCompanyId');
const antiMoneyLaundryCalls = useStoreValue('antiMoneyLaundryCalls');
const [localAsyncRequest, setLocalAsyncRequest] = useState(false); const [localAsyncRequest, setLocalAsyncRequest] = useState(false);
const [items, setItems] = useState(null); const [items, setItems] = useState([]);
let filteredItems = items;
if (REACT_APP_HUB_ID !== 't7jh5wfg9QXylNaTZkPoE') {
filteredItems = isAntiMoneylaundry
? items.filter(o => antiMoneyLaundryCalls.includes(o.id))
: items.filter(o => !antiMoneyLaundryCalls.includes(o.id));
}
const [totalRecordsNum, setTotalRecordsNum] = useState(0); const [totalRecordsNum, setTotalRecordsNum] = useState(0);
const [lazyState, setLazyState] = useState({ const [lazyState, setLazyState] = useState({
first: 0, first: 0,
@@ -154,7 +163,7 @@ const LatestBandiBeneficiarioTableAsync = () => {
<i className="pi pi-heart" style={{ fontSize: '1rem' }}></i> <i className="pi pi-heart" style={{ fontSize: '1rem' }}></i>
</button> </button>
<Link to={`/bandi/${rowData.id}`}> <Link to={`/bandi/${rowData.id}`}>
<Button severity="info" label={__('Partecipa', 'gepafin')} icon="pi pi-arrow-right" size="small" <Button severity="info" label={__('Compila', 'gepafin')} icon="pi pi-arrow-right" size="small"
iconPos="right"/> iconPos="right"/>
</Link></div> </Link></div>
} }
@@ -217,7 +226,7 @@ const LatestBandiBeneficiarioTableAsync = () => {
return ( return (
<div className="appPageSection__table"> <div className="appPageSection__table">
<DataTable <DataTable
value={items} stripedRows showGridlines value={filteredItems} stripedRows showGridlines
lazy filterDisplay="menu" dataKey="id" paginator lazy filterDisplay="menu" dataKey="id" paginator
first={lazyState.first} rows={lazyState.rows} totalRecords={totalRecordsNum} onPage={onPage} first={lazyState.first} rows={lazyState.rows} totalRecords={totalRecordsNum} onPage={onPage}
onSort={onSort} sortField={lazyState.sortField} sortOrder={lazyState.sortOrder} onSort={onSort} sortField={lazyState.sortField} sortOrder={lazyState.sortOrder}

View File

@@ -29,6 +29,8 @@ import { Calendar } from 'primereact/calendar';
import { confirmPopup, ConfirmPopup } from 'primereact/confirmpopup'; import { confirmPopup, ConfirmPopup } from 'primereact/confirmpopup';
import { ProgressBar } from 'primereact/progressbar'; import { ProgressBar } from 'primereact/progressbar';
const REACT_APP_HUB_ID = process.env.REACT_APP_HUB_ID;
const MyLatestSubmissionsTableAsync = () => { const MyLatestSubmissionsTableAsync = () => {
const chosenCompanyId = useStoreValue('chosenCompanyId'); const chosenCompanyId = useStoreValue('chosenCompanyId');
const [localAsyncRequest, setLocalAsyncRequest] = useState(false); const [localAsyncRequest, setLocalAsyncRequest] = useState(false);
@@ -50,6 +52,9 @@ const MyLatestSubmissionsTableAsync = () => {
status: { value: null, matchMode: 'equals' } status: { value: null, matchMode: 'equals' }
} }
}); });
const colBandoLabel = REACT_APP_HUB_ID === 't7jh5wfg9QXylNaTZkPoE'
? __('Bando', 'gepafin')
: __('Bandi e modello AR1', 'gepafin');
const statuses = ['DRAFT', 'AWAITING', 'READY']; const statuses = ['DRAFT', 'AWAITING', 'READY'];
@@ -212,7 +217,7 @@ const MyLatestSubmissionsTableAsync = () => {
onSort={onSort} sortField={lazyState.sortField} sortOrder={lazyState.sortOrder} onSort={onSort} sortField={lazyState.sortField} sortOrder={lazyState.sortOrder}
onFilter={onFilter} filters={lazyState.filters} loading={localAsyncRequest} onFilter={onFilter} filters={lazyState.filters} loading={localAsyncRequest}
emptyMessage={translationStrings.emptyMessage}> emptyMessage={translationStrings.emptyMessage}>
<Column field="callTitle" header={__('Bando', 'gepafin')} <Column field="callTitle" header={colBandoLabel}
filterField="callTitle" filter filterField="callTitle" filter
filterMatchModeOptions={translationStrings.textFilterOptions} filterMatchModeOptions={translationStrings.textFilterOptions}
filterPlaceholder={__('Cerca il nome', 'gepafin')} filterPlaceholder={__('Cerca il nome', 'gepafin')}

View File

@@ -16,7 +16,7 @@ import ErrorBoundary from '../../components/ErrorBoundary';
import LatestBandiBeneficiarioTableAsync from './components/LatestBandiBeneficiarioTableAsync'; import LatestBandiBeneficiarioTableAsync from './components/LatestBandiBeneficiarioTableAsync';
import MyLatestSubmissionsTableAsync from './components/MyLatestSubmissionsTableAsync'; import MyLatestSubmissionsTableAsync from './components/MyLatestSubmissionsTableAsync';
//const REACT_APP_HUB_ID = process.env.REACT_APP_HUB_ID; const REACT_APP_HUB_ID = process.env.REACT_APP_HUB_ID;
const DashboardBeneficiario = () => { const DashboardBeneficiario = () => {
const navigate = useNavigate(); const navigate = useNavigate();
@@ -102,7 +102,7 @@ const DashboardBeneficiario = () => {
<span className="summary">{__('Attenzione', 'gepafin')}</span> <span className="summary">{__('Attenzione', 'gepafin')}</span>
<span> <span>
{__('Per applicare ai bandi devi Registare un Azienda clicca', 'gepafin')} {__('Per applicare ai bandi devi Registare un Azienda clicca', 'gepafin')}
<Link to={`/agguingi-azienda`} style={{marginLeft: '0.5ch'}}>{__('qua', 'gepafin')}</Link> <Link to={`/agguingi-azienda`} style={{ marginLeft: '0.5ch' }}>{__('qua', 'gepafin')}</Link>
</span> </span>
</div> </div>
<div className="appPage__spacer"></div> <div className="appPage__spacer"></div>
@@ -127,6 +127,16 @@ const DashboardBeneficiario = () => {
<div className="appPage__spacer"></div> <div className="appPage__spacer"></div>
{REACT_APP_HUB_ID !== 't7jh5wfg9QXylNaTZkPoE'
? <>
<div className="appPageSection">
<h2>{__('Questionario Antiriciclaggio', 'gepafin')}</h2>
<ErrorBoundary><LatestBandiBeneficiarioTableAsync isAntiMoneylaundry={true}/></ErrorBoundary>
</div>
<div className="appPage__spacer"></div>
</>
: null}
<div className="appPageSection__hr"> <div className="appPageSection__hr">
<span>{__('Azioni rapide', 'gepafin')}</span> <span>{__('Azioni rapide', 'gepafin')}</span>
</div> </div>

View File

@@ -16,7 +16,7 @@ import ErrorBoundary from '../../components/ErrorBoundary';
import MyLatestSubmissionsTableAsync from '../DashboardBeneficiario/components/MyLatestSubmissionsTableAsync'; import MyLatestSubmissionsTableAsync from '../DashboardBeneficiario/components/MyLatestSubmissionsTableAsync';
import LatestBandiBeneficiarioTableAsync from '../DashboardBeneficiario/components/LatestBandiBeneficiarioTableAsync'; import LatestBandiBeneficiarioTableAsync from '../DashboardBeneficiario/components/LatestBandiBeneficiarioTableAsync';
//const REACT_APP_HUB_ID = process.env.REACT_APP_HUB_ID; const REACT_APP_HUB_ID = process.env.REACT_APP_HUB_ID;
const DashboardBeneficiarioConfidi = () => { const DashboardBeneficiarioConfidi = () => {
const navigate = useNavigate(); const navigate = useNavigate();
@@ -127,6 +127,16 @@ const DashboardBeneficiarioConfidi = () => {
<div className="appPage__spacer"></div> <div className="appPage__spacer"></div>
{REACT_APP_HUB_ID !== 't7jh5wfg9QXylNaTZkPoE'
? <>
<div className="appPageSection">
<h2>{__('Questionario Antiriciclaggio', 'gepafin')}</h2>
<ErrorBoundary><LatestBandiBeneficiarioTableAsync isAntiMoneylaundry={true}/></ErrorBoundary>
</div>
<div className="appPage__spacer"></div>
</>
: null}
<div className="appPageSection__hr"> <div className="appPageSection__hr">
<span>{__('Azioni rapide', 'gepafin')}</span> <span>{__('Azioni rapide', 'gepafin')}</span>
</div> </div>

View File

@@ -25,7 +25,9 @@ const initialStore = {
// flow // flow
flowData: [], flowData: [],
flowForms: [], flowForms: [],
flowEdges: [] flowEdges: [],
// misc
antiMoneyLaundryCalls: [23]
} }
export default initialStore; export default initialStore;