-- перенос оплат use kv2022 -- ВОЗВРАТ - Полный возврат чека, который был ошибочно сделан -- ПЕРЕНОС - Оплату, которая поступила в счет ЛС другого потребителя, переносят по заявлению. Делается полный возврат чека и принятие полной суммы возвращенного чека в адрес требуемого потребителя -- ВОЗВРТА ПЕРЕПЛАТЫ - часть суммы чека по заявлению переносят на требуемый ЛС. declare @kod_adres bigint , @corrected_kod_adres bigint , @previous_data_gash smalldatetime , @vid smallint , @no_kv bigint , @corrected_no_kv bigint , @final_transaction bit , @month tinyint , @external_id uniqueidentifier , @external_id_reserv uniqueidentifier , @cMonth tinyint , @cYear smallint , @return varchar(100) , @Error varchar(150) Select @cMonth=month, @cYear=year From spr..uf_GetCurrentPeriod() Declare tCursor Cursor for Select [kod_adres] ,[corrected_kod_adres] ,[no_kv] ,[corrected_no_kv] ,[month] ,[vid] ,[final_transaction] ,[previous_data_gash] From sbrf_no_kv_refunds Where is_taken = 0 --And previous_data_gash is not null --And Year(previous_data_gash)>=2022 --AND month=5 --And corrected_kod_adres<>25025005005 -- And no_kv not in ( 290000105 -- Косячный чек, для него вобще нет тела чека, но есть два тела - пустышки, для которых нет записей в post_t ,1170051906-- у этого чека нет деталей, хотя это сбер ,1170048172 ) -- у этого чека нет деталей, хотя это сбер Open tCursor Fetch Next From tCursor Into @kod_adres ,@corrected_kod_adres ,@no_kv ,@corrected_no_kv ,@month ,@vid ,@final_transaction ,@previous_data_gash While @@FETCH_STATUS = 0 Begin Select @external_id = Null -- Если это НЕ 2022 год, то возврат мы не делаем вовсе, т.к. ранее не пробивалось тело чека. Сразу создаем новый чек. If Year(@previous_data_gash)<=2021 Goto Create_Body -- Первым шагом проверим, был ли этот чек зарегистрирован у нас, возврат един для всех случаев. -- Step1 Begin>> -- Если *ВОЗВРАТ ПЕРЕПЛАТЫ* If (@previous_data_gash is Null) Begin -- В данном случае как таковой полноценный возврат не происходит, т.к. мы не отменяем чек -- следовательно изначальный чек остается неизменным -- Нужно создать два чека -- 1 по ПОЛНОМУ РАСЧЕТУ создаем новый чек в payment_details по иной форме из цифр, которые есть в post_t Select @external_id = NewId() Insert [172.16.1.150].fz54_details.dbo.link_storage Select @no_kv, @external_id, @kod_adres,null Insert [172.16.1.150].fz54_details.dbo.payment_details Select @external_id external_id/*NEWID()*/ ,ctdtl.kod_adres ,null ,null ,null ,null ,tPhone.phone phone ,@cYear --ctdtl.year ,ctdtl.mes ,null date_operation/*дата операции*/ ,prvds.id_provider id_company /*организация-отправитель 1048*/ ,srvs.id_service as id_item ,Round(Summa*-0.01,2) price-- стоимость товара/услуги ,1 quantity-- количество ,Round(Summa*-0.01,2) summa-- сумма ,1 payment_method -- 1214 Признак способа расчета - Полный расчет ,4 payment_object -- что-то не совсем ясное тег 1212 -- для определения ставки НДС нет никаких таблиц ,IsNull(_agnt.vat,1) vat -- ставка НДС -- это нужно расшырить-- Prokopenko 10/06 Тут норм,унекоторых организаций стоит значение ндс20 у всех остальных нулл , 5 as payments -- тип денег 5 - иная форма оплаты (встречное предоставление) ,Case When agnts.id_agent is not null Then 'another' Else null End agent_type -- вид агента ,isnull(agnts.id_agent,1) supplier_info -- код поставщика, если заполнен тип агента. Если null, то поставщик гуп ,1 -- возврат ,Null From (Select *, @cMonth mes From post_t Where no_kv = @no_kv and kod_adres = @kod_adres Union all Select * From post_a Where no_kv = @no_kv and kod_adres = @kod_adres) ctdtl Left Join [172.16.1.150].fz54.dbo.vServices srvs On srvs.id_service=ctdtl.kod_uslugi Left Join [172.16.1.150].fz54.dbo.providers_to_kvar prvds on prvds.kod_postav=1--тут всегда гуп Left Join [172.16.1.150].fz54.dbo.agents_to_kvar agnts on agnts.kod_postav=ctdtl.kod_postav Left Join ( Select * From ( Select Row_Number() over (PARTITION BY kod_adres Order by stel) as rank -- #ChangeContact08032022 ,kod_adres ,'+7'+Replace(Replace(Replace(stel,'(',''),')',''),'-','') phone From spr.dbo.contact where stel like '(9%' ) Tstel Where rank=1 ) tPhone On ctdtl.kod_adres=tPhone.kod_adres -- Связи для получения ставки НДС Left join [172.16.1.150].fz54.dbo.agents _agnt On _agnt.id_agent=agnts.id_agent -- По стандартным алгоритмам нужно создать чеки прихода см тег #Stp2 End -- Возвраты и Переносы оплат If (@previous_data_gash is Not Null) and (Year(@previous_data_gash)>=2022) Begin If exists (Select * From [172.16.1.150].fz54_details.dbo.link_storage Where no_kv = @no_kv And payer_id = @kod_adres) Begin Select 'cntr', @no_kv Select @external_id = NewId() -- Если да, то подготовим его к возврату, как есть -- Step 1.1 Begin>> Select @external_id_reserv = external_id From [172.16.1.150].fz54_details.dbo.link_storage Where no_kv = @no_kv And refund_number is null And payer_id = @kod_adres --refunds -- т.к. нельзя регистрировать одинаковые номера, нам потребуется создать новые записи и в Insert [172.16.1.150].fz54_details.dbo.refunds Select @external_id ,[payer_id] ,[timestamp] ,[operation_type] ,[operation_number] ,[rollback_number] ,[phone] ,[year] ,[month] ,[date_operation] ,[id_company] ,[id_item] ,[price] ,[quantity] ,[summa] ,[payment_method] -- Тут оставляем, как было ,[payment_object] ,[vat] ,5 -- Тут устанавливает "Иная форма оплаты" id = 5, name = 4 ,[agent_type] ,[supplier_info] ,1 is_refund ,0 is_taken ,6 ErrorCode ,1 PayOnPrpay ,1 KvOnPrpay From [172.16.1.150].fz54_details.dbo.payment_details Where external_id = @external_id_reserv --payment_details Insert [172.16.1.150].fz54_details.dbo.payment_details Select @external_id ,[payer_id] ,[timestamp] ,[operation_type] ,[operation_number] ,[rollback_number] ,[phone] ,[year] ,[month] ,[date_operation] ,[id_company] ,[id_item] ,[price] ,[quantity] ,[summa] ,[payment_method] -- Тут оставляем, как было ,[payment_object] ,[vat] ,5 -- Тут устанавливает "Иная форма оплаты" id = 5, name = 4 ,[agent_type] ,[supplier_info] ,1 is_refund ,Null is_taken From [172.16.1.150].fz54_details.dbo.payment_details Where external_id = @external_id_reserv -- Обновляем ссылку на возврат в исходном документе Update [172.16.1.150].fz54_details.dbo.link_storage Set refund_number = @external_id Where external_id = @external_id_reserv -- Обязательно требуется создать новое состояние чека, чтобы потом можно было бы сдалеть его возврат Insert [172.16.1.150].fz54_details.dbo.link_storage Select @no_kv, @external_id, @kod_adres, null -- Step 1.1 End<< End Else Begin -- Если нет, то найдем его в телах чека, это упростит нам создание нового чека -- Step 1.2 Begin>> If exists (Select * From [172.16.1.150].fz54_details.dbo.prepayment_details Where no_kv = @no_kv And payer_id = @kod_adres) Begin Select 'ulus', @no_kv --prepayment_details -- Мы создаем новый чек с новым external_id exec [172.16.1.150].fz54_details.dbo.usp_construct_prepayment @no_kv,5,1,0,'',@kod_adres -- Добавим дубликат этого чека в таблицу возвратов. Так-то по хорошему только там его и нужно хранить Insert [172.16.1.150].fz54_details.dbo.refunds Select * ,6 ErrorCode ,1 PayOnPrpay ,1 KvOnPrpay From [172.16.1.150].fz54_details.dbo.payment_details Where external_id = (Select external_id From [172.16.1.150].fz54_details.dbo.link_storage Where no_kv=@no_kv And refund_number is null And payer_id = @kod_adres) -- Сохрним идентификатор новго чека Select @external_id = external_id From [172.16.1.150].fz54_details.dbo.link_storage Where no_kv=@no_kv And refund_number is null And payer_id = @kod_adres End -- Step 1.2 End<< Else -- Если и этого нет, то сконструируем чек по тем цифрам, которые есть в КВ, с методом расчета "Полный расчет" и сделаем возврат -- нужно написать специальны ОТДЕЛЬНЫЙ скрипт для этого дела -- Step 1.3 Begin>> Begin Select 'Кричи АЛЯРМ!', @no_kv Close tCursor Deallocate tCursor Return End -- Step 1.3 End<< End End -- Step1 End<< -- После того, как возврат сформирован, нужно сделать чек прихода -- Тут может быть два варианта, если оплату нужно взять из архива, то будем использовать процедуру usp_calculate_prepayment_cheking -- если текущую usp_calculate_prepayment_cheking_current -- по сути эти процедуры делают то же, что и базовая процедура usp_calculate_prepayment, только работает с таблицами post_a(t) --#Stp2 Create_Body: If @month=@cMonth Begin -- Шаг 1. Формируем детали чека exec [172.16.1.150].fz54_details.dbo.usp_calculate_prepayment_cheking_current @month, @cYear, @corrected_no_kv,@return Output, @corrected_kod_adres Select 'Детали:'+@return -- Шаг 2. Формируем чек If (Select PATINDEX('%успех%', @return))>0 Begin exec [172.16.1.150].fz54_details.dbo.usp_construct_prepayment @corrected_no_kv, 5, 0, 0, @return Output, @corrected_kod_adres Select 'Тело:'+@return End Select @Error='' exec usp_fz54_CheckOperation @no_kv, @corrected_no_kv, @kod_adres, @corrected_kod_adres, @previous_data_gash, @Error Output If @Error in ('001', '002', '003') Begin Update sbrf_no_kv_refunds Set is_taken = 1 Where no_kv=@no_kv And corrected_no_kv = @corrected_no_kv And is_taken = 0 If @external_id is not Null Begin Update [172.16.1.150].fz54_details.dbo.payment_details Set is_taken = 0 Where external_id = @external_id End -- Установим значение is_taken в значение 0 Select @external_id = external_id From [172.16.1.150].fz54_details.dbo.link_storage Where no_kv = @corrected_no_kv And payer_id = @corrected_kod_adres and refund_number is null Update [172.16.1.150].fz54_details.dbo.payment_details Set is_taken = 0 Where external_id = @external_id End Else Begin Select @Error -- rollback return End End Else Begin -- Шаг 1. Формируем детали чека exec [172.16.1.150].fz54_details.dbo.usp_calculate_prepayment_cheking @month, @cYear, @corrected_no_kv, @return Output,@corrected_kod_adres Select 'Детали:'+@return -- Шаг 2. Формируем чек If (Select PATINDEX('%успех%', @return))>0 Begin exec [172.16.1.150].fz54_details.dbo.usp_construct_prepayment @corrected_no_kv, 5, 0, 0, @return Output, @corrected_kod_adres Select 'Тело:'+@return End Select @Error='' exec usp_fz54_CheckOperation @no_kv, @corrected_no_kv, @kod_adres, @corrected_kod_adres, @previous_data_gash, @Error Output If @Error in ('001', '002', '003') Begin Update sbrf_no_kv_refunds Set is_taken = 1 Where no_kv=@no_kv And corrected_no_kv = @corrected_no_kv And is_taken = 0 -- If @external_id is not Null Begin Update [172.16.1.150].fz54_details.dbo.payment_details Set is_taken = 0 Where external_id = @external_id End -- Установим значение is_taken в значение 0 Select @external_id = external_id From [172.16.1.150].fz54_details.dbo.link_storage Where no_kv = @corrected_no_kv And payer_id = @corrected_kod_adres Update [172.16.1.150].fz54_details.dbo.payment_details Set is_taken = 0 Where external_id = @external_id End Else Begin Select @Error -- rollback return End End Fetch Next From tCursor Into @kod_adres ,@corrected_kod_adres ,@no_kv ,@corrected_no_kv ,@month ,@vid ,@final_transaction ,@previous_data_gash End Close tCursor Deallocate tCursor --Select * From [172.16.1.150].fz54_details.dbo.link_storage Where no_kv in (1170008793, 1170043491) -- Иначе делаем перенос переплаты. В этом случае у нас будет стоять метод полный расчет