﻿! ПРИМЕРЫ ИСПОЛЬЗОВАНИЯ КЛАССА ИЛИ С ЧЕГО НАЧАТЬ РАБОТУ С ЮKassa ?

1. Зарегистрироваться на https://yookassa.ru и добавить тестовый магазин.

2. В GlobalData добавить интерфейс к API и данные для входа в магазин.

[After Global Include]
  Include('YKassa.inc'),Once  ! API СЕРВИСА ЮKassa
  
3. Получаем в ЛК ЮKassa данные для доступа и инициализируем класс.
   
YTest  Routine  ! Тестирование и отладка
  Data
MyKassa         Class(YKassa).               ! Класс  API ЮKassa
gOper           Group(YKassa:G_Oper).        ! Операция в ЮKassa
gAskMe          Group(YKassa:G_AskMe).       ! Информация о магазине / шлюзе

gReqPayment     Group(YKassa:G_ReqPayment).  ! Запрос платежа
gPayment        Group(YKassa:G_Payment).     ! Объект платёжа
qItems          Queue(YKassa:Q_Item).        ! Элементы чека ЮKassa 54-ФЗ

gReqRefund      Group(YKassa:G_ReqRefund).   ! Запрос возврата платежа
gRefund         Group(YKassa:G_Refund).      ! Объект возврата платежа

gReqInvoice     Group(YKassa:G_ReqInvoice).  ! Запрос на создание счёта
gInvoice        Group(YKassa:G_Invoice).     ! Объект счёта
qCart           Queue(YKassa:Q_Cart).        ! Корзина заказа — список товаров или услуг

! ЗДЕСЬ УКАЗАТЬ ДАННЫЕ ДЛЯ ДОСТУПА В ВАШ МАГАЗИН
YKassa:Shop     Equate(YKassa:DemoShop)     ! ID Магазина
YKassa:Key      Equate(YKassa:DemoKey)      ! Ключ доступа в магазин

  Code
  
  ! Инициализация класса ЮKassa
  MyKassa.Init(YKassa:Shop,YKassa:Key,CP_UTF8)
  
  ! --- Создаём платёж ----------------------------------------------------------------------------
  
  Clear(gOper.Payment)  
  gOper.Payment.Idempotence = YKassa::GetGUID()
  
  json::DeepClear(gReqPayment)
  gReqPayment.amount.value             = '123.45'
  gReqPayment.amount.currency          = 'RUB'
  gReqPayment.description              = 'Тестовый платёж на оплату покупки из Clarion приложения'
  gReqPayment.capture                  = True  
  gReqPayment.confirmation.type        = 'redirect'
  gReqPayment.confirmation.return_url  = 'https://yookassa.ru'  
  
  If MyKassa.PaymentCreate(gReqPayment,gPayment,gOper.Payment) and |
                                       gPayment.confirmation.confirmation_url <> ''
  
     ! Открываем запрос на оплату
     YKassa::OpenWebPage(gPayment.confirmation.confirmation_url)
     
     ! Ждём оплату 30 сек
     Loop 30 times
       YKassa::Sleep(1000)
       If MyKassa.PaymentInfo(gPayment,gOper.Payment) and |
                              gPayment.Status = 'succeeded' then Break.
     end

     ! Информация о платеже
     If gPayment.Status = 'succeeded'
        YKassa::Message('Заказ УСПЕШНО ОПЛАЧЕН - выполняем ПОЛНЫЙ ВОЗВРАТ !') 
       
        ! Создаём полный возврат 
        Clear(gOper.Refund)
        gOper.Refund.Idempotence = YKassa::GetGUID()       
        
        json::DeepClear(gReqRefund)               ! Запрос на возврат
        gReqRefund.payment_id  = gPayment.ID      ! ID возвращаемого платежа
        gReqRefund.amount      = gPayment.amount  ! Возврат полной суммы платежа
        If MyKassa.RefundCreate(gReqRefund,gRefund,gOper.Refund)  ! Выполнить возврат 
        
          ! Ждём возврат 30 сек
          Loop 30 times
            YKassa::Sleep(1000)
            If MyKassa.RefundInfo(gRefund,gOper.Refund) and |
                                  gRefund.Status = 'succeeded' then Break.
          end
          
          If gRefund.Status = 'succeeded'
             YKassa::Message('Полный возврат платежа выполнен УСПЕШНО !') 
          else
             YKassa::Message('Не удалось выполнить возврат платежа !') 
          end
        end
     else
        YKassa::Message('Заказ НЕ ОПЛАЧЕН !') 
     end     
  else
     YKassa::Message('Не удалось создать платёж в ЮKassa !')     
  end

  ! --- Создаём платёж с кассовым чеком ЮKassa 54-ФЗ ----------------------------------------------
  
  Clear(gOper.Payment)  
  gOper.Payment.Idempotence = YKassa::GetGUID()
  
  json::DeepClear(gReqPayment)
  gReqPayment.amount.value                = '110.00'
  gReqPayment.amount.currency             = 'RUB'
  gReqPayment.description                 = 'Тестовый чек из Clarion приложения'
  gReqPayment.capture                     = True  
  gReqPayment.confirmation.type           = 'redirect'
  gReqPayment.confirmation.return_url     = 'https://yookassa.ru'  
  
  ! Информация о пользователе 
  gReqPayment.receipt.customer.full_name  = 'ООО "Спортивное чудо"'   ! Для юрлица — название организации, для ИП и физического лица — ФИО / паспортные данные
  gReqPayment.receipt.customer.inn        = '6660095698'              ! ИНН пользователя (10 или 12 цифр)
  gReqPayment.receipt.customer.email      = 'client@mail.ru'          ! Электронная почта пользователя для отправки чека
                                                                      ! Телефон пользователя для отправки чека 
  gReqPayment.receipt.customer.phone      = YKassa::NormPhone('8 (903) 345-98-45')
     
  Free(qItems)  ! Список содержания заказа  
  
  json::DeepClear(qItems)          
  qItems.description      = 'Бейсбольная бита'      ! 1030 Наименование
  qItems.amount.value     = 105                     ! 1079 Цена товара   
  qItems.amount.currency  = 'RUB'                                                    
  qItems.vat_code         = YKassa::Calc1199(20)    ! 1199 Ставка НДС = 20%    
  qItems.quantity         = 1                       ! 1023 Количество
                                                    ! 2108 Мера количества предмета расчета 796 = ШТУКА
  qItems.measure          = YKassa::Nick2108(796,'штука')   
                                                    ! 1212 Признак предмета расчета 33 = товар, имеющий код маркировки

  qItems.payment_subject  = YKassa::Nick1212(33,Choose(Sub(YKassa:Key,1,4) = 'test'))
  qItems.payment_mode     = YKassa::Nick1214(1)     ! 1214 Признак способа расчета   1 = 100% предоплата
  
  ! 1260 Результат проверки КМ в НСЦМ Честный Знак
  qItems.payment_subject_industry_details[1].federal_id      = '030'
  qItems.payment_subject_industry_details[1].document_date   = '2023-11-21'  ! 2020-11-18
  qItems.payment_subject_industry_details[1].document_number = '1944'
  qItems.payment_subject_industry_details[1].value           = 'UUID=6927b0e9-b32a-444b-ac3a-4baa9dec98dc&Time=1726859255986'

  qItems.mark_mode = '0'
  qItems.mark_code_info.mark_code_raw  = '0104600682037477215>NbBdB<29>93w6hO'  ! 2000 Код товара GS1
  
  qItems.country_of_origin_code     = 'RU'
  qItems.customs_declaration_number = '10714040/140917/0090376'  
  
  Add(qItems)
  
  json::DeepClear(qItems)          
  qItems.description      = 'Доставка заказа'       ! 1030 Наименование
  qItems.amount.value     = 5                       ! 1079 Цена товара   
  qItems.amount.currency  = 'RUB'                                                    
  qItems.vat_code         = YKassa::Calc1199()      ! 1199 Ставка НДС = БЕЗ НАЛОГА
  qItems.quantity         = 1                       ! 1023 Количество
                                                    ! 2108 Мера количества предмета расчета 356 = ЧАС
  qItems.measure          = YKassa::Nick2108(356,'час')  
  qItems.payment_subject  = YKassa::Nick1212(3)     ! 1212 Признак предмета расчета           3 = РАБОТА
  qItems.payment_mode     = YKassa::Nick1214(4)     ! 1214 Признак способа расчета            4 = полный расчёт
  Add(qItems)  
     
  gReqPayment.receipt.items &= qItems               ! Прикрепить элементы к чеку в платеже
 !MyKassa.UploadToFile = YKassa::SetFileISO()       ! Выгрузить JSON задание в файл для диагностики проблем (опционально)
  
  If MyKassa.PaymentCreate(gReqPayment,gPayment,gOper.Payment) and |
                                       gPayment.confirmation.confirmation_url <> ''
  
     ! Открываем запрос на оплату
     YKassa::OpenWebPage(gPayment.confirmation.confirmation_url)
     
     ! Ждём оплату 30 сек
     Loop 30 times
       YKassa::Sleep(1000)
       If MyKassa.PaymentInfo(gPayment,gOper.Payment) and |
                              gPayment.Status = 'succeeded' then Break.
     end

     ! Информация о платеже
     If gPayment.Status = 'succeeded'     
        YKassa::Message('Заказ УСПЕШНО ОПЛАЧЕН !') 
        
        If gPayment.receipt_registration = 'succeeded'
           YKassa::Message('ЧЕК УСПЕШНО ПЕРЕДАН В ОНЛАЙН КАССУ !')
        
           ! Информация о чеке
           If MyKassa.ReceiptInfo(gOper.Payment)
              YKassa::Message('Чек зарегистрирован ККМ, номер ФД: ' & gOper.Payment.fiscal_document_number) 
           end
        end
     else
        YKassa::Message('Заказ с чеком НЕ ОПЛАЧЕН !') 
     end  
  else
     YKassa::Message('Не удалось создать платёж с чеком в ЮKassa !')     
  end
  
  ! --- Получить и показать информацию о текущем магазине -----------------------------------------

  MyKassa.AskMe(gAskMe,True)

  ! --- Выставить счёт на оплату со списком товаров и скидками (только боевой магазин !) ----------
  
  Clear(gOper.Payment)  
  gOper.Payment.Idempotence = YKassa::GetGUID()  
  
  json::DeepClear(gReqInvoice)
  gReqInvoice.payment_data.amount.value     = 2400.00 !2300.00
  gReqInvoice.payment_data.amount.currency  = 'RUB'
  gReqInvoice.payment_data.description      = 'Счёт № 123 на оплату заказа'
  gReqInvoice.payment_data.capture          = True 
  
  ! Срок действия счёта 7 дней
  gReqInvoice.expires_at                    = YKassa::FormatDate(Today() + 7)
  
  ! Корзина заказов 
  Clear(qCart)
  qCart.description              = 'Пицца "Сицилия" 40 см.'
  qCart.quantity                 = 1
  qCart.price.value              = 900.00
  qCart.price.currency           = 'RUB'
  qCart.discount_price.value     = 700.00
  qCart.discount_price.currency  = 'RUB'
  Add(qCart)
  
  Clear(qCart)
  qCart.description              = 'Роллы с угрём'
  qCart.quantity                 = 2
  qCart.price.value              = 600.00
  qCart.price.currency           = 'RUB'
  qCart.discount_price.value     = 500.00
  qCart.discount_price.currency  = 'RUB'
  Add(qCart)  
  
  Clear(qCart)
  qCart.description              = 'Пиво Radeberger Pilsner, 500 мл.'
  qCart.quantity                 = 5
  qCart.price.value              = 140.00
  qCart.price.currency           = 'RUB'
 !qCart.discount_price.value     = 120.00
 !qCart.discount_price.currency  = 'RUB'
  Add(qCart)    
  
  ! Прикрепить корзину заказов к счёту
  gReqInvoice.cart &= qCart 
  
  ! Создать счёт
  If MyKassa.InvoiceCreate(gReqInvoice,gInvoice,gOper.Payment) and gOper.Payment.ID <> ''
  
     ! Открываем счёт на оплату
     YKassa::OpenWebPage(gInvoice.delivery_method.url)
     
     ! При необходимости можно ожидать / проверять статус оплаты по gOper.Payment.ID
  end  

  ! --- ВСЁ ! ---