Загрузка данных


DECLARE
v_outgoing_order_number varchar(10);
BEGIN


    SELECT CAST(serial_number + 1 AS VARCHAR(10)) INTO v_outgoing_order_number FROM dev.unique_number WHERE code = 'output_paiment_order_number';

    INSERT INTO back_office.payment (
                payment_register_id, sharer_id, group_code, recipient_bank_current_account,
                 recipient_last_name, recipient_first_name, recipient_middle_name,
                 outgoing_order_number,
                topay,
                recipient_inn,
                recipient_bank_bic,
                payment_way,
                recipient_individual_id,
                recipient_entity_id,
                entity_bank_detail_id,
                recipient_name

    )
    VALUES (
         p_register_id, p_sharer_id, 'ONE_PAYMENT', p_account,
             p_recipient_last_name, p_recipient_first_name, p_recipient_middle_name,
         v_outgoing_order_number,
         p_topay,
         p_recipient_inn,
         p_recipient_bank_bic,
         '01',
         p_recipient_individual_id,
         p_recipient_entity_id,
         p_entity_bank_detail_id,
         p_recipient_name
        
    );

    UPDATE dev.unique_number SET serial_number = serial_number + 1 WHERE code = 'output_paiment_order_number';

    return 'success';

END;



DECLARE
    v_outgoing_order_number varchar(10);
    v_required_fields TEXT[] := ARRAY[
        'register_id',
        'account',
        'recipient_inn',
        'topay',
        'recipient_name'
    ];
    v_missing_field TEXT;
    p_register_id integer;
    p_sharer_id integer;
    p_account varchar(20);
    p_recipient_last_name varchar(100);
    p_recipient_first_name varchar(100);
    p_recipient_middle_name varchar(100);
    p_recipient_inn varchar(12);
    p_topay numeric(22, 2);
    p_recipient_bank_bic varchar(9);
    p_recipient_individual_id integer;
    p_recipient_entity_id integer;
    p_entity_bank_detail_id integer;
    p_recipient_name varchar(500);
BEGIN
    -- Проверка наличия обязательных полей в JSONB
    FOR v_missing_field IN
        SELECT field
        FROM unnest(v_required_fields) AS field
        WHERE NOT (field = ANY(jsonb_object_keys(p_data)))
    LOOP
        RETURN QUERY SELECT FALSE, format('Отсутствует обязательное поле: %s', v_missing_field), NULL;
        RETURN;
    END LOOP;

    -- Извлечение параметров из JSONB
    p_register_id := (p_data->>'register_id')::integer;
    p_sharer_id := (p_data->>'sharer_id')::integer;
    p_account := p_data->>'account';
    p_recipient_last_name := p_data->>'recipient_last_name';
    p_recipient_first_name := p_data->>'recipient_first_name';
    p_recipient_middle_name := p_data->>'recipient_middle_name';
    p_recipient_inn := p_data->>'recipient_inn';
    p_topay := (p_data->>'topay')::numeric(22, 2);
    p_recipient_bank_bic := p_data->>'recipient_bank_bic';
    p_recipient_individual_id := (p_data->>'recipient_individual_id')::integer;
    p_recipient_entity_id := (p_data->>'recipient_entity_id')::integer;
    p_entity_bank_detail_id := (p_data->>'entity_bank_detail_id')::integer;
    p_recipient_name := p_data->>'recipient_name';

    -- Получение уникального номера платежа
    SELECT CAST(serial_number + 1 AS VARCHAR(10))
    INTO v_outgoing_order_number
    FROM dev.unique_number
    WHERE code = 'output_paiment_order_number';

    -- Выбор алгоритма обработки
    IF p_algoritm = 1 THEN
        -- Алгоритм создания новой выплаты
        INSERT INTO back_office.payment (
            payment_register_id,
            sharer_id,
            group_code,
            recipient_bank_current_account,
            recipient_last_name,
            recipient_first_name,
            recipient_middle_name,
            outgoing_order_number,
            topay,
            recipient_inn,
            recipient_bank_bic,
            payment_way,
            recipient_individual_id,
            recipient_entity_id,
            entity_bank_detail_id,
            recipient_name
        )
        VALUES (
            p_register_id,
            p_sharer_id,
            'ONE_PAYMENT',
            p_account,
            p_recipient_last_name,
            p_recipient_first_name,
            p_recipient_middle_name,
            v_outgoing_order_number,
            p_topay,
            p_recipient_inn,
            p_recipient_bank_bic,
            '01',
            p_recipient_individual_id,
            p_recipient_entity_id,
            p_entity_bank_detail_id,
            p_recipient_name
        )
        RETURNING id INTO payment_id;

        -- Обновление счетчика уникальных номеров
        UPDATE dev.unique_number
        SET serial_number = serial_number + 1
        WHERE code = 'output_paiment_order_number';

    ELSIF p_algoritm = 2 THEN
        -- Алгоритм копирования существующей выплаты
        INSERT INTO back_office.payment (
            payment_register_id,
            pension_calculation_id,
            sharer_id,
            recipient_individual_id,
            recipient_inn,
            recipient_name,
            recipient_bank_current_account,
            recipient_bank_personal_account,
            recipient_bank_card_account,
            recipient_bank_name,
            recipient_bank_place,
            recipient_bank_correspondent_account,
            recipient_bank_bic,
            version,
            individual_bank_detail_id,
            inheritance_calculation_id,
            termination_contract_calculation_id,
            recipient_fund_id,
            fund_bank_detail_id,
            recipient_fund_inn,
            recipient_fund_name,
            recipient_fund_bank_current_account,
            recipient_fund_bank_name,
            recipient_fund_bank_place,
            recipient_fund_bank_correspondent_account,
            recipient_fund_bank_bic,
            inherited_payment_id,
            recipient_tax_rate,
            recipient_resident,
            application_payee_id,
            trustee_order_id,
            payment_return_id,
            compensation_calculation_id,
            foreign_account,
            foreign_personal_account,
            foreign_bank_name,
            foreign_bank_corr_account,
            foreign_bank_city,
            inheritance_pension_calculation_id,
            id_1c,
            payment_register_id_1с,
            pension_calculation_id_1c,
            sharer_id_1c,
            recipient_individual_id_1c,
            individual_bank_detail_id_1c,
            trustee_order_id_1c,
            redemption_calculation_id_1с,
            inherited_calculation_id_1c,
            inheritance_calculation_id_1c,
            termination_contract_calculation_id_1с,
            inherited_payment_id_1c,
            operation_id_1c,
            group_code,
            outgoing_order_number,
            accrued,
            tax,
            retention,
            topay,
            recipient_last_name,
            recipient_first_name,
            recipient_middle_name,
            recipient_post_address_id,
            payment_way,
            accrual_pension_id,
            accrual_repurchase_id,
            recipient_entity_id,
            retention_id,
            calculate_ndfl_id,
            entity_bank_detail_id,
            comission,
            completed,
            refusal_id,
            total_topay,
            operation_id
        )
        SELECT
            payment_register_id,
            pension_calculation_id,
            sharer_id,
            recipient_individual_id,
            recipient_inn,
            recipient_name,
            recipient_bank_current_account,
            recipient_bank_personal_account,
            recipient_bank_card_account,
            recipient_bank_name,
            recipient_bank_place,
            recipient_bank_correspondent_account,
            recipient_bank_bic,
            version,
            individual_bank_detail_id,
            inheritance_calculation_id,
            termination_contract_calculation_id,
            recipient_fund_id,
            fund_bank_detail_id,
            recipient_fund_inn,
            recipient_fund_name,
            recipient_fund_bank_current_account,
            recipient_fund_bank_name,
            recipient_fund_bank_place,
            recipient_fund_bank_correspondent_account,
            recipient_fund_bank_bic,
            inherited_payment_id,
            recipient_tax_rate,
            recipient_resident,
            application_payee_id,
            trustee_order_id,
            payment_return_id,
            compensation_calculation_id,
            foreign_account,
            foreign_personal_account,
            foreign_bank_name,
            foreign_bank_corr_account,
            foreign_bank_city,
            inheritance_pension_calculation_id,
            id_1c,
            payment_register_id_1с,
            pension_calculation_id_1c,
            sharer_id_1c,
            recipient_individual_id_1c,
            individual_bank_detail_id_1c,
            trustee_order_id_1c,
            redemption_calculation_id_1с,
            inherited_calculation_id_1c,
            inheritance_calculation_id_1c,
            termination_contract_calculation_id_1с,
            inherited_payment_id_1c,
            operation_id_1c,
            group_code,
            v_outgoing_order_number,
            accrued,
            tax,
            retention,
            topay,
            recipient_last_name,
            recipient_first_name,
            recipient_middle_name,
            recipient_post_address_id,
            payment_way,
            accrual_pension_id,
            accrual_repurchase_id,
            recipient_entity_id,
            retention_id,
            calculate_ndfl_id,
            entity_bank_detail_id,
            comission,
            completed,
            refusal_id,
            total_topay,
            operation_id
        FROM back_office.payment
        WHERE id = (p_data->>'paiment_id')::integer
        RETURNING id INTO payment_id;

    ELSE
        RETURN QUERY SELECT FALSE, 'Неизвестный алгоритм: ' || p_algoritm, NULL;
        RETURN;
    END IF;

    RETURN QUERY SELECT TRUE, NULL, payment_id;
    RETURN;


END;