All files / libs/assignments/quotas/components/src/lib/quotas-csv/import QuotaValuesBulkCsvImportModal.tsx

0% Statements 0/104
0% Branches 0/1
0% Functions 0/1
0% Lines 0/104

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105                                                                                                                                                                                                                 
import { memo, useCallback } from 'react';
import { FormattedMessage } from 'react-intl';

import { useSnackbars } from '@allshares/studio-design-system';
import { VariableType, type Quota } from '@amalia/amalia-lang/tokens/types';
import { useUpsertQuotasAssignments } from '@amalia/assignments/quotas/state';
import { toError } from '@amalia/ext/typescript';
import { BulkCsvImportModal } from '@amalia/kernel/data-imports/components';
import { usePlansList } from '@amalia/payout-definition/state';
import { useCurrentCompany } from '@amalia/tenants/companies/state';
import { useTeams } from '@amalia/tenants/teams/state';
import { useAuthorizedProfiles } from '@amalia/tenants/users/profile/state';

import {
  QUOTA_FREQUENCY_COLUMNS,
  QUOTA_TYPE_AND_FREQUENCY_CSV_TEMPLATE,
  QUOTA_TYPE_ID_COLUMN,
} from '../quotas-csv.constants';
import { transformCsvQuotaRowsToUpsertQuotaAssignmentRequests } from '../quotas-csv.transform';
import { type CsvQuotaRow } from '../quotas-csv.types';

export type QuotaValuesBulkCsvImportModalProps = {
  readonly isOpen: boolean;
  readonly onClose: () => void;
  readonly quota: Pick<Quota, 'format' | 'frequency' | 'id' | 'name' | 'type'>;
  readonly selectedYear: number;
};

export const QuotaValuesBulkCsvImportModal = memo(function QuotaValuesBulkCsvImportModal({
  isOpen,
  onClose,
  quota,
  selectedYear,
}: QuotaValuesBulkCsvImportModalProps) {
  const { snackSuccess, snackError } = useSnackbars();

  const { mutateAsync: upsertQuotasAssignments } = useUpsertQuotasAssignments();

  const { data: company } = useCurrentCompany();

  /** Fetch plans, users or teams when the modal opens, based on quota type. */
  const { data: plans } = usePlansList({}, { enabled: isOpen && quota.type === VariableType.plan });
  const { data: users } = useAuthorizedProfiles({ enabled: isOpen && quota.type === VariableType.user });
  const { teamsList: teams } = useTeams({}, { enabled: isOpen && quota.type === VariableType.team });

  const handleSubmitUploadedRows = useCallback(
    async (csvQuotaRows: CsvQuotaRow[]) => {
      try {
        await upsertQuotasAssignments({
          quotas: transformCsvQuotaRowsToUpsertQuotaAssignmentRequests({
            csvQuotaRows,
            quota,
            teams,
            plans,
            users,
            year: selectedYear,
            defaultCurrency: company.currency,
          }),
        });

        snackSuccess(
          <FormattedMessage
            defaultMessage="“{quotaName}” has been successfully updated."
            values={{ quotaName: quota.name }}
          />,
        );
        onClose();
      } catch (error) {
        snackError(
          <FormattedMessage
            defaultMessage="“{quotaName}” could not be updated: {errorMessage}."
            values={{
              quotaName: quota.name,
              errorMessage: toError(error).message,
            }}
          />,
        );
      }
    },
    [
      upsertQuotasAssignments,
      quota,
      teams,
      plans,
      users,
      selectedYear,
      company.currency,
      snackSuccess,
      snackError,
      onClose,
    ],
  );

  return (
    <BulkCsvImportModal
      isOpen={isOpen}
      mandatoryColumns={[QUOTA_TYPE_ID_COLUMN[quota.type]]}
      optionalColumns={QUOTA_FREQUENCY_COLUMNS[quota.frequency]}
      templateLink={QUOTA_TYPE_AND_FREQUENCY_CSV_TEMPLATE[quota.type][quota.frequency]}
      onClose={onClose}
      onSubmit={handleSubmitUploadedRows}
    />
  );
});