Загрузка данных
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;