From 7bf56190e1fa78ed3fce1afac246229e17a57a16 Mon Sep 17 00:00:00 2001 From: dcioara Date: Mon, 10 Apr 2023 12:17:36 +0300 Subject: [PATCH 01/10] [ch33354] UNICEF Cash Unfunded --- assets/i18n/ar.json | 3 ++ assets/i18n/en.json | 3 ++ assets/i18n/es.json | 3 ++ assets/i18n/fr.json | 3 ++ assets/i18n/pt.json | 3 ++ assets/i18n/ru.json | 3 ++ .../components/activity/activity-item-row.ts | 33 ++++++++++++--- .../activity/activity-items-table.ts | 6 ++- .../components/activity/get-total.helper.ts | 16 ++++++-- common/mixins/activities-common.mixin.ts | 13 +++--- common/types/editor-page-types.ts | 2 + intervention-metadata/other/other.models.ts | 2 + intervention-metadata/other/other.ts | 19 +++++++-- .../editor-utils/activities-mixin.ts | 25 +++++++++++- .../editor-utils/activity-item-mixin.ts | 21 ++++++++++ .../activity-dialog.ts | 40 +++++++++++++++++-- .../effective-efficient-programme-mgmt.ts | 13 +++++- .../activity-dialog/activity-data-dialog.ts | 38 ++++++++++++++++-- 18 files changed, 216 insertions(+), 30 deletions(-) diff --git a/assets/i18n/ar.json b/assets/i18n/ar.json index 9adf7fff5..79e30487c 100644 --- a/assets/i18n/ar.json +++ b/assets/i18n/ar.json @@ -126,6 +126,8 @@ "COMPLETED": "مكتمل", "CONFIDENTIAL": "مؤتمن", "CONFIDENTIAL_INFO": "سيمنع هذا التبديل استخدام PD في لوحات المعلومات الخارجية لليونيسف.", + "PD_UNFUNDED_AMOUNTS": "This programme document includes unfunded amounts.", + "UNFUNDED_CASH": "Unfunded Cash", "CONFIRM_BTN_TEXT": "نعم", "CONFIRM_BTN_TXT": "نعم", "CONTEXT": "سياق", @@ -313,6 +315,7 @@ "INVALID_ERR": "غير صالح", "INVALID_NUMBER": "رقم غير صالح", "INVALID_TOTAL_ACTIVITY_ITEMS": "بيانات الميزانية غير صالحة. يجب أن تكون أموال اليونيسف + الشريك مساوية لإجمالي النقد.", + "INVALID_TOTAL_UNFUNDED_ACTIVITY_ITEMS": "Invalid budget data. UNICEF + Partner Cash + Unfunded Cash should be equal to Total Cash.", "IS_ACTIVE": "نشط", "ITEM_ALL_PRICES": "البند (جميع الأسعار بعملة PD)", "ITEM_DESCRIPTION": "وصف السلعة", diff --git a/assets/i18n/en.json b/assets/i18n/en.json index 88af3d17c..5cffb8ab6 100644 --- a/assets/i18n/en.json +++ b/assets/i18n/en.json @@ -126,6 +126,8 @@ "COMPLETED": "Completed", "CONFIDENTIAL": "Confidential", "CONFIDENTIAL_INFO": "This toggle will prevent this PD to be used in dashboards external to UNICEF.", + "PD_UNFUNDED_AMOUNTS": "This programme document includes unfunded amounts.", + "UNFUNDED_CASH": "Unfunded Cash", "CONFIRM_BTN_TEXT": "Yes", "CONFIRM_BTN_TXT": "Yes", "CONTEXT": "Context", @@ -313,6 +315,7 @@ "INVALID_ERR": "Invalid", "INVALID_NUMBER": "Invalid number", "INVALID_TOTAL_ACTIVITY_ITEMS": "Invalid budget data. UNICEF + Partner Cash should be equal to Total Cash.", + "INVALID_TOTAL_UNFUNDED_ACTIVITY_ITEMS": "Invalid budget data. UNICEF + Partner Cash + Unfunded Cash should be equal to Total Cash.", "IS_ACTIVE": "Is active", "ITEM_ALL_PRICES": "Item (all prices in PD Currency)", "ITEM_DESCRIPTION": "Item Description", diff --git a/assets/i18n/es.json b/assets/i18n/es.json index 0a2b67ea8..4a3c73ee1 100644 --- a/assets/i18n/es.json +++ b/assets/i18n/es.json @@ -126,6 +126,8 @@ "COMPLETED": "COMPLETADO", "CONFIDENTIAL": "Confidencial", "CONFIDENTIAL_INFO": "Este conmutador impedirá que esta EP se utilice en cuadros de mando externos a UNICEF.", + "PD_UNFUNDED_AMOUNTS": "This programme document includes unfunded amounts.", + "UNFUNDED_CASH": "Unfunded Cash", "CONFIRM_BTN_TEXT": "Sí", "CONFIRM_BTN_TXT": "Sí", "CONTEXT": "Contexto", @@ -313,6 +315,7 @@ "INVALID_ERR": "Invalido", "INVALID_NUMBER": "Número inválido", "INVALID_TOTAL_ACTIVITY_ITEMS": "Datos presupuestarios no válidos. UNICEF + Efectivo de los socios debe ser igual a Efectivo total.", + "INVALID_TOTAL_UNFUNDED_ACTIVITY_ITEMS": "Invalid budget data. UNICEF + Partner Cash + Unfunded Cash should be equal to Total Cash.", "IS_ACTIVE": "Está activo", "ITEM_ALL_PRICES": "Artículo (todos los precios en moneda PD)", "ITEM_DESCRIPTION": "Descripción del artículo", diff --git a/assets/i18n/fr.json b/assets/i18n/fr.json index ea3ae6154..359c78835 100644 --- a/assets/i18n/fr.json +++ b/assets/i18n/fr.json @@ -126,6 +126,8 @@ "COMPLETED": "Complété", "CONFIDENTIAL": "Confidentiel ", "CONFIDENTIAL_INFO": "Cette bascule empêchera ce DP d’être utilisée dans des tableaux de bord extérieurs à l’UNICEF", + "PD_UNFUNDED_AMOUNTS": "This programme document includes unfunded amounts.", + "UNFUNDED_CASH": "Unfunded Cash", "CONFIRM_BTN_TEXT": "Oui", "CONFIRM_BTN_TXT": "Oui", "CONTEXT": "Contexte", @@ -313,6 +315,7 @@ "INVALID_ERR": "Invalide", "INVALID_NUMBER": "Numéro non valide", "INVALID_TOTAL_ACTIVITY_ITEMS": "Données budgétaires non valides. Espèces UNICEF + Partenaire devrait être égal au Total Espèces.", + "INVALID_TOTAL_UNFUNDED_ACTIVITY_ITEMS": "Invalid budget data. UNICEF + Partner Cash + Unfunded Cash should be equal to Total Cash.", "IS_ACTIVE": "C'est actif", "ITEM_ALL_PRICES": "Article (tous les prix dans la devise du DP)", "ITEM_DESCRIPTION": "Description de l’objet ", diff --git a/assets/i18n/pt.json b/assets/i18n/pt.json index 9a152afa0..21e34cb9d 100644 --- a/assets/i18n/pt.json +++ b/assets/i18n/pt.json @@ -126,6 +126,8 @@ "COMPLETED": "Concluído", "CONFIDENTIAL": "Confidencial", "CONFIDENTIAL_INFO": "Esta alternância impedirá que este PD seja usado em painéis externos ao UNICEF", + "PD_UNFUNDED_AMOUNTS": "This programme document includes unfunded amounts.", + "UNFUNDED_CASH": "Unfunded Cash", "CONFIRM_BTN_TEXT": "Sim", "CONFIRM_BTN_TXT": "Sim", "CONTEXT": "Contexto", @@ -313,6 +315,7 @@ "INVALID_ERR": "Inválido", "INVALID_NUMBER": "Número inválido", "INVALID_TOTAL_ACTIVITY_ITEMS": "Dado orçamentário inválido. Orçamento financeiro do Unicef + Parceiro deve ser igual ao orçamento total.", + "INVALID_TOTAL_UNFUNDED_ACTIVITY_ITEMS": "Invalid budget data. UNICEF + Partner Cash + Unfunded Cash should be equal to Total Cash.", "IS_ACTIVE": "Está ativo", "ITEM_ALL_PRICES": "Item (todos os valoresna moeda do PD)", "ITEM_DESCRIPTION": "Descrição do item", diff --git a/assets/i18n/ru.json b/assets/i18n/ru.json index c4e6cc8bc..1e9b758d8 100644 --- a/assets/i18n/ru.json +++ b/assets/i18n/ru.json @@ -126,6 +126,8 @@ "COMPLETED": "Завершено", "CONFIDENTIAL": "Конфиденциально", "CONFIDENTIAL_INFO": "Эта функция позволит предотвратить использование этого ПД на других информационных платформах, не относящихся к ЮНИСЕФ. ", + "PD_UNFUNDED_AMOUNTS": "This programme document includes unfunded amounts.", + "UNFUNDED_CASH": "Unfunded Cash", "CONFIRM_BTN_TEXT": "Да", "CONFIRM_BTN_TXT": "Да", "CONTEXT": "контекст", @@ -313,6 +315,7 @@ "INVALID_ERR": "Неверно", "INVALID_NUMBER": "Неправильный номер", "INVALID_TOTAL_ACTIVITY_ITEMS": "Ошибка бюджета. Денежный вклад ЮНИСЕФ + денежный вклад партнера должны равняться Общей сумме денежных средств", + "INVALID_TOTAL_UNFUNDED_ACTIVITY_ITEMS": "Invalid budget data. UNICEF + Partner Cash + Unfunded Cash should be equal to Total Cash.", "IS_ACTIVE": "Активен", "ITEM_ALL_PRICES": "Статья (все суммы в валюте ПД)", "ITEM_DESCRIPTION": "Описание статьи", diff --git a/common/components/activity/activity-item-row.ts b/common/components/activity/activity-item-row.ts index a5ccb7b03..e5b731918 100644 --- a/common/components/activity/activity-item-row.ts +++ b/common/components/activity/activity-item-row.ts @@ -44,8 +44,8 @@ export class ActivityItemRow extends ActivitiesCommonMixin(LitElement) { @property() invalidSum = false; @property() readonly: boolean | undefined = false; @property() lastItem: boolean | undefined = false; - @property({type: String}) - currency = ''; + @property({type: String}) currency = ''; + @property() showUnfunded = true; protected render(): TemplateResult { return this.activityItem @@ -138,7 +138,7 @@ export class ActivityItemRow extends ActivitiesCommonMixin(LitElement) { no-label-float ?readonly="${this.readonly}" @value-changed="${({detail}: CustomEvent) => - this.cashFieldChanged(detail, 'cso_cash', this.activityItem)}" + this.cashFieldChanged(detail, 'cso_cash', this.activityItem, !this.showUnfunded)}" @blur="${() => this.onBlur()}" ?invalid="${this.invalidSum}" @focus="${() => (this.invalidSum = false)}" @@ -155,7 +155,7 @@ export class ActivityItemRow extends ActivitiesCommonMixin(LitElement) { no-label-float ?readonly="${this.readonly}" @value-changed="${({detail}: CustomEvent) => - this.cashFieldChanged(detail, 'unicef_cash', this.activityItem)}" + this.cashFieldChanged(detail, 'unicef_cash', this.activityItem, !this.showUnfunded)}" @blur="${() => this.onBlur()}" ?invalid="${this.invalidSum}" @focus="${() => (this.invalidSum = false)}" @@ -163,6 +163,25 @@ export class ActivityItemRow extends ActivitiesCommonMixin(LitElement) { error-message="" > + ${this.showUnfunded + ? html`
+ +
` + : ``}
[] = []; @property() readonly: boolean | undefined = false; @property() dialogElement!: EtoolsDialog; - @property({type: String}) - currency = ''; + @property({type: String}) currency = ''; + @property() showUnfunded = true; protected render(): TemplateResult { // language=html @@ -60,6 +60,7 @@ export class ActivityItemsTable extends LitElement {
${translate('PRICE_UNIT')}
${translate('PARTNER_CASH')}
${translate('UNICEF_CASH')}
+
${translate('UNFUNDED_CASH')}
${translate('TOTAL_CASH')} (${this.currency})
@@ -76,6 +77,7 @@ export class ActivityItemsTable extends LitElement { .readonly="${this.readonly}" .lastItem="${this.isLastItem(index)}" .currency="${this.currency}" + .showUnfunded="${this.showUnfunded}" >` )} ${!this.readonly diff --git a/common/components/activity/get-total.helper.ts b/common/components/activity/get-total.helper.ts index c2d8785ec..089504671 100644 --- a/common/components/activity/get-total.helper.ts +++ b/common/components/activity/get-total.helper.ts @@ -1,10 +1,18 @@ import {displayCurrencyAmount} from '@unicef-polymer/etools-currency-amount-input/mixins/etools-currency-module'; -export function getTotalCash(csoCash: number | string, unicefCash: number | string): number { - return Number(((Number(csoCash) || 0) + (Number(unicefCash) || 0)).toFixed(2)); +export function getTotalCash( + csoCash: number | string, + unicefCash: number | string, + unfundedCash?: number | string +): number { + return Number(((Number(csoCash) || 0) + (Number(unicefCash) || 0) + (Number(unfundedCash) || 0)).toFixed(2)); } -export function getTotalCashFormatted(csoCash: number | string, unicefCash: number | string): string { - return displayCurrencyAmount(String(getTotalCash(csoCash, unicefCash)), '0', 2); +export function getTotalCashFormatted( + csoCash: number | string, + unicefCash: number | string, + unfundedCash?: number | string +): string { + return displayCurrencyAmount(String(getTotalCash(csoCash, unicefCash, unfundedCash)), '0', 2); } export function getMultiplyProductCash(unit: number | string, price: number | string): number { diff --git a/common/mixins/activities-common.mixin.ts b/common/mixins/activities-common.mixin.ts index f63a8eb55..e27d343ed 100644 --- a/common/mixins/activities-common.mixin.ts +++ b/common/mixins/activities-common.mixin.ts @@ -7,17 +7,20 @@ export function ActivitiesCommonMixin>(baseCla return class ActivitiesCommonClass extends ModelChangedMixin(baseClass) { cashFieldChanged( detail: {value: any}, - field: 'unicef_cash' | 'cso_cash', - item: Partial + field: 'unicef_cash' | 'cso_cash' | 'unfunded_cash', + item: Partial, + setSecondCashField = true ): void { this.numberChanged(detail, field, item); if (!item.unit_price || !item.no_units) { return; } - const secondCashField = field === 'unicef_cash' ? 'cso_cash' : 'unicef_cash'; const total = getItemTotal(item); - const value = Number(Math.max(0, total - detail.value).toFixed(2)); // in js 12019.15-11130 = 889.1499999999996 - this.numberChanged({value}, secondCashField, item); + if (setSecondCashField) { + const secondCashField = field === 'unicef_cash' ? 'cso_cash' : 'unicef_cash'; + const value = Number(Math.max(0, total - detail.value).toFixed(2)); // in js 12019.15-11130 = 889.1499999999996 + this.numberChanged({value}, secondCashField, item); + } } activityItemInvalidChanged(detail: {value: any}, field: string, item: any) { diff --git a/common/types/editor-page-types.ts b/common/types/editor-page-types.ts index f8a72f0bf..90de7720a 100644 --- a/common/types/editor-page-types.ts +++ b/common/types/editor-page-types.ts @@ -24,6 +24,7 @@ export declare type InterventionActivity = { name: string; time_frames: number[]; unicef_cash: string; + unfunded_cash: string; unicef_suppies: number; is_active: boolean; created: string; @@ -61,6 +62,7 @@ type InvalidItem = { unit_price: boolean; cso_cash: boolean; unicef_cash: boolean; + unfunded_cash: boolean; }; export type InterventionActivityExtended = InterventionActivity & { diff --git a/intervention-metadata/other/other.models.ts b/intervention-metadata/other/other.models.ts index 9cc616a62..0e6b3110d 100644 --- a/intervention-metadata/other/other.models.ts +++ b/intervention-metadata/other/other.models.ts @@ -12,6 +12,7 @@ export class OtherData extends ModelsBase { contingency_pd = false; activation_protocol = ''; confidential = false; + unfunded_amounts = false; } export class OtherPermissions extends ModelsBase { @@ -22,4 +23,5 @@ export class OtherPermissions extends ModelsBase { document_type = true; document_currency = true; confidential = true; + unfunded_amounts = true; } diff --git a/intervention-metadata/other/other.ts b/intervention-metadata/other/other.ts index 7a43ce518..e5828ffeb 100644 --- a/intervention-metadata/other/other.ts +++ b/intervention-metadata/other/other.ts @@ -83,9 +83,11 @@ export class Other extends CommentsMixin(ComponentBaseMixin(LitElement)) { max-height: 96px; } } - .confidential-row { + .toggle-row { + padding-bottom: 15px; + } + .mt-4 { margin-top: -4px; - padding-bottom: 12px; } @@ -194,7 +196,7 @@ export class Other extends CommentsMixin(ComponentBaseMixin(LitElement)) { -
+
+
+ + ${translate('PD_UNFUNDED_AMOUNTS')} + +
+ ${this.renderActions(this.editMode, this.canEditAtLeastOneField)} `; diff --git a/intervention-workplan-editor/editor-utils/activities-mixin.ts b/intervention-workplan-editor/editor-utils/activities-mixin.ts index df9cd5664..5a2dc0d1d 100644 --- a/intervention-workplan-editor/editor-utils/activities-mixin.ts +++ b/intervention-workplan-editor/editor-utils/activities-mixin.ts @@ -57,6 +57,9 @@ export function ActivitiesMixin>(baseClass: T) @property({type: Boolean}) oneEntityInEditMode!: boolean; + @property({type: Boolean}) + showUnfunded = true; + handleEsc!: (event: KeyboardEvent) => void; refreshResultStructure = false; quarters: InterventionQuarter[] = []; @@ -84,10 +87,11 @@ export function ActivitiesMixin>(baseClass: T) > - ${translate('ACTIVITY')} + ${translate('ACTIVITY')} ${translate('TIME_PERIODS')} ${translate('PARTNER_CASH')} ${translate('UNICEF_CASH')} + ${this.showUnfunded ? html`${translate('UNFUNDED_CASH')}` : ``} ${translate('GENERAL.TOTAL')} @@ -101,7 +105,7 @@ export function ActivitiesMixin>(baseClass: T) > @@ -210,6 +214,22 @@ export function ActivitiesMixin>(baseClass: T) @value-changed="${({detail}: CustomEvent) => this.numberChanged(detail, 'unicef_cash', activity)}" > + + + >(baseClass: T) ${translate('PRICE_UNIT')} ${translate('PARTNER_CASH')} ${translate('UNICEF_CASH')} + ${this.showUnfunded ? html`${translate('UNFUNDED_CASH')}` : ``} ${translate('TOTAL')} (${this.intervention.planned_budget.currency}) diff --git a/intervention-workplan-editor/editor-utils/activity-item-mixin.ts b/intervention-workplan-editor/editor-utils/activity-item-mixin.ts index e1c937c4b..dec665a99 100644 --- a/intervention-workplan-editor/editor-utils/activity-item-mixin.ts +++ b/intervention-workplan-editor/editor-utils/activity-item-mixin.ts @@ -231,6 +231,27 @@ export function ActivityItemsMixin>(baseClass: }}" > + + + + +
` : html` + `}
{ @@ -309,7 +339,7 @@ export class ActivityDialog extends ComponentBaseMixin(LitElement) { } } - getSumValue(field: 'cso_cash' | 'unicef_cash'): string { + getSumValue(field: 'cso_cash' | 'unicef_cash' | 'unfunded_cash'): string { const total = (this.items || []).reduce((sum: number, item: AnyObject) => sum + Number(item[field]), 0); return displayCurrencyAmount(String(total), '0', 2); } @@ -318,12 +348,14 @@ export class ActivityDialog extends ComponentBaseMixin(LitElement) { if (!this.useInputLevel) { return getTotalCashFormatted( this.data[this.getPropertyName('partner')] || 0, - this.data[this.getPropertyName('unicef')] || 0 + this.data[this.getPropertyName('unicef')] || 0, + this.showUnfunded ? this.data[this.getPropertyName('unfunded')] || 0 : 0 ); } else { const cso: string = this.getSumValue('cso_cash').replace(/,/g, ''); const unicef: string = this.getSumValue('unicef_cash').replace(/,/g, ''); - return getTotalCashFormatted(cso, unicef); + const unfunded: string = this.showUnfunded ? this.getSumValue('unfunded_cash').replace(/,/g, '') : '0'; + return getTotalCashFormatted(cso, unicef, unfunded); } } diff --git a/intervention-workplan/effective-efficient-programme-mgmt/effective-efficient-programme-mgmt.ts b/intervention-workplan/effective-efficient-programme-mgmt/effective-efficient-programme-mgmt.ts index c9b6d15f4..1884f75da 100644 --- a/intervention-workplan/effective-efficient-programme-mgmt/effective-efficient-programme-mgmt.ts +++ b/intervention-workplan/effective-efficient-programme-mgmt/effective-efficient-programme-mgmt.ts @@ -151,6 +151,9 @@ export class EffectiveAndEfficientProgrammeManagement extends CommentsMixin(Comp @property({type: Number}) interventionId!: number; + @property({type: Boolean}) + showUnfunded = true; + connectedCallback() { super.connectedCallback(); } @@ -177,7 +180,15 @@ export class EffectiveAndEfficientProgrammeManagement extends CommentsMixin(Comp } currencyDisplayForTotal() { - this.columns[3].label = getTranslation('GENERAL.TOTAL') + ' (' + this.data.currency + ')'; + this.columns.find((x) => x.name === 'total')!.label = + getTranslation('GENERAL.TOTAL') + ' (' + this.data.currency + ')'; + if (this.showUnfunded && !this.columns.find((x) => x.name === 'unfunded_cash')) { + this.columns.splice(3, 0, { + label: translate('UNFUNDED_CASH') as unknown as string, + name: 'unfunded_cash', + type: EtoolsTableColumnType.Number + }); + } } formatData(data: ProgrammeManagement) { diff --git a/intervention-workplan/results-structure/modals/activity-dialog/activity-data-dialog.ts b/intervention-workplan/results-structure/modals/activity-dialog/activity-data-dialog.ts index 16a71460a..d69c7f36c 100644 --- a/intervention-workplan/results-structure/modals/activity-dialog/activity-data-dialog.ts +++ b/intervention-workplan/results-structure/modals/activity-dialog/activity-data-dialog.ts @@ -42,6 +42,7 @@ export class ActivityDataDialog extends DataMixin()(LitEle @property() readonly: boolean | undefined = false; @query('etools-dialog') private dialogElement!: EtoolsDialog; quarters: ActivityTimeFrames[] = []; + @property() showUnfunded = true; set dialogData({activityId, pdOutputId, interventionId, quarters, readonly, currency}: any) { this.quarters = quarters; @@ -191,6 +192,15 @@ export class ActivityDataDialog extends DataMixin()(LitEle .value="${this.editedData.unicef_cash}" @value-changed="${({detail}: CustomEvent) => this.updateModelValue('unicef_cash', detail.value)}" > + + ` : html` (LitEle label=${translate('UNICEF_CASH_BUDGET')} .value="${this.getSumValue('unicef_cash')}" > + `}
@@ -234,6 +252,7 @@ export class ActivityDataDialog extends DataMixin()(LitEle .activityItems="${this.editedData.items || []}" .readonly="${this.readonly}" .currency="${this.currency}" + .showUnfunded="${this.showUnfunded}" @activity-items-changed="${({detail}: CustomEvent) => { this.editedData.items = detail; this.requestUpdate(); @@ -258,7 +277,7 @@ export class ActivityDataDialog extends DataMixin()(LitEle fireEvent(this, 'dialog-closed', {confirmed: false}); } - getSumValue(field: 'cso_cash' | 'unicef_cash'): string { + getSumValue(field: 'cso_cash' | 'unicef_cash' | 'unfunded_cash'): string { const columnTotal = (this.editedData.items || []).reduce( (sum: number, item: Partial) => sum + Number(item[field]), 0 @@ -269,11 +288,16 @@ export class ActivityDataDialog extends DataMixin()(LitEle getTotalValue(): string { if (!this.useInputLevel) { - return getTotalCashFormatted(this.editedData.cso_cash || 0, this.editedData.unicef_cash || 0); + return getTotalCashFormatted( + this.editedData.cso_cash || 0, + this.editedData.unicef_cash || 0, + this.editedData.unfunded_cash || 0 + ); } else { const cso: string = this.getSumValue('cso_cash').replace(/,/g, ''); const unicef: string = this.getSumValue('unicef_cash').replace(/,/g, ''); - return getTotalCashFormatted(cso, unicef); + const unfunded: string = this.showUnfunded ? this.getSumValue('unfunded_cash').replace(/,/g, '') : '0'; + return getTotalCashFormatted(cso, unicef, unfunded); } } @@ -291,6 +315,12 @@ export class ActivityDataDialog extends DataMixin()(LitEle }; } + getInvalidTotalMessage() { + return this.showUnfunded + ? getTranslation('INVALID_TOTAL_UNFUNDED_ACTIVITY_ITEMS') + : getTranslation('INVALID_TOTAL_ACTIVITY_ITEMS'); + } + validate() { return validateRequiredFields(this); } @@ -309,7 +339,7 @@ export class ActivityDataDialog extends DataMixin()(LitEle fireEvent(this, 'toast', { text: activityItemsValidationSummary.invalidRequired ? getTranslation('FILL_ALL_ACTIVITY_ITEMS') - : getTranslation('INVALID_TOTAL_ACTIVITY_ITEMS') + : this.getInvalidTotalMessage() }); return; } From 662dc0518fefd474822a80911dcdaa25e421ef35 Mon Sep 17 00:00:00 2001 From: dcioara Date: Wed, 14 Jun 2023 17:19:31 +0300 Subject: [PATCH 02/10] UNICEF Cash Unfunded adjustments --- assets/i18n/ar.json | 4 +- assets/i18n/en.json | 4 +- assets/i18n/es.json | 4 +- assets/i18n/fr.json | 4 +- assets/i18n/pt.json | 4 +- assets/i18n/ru.json | 4 +- common/budget-summary/budget-summary.ts | 20 +++++-- common/budget-summary/budgetSummary.models.ts | 1 + .../components/activity/activity-item-row.ts | 9 ++-- .../activity/activity-items-table.ts | 6 +-- common/mixins/activities-common.mixin.ts | 26 ++++++--- common/types/editor-page-types.ts | 3 +- intervention-metadata/other/other.ts | 4 +- intervention-workplan-editor/editor-table.ts | 17 +++--- .../editor-utils/activities-mixin.ts | 50 ++++++++--------- .../editor-utils/activity-item-mixin.ts | 54 +++++++++++-------- .../programme-management-item-mixin.ts | 24 +++++++++ .../programme-management-mixin.ts | 37 ++++++++++++- .../activity-dialog.ts | 21 ++++---- .../effective-efficient-programme-mgmt.ts | 19 +++++-- .../hq-contribution/hq-contribution.ts | 6 +-- .../hq-contribution/hqContribution.models.ts | 3 +- .../activity-dialog/activity-data-dialog.ts | 15 +++--- .../results-structure/pd-activities.ts | 26 +++++++-- .../results-structure/results-structure.ts | 1 + 25 files changed, 257 insertions(+), 109 deletions(-) diff --git a/assets/i18n/ar.json b/assets/i18n/ar.json index e1d43f1c8..5731cf9fa 100644 --- a/assets/i18n/ar.json +++ b/assets/i18n/ar.json @@ -127,7 +127,7 @@ "COMPLETED": "مكتمل", "CONFIDENTIAL": "مؤتمن", "CONFIDENTIAL_INFO": "سيمنع هذا التبديل استخدام PD في لوحات المعلومات الخارجية لليونيسف.", - "PD_UNFUNDED_AMOUNTS": "تتضمن وثيقة البرنامج هذه مبالغ غير ممولة.", + "HAS_UNFUNDED_CASH": "تتضمن وثيقة البرنامج هذه مبالغ غير ممولة", "CONFIRM_BTN_TEXT": "نعم", "CONFIRM_BTN_TXT": "نعم", "CONTEXT": "سياق", @@ -674,6 +674,7 @@ "TITLE_3": "التخطيط والمراقبة والتقييم والاتصال", "TOTAL": "المجموع", "TOTAL_AMT": "المبلغ الإجمالي (النقد + العرض)", + "TOTAL_AMT_UNFUNDED": "المبلغ الإجمالي (النقد + العرض + غير الممول)", "TOTAL_CASH": "مجموع المبالغ النقدية", "TOTAL_CASH_AMT": "المبلغ النقدي الإجمالي", "TOTAL_CASH_BUDGET": "إجمالي الميزانية النقدية", @@ -691,6 +692,7 @@ "TOTAL_UNICEF_CONTRIB": "إجمالي مساهمة اليونيسيف", "TOTAL_UNICEF_CONTRIBUTION": "إجمالي مساهمة اليونيسف", "TOTAL_UNICEF_SUPPLY": "إجمالي العرض", + "TOTAL_UNFUNDED": "إجمالي غير الممول", "TOTAL_VALUE_UNICEF_CONTRIB_EFF": "النسبة المئوية للقيمة الإجمالية لمساهمة اليونيسف التي تمثل تكلفة إدارة البرامج الفعالة والفعالة", "TOTAL_VAL_EFF_PROG_MGMT_COST": "القيمة الإجمالية لتكلفة إدارة البرنامج الفعال", "TRUE": "حقيقي", diff --git a/assets/i18n/en.json b/assets/i18n/en.json index 3f435f0a2..91bacefb9 100644 --- a/assets/i18n/en.json +++ b/assets/i18n/en.json @@ -127,7 +127,7 @@ "COMPLETED": "Completed", "CONFIDENTIAL": "Confidential", "CONFIDENTIAL_INFO": "This toggle will prevent this PD to be used in dashboards external to UNICEF.", - "PD_UNFUNDED_AMOUNTS": "This programme document includes unfunded amounts.", + "HAS_UNFUNDED_CASH": "This Programme Document includes unfunded amounts", "CONFIRM_BTN_TEXT": "Yes", "CONFIRM_BTN_TXT": "Yes", "CONTEXT": "Context", @@ -674,6 +674,7 @@ "TITLE_3": "Planning, monitoring, evaluation and communication", "TOTAL": "Total", "TOTAL_AMT": "Total Amt (Cash + Supply)", + "TOTAL_AMT_UNFUNDED": "Total Amt (Cash + Supply + Unfunded)", "TOTAL_CASH": "Total Cash", "TOTAL_CASH_AMT": "Total Cash Amt", "TOTAL_CASH_BUDGET": "Total Cash Budget", @@ -691,6 +692,7 @@ "TOTAL_UNICEF_CONTRIB": "Total UNICEF Contrib", "TOTAL_UNICEF_CONTRIBUTION": "Total UNICEF Contribution", "TOTAL_UNICEF_SUPPLY": "Total UNICEF Supply", + "TOTAL_UNFUNDED": "Total Unfunded", "TOTAL_VALUE_UNICEF_CONTRIB_EFF": "% Total value of UNICEF's contribution that is Effective and Efficient Programme Management Cost", "TOTAL_VAL_EFF_PROG_MGMT_COST": "Total value of the Effective Programme management Cost", "TRUE": "True", diff --git a/assets/i18n/es.json b/assets/i18n/es.json index c6f77b8a0..a2cb7472e 100644 --- a/assets/i18n/es.json +++ b/assets/i18n/es.json @@ -127,7 +127,7 @@ "COMPLETED": "COMPLETADO", "CONFIDENTIAL": "Confidencial", "CONFIDENTIAL_INFO": "Este conmutador impedirá que esta EP se utilice en cuadros de mando externos a UNICEF.", - "PD_UNFUNDED_AMOUNTS": "Este documento de programa incluye montos no financiados.", + "HAS_UNFUNDED_CASH": "Este documento de programa incluye montos no financiados", "CONFIRM_BTN_TEXT": "Sí", "CONFIRM_BTN_TXT": "Sí", "CONTEXT": "Contexto", @@ -674,6 +674,7 @@ "TITLE_3": "Planificación, seguimiento, evaluación y comunicación", "TOTAL": "TOTAL", "TOTAL_AMT": "Importe total (efectivo + suministros)", + "TOTAL_AMT_UNFUNDED": "Importe total (Efectivo + Suministro + No financiado)", "TOTAL_CASH": "Total de efectivo", "TOTAL_CASH_AMT": "Importe total en efectivo", "TOTAL_CASH_BUDGET": "Presupuesto de tesorería total", @@ -691,6 +692,7 @@ "TOTAL_UNICEF_CONTRIB": "Total UNICEF Contrib", "TOTAL_UNICEF_CONTRIBUTION": "Contribución total de UNICEF", "TOTAL_UNICEF_SUPPLY": "Suministro total de UNICEF", + "TOTAL_UNFUNDED": "Total no financiado", "TOTAL_VALUE_UNICEF_CONTRIB_EFF": "% Valor total de la contribución de UNICEF que es Eficaz y eficiente Coste de gestión del programa", "TOTAL_VAL_EFF_PROG_MGMT_COST": "Valor total de la gestión efectiva del programa Coste", "TRUE": "Verdadero", diff --git a/assets/i18n/fr.json b/assets/i18n/fr.json index 97e1203ce..8c5ae5d92 100644 --- a/assets/i18n/fr.json +++ b/assets/i18n/fr.json @@ -127,7 +127,7 @@ "COMPLETED": "Complété", "CONFIDENTIAL": "Confidentiel ", "CONFIDENTIAL_INFO": "Cette bascule empêchera ce DP d’être utilisée dans des tableaux de bord extérieurs à l’UNICEF", - "PD_UNFUNDED_AMOUNTS": "Ce document de programme comprend des montants non financés.", + "HAS_UNFUNDED_CASH": "Ce Document de Programme comprend des montants non financés", "CONFIRM_BTN_TEXT": "Oui", "CONFIRM_BTN_TXT": "Oui", "CONTEXT": "Contexte", @@ -674,6 +674,7 @@ "TITLE_3": "Planification, suivi, évaluation et communication", "TOTAL": "Total", "TOTAL_AMT": "Total Amdt (Espèces + Fournitures)", + "TOTAL_AMT_UNFUNDED": "Montant total (liquidités + crédits + non financés)", "TOTAL_CASH": "Total Espèces ", "TOTAL_CASH_AMT": "Total Amdt Espèces", "TOTAL_CASH_BUDGET": "Budget Total Esp", @@ -691,6 +692,7 @@ "TOTAL_UNICEF_CONTRIB": "Contribution totale de l’UNICEF", "TOTAL_UNICEF_CONTRIBUTION": "Contribution totale de l’UNICEF", "TOTAL_UNICEF_SUPPLY": "Total Fournitures UNICEF", + "TOTAL_UNFUNDED": "Total non financé", "TOTAL_VALUE_UNICEF_CONTRIB_EFF": "Valeur totale de la contribution de l’UNICEF qui est un coût de gestion efficace et efficiente du programme", "TOTAL_VAL_EFF_PROG_MGMT_COST": "Valeur totale du Coût Réel de Gestion du Programme", "TRUE": "Vrai", diff --git a/assets/i18n/pt.json b/assets/i18n/pt.json index 1b0dc882e..0c88d7a15 100644 --- a/assets/i18n/pt.json +++ b/assets/i18n/pt.json @@ -127,7 +127,7 @@ "COMPLETED": "Concluído", "CONFIDENTIAL": "Confidencial", "CONFIDENTIAL_INFO": "Esta alternância impedirá que este PD seja usado em painéis externos ao UNICEF", - "PD_UNFUNDED_AMOUNTS": "Este documento do programa inclui valores não financiados.", + "HAS_UNFUNDED_CASH": "Este documento do programa inclui valores não financiados", "CONFIRM_BTN_TEXT": "Sim", "CONFIRM_BTN_TXT": "Sim", "CONTEXT": "Contexto", @@ -674,6 +674,7 @@ "TITLE_3": "Planejamento, monitoramento, avaliação e comunicação", "TOTAL": "Total", "TOTAL_AMT": "Valor total (dinheiro+ suprimentos)", + "TOTAL_AMT_UNFUNDED": "Montante total (Caixa + Fornecimento + Não financiado)", "TOTAL_CASH": "Oçamento financeiro total", "TOTAL_CASH_AMT": "Valor Total em Dinheiro", "TOTAL_CASH_BUDGET": "Total de recurso financeiro", @@ -691,6 +692,7 @@ "TOTAL_UNICEF_CONTRIB": "Contribuição Total UNICEF", "TOTAL_UNICEF_CONTRIBUTION": "Contribuição Total do UNICEF", "TOTAL_UNICEF_SUPPLY": "Suprimento Total UNICEF", + "TOTAL_UNFUNDED": "Total não financiado", "TOTAL_VALUE_UNICEF_CONTRIB_EFF": "% Valor total da contribuição do Unicef como custo efetivo e eficiente da gestão do programa", "TOTAL_VAL_EFF_PROG_MGMT_COST": "Valor total do custo efetivo da gestão do programa", "TRUE": "Verdadeiro", diff --git a/assets/i18n/ru.json b/assets/i18n/ru.json index 32f1ad073..326b7a321 100644 --- a/assets/i18n/ru.json +++ b/assets/i18n/ru.json @@ -127,7 +127,7 @@ "COMPLETED": "Завершено", "CONFIDENTIAL": "Конфиденциально", "CONFIDENTIAL_INFO": "Эта функция позволит предотвратить использование этого ПД на других информационных платформах, не относящихся к ЮНИСЕФ. ", - "PD_UNFUNDED_AMOUNTS": "Этот программный документ включает необеспеченные суммы.", + "HAS_UNFUNDED_CASH": "Этот программный документ включает необеспеченные суммы", "CONFIRM_BTN_TEXT": "Да", "CONFIRM_BTN_TXT": "Да", "CONTEXT": "контекст", @@ -674,6 +674,7 @@ "TITLE_3": "Планирование, мониторинг и коммуникации", "TOTAL": "Итого ", "TOTAL_AMT": "Общая сумма (денежная+материальная)", + "TOTAL_AMT_UNFUNDED": "Общая сумма (наличные + обеспечение + нефинансирование)", "TOTAL_CASH": "Итого денежных средств ", "TOTAL_CASH_AMT": "Общая денежная сумма ", "TOTAL_CASH_BUDGET": "Общий денежный бюджет", @@ -691,6 +692,7 @@ "TOTAL_UNICEF_CONTRIB": "Общий вклад ЮНИСЕФ", "TOTAL_UNICEF_CONTRIBUTION": "Общий вклад ЮНИСЕФ", "TOTAL_UNICEF_SUPPLY": "Общий объем поставок ЮНИСЕФ", + "TOTAL_UNFUNDED": "Всего не профинансировано", "TOTAL_VALUE_UNICEF_CONTRIB_EFF": "% от общей стоимости вклада ЮНИСЕФ, которая представляет собой расходы на эффективное управление программами", "TOTAL_VAL_EFF_PROG_MGMT_COST": "Общая стоимость затрат на эффективное управление программой", "TRUE": "верно", diff --git a/common/budget-summary/budget-summary.ts b/common/budget-summary/budget-summary.ts index 9a9128078..345851991 100644 --- a/common/budget-summary/budget-summary.ts +++ b/common/budget-summary/budget-summary.ts @@ -10,7 +10,7 @@ import '@unicef-polymer/etools-info-tooltip/etools-info-tooltip'; import {InfoElementStyles} from '@unicef-polymer/etools-modules-common/dist/styles/info-element-styles'; import {CommentsMixin} from '../components/comments/comments-mixin'; import {FrsDetails, Intervention} from '@unicef-polymer/etools-types'; -import {translate} from 'lit-translate'; +import {translate, get as getTranslation} from 'lit-translate'; import {TABS} from '../constants'; import {isUnicefUser} from '../selectors'; import FrNumbersConsistencyMixin from '@unicef-polymer/etools-modules-common/dist/mixins/fr-numbers-consistency-mixin'; @@ -95,7 +95,7 @@ export class BudgetSummaryEl extends CommentsMixin(FrNumbersConsistencyMixin(Lit
${this.getTable()}
- +
${this.budgetSummary.currency} ${displayCurrencyAmount( String(this.budgetSummary.total_local) @@ -186,7 +186,7 @@ export class BudgetSummaryEl extends CommentsMixin(FrNumbersConsistencyMixin(Lit
- +
${displayCurrencyAmount(String(this.budgetSummary.total_local))}
@@ -213,6 +213,14 @@ export class BudgetSummaryEl extends CommentsMixin(FrNumbersConsistencyMixin(Lit (${displayCurrencyAmount(String(this.budgetSummary.total_partner_contribution_local))})
+ ${this.intervention.planned_budget.has_unfunded_cash + ? html`
+ +
+ ${displayCurrencyAmount(String(this.budgetSummary.total_unfunded))} +
+
` + : ''}
`; } @@ -250,8 +258,8 @@ export class BudgetSummaryEl extends CommentsMixin(FrNumbersConsistencyMixin(Lit ) { return; } - this.budgetSummary = selectBudgetSummary(state); this.intervention = state.interventions.current; + this.budgetSummary = selectBudgetSummary(state); this.frsDetails = this.intervention.frs_details; if (isUnicefUser(state)) { this.setFrsConsistencyWarning(); @@ -279,6 +287,10 @@ export class BudgetSummaryEl extends CommentsMixin(FrNumbersConsistencyMixin(Lit return !value && value !== 0; } + getTotalLabel(intervention: Intervention) { + return getTranslation(intervention.planned_budget.has_unfunded_cash ? 'TOTAL_AMT_UNFUNDED' : 'TOTAL_AMT'); + } + currenciesMatch() { if (!this.frsDetails.frs.length) { // if no FR number added, hide currency-mismatch tooltip diff --git a/common/budget-summary/budgetSummary.models.ts b/common/budget-summary/budgetSummary.models.ts index eb3698298..1a63edb2b 100644 --- a/common/budget-summary/budgetSummary.models.ts +++ b/common/budget-summary/budgetSummary.models.ts @@ -21,4 +21,5 @@ export class BudgetSummary extends ModelsBase { total_hq_cash_local = 0; partner_supply_local = 0; total_partner_contribution_local = 0; + total_unfunded = 0; } diff --git a/common/components/activity/activity-item-row.ts b/common/components/activity/activity-item-row.ts index 8eb0629f1..92a0c1f0f 100644 --- a/common/components/activity/activity-item-row.ts +++ b/common/components/activity/activity-item-row.ts @@ -45,7 +45,6 @@ export class ActivityItemRow extends ActivitiesCommonMixin(LitElement) { @property() readonly: boolean | undefined = false; @property() lastItem: boolean | undefined = false; @property({type: String}) currency = ''; - @property() showUnfunded = true; protected render(): TemplateResult { return this.activityItem @@ -138,7 +137,7 @@ export class ActivityItemRow extends ActivitiesCommonMixin(LitElement) { no-label-float ?readonly="${this.readonly}" @value-changed="${({detail}: CustomEvent) => - this.cashFieldChanged(detail, 'cso_cash', this.activityItem, !this.showUnfunded)}" + this.cashFieldChanged(detail, 'cso_cash', this.activityItem, !this.hasUnfundedCash)}" @blur="${() => this.onBlur()}" ?invalid="${this.invalidSum}" @focus="${() => (this.invalidSum = false)}" @@ -155,7 +154,7 @@ export class ActivityItemRow extends ActivitiesCommonMixin(LitElement) { no-label-float ?readonly="${this.readonly}" @value-changed="${({detail}: CustomEvent) => - this.cashFieldChanged(detail, 'unicef_cash', this.activityItem, !this.showUnfunded)}" + this.cashFieldChanged(detail, 'unicef_cash', this.activityItem, !this.hasUnfundedCash)}" @blur="${() => this.onBlur()}" ?invalid="${this.invalidSum}" @focus="${() => (this.invalidSum = false)}" @@ -163,7 +162,7 @@ export class ActivityItemRow extends ActivitiesCommonMixin(LitElement) { error-message="" >
- ${this.showUnfunded + ${this.hasUnfundedCash ? html`
${translate('PRICE_UNIT')}
${translate('PARTNER_CASH')}
${translate('UNICEF_CASH')}
-
${translate('UNFUNDED_CASH')}
+
${translate('UNFUNDED_CASH')}
${translate('TOTAL_CASH')} (${this.currency})
@@ -77,7 +77,7 @@ export class ActivityItemsTable extends LitElement { .readonly="${this.readonly}" .lastItem="${this.isLastItem(index)}" .currency="${this.currency}" - .showUnfunded="${this.showUnfunded}" + .hasUnfundedCash="${this.hasUnfundedCash}" >` )} ${!this.readonly diff --git a/common/mixins/activities-common.mixin.ts b/common/mixins/activities-common.mixin.ts index e27d343ed..584fce607 100644 --- a/common/mixins/activities-common.mixin.ts +++ b/common/mixins/activities-common.mixin.ts @@ -1,10 +1,14 @@ import ModelChangedMixin from '@unicef-polymer/etools-modules-common/dist/mixins/model-changed-mixin'; import {Constructor, InterventionActivityItem} from '@unicef-polymer/etools-types'; -import {LitElement} from 'lit-element'; +import {LitElement, property} from 'lit-element'; import {getItemTotal} from '../components/activity/get-total.helper'; export function ActivitiesCommonMixin>(baseClass: T) { return class ActivitiesCommonClass extends ModelChangedMixin(baseClass) { + // @ts-ignore + @property({type: Boolean}) + hasUnfundedCash!: boolean; + cashFieldChanged( detail: {value: any}, field: 'unicef_cash' | 'cso_cash' | 'unfunded_cash', @@ -12,7 +16,7 @@ export function ActivitiesCommonMixin>(baseCla setSecondCashField = true ): void { this.numberChanged(detail, field, item); - if (!item.unit_price || !item.no_units) { + if (this.hasUnfundedCash || !item.unit_price || !item.no_units) { return; } const total = getItemTotal(item); @@ -74,16 +78,20 @@ export function ActivitiesCommonMixin>(baseCla let total = (Number(item.no_units) || 0) * (Number(item.unit_price) || 0); total = Number(total.toFixed(2)); - let sum = (Number(item.cso_cash) || 0) + (Number(item.unicef_cash) || 0); + let sum = + (Number(item.cso_cash) || 0) + + (Number(item.unicef_cash) || 0) + + (this.hasUnfundedCash ? Number(item.unfunded_cash) || 0 : 0); sum = Number(sum.toFixed(2)); if (total != sum) { - item.invalid = {...item.invalid, ...{cso_cash: true, unicef_cash: true}}; + item.invalid = {...item.invalid, ...{cso_cash: true, unicef_cash: true, unfunded_cash: true}}; } else { item.invalid = { ...item.invalid, ...{ cso_cash: item.cso_cash === null || item.cso_cash === undefined || isNaN(item.cso_cash), - unicef_cash: item.unicef_cash === null || item.unicef_cash === undefined || isNaN(item.unicef_cash) + unicef_cash: item.unicef_cash === null || item.unicef_cash === undefined || isNaN(item.unicef_cash), + unfunded_cash: item.unfunded_cash === null || item.unfunded_cash === undefined || isNaN(item.unfunded_cash) } }; } @@ -101,7 +109,8 @@ export function ActivitiesCommonMixin>(baseCla no_units: false, unit_price: false, cso_cash: false, - unicef_cash: false + unicef_cash: false, + unfunded_cash: false }; }); } @@ -122,6 +131,11 @@ export function ActivitiesCommonMixin>(baseCla activity.unicef_cash = String( activity.items.reduce((sum: number, item: {unicef_cash: any}) => sum + Number(item.unicef_cash), 0) ); + if (this.hasUnfundedCash) { + activity.unfunded_cash = String( + activity.items.reduce((sum: number, item: {unfunded_cash: any}) => sum + Number(item.unfunded_cash), 0) + ); + } } }; } diff --git a/common/types/editor-page-types.ts b/common/types/editor-page-types.ts index 90de7720a..4342540a4 100644 --- a/common/types/editor-page-types.ts +++ b/common/types/editor-page-types.ts @@ -100,6 +100,7 @@ export type ProgrammeManagementRow = { context_details: string; cso_cash: string; unicef_cash: string; + unfunded_cash: string; totalProgrammeManagementCash: number; total: string; items: ProgrammeManagementRowItemExtended[]; @@ -112,6 +113,6 @@ export type ProgrammeManagementRow = { export type ProgrammeManagementRowExtended = ProgrammeManagementRow & { inEditMode: boolean; itemsInEditMode: boolean; - invalid?: Partial<{unicef_cash: boolean; cso_cash: boolean}>; + invalid?: Partial<{unicef_cash: boolean; cso_cash: boolean; unfunded_cash: boolean}>; total: string; }; diff --git a/intervention-metadata/other/other.ts b/intervention-metadata/other/other.ts index f56ed21bb..861276222 100644 --- a/intervention-metadata/other/other.ts +++ b/intervention-metadata/other/other.ts @@ -241,7 +241,7 @@ export class Other extends CommentsMixin(ComponentBaseMixin(LitElement)) { this.requestUpdate(); }}}" > - ${translate('PD_UNFUNDED_AMOUNTS')} + ${translate('HAS_UNFUNDED_CASH')} @@ -301,7 +301,7 @@ export class Other extends CommentsMixin(ComponentBaseMixin(LitElement)) { })) ]; } - this.data = selectOtherData(state); + this.data = cloneDeep(selectOtherData(state)); this.originalData = cloneDeep(this.data); this.setPermissions(state); super.stateChanged(state); diff --git a/intervention-workplan-editor/editor-table.ts b/intervention-workplan-editor/editor-table.ts index 3103c3ae6..40dad23e6 100644 --- a/intervention-workplan-editor/editor-table.ts +++ b/intervention-workplan-editor/editor-table.ts @@ -156,6 +156,7 @@ export class EditorTable extends CommentsMixin( + ${this.hasUnfundedCash ? html`` : ''} @@ -175,7 +176,7 @@ export class EditorTable extends CommentsMixin( > ${translate('ADD_PD_OUTPUT')} - +
${translate('ID')} ${translate('COUNTRY_PROGRAME_OUTPUT')} - + ${translate('TOTAL')} @@ -233,7 +234,7 @@ export class EditorTable extends CommentsMixin( ${result.cp_output_name || translate('UNASSOCIATED_TO_CP_OUTPUT')} - + ${this.intervention.planned_budget.currency} ${displayCurrencyAmount(result.total, '0.00')} @@ -242,7 +243,7 @@ export class EditorTable extends CommentsMixin( - + ${translate('PD_OUTPUT')} - + ${translate('TOTAL')} ` : ''} - + >(baseClass: T) @property({type: Boolean}) oneEntityInEditMode!: boolean; - @property({type: Boolean}) - showUnfunded = true; - handleEsc!: (event: KeyboardEvent) => void; refreshResultStructure = false; quarters: InterventionQuarter[] = []; @@ -88,11 +85,11 @@ export function ActivitiesMixin>(baseClass: T) > - ${translate('ACTIVITY')} + ${translate('ACTIVITY')} ${translate('TIME_PERIODS')} ${translate('PARTNER_CASH')} ${translate('UNICEF_CASH')} - ${this.showUnfunded ? html`${translate('UNFUNDED_CASH')}` : ``} + ${this.hasUnfundedCash ? html`${translate('UNFUNDED_CASH')}` : ``} ${translate('GENERAL.TOTAL')} @@ -106,7 +103,7 @@ export function ActivitiesMixin>(baseClass: T) > @@ -215,22 +212,25 @@ export function ActivitiesMixin>(baseClass: T) @value-changed="${({detail}: CustomEvent) => this.numberChanged(detail, 'unicef_cash', activity)}" > - - - + ${this.hasUnfundedCash + ? html` + + ` + : ``} >(baseClass: T) >
${this.intervention.planned_budget.currency} - ${getTotalCashFormatted(activity.cso_cash, activity.unicef_cash)} + + ${getTotalCashFormatted(activity.cso_cash, activity.unicef_cash, activity.unfunded_cash)} +
>(baseClass: T) ${translate('PRICE_UNIT')} ${translate('PARTNER_CASH')} ${translate('UNICEF_CASH')} - ${this.showUnfunded ? html`${translate('UNFUNDED_CASH')}` : ``} + ${this.hasUnfundedCash ? html`${translate('UNFUNDED_CASH')}` : ``} ${translate('TOTAL')} (${this.intervention.planned_budget.currency}) diff --git a/intervention-workplan-editor/editor-utils/activity-item-mixin.ts b/intervention-workplan-editor/editor-utils/activity-item-mixin.ts index e3b7db18e..b90e876fc 100644 --- a/intervention-workplan-editor/editor-utils/activity-item-mixin.ts +++ b/intervention-workplan-editor/editor-utils/activity-item-mixin.ts @@ -231,27 +231,30 @@ export function ActivityItemsMixin>(baseClass: }}" > - - - + ${this.hasUnfundedCash + ? html` + + ` + : ``} + >(baseClass: if (!activity.items) { activity.items = []; } - activity.items?.push({name: '', cso_cash: '0', unicef_cash: '0', unit_price: '0', inEditMode: true} as any); + activity.items?.push({ + name: '', + cso_cash: '0', + unicef_cash: '0', + unit_price: '0', + unfunded_cash: '0', + inEditMode: true + } as any); activity.inEditMode = true; activity.itemsInEditMode = true; this.oneEntityInEditMode = true; diff --git a/intervention-workplan-editor/editor-utils/programme-management-item-mixin.ts b/intervention-workplan-editor/editor-utils/programme-management-item-mixin.ts index ea85241f8..81b29947c 100644 --- a/intervention-workplan-editor/editor-utils/programme-management-item-mixin.ts +++ b/intervention-workplan-editor/editor-utils/programme-management-item-mixin.ts @@ -226,6 +226,29 @@ export function ProgrammeManagementItemMixin>( }}" > + ${this.hasUnfundedCash + ? html` + + ` + : ``} + >( + ${this.hasUnfundedCash ? html`` : ``}
>(base - ${translate('EFFECTIVE_EFFICIENT_PROG_MGM')} + ${translate('EFFECTIVE_EFFICIENT_PROG_MGM')} ${repeat( @@ -90,6 +90,7 @@ export function ProgrammeManagementMixin>(base ${translate('ACTIVITY')} ${translate('PARTNER_CASH')} ${translate('UNICEF_CASH')} + ${this.hasUnfundedCash ? html`${translate('UNFUNDED_CASH')}` : ''} ${translate('GENERAL.TOTAL')} @@ -148,6 +149,31 @@ export function ProgrammeManagementMixin>(base @value-changed="${({detail}: CustomEvent) => this.numberChanged(detail, 'unicef_cash', item)}" > + ${this.hasUnfundedCash + ? html` + + + + ` + : ``} >(base >
${this.intervention.planned_budget.currency} - ${getTotalCashFormatted(item.cso_cash, item.unicef_cash)} + ${getTotalCashFormatted(item.cso_cash, item.unicef_cash, item.unfunded_cash)}
>(base ${translate('PRICE_UNIT')} ${translate('PARTNER_CASH')} ${translate('UNICEF_CASH')} + ${this.hasUnfundedCash ? html`${translate('UNFUNDED_CASH')}` : ``} ${translate('TOTAL')} (${this.intervention.planned_budget.currency}) @@ -248,6 +275,7 @@ export function ProgrammeManagementMixin>(base context_details: getTranslation('DESCRIPTION_1'), cso_cash: data.act1_partner, unicef_cash: data.act1_unicef, + unfunded_cash: data.act1_unfunded, totalProgrammeManagementCash: getTotalCash(data.act1_partner, data.act1_unicef), total: data.act1_total, items: data.items.filter( @@ -264,6 +292,7 @@ export function ProgrammeManagementMixin>(base context_details: getTranslation('DESCRIPTION_2'), cso_cash: data.act2_partner, unicef_cash: data.act2_unicef, + unfunded_cash: data.act2_unfunded, totalProgrammeManagementCash: getTotalCash(data.act2_partner, data.act2_unicef), total: data.act2_total, items: data.items.filter( @@ -280,6 +309,7 @@ export function ProgrammeManagementMixin>(base context_details: getTranslation('DESCRIPTION_3'), cso_cash: data.act3_partner, unicef_cash: data.act3_unicef, + unfunded_cash: data.act3_unfunded, totalProgrammeManagementCash: getTotalCash(data.act3_partner, data.act3_unicef), total: data.act3_total, items: data.items.filter( @@ -385,6 +415,9 @@ export function ProgrammeManagementMixin>(base formatDataBeforeSave(data: any) { data[this.getPropertyName(data, 'partner')] = data.cso_cash; data[this.getPropertyName(data, 'unicef')] = data.unicef_cash; + // @dci if (this.hasUnfundedCash) { + data[this.getPropertyName(data, 'unfunded')] = data.unfunded_cash; + // } } }; } diff --git a/intervention-workplan/effective-efficient-programme-mgmt/activity-dialog.ts b/intervention-workplan/effective-efficient-programme-mgmt/activity-dialog.ts index cb5dba798..f0b936af8 100644 --- a/intervention-workplan/effective-efficient-programme-mgmt/activity-dialog.ts +++ b/intervention-workplan/effective-efficient-programme-mgmt/activity-dialog.ts @@ -144,7 +144,7 @@ export class ActivityDialog extends ComponentBaseMixin(LitElement) { ${translate('UNICEF_CASH')} + + ${ + this.hasUnfundedCash + ? html` + ${translate('UNFUNDED_CASH')}` + : '' + } ${getTranslation('GENERAL.TOTAL') + ' (' + this.data.currency + ')'} @@ -130,6 +138,11 @@ export class EffectiveAndEfficientProgrammeManagement extends CommentsMixin(Comp
${item.unicef_cash}
+ ${this.hasUnfundedCash + ? html`
+ ${item.unfunded_cash} +
` + : ''}
${item.total}
@@ -180,7 +193,7 @@ export class EffectiveAndEfficientProgrammeManagement extends CommentsMixin(Comp interventionId!: number; @property({type: Boolean}) - has_unfunded_cash?: boolean; + hasUnfundedCash?: boolean; connectedCallback() { super.connectedCallback(); @@ -194,7 +207,7 @@ export class EffectiveAndEfficientProgrammeManagement extends CommentsMixin(Comp return; } this.interventionId = state.interventions.current.id!; - this.has_unfunded_cash = state.interventions.current.planned_budget.has_unfunded_cash; + this.hasUnfundedCash = state.interventions.current.planned_budget.has_unfunded_cash; this.data = selectProgrammeManagement(state); this.originalData = cloneDeep(this.data); @@ -250,7 +263,7 @@ export class EffectiveAndEfficientProgrammeManagement extends CommentsMixin(Comp activity: {...activity, items: cloneDeep(this.data.items)}, interventionId: this.interventionId, currency: this.data.currency, - has_unfunded_cash: this.has_unfunded_cash, + hasUnfundedCash: this.hasUnfundedCash, readonly: !this.canEdit } }); diff --git a/intervention-workplan/hq-contribution/hq-contribution.ts b/intervention-workplan/hq-contribution/hq-contribution.ts index fed756c84..d80879b13 100644 --- a/intervention-workplan/hq-contribution/hq-contribution.ts +++ b/intervention-workplan/hq-contribution/hq-contribution.ts @@ -116,15 +116,15 @@ export class HqContributionElement extends CommentsMixin(ComponentBaseMixin(LitE >
-
+
diff --git a/intervention-workplan/hq-contribution/hqContribution.models.ts b/intervention-workplan/hq-contribution/hqContribution.models.ts index 1f72bd2e9..a11bb68e8 100644 --- a/intervention-workplan/hq-contribution/hqContribution.models.ts +++ b/intervention-workplan/hq-contribution/hqContribution.models.ts @@ -7,6 +7,7 @@ export class HqContributionData extends ModelsBase { this.setObjProperties(intervention); } hq_support_cost = ''; + unfunded_cash_local = ''; planned_budget = new PlannedBudget(); } @@ -17,5 +18,5 @@ export class HqContributionPermissions extends ModelsBase { } hq_support_cost = true; planned_budget = true; - unfunded_cash_local = true; + has_unfunded_cash = true; } diff --git a/intervention-workplan/results-structure/modals/activity-dialog/activity-data-dialog.ts b/intervention-workplan/results-structure/modals/activity-dialog/activity-data-dialog.ts index 696bab23c..eaa006de6 100644 --- a/intervention-workplan/results-structure/modals/activity-dialog/activity-data-dialog.ts +++ b/intervention-workplan/results-structure/modals/activity-dialog/activity-data-dialog.ts @@ -43,12 +43,13 @@ export class ActivityDataDialog extends DataMixin()(LitEle @query('etools-dialog') private dialogElement!: EtoolsDialog; @query('activity-items-table') private activityItemsTable!: ActivityItemsTable; quarters: ActivityTimeFrames[] = []; - @property() showUnfunded = true; + @property() hasUnfundedCash = false; - set dialogData({activityId, pdOutputId, interventionId, quarters, readonly, currency}: any) { + set dialogData({activityId, pdOutputId, interventionId, quarters, readonly, currency, hasUnfundedCash}: any) { this.quarters = quarters; this.readonly = readonly; this.currency = currency; + this.hasUnfundedCash = hasUnfundedCash; if (!activityId) { this.data = {} as InterventionActivity; this.isEditDialog = false; @@ -203,7 +204,7 @@ export class ActivityDataDialog extends DataMixin()(LitEle (LitEle > (LitEle .activityItems="${this.editedData.items || []}" .readonly="${this.readonly}" .currency="${this.currency}" - .showUnfunded="${this.showUnfunded}" + .hasUnfundedCash="${this.hasUnfundedCash}" @activity-items-changed="${({detail}: CustomEvent) => { this.editedData.items = detail; this.requestUpdate(); @@ -304,7 +305,7 @@ export class ActivityDataDialog extends DataMixin()(LitEle } else { const cso: string = this.getSumValue('cso_cash').replace(/,/g, ''); const unicef: string = this.getSumValue('unicef_cash').replace(/,/g, ''); - const unfunded: string = this.showUnfunded ? this.getSumValue('unfunded_cash').replace(/,/g, '') : '0'; + const unfunded: string = this.hasUnfundedCash ? this.getSumValue('unfunded_cash').replace(/,/g, '') : '0'; return getTotalCashFormatted(cso, unicef, unfunded); } } @@ -330,7 +331,7 @@ export class ActivityDataDialog extends DataMixin()(LitEle } getInvalidTotalMessage() { - return this.showUnfunded + return this.hasUnfundedCash ? getTranslation('INVALID_TOTAL_UNFUNDED_ACTIVITY_ITEMS') : getTranslation('INVALID_TOTAL_ACTIVITY_ITEMS'); } diff --git a/intervention-workplan/results-structure/pd-activities.ts b/intervention-workplan/results-structure/pd-activities.ts index 94aff7ba2..35e8044e9 100644 --- a/intervention-workplan/results-structure/pd-activities.ts +++ b/intervention-workplan/results-structure/pd-activities.ts @@ -45,6 +45,9 @@ export class PdActivities extends CommentsMixin(TruncateMixin(LitElement)) { @property({type: String}) interventionStatus!: string; + @property({type: Boolean}) + hasUnfundedCash!: boolean; + @property({type: Boolean}) showInactive!: boolean; interventionId!: number; @@ -76,6 +79,9 @@ export class PdActivities extends CommentsMixin(TruncateMixin(LitElement)) {
${translate('TIME_PERIODS')}
${translate('PARTNER_CASH')}
${translate('UNICEF_CASH')}
+ ${this.hasUnfundedCash + ? html`
${translate('UNFUNDED_CASH')}
` + : ``}
${translate('GENERAL.TOTAL')} (${this.currency})
@@ -135,11 +141,22 @@ export class PdActivities extends CommentsMixin(TruncateMixin(LitElement)) { ${displayCurrencyAmount(String(activity.unicef_cash || 0), '0', 2)}
+ + ${this.hasUnfundedCash + ? html`
+ ${displayCurrencyAmount(String(activity.unfunded_cash || 0), '0', 2)} +
` + : ``} +
- ${displayCurrencyAmount(String(this.getTotal(activity.cso_cash, activity.unicef_cash)), '0', 2)} + ${displayCurrencyAmount( + String(this.getTotal(activity.cso_cash, activity.unicef_cash, activity.unfunded_cash)), + '0', + 2 + )}
@@ -241,8 +258,8 @@ export class PdActivities extends CommentsMixin(TruncateMixin(LitElement)) { return [{element, relatedTo, relatedToDescription}]; } - getTotal(partner: string, unicef: string): number { - return (Number(partner) || 0) + (Number(unicef) || 0); + getTotal(partner: string, unicef: string, unfunded: string): number { + return (Number(partner) || 0) + (Number(unicef) || 0) + (this.hasUnfundedCash ? Number(unfunded) || 0 : 0); } openAllRows(): void { @@ -259,7 +276,8 @@ export class PdActivities extends CommentsMixin(TruncateMixin(LitElement)) { pdOutputId: this.pdOutputId, quarters: this.quarters, readonly: readonly, - currency: this.currency + currency: this.currency, + hasUnfundedCash: this.hasUnfundedCash } }); } diff --git a/intervention-workplan/results-structure/results-structure.ts b/intervention-workplan/results-structure/results-structure.ts index 3b6e41b27..226ec7430 100644 --- a/intervention-workplan/results-structure/results-structure.ts +++ b/intervention-workplan/results-structure/results-structure.ts @@ -266,6 +266,7 @@ export class ResultsStructure extends CommentsMixin(ContentPanelMixin(LitElement .readonly="${!this.permissions.edit.result_links || this.commentMode}" .currency="${this.intervention.planned_budget.currency}" .inAmendment="${this.intervention.in_amendment}" + .hasUnfundedCash="${this.intervention.planned_budget.has_unfunded_cash}" > Date: Thu, 15 Jun 2023 17:19:51 +0300 Subject: [PATCH 03/10] renamed `unfunded_cash_local` after BE change --- intervention-workplan/hq-contribution/hq-contribution.ts | 8 ++++---- .../hq-contribution/hqContribution.models.ts | 1 - 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/intervention-workplan/hq-contribution/hq-contribution.ts b/intervention-workplan/hq-contribution/hq-contribution.ts index d80879b13..a02c2d1a1 100644 --- a/intervention-workplan/hq-contribution/hq-contribution.ts +++ b/intervention-workplan/hq-contribution/hq-contribution.ts @@ -122,7 +122,7 @@ export class HqContributionElement extends CommentsMixin(ComponentBaseMixin(LitE class="col-3" placeholder="—" label=${translate(translatesMap.capacity_strenghtening_unfunded)} - .value="${this.data.planned_budget.unfunded_cash_local}" + .value="${this.data.planned_budget.unfunded_hq_cash}" ?readonly="${this.isReadonly(this.editMode, this.permissions?.edit.has_unfunded_cash)}" tabindex="${this.isReadonly(this.editMode, this.permissions?.edit.has_unfunded_cash) ? -1 : 0}" @value-changed="${({detail}: CustomEvent) => this.unfundedCashChanged(detail)}" @@ -181,11 +181,11 @@ export class HqContributionElement extends CommentsMixin(ComponentBaseMixin(LitE } unfundedCashChanged(detail: any) { - if (areEqual(this.data.planned_budget.unfunded_cash_local, detail.value)) { + if (areEqual(this.data.planned_budget.unfunded_hq_cash, detail.value)) { return; } - this.data.planned_budget.unfunded_cash_local = detail.value; + this.data.planned_budget.unfunded_hq_cash = detail.value; this.requestUpdate(); } @@ -259,7 +259,7 @@ export class HqContributionElement extends CommentsMixin(ComponentBaseMixin(LitE data.planned_budget = { id: data.planned_budget.id, total_hq_cash_local: data.planned_budget.total_hq_cash_local, - unfunded_cash_local: data.planned_budget.unfunded_cash_local + unfunded_hq_cash: data.planned_budget.unfunded_hq_cash }; return data; } diff --git a/intervention-workplan/hq-contribution/hqContribution.models.ts b/intervention-workplan/hq-contribution/hqContribution.models.ts index a11bb68e8..2611805be 100644 --- a/intervention-workplan/hq-contribution/hqContribution.models.ts +++ b/intervention-workplan/hq-contribution/hqContribution.models.ts @@ -7,7 +7,6 @@ export class HqContributionData extends ModelsBase { this.setObjProperties(intervention); } hq_support_cost = ''; - unfunded_cash_local = ''; planned_budget = new PlannedBudget(); } From 6062b99f2c16af56e24d515c943672f2b3886174 Mon Sep 17 00:00:00 2001 From: dcioara Date: Wed, 21 Jun 2023 15:58:29 +0300 Subject: [PATCH 04/10] fixed lint issue --- common/mixins/activities-common.mixin.ts | 2 +- .../editor-utils/programme-management-mixin.ts | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/common/mixins/activities-common.mixin.ts b/common/mixins/activities-common.mixin.ts index 584fce607..7992392d5 100644 --- a/common/mixins/activities-common.mixin.ts +++ b/common/mixins/activities-common.mixin.ts @@ -1,6 +1,6 @@ import ModelChangedMixin from '@unicef-polymer/etools-modules-common/dist/mixins/model-changed-mixin'; import {Constructor, InterventionActivityItem} from '@unicef-polymer/etools-types'; -import {LitElement, property} from 'lit-element'; +import {LitElement} from 'lit-element'; import {getItemTotal} from '../components/activity/get-total.helper'; export function ActivitiesCommonMixin>(baseClass: T) { diff --git a/intervention-workplan-editor/editor-utils/programme-management-mixin.ts b/intervention-workplan-editor/editor-utils/programme-management-mixin.ts index 0275df40b..25e5b3c44 100644 --- a/intervention-workplan-editor/editor-utils/programme-management-mixin.ts +++ b/intervention-workplan-editor/editor-utils/programme-management-mixin.ts @@ -415,9 +415,7 @@ export function ProgrammeManagementMixin>(base formatDataBeforeSave(data: any) { data[this.getPropertyName(data, 'partner')] = data.cso_cash; data[this.getPropertyName(data, 'unicef')] = data.unicef_cash; - // @dci if (this.hasUnfundedCash) { data[this.getPropertyName(data, 'unfunded')] = data.unfunded_cash; - // } } }; } From ef6ccb01f3ed509b00d868c8a2de3bdcf43ed225 Mon Sep 17 00:00:00 2001 From: dcioara Date: Wed, 21 Jun 2023 17:14:16 +0300 Subject: [PATCH 05/10] updated translations --- assets/i18n/ar.json | 2 +- assets/i18n/es.json | 2 +- assets/i18n/fr.json | 2 +- assets/i18n/pt.json | 2 +- assets/i18n/ru.json | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/assets/i18n/ar.json b/assets/i18n/ar.json index 5731cf9fa..8f1326865 100644 --- a/assets/i18n/ar.json +++ b/assets/i18n/ar.json @@ -315,7 +315,7 @@ "INVALID_ERR": "غير صالح", "INVALID_NUMBER": "رقم غير صالح", "INVALID_TOTAL_ACTIVITY_ITEMS": "بيانات الميزانية غير صالحة. يجب أن تكون أموال اليونيسف + الشريك مساوية لإجمالي النقد.", - "INVALID_TOTAL_UNFUNDED_ACTIVITY_ITEMS": "Invalid budget data. UNICEF + Partner Cash + Unfunded Cash should be equal to Total Cash.", + "INVALID_TOTAL_UNFUNDED_ACTIVITY_ITEMS": "بيانات الميزانية غير صالحة. اليونيسف + النقد الشريك + النقد غير الممول يجب أن يكون مساوياً لإجمالي النقد.", "IS_ACTIVE": "نشط", "ITEM_ALL_PRICES": "البند (جميع الأسعار بعملة PD)", "ITEM_DESCRIPTION": "وصف السلعة", diff --git a/assets/i18n/es.json b/assets/i18n/es.json index a2cb7472e..7b7458a85 100644 --- a/assets/i18n/es.json +++ b/assets/i18n/es.json @@ -315,7 +315,7 @@ "INVALID_ERR": "Invalido", "INVALID_NUMBER": "Número inválido", "INVALID_TOTAL_ACTIVITY_ITEMS": "Datos presupuestarios no válidos. UNICEF + Efectivo de los socios debe ser igual a Efectivo total.", - "INVALID_TOTAL_UNFUNDED_ACTIVITY_ITEMS": "Invalid budget data. UNICEF + Partner Cash + Unfunded Cash should be equal to Total Cash.", + "INVALID_TOTAL_UNFUNDED_ACTIVITY_ITEMS": "Datos de presupuesto no válidos. UNICEF + Efectivo de socios + Efectivo no financiado debe ser igual al Efectivo total.", "IS_ACTIVE": "Está activo", "ITEM_ALL_PRICES": "Artículo (todos los precios en moneda PD)", "ITEM_DESCRIPTION": "Descripción del artículo", diff --git a/assets/i18n/fr.json b/assets/i18n/fr.json index 8c5ae5d92..2f1b8bfd3 100644 --- a/assets/i18n/fr.json +++ b/assets/i18n/fr.json @@ -315,7 +315,7 @@ "INVALID_ERR": "Invalide", "INVALID_NUMBER": "Numéro non valide", "INVALID_TOTAL_ACTIVITY_ITEMS": "Données budgétaires non valides. Espèces UNICEF + Partenaire devrait être égal au Total Espèces.", - "INVALID_TOTAL_UNFUNDED_ACTIVITY_ITEMS": "Invalid budget data. UNICEF + Partner Cash + Unfunded Cash should be equal to Total Cash.", + "INVALID_TOTAL_UNFUNDED_ACTIVITY_ITEMS": "Données budgétaires non valides. L'UNICEF + l'argent du partenaire + l'argent non financé doit être égal au total de l'argent.", "IS_ACTIVE": "C'est actif", "ITEM_ALL_PRICES": "Article (tous les prix dans la devise du DP)", "ITEM_DESCRIPTION": "Description de l’objet ", diff --git a/assets/i18n/pt.json b/assets/i18n/pt.json index 0c88d7a15..2126c4c6f 100644 --- a/assets/i18n/pt.json +++ b/assets/i18n/pt.json @@ -315,7 +315,7 @@ "INVALID_ERR": "Inválido", "INVALID_NUMBER": "Número inválido", "INVALID_TOTAL_ACTIVITY_ITEMS": "Dado orçamentário inválido. Orçamento financeiro do Unicef + Parceiro deve ser igual ao orçamento total.", - "INVALID_TOTAL_UNFUNDED_ACTIVITY_ITEMS": "Invalid budget data. UNICEF + Partner Cash + Unfunded Cash should be equal to Total Cash.", + "INVALID_TOTAL_UNFUNDED_ACTIVITY_ITEMS": "Dados de orçamento inválidos. UNICEF + Dinheiro do Parceiro + Dinheiro Não Financiado deve ser igual ao Dinheiro Total.", "IS_ACTIVE": "Está ativo", "ITEM_ALL_PRICES": "Item (todos os valoresna moeda do PD)", "ITEM_DESCRIPTION": "Descrição do item", diff --git a/assets/i18n/ru.json b/assets/i18n/ru.json index 326b7a321..bf4a6574b 100644 --- a/assets/i18n/ru.json +++ b/assets/i18n/ru.json @@ -315,7 +315,7 @@ "INVALID_ERR": "Неверно", "INVALID_NUMBER": "Неправильный номер", "INVALID_TOTAL_ACTIVITY_ITEMS": "Ошибка бюджета. Денежный вклад ЮНИСЕФ + денежный вклад партнера должны равняться Общей сумме денежных средств", - "INVALID_TOTAL_UNFUNDED_ACTIVITY_ITEMS": "Invalid budget data. UNICEF + Partner Cash + Unfunded Cash should be equal to Total Cash.", + "INVALID_TOTAL_UNFUNDED_ACTIVITY_ITEMS": "Неверные данные бюджета. Денежные средства ЮНИСЕФ + Партнерские денежные средства + Необеспеченные денежные средства должны равняться общей сумме денежных средств.", "IS_ACTIVE": "Активен", "ITEM_ALL_PRICES": "Статья (все суммы в валюте ПД)", "ITEM_DESCRIPTION": "Описание статьи", From 9a16ba6b216f2463f1b9540def3c57b79f50b596 Mon Sep 17 00:00:00 2001 From: dcioara Date: Thu, 22 Jun 2023 17:10:30 +0300 Subject: [PATCH 06/10] [ch33354] UNICEF Cash Unfunded --- common/components/activity/activity-items-table.ts | 3 ++- common/mixins/activities-common.mixin.ts | 3 +++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/common/components/activity/activity-items-table.ts b/common/components/activity/activity-items-table.ts index 83da5c7d9..dfb10f042 100644 --- a/common/components/activity/activity-items-table.ts +++ b/common/components/activity/activity-items-table.ts @@ -113,7 +113,8 @@ export class ActivityItemsTable extends LitElement { cso_cash: '0', unicef_cash: '0', name: '', - unit_price: '0' + unit_price: '0', + unfunded_cash: '0' } ]; this.setFocusOnActivityRow(); diff --git a/common/mixins/activities-common.mixin.ts b/common/mixins/activities-common.mixin.ts index 7992392d5..5e1b576d9 100644 --- a/common/mixins/activities-common.mixin.ts +++ b/common/mixins/activities-common.mixin.ts @@ -15,6 +15,9 @@ export function ActivitiesCommonMixin>(baseCla item: Partial, setSecondCashField = true ): void { + if (!detail.value) { + detail.value = 0; // avoid saving null values, default is 0 + } this.numberChanged(detail, field, item); if (this.hasUnfundedCash || !item.unit_price || !item.no_units) { return; From d7d9ee2ef6ad9910b352c58a9274162b9ecec8f8 Mon Sep 17 00:00:00 2001 From: dcioara Date: Mon, 26 Jun 2023 12:18:35 +0300 Subject: [PATCH 07/10] [ch33354] UNICEF Cash Unfunded --- .../components/activity/activity-item-row.ts | 79 +++++++++++++++---- .../activity/activity-items-table.ts | 10 ++- common/mixins/activities-common.mixin.ts | 10 --- common/types/editor-page-types.ts | 9 ++- intervention-workplan-editor/editor-table.ts | 3 + .../editor-utils/activities-mixin.ts | 26 ++++-- .../editor-utils/activity-item-mixin.ts | 6 +- .../programme-management-item-mixin.ts | 6 +- .../programme-management-mixin.ts | 7 +- .../hq-contribution/hq-contribution.ts | 4 + .../activity-dialog/activity-data-dialog.ts | 8 ++ 11 files changed, 122 insertions(+), 46 deletions(-) diff --git a/common/components/activity/activity-item-row.ts b/common/components/activity/activity-item-row.ts index 92a0c1f0f..ce408816b 100644 --- a/common/components/activity/activity-item-row.ts +++ b/common/components/activity/activity-item-row.ts @@ -41,6 +41,10 @@ export class ActivityItemRow extends ActivitiesCommonMixin(LitElement) { @property() invalidName = false; @property() invalidUnit = false; @property() invalidNoUnits = false; + @property() invalidUnitPrice = false; + @property() invalidCsoCash = false; + @property() invalidUnicefCash = false; + @property() invalidUnfundedCash = false; @property() invalidSum = false; @property() readonly: boolean | undefined = false; @property() lastItem: boolean | undefined = false; @@ -108,6 +112,7 @@ export class ActivityItemRow extends ActivitiesCommonMixin(LitElement) { }}" no-of-decimals="2" error-message="" + required >
@@ -133,16 +145,23 @@ export class ActivityItemRow extends ActivitiesCommonMixin(LitElement) { data-col-header-label="${translate('PARTNER_CASH')}" >
@@ -168,16 +194,23 @@ export class ActivityItemRow extends ActivitiesCommonMixin(LitElement) { data-col-header-label="${translate('UNFUNDED_CASH')}" >
` : ``} @@ -223,7 +256,19 @@ export class ActivityItemRow extends ActivitiesCommonMixin(LitElement) { this.invalidName = !this.activityItem.name; this.invalidUnit = !this.activityItem.unit; this.invalidNoUnits = isNaN(parseFloat(String(this.activityItem.no_units))); - const invalidRequired = this.invalidName || this.invalidUnit || this.invalidNoUnits; + this.invalidUnitPrice = isNaN(parseFloat(String(this.activityItem.unit_price))); + this.invalidCsoCash = isNaN(parseFloat(String(this.activityItem.cso_cash))); + this.invalidUnicefCash = isNaN(parseFloat(String(this.activityItem.unicef_cash))); + this.invalidUnfundedCash = isNaN(parseFloat(String(this.activityItem.unfunded_cash))); + + const invalidRequired = + this.invalidName || + this.invalidUnit || + this.invalidNoUnits || + this.invalidUnitPrice || + this.invalidCsoCash || + this.invalidUnicefCash || + this.invalidUnfundedCash; this.invalidSum = invalidRequired ? false : getMultiplyProductCashFormatted(this.activityItem.no_units || 0, this.activityItem.unit_price || 0) !== diff --git a/common/components/activity/activity-items-table.ts b/common/components/activity/activity-items-table.ts index dfb10f042..1c2eac3d0 100644 --- a/common/components/activity/activity-items-table.ts +++ b/common/components/activity/activity-items-table.ts @@ -57,10 +57,12 @@ export class ActivityItemsTable extends LitElement {
-
${translate('PRICE_UNIT')}
-
${translate('PARTNER_CASH')}
-
${translate('UNICEF_CASH')}
-
${translate('UNFUNDED_CASH')}
+
+
+
+
+ +
${translate('TOTAL_CASH')} (${this.currency})
diff --git a/common/mixins/activities-common.mixin.ts b/common/mixins/activities-common.mixin.ts index 5e1b576d9..e39e2b1f1 100644 --- a/common/mixins/activities-common.mixin.ts +++ b/common/mixins/activities-common.mixin.ts @@ -15,13 +15,7 @@ export function ActivitiesCommonMixin>(baseCla item: Partial, setSecondCashField = true ): void { - if (!detail.value) { - detail.value = 0; // avoid saving null values, default is 0 - } this.numberChanged(detail, field, item); - if (this.hasUnfundedCash || !item.unit_price || !item.no_units) { - return; - } const total = getItemTotal(item); if (setSecondCashField) { const secondCashField = field === 'unicef_cash' ? 'cso_cash' : 'unicef_cash'; @@ -75,10 +69,6 @@ export function ActivitiesCommonMixin>(baseCla } validateCsoAndUnicefCashForItem(item: any) { - if (Number(item.no_units) == 0 || Number(item.unit_price) == 0) { - return; - } - let total = (Number(item.no_units) || 0) * (Number(item.unit_price) || 0); total = Number(total.toFixed(2)); let sum = diff --git a/common/types/editor-page-types.ts b/common/types/editor-page-types.ts index 4342540a4..bc5a39210 100644 --- a/common/types/editor-page-types.ts +++ b/common/types/editor-page-types.ts @@ -72,7 +72,14 @@ export type InterventionActivityExtended = InterventionActivity & { total: string; }; -type ItemInvalid = {name: boolean; context_details: boolean; time_frames: boolean}; +type ItemInvalid = { + name: boolean; + context_details: boolean; + time_frames: boolean; + cso_cash: boolean; + unicef_cash: boolean; + unfunded_cash: boolean; +}; export type ResultLinkLowerResultExtended = ResultLinkLowerResult & { inEditMode: boolean; diff --git a/intervention-workplan-editor/editor-table.ts b/intervention-workplan-editor/editor-table.ts index 40dad23e6..e0be57230 100644 --- a/intervention-workplan-editor/editor-table.ts +++ b/intervention-workplan-editor/editor-table.ts @@ -145,6 +145,9 @@ export class EditorTable extends CommentsMixin( .v-middle { vertical-align: middle; } + label[required] { + background: url('./images/required.svg') no-repeat 99% 20%/5px; + } diff --git a/intervention-workplan-editor/editor-utils/activities-mixin.ts b/intervention-workplan-editor/editor-utils/activities-mixin.ts index 22f9e4187..417f8f159 100644 --- a/intervention-workplan-editor/editor-utils/activities-mixin.ts +++ b/intervention-workplan-editor/editor-utils/activities-mixin.ts @@ -87,9 +87,9 @@ export function ActivitiesMixin>(baseClass: T) - - - ${this.hasUnfundedCash ? html`` : ``} + + + ${this.hasUnfundedCash ? html`` : ``} @@ -194,6 +194,9 @@ export function ActivitiesMixin>(baseClass: T) ?readonly="${this.isReadonlyCash(activity.inEditMode, activity.items)}" @keydown="${(e: any) => this.handleEsc(e)}" @value-changed="${({detail}: CustomEvent) => this.numberChanged(detail, 'cso_cash', activity)}" + required + .invalid="${activity.invalid?.cso_cash}" + error-message="${translate('THIS_FIELD_IS_REQUIRED')}" > ${this.hasUnfundedCash @@ -228,6 +234,9 @@ export function ActivitiesMixin>(baseClass: T) @keydown="${(e: any) => this.handleEsc(e)}" @value-changed="${({detail}: CustomEvent) => this.numberChanged(detail, 'unfunded_cash', activity)}" + required + .invalid="${activity.invalid?.unfunded_cash}" + error-message="${translate('THIS_FIELD_IS_REQUIRED')}" > ` : ``} @@ -406,15 +415,18 @@ export function ActivitiesMixin>(baseClass: T) validateActivity(activity: InterventionActivityExtended) { activity.invalid = {}; - if (!activity.name) { - activity.invalid.name = true; - } + + activity.invalid.name = !activity.name; + activity.invalid.unicef_cash = isNaN(parseFloat(String(activity.unicef_cash))); + activity.invalid.cso_cash = isNaN(parseFloat(String(activity.cso_cash))); + activity.invalid.unfunded_cash = isNaN(parseFloat(String(activity.unfunded_cash))); + if (this.quarters && this.quarters.length) { if (!(activity.time_frames && activity.time_frames.length)) { activity.invalid.time_frames = true; } } - return !Object.keys(activity.invalid).length; + return !Object.values(activity.invalid).some((val) => val === true); } // @ts-ignore diff --git a/intervention-workplan-editor/editor-utils/activity-item-mixin.ts b/intervention-workplan-editor/editor-utils/activity-item-mixin.ts index b90e876fc..6bf8b66f9 100644 --- a/intervention-workplan-editor/editor-utils/activity-item-mixin.ts +++ b/intervention-workplan-editor/editor-utils/activity-item-mixin.ts @@ -205,7 +205,7 @@ export function ActivityItemsMixin>(baseClass: .value="${item.cso_cash}" @keydown="${(e: any) => this.handleEsc(e)}" @value-changed="${({detail}: CustomEvent) => { - this.cashFieldChanged(detail, 'cso_cash', item); + this.cashFieldChanged(detail, 'cso_cash', item, !this.hasUnfundedCash); this.updateActivityCashFromItem(activity, item); }}" > @@ -226,7 +226,7 @@ export function ActivityItemsMixin>(baseClass: .value="${item.unicef_cash}" @keydown="${(e: any) => this.handleEsc(e)}" @value-changed="${({detail}: CustomEvent) => { - this.cashFieldChanged(detail, 'unicef_cash', item); + this.cashFieldChanged(detail, 'unicef_cash', item, !this.hasUnfundedCash); this.updateActivityCashFromItem(activity, item); }}" > @@ -248,7 +248,7 @@ export function ActivityItemsMixin>(baseClass: .value="${item.unfunded_cash}" @keydown="${(e: any) => this.handleEsc(e)}" @value-changed="${({detail}: CustomEvent) => { - this.cashFieldChanged(detail, 'unfunded_cash', item); + this.cashFieldChanged(detail, 'unfunded_cash', item, !this.hasUnfundedCash); this.updateActivityCashFromItem(activity, item); }}" > diff --git a/intervention-workplan-editor/editor-utils/programme-management-item-mixin.ts b/intervention-workplan-editor/editor-utils/programme-management-item-mixin.ts index 81b29947c..4fc566568 100644 --- a/intervention-workplan-editor/editor-utils/programme-management-item-mixin.ts +++ b/intervention-workplan-editor/editor-utils/programme-management-item-mixin.ts @@ -201,7 +201,7 @@ export function ProgrammeManagementItemMixin>( .value="${item.cso_cash}" @keydown="${(e: any) => this.handleEsc(e)}" @value-changed="${({detail}: CustomEvent) => { - this.cashFieldChanged(detail, 'cso_cash', item); + this.cashFieldChanged(detail, 'cso_cash', item, !this.hasUnfundedCash); this.updateActivityCashFromItem(programmeManagement, item); }}" > @@ -221,7 +221,7 @@ export function ProgrammeManagementItemMixin>( .value="${item.unicef_cash}" @keydown="${(e: any) => this.handleEsc(e)}" @value-changed="${({detail}: CustomEvent) => { - this.cashFieldChanged(detail, 'unicef_cash', item); + this.cashFieldChanged(detail, 'unicef_cash', item, !this.hasUnfundedCash); this.updateActivityCashFromItem(programmeManagement, item); }}" > @@ -242,7 +242,7 @@ export function ProgrammeManagementItemMixin>( .value="${item.unfunded_cash}" @keydown="${(e: any) => this.handleEsc(e)}" @value-changed="${({detail}: CustomEvent) => { - this.cashFieldChanged(detail, 'unfunded_cash', item); + this.cashFieldChanged(detail, 'unfunded_cash', item, !this.hasUnfundedCash); this.updateActivityCashFromItem(programmeManagement, item); }}" > diff --git a/intervention-workplan-editor/editor-utils/programme-management-mixin.ts b/intervention-workplan-editor/editor-utils/programme-management-mixin.ts index 25e5b3c44..936b391fd 100644 --- a/intervention-workplan-editor/editor-utils/programme-management-mixin.ts +++ b/intervention-workplan-editor/editor-utils/programme-management-mixin.ts @@ -22,6 +22,7 @@ import { ProgrammeManagementRowItemExtended } from '../../common/types/editor-page-types'; import {getTotalCash, getTotalCashFormatted} from '../../common/components/activity/get-total.helper'; +import {validateRequiredFields} from '@unicef-polymer/etools-modules-common/dist/utils/validation-helper'; // import {ManagementBudgetItem} from '@unicef-polymer/etools-types'; @@ -364,7 +365,11 @@ export function ProgrammeManagementMixin>(base // @ts-ignore saveProgrammeManagement(programmeManagement: ProgrammeManagementRowExtended, interventionId: number) { - if (!this.validateProgrammeManagement(programmeManagement) || !this.validateActivityItems(programmeManagement)) { + if ( + !validateRequiredFields(this) || + !this.validateProgrammeManagement(programmeManagement) || + !this.validateActivityItems(programmeManagement) + ) { this.requestUpdate(); fireEvent(this, 'toast', { text: getTranslation('FIX_VALIDATION_ERRORS') diff --git a/intervention-workplan/hq-contribution/hq-contribution.ts b/intervention-workplan/hq-contribution/hq-contribution.ts index a02c2d1a1..2327cfca4 100644 --- a/intervention-workplan/hq-contribution/hq-contribution.ts +++ b/intervention-workplan/hq-contribution/hq-contribution.ts @@ -113,6 +113,8 @@ export class HqContributionElement extends CommentsMixin(ComponentBaseMixin(LitE tabindex="${this.isReadonly(this.editMode, this.permissions?.edit.planned_budget) ? -1 : 0}" @value-changed="${({detail}: CustomEvent) => this.hqContribChanged(detail)}" .currency="${this.data.planned_budget?.currency}" + required + auto-validate > @@ -127,6 +129,8 @@ export class HqContributionElement extends CommentsMixin(ComponentBaseMixin(LitE tabindex="${this.isReadonly(this.editMode, this.permissions?.edit.has_unfunded_cash) ? -1 : 0}" @value-changed="${({detail}: CustomEvent) => this.unfundedCashChanged(detail)}" .currency="${this.data.planned_budget?.currency}" + required + auto-validate > diff --git a/intervention-workplan/results-structure/modals/activity-dialog/activity-data-dialog.ts b/intervention-workplan/results-structure/modals/activity-dialog/activity-data-dialog.ts index eaa006de6..b344e553b 100644 --- a/intervention-workplan/results-structure/modals/activity-dialog/activity-data-dialog.ts +++ b/intervention-workplan/results-structure/modals/activity-dialog/activity-data-dialog.ts @@ -187,11 +187,14 @@ export class ActivityDataDialog extends DataMixin()(LitEle ${!this.useInputLevel ? html` (LitEle ?readonly="${this.readonly}" .value="${this.editedData.unicef_cash}" @value-changed="${({detail}: CustomEvent) => this.updateModelValue('unicef_cash', detail.value)}" + required + auto-validate > ` : html` From 9a5b79d4c9482e6897d9b0ed61386d48d9752171 Mon Sep 17 00:00:00 2001 From: dcioara Date: Wed, 28 Jun 2023 12:43:58 +0300 Subject: [PATCH 08/10] [ch33354] UNICEF Cash Unfunded --- intervention-workplan/hq-contribution/hq-contribution.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/intervention-workplan/hq-contribution/hq-contribution.ts b/intervention-workplan/hq-contribution/hq-contribution.ts index 2327cfca4..ce2532c99 100644 --- a/intervention-workplan/hq-contribution/hq-contribution.ts +++ b/intervention-workplan/hq-contribution/hq-contribution.ts @@ -65,6 +65,9 @@ export class HqContributionElement extends CommentsMixin(ComponentBaseMixin(LitE color: darkred; padding-bottom: 5px; } + etools-currency-amount-input[required] { + --paper-input-container-label-floating_-_max-width: 133%; + } Date: Wed, 28 Jun 2023 13:03:52 +0300 Subject: [PATCH 09/10] adjustments --- intervention-workplan/hq-contribution/hq-contribution.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/intervention-workplan/hq-contribution/hq-contribution.ts b/intervention-workplan/hq-contribution/hq-contribution.ts index ce2532c99..79c37c6fa 100644 --- a/intervention-workplan/hq-contribution/hq-contribution.ts +++ b/intervention-workplan/hq-contribution/hq-contribution.ts @@ -108,7 +108,7 @@ export class HqContributionElement extends CommentsMixin(ComponentBaseMixin(LitE
Date: Wed, 28 Jun 2023 15:18:31 +0300 Subject: [PATCH 10/10] adjustments --- assets/i18n/ar.json | 2 +- assets/i18n/en.json | 2 +- assets/i18n/es.json | 2 +- assets/i18n/fr.json | 2 +- assets/i18n/pt.json | 2 +- assets/i18n/ru.json | 2 +- intervention-workplan/hq-contribution/hq-contribution.ts | 4 ++-- utils/intervention-labels-map.ts | 2 +- 8 files changed, 9 insertions(+), 9 deletions(-) diff --git a/assets/i18n/ar.json b/assets/i18n/ar.json index 8f1326865..10035caed 100644 --- a/assets/i18n/ar.json +++ b/assets/i18n/ar.json @@ -104,7 +104,7 @@ "CAPACITY_STRENGTHENING_COST": "تكلفة تعزيز القدرات", "CAPACITY_STRENGTHENING_COST_AUTOMATIC": "النسبة المئوية لتكلفة تعزيز القدرات", "CAPACITY_STRENGTHENING_COST_DESCRIPTION": "تكلفة تعزيز القدرات", - "CAPACITY_STRENGHTENING_UNFUNDED": "تعزيز القدرات غير ممولة", + "UNFUNDED_HQ_CASH": "تعزيز القدرات غير ممولة", "CASH_TRANSFERED": "تحويل نقدي", "CASH_TRANSFER_MOD": "طريقة (طرق) التحويل النقدي", "CASH_TRANSFER_MODALITIES": { diff --git a/assets/i18n/en.json b/assets/i18n/en.json index 91bacefb9..751873132 100644 --- a/assets/i18n/en.json +++ b/assets/i18n/en.json @@ -104,7 +104,7 @@ "CAPACITY_STRENGTHENING_COST": "Capacity-Strengthening Cost", "CAPACITY_STRENGTHENING_COST_AUTOMATIC": "Capacity-Strengthening Cost Percentage", "CAPACITY_STRENGTHENING_COST_DESCRIPTION": "Capacity-Strengthening Cost", - "CAPACITY_STRENGHTENING_UNFUNDED": "Capacity-Strengthening Unfunded", + "UNFUNDED_HQ_CASH": "Capacity-Strengthening Unfunded", "CASH_TRANSFERED": "Cash Transferred", "CASH_TRANSFER_MOD": "Cash Transfer Modality(ies)", "CASH_TRANSFER_MODALITIES": { diff --git a/assets/i18n/es.json b/assets/i18n/es.json index 7b7458a85..2c959a651 100644 --- a/assets/i18n/es.json +++ b/assets/i18n/es.json @@ -104,7 +104,7 @@ "CAPACITY_STRENGTHENING_COST": "Coste del refuerzo de las capacidades", "CAPACITY_STRENGTHENING_COST_AUTOMATIC": "Porcentaje del coste de refuerzo de las capacidades", "CAPACITY_STRENGTHENING_COST_DESCRIPTION": "Coste del refuerzo de las capacidades", - "CAPACITY_STRENGHTENING_UNFUNDED": "Fortalecimiento de capacidades Sin financiación", + "UNFUNDED_HQ_CASH": "Fortalecimiento de capacidades Sin financiación", "CASH_TRANSFERED": "Efectivo transferido", "CASH_TRANSFER_MOD": "Modalidad(es) de transferencia de efectivo", "CASH_TRANSFER_MODALITIES": { diff --git a/assets/i18n/fr.json b/assets/i18n/fr.json index 2f1b8bfd3..d34261535 100644 --- a/assets/i18n/fr.json +++ b/assets/i18n/fr.json @@ -104,7 +104,7 @@ "CAPACITY_STRENGTHENING_COST": "Coût du renforcement des capacités", "CAPACITY_STRENGTHENING_COST_AUTOMATIC": "Pourcentage des coûts de renforcement des capacités", "CAPACITY_STRENGTHENING_COST_DESCRIPTION": "Coût du renforcement des capacités", - "CAPACITY_STRENGHTENING_UNFUNDED": "Renforcement des capacités Non financé", + "UNFUNDED_HQ_CASH": "Renforcement des capacités Non financé", "CASH_TRANSFERED": "Espèces transférées ", "CASH_TRANSFER_MOD": "Modalité(s) de transfert(s) monétaire(s)", "CASH_TRANSFER_MODALITIES": { diff --git a/assets/i18n/pt.json b/assets/i18n/pt.json index 2126c4c6f..75f6c76cd 100644 --- a/assets/i18n/pt.json +++ b/assets/i18n/pt.json @@ -104,7 +104,7 @@ "CAPACITY_STRENGTHENING_COST": "Custo de fortalecimento da capacidade", "CAPACITY_STRENGTHENING_COST_AUTOMATIC": "Porcentagem de custo de fortalecimento da capacidade", "CAPACITY_STRENGTHENING_COST_DESCRIPTION": "Custo de reforço da capacidade", - "CAPACITY_STRENGHTENING_UNFUNDED": "Reforço de Capacidade Não Financiado", + "UNFUNDED_HQ_CASH": "Reforço de Capacidade Não Financiado", "CASH_TRANSFERED": "Valor financeiro Transferido", "CASH_TRANSFER_MOD": "Modalidade (s) de transferência financeira ", "CASH_TRANSFER_MODALITIES": { diff --git a/assets/i18n/ru.json b/assets/i18n/ru.json index bf4a6574b..28737a564 100644 --- a/assets/i18n/ru.json +++ b/assets/i18n/ru.json @@ -104,7 +104,7 @@ "CAPACITY_STRENGTHENING_COST": "Затраты на укрепление потенциала", "CAPACITY_STRENGTHENING_COST_AUTOMATIC": "Процент затрат на укрепление мощностей", "CAPACITY_STRENGTHENING_COST_DESCRIPTION": "Затраты на укрепление потенциала", - "CAPACITY_STRENGHTENING_UNFUNDED": "Укрепление потенциала", + "UNFUNDED_HQ_CASH": "Укрепление потенциала", "CASH_TRANSFERED": "Перечислено денежных средств", "CASH_TRANSFER_MOD": "Метод/ы денежных переводов", "CASH_TRANSFER_MODALITIES": { diff --git a/intervention-workplan/hq-contribution/hq-contribution.ts b/intervention-workplan/hq-contribution/hq-contribution.ts index 79c37c6fa..ce2532c99 100644 --- a/intervention-workplan/hq-contribution/hq-contribution.ts +++ b/intervention-workplan/hq-contribution/hq-contribution.ts @@ -108,7 +108,7 @@ export class HqContributionElement extends CommentsMixin(ComponentBaseMixin(LitE
${translate('ACTIVITY')} ${translate('TIME_PERIODS')}${translate('PARTNER_CASH')}${translate('UNICEF_CASH')}${translate('UNFUNDED_CASH')}${translate('GENERAL.TOTAL')}
>(baseClass: T) ?readonly="${this.isReadonlyCash(activity.inEditMode, activity.items)}" @keydown="${(e: any) => this.handleEsc(e)}" @value-changed="${({detail}: CustomEvent) => this.numberChanged(detail, 'unicef_cash', activity)}" + required + .invalid="${activity.invalid?.unicef_cash}" + error-message="${translate('THIS_FIELD_IS_REQUIRED')}" >