Skip to content

Отмена банкета и возврат внешнего фискального платежа #574

@Avanlock

Description

@Avanlock

Добрый день!
Работаю с плагином айко первый раз. Задачка создавать банкет добавить к банкету фискальную предоплату.

Создание банкета и заказа к банкету:

`
private void CancelBanquet(IikoPrepaidBookingRq rq, string callBackUrl)
{
if (rq.BanquetId is null)
{
PluginContext.Log.Error($"Banquet {rq.BanquetId} is empty : {nameof(PrepaidBookingHandler)} : {nameof(CancelBanquet)}");
SentryHelper.SendException($"Banquet {rq.BanquetId} is empty", new Exception(),
$"{nameof(PrepaidBookingHandler)} : {nameof(CreateBanquetAndOrder)}");

            operationProvider.SendPrepaidBanquetId(new IikoPrepaidBookingRp
            {
                State = "Error",
                Message = "BanquetId is empty"
            }, callBackUrl);
            
            return;
        }
        
        var reserves = PluginContext.Operations.GetReserves();
        
        var banquetId = Guid.Parse(rq.BanquetId);
        
        var userBanquet = reserves.SingleOrDefault(x => x.Id == banquetId);

        if (userBanquet is null)
        {
            PluginContext.Log.Error(
                $"User ${rq.UserName} : {rq.UserPhone} : Reserve with tableId {rq.TableId} not found : " +
                $"{nameof(PrepaidBookingHandler)} : {nameof(CancelBanquet)}");
            SentryHelper.SendException(
                $"User ${rq.UserName} : {rq.UserPhone} : Reserve with tableId {rq.TableId} not found", 
                new Exception(), $"{nameof(PrepaidBookingHandler)} : {nameof(CreateBanquetAndOrder)}");
            
            operationProvider.SendPrepaidBanquetId(new IikoPrepaidBookingRp
            {
                State = "NotFound",
                Message = "userBanquet not found"
            }, callBackUrl);
            
            return;
        }
        
        var credentials = PluginContext.Operations.GetCredentials(AppDataV2.PaymentProcessorUserPin);
        
        var prepaidPayment = userBanquet.Order.Payments.FirstOrDefault(p => p.IsPrepay);
        
        
        //TODo добавить лог посмотерть как создается через UI платеж к банкету
        
        //Todo Resto.Front.Api.Exceptions.ConstraintViolationException: Cannot delete payment item in status PROCESSED
        PluginContext.Operations.DeleteExternalFiscalizedPaymentItem(prepaidPayment, userBanquet.Order, credentials);
        
        PluginContext.Operations.CancelReserve(credentials, userBanquet, ReserveCancelReason.ClientRefused);
        
        operationProvider.SendPrepaidBanquetId(new IikoPrepaidBookingRp
        {
            State = "Success"
        }, callBackUrl);
    }
    #endregion

    #region CreateBanquetAndOrder
    private void CreateBanquetAndOrder(IikoPrepaidBookingRq rq, string callBackUrl)
    {
        var editSession = PluginContext.Operations.CreateEditSession();
        var credentials = PluginContext.Operations.GetCredentials(AppDataV2.PaymentProcessorUserPin);

        var phones = new List<PhoneDto> 
        { 
            new PhoneDto
            {
                PhoneValue = rq.UserPhone, 
                IsMain = true
            } 
        };
        
        var client = editSession.CreateClient(Guid.NewGuid(), rq.UserName, phones, null, DateTime.Now);
        
        var table = PluginContext.Operations.GetTables()
            .SingleOrDefault(x =>
                x.RestaurantSection.Id == Guid.Parse(rq.SectionId) && x.Id == Guid.Parse(rq.TableId));
        
        var order = editSession.CreateOrder(table);
        editSession.AddOrderGuest(rq.UserName, order);
        editSession.ChangeEstimatedOrderGuestsCount(rq.GuestsCount, order);

        var banquetSub = editSession.CreateBanquet(rq.CheckinTime, client, order);
        var createdBanquet = PluginContext.Operations.SubmitChanges(credentials, editSession).Get(banquetSub);
        
        PluginContext.Operations.ChangeReserveGuestsCount(rq.GuestsCount, createdBanquet, credentials);

        if (!string.IsNullOrEmpty(rq.Comment))
        {
            PluginContext.Operations.ChangeReserveComment(rq.Comment, createdBanquet, credentials);
        }
        
        AddExternalFiscalizedPrepay(createdBanquet.Order, rq.PrepaidAmount, rq.PaymentTypeId);

        operationProvider.SendPrepaidBanquetId(new IikoPrepaidBookingRp
        {
            State = "Success",
            BanquetId = createdBanquet.Id.ToString()
        }, callBackUrl);
    }
    #endregion

    #region AddExternalFiscalizedPrepay for banquet order
    private void AddExternalFiscalizedPrepay(IOrder order, int prepaidAmount, string paymentTypeId)
    {
        var paymentType = PluginContext.Operations.GetPaymentTypes().First(x => x.Id == Guid.Parse(paymentTypeId));
        
        var credentials = PluginContext.Operations.GetCredentials(AppDataV2.PaymentProcessorUserPin);
        
        var paymentItem = PluginContext.Operations.AddExternalFiscalizedPaymentItem(
            prepaidAmount,
            null,
            paymentType, 
            order, 
            credentials
        );
        
        PluginContext.Operations.ProcessPrepay(credentials, order, paymentItem);
    }
    #endregion

`

По логам выдает ошибку Resto.Front.Api.Exceptions.ConstraintViolationException: Cannot delete payment item in status PROCESSED когда делаю DeleteExternalFiscalizedPaymentItem. Мне нужно создать фискальную предоплату. Создалось все нормально, но не могу теперь отменять. Хотя через UI созданный через плагин банкет можно отменять, а через плагин не могу.

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions