diadocsdk-csharp icon indicating copy to clipboard operation
diadocsdk-csharp copied to clipboard

Ошибка 409 при вызове GenerateAcceptanceCertificateXmlForBuyer

Open lincoln-6-echo opened this issue 4 years ago • 7 comments

Пытаюсь сформировать титул заказчика для документа XmlAcceptanceCertificate

Вначале получаю данные по организации и текущего пользователя:

     Organization myOrganization = Api.GetMyOrganizations(authToken).Organizations[0];
            User currentUser = Api.GetMyUser(authToken);

            string boxGuid = myOrganization.Boxes[0].BoxIdGuid;

Затем список документов:

            DocumentList documents = Api.GetDocuments(authToken, new DocumentsFilter()
            {
                BoxId = boxGuid,
                FilterCategory = "Any.InboundNotFinished",
                //  FilterCategory = "XmlAcceptanceCertificate.InboundNotFinished",
                Count = 100
            });

Далее смотрим документы с типом DocumentType.XmlAcceptanceCertificate

            foreach (Document document in documents.Documents)
                if (document.DocumentType == DocumentType.XmlAcceptanceCertificate)
                {
                    Diadoc.Api.Proto.Events.Message message = Api.GetMessage(authToken, boxGuid, document.MessageId);
                    Organization contragentBoxInfo = Api.GetOrganizationByBoxId(message.FromBoxId);

                    Signer signer = new Signer
                    {
                        SignerCertificate = ReadCertContent(),
                        SignerDetails = new SignerDetails
                        {
                            Surname = currentUser.LastName,
                            FirstName = currentUser.FirstName,
                            Patronymic = currentUser.MiddleName,
                            Inn = myOrganization.Inn
                        }
                    };


                    AcceptanceCertificateBuyerTitleInfo content = new AcceptanceCertificateBuyerTitleInfo
                    {
                        Signature = new AcceptanceCertificateSignatureInfo
                        {
                            SignatureDate = DateTime.Now.ToShortDateString(),                           
                            Official = new Official
                            {
                                Surname = currentUser.LastName,
                                FirstName = currentUser.FirstName,
                            }
                        },
                      
                        AdditionalInfo = "подписан из системы",
                        Signer = signer
                    };

                    var buyerTitle = Api.GenerateAcceptanceCertificateXmlForBuyer(authToken, content, boxGuid, document.MessageId, document.EntityId);

При вызове метода GenerateAcceptanceCertificateXmlForBuyer, вываливается ошибка сервера 409:

BaseUrl=https://diadoc-api.kontur.ru, PathAndQuery=/GenerateAcceptanceCertificateXmlForBuyer?boxId=05e7c27b-522c-4de2-8788-e1c844a3f12c&sellerTitleMessageId=643ab00e-f00f-43d8-bc8e-f8229a41e5bd&sellerTitleAttachmentId=ada730a2-fced-4fd9-bc8c-f56b5f596299, AdditionalMessage=Генерация титула покупателя возможна только в формате, соответствующем титулу продавца, StatusCode=Conflict, DiadocErrorCode: DocumentService.NotCorrespondingTitleFormat

Помогите разобраться, в чем причина ошибки?

lincoln-6-echo avatar Oct 16 '20 08:10 lincoln-6-echo

Добрый день! Вы пытаетесь сформировать ответный титул для акта в 155 формате. В этом случае нужно использовать метод GenerateUniversalTransferDocumentXmlForBuyer. Подробнее о соответствии формата и метода можно посмотреть на странице https://api-docs.diadoc.ru/ru/latest/docflows/AktDocflow.html

NataliaShumikhina avatar Oct 19 '20 05:10 NataliaShumikhina

При работе с GenerateUniversalTransferDocumentXmlForBuyer функция возвращает другую ошибку:

{"Удаленный сервер возвратил ошибку: (400) Недопустимый запрос."}

Поля структуры UniversalTransferDocumentBuyerTitleInfo помеченные как required были заполнены.

Пример кода:

                    ExtendedSigner extSigner = new ExtendedSigner
                    {
                        BoxId = boxGuid,
                        SignerCertificate = ReadCertContent(),
                        SignerDetails = new ExtendedSignerDetails
                        {
                            Surname = currentUser.LastName,
                            FirstName = currentUser.FirstName,
                            SignerType = Diadoc.Api.Proto.Invoicing.Signers.SignerType.LegalEntity,
                            SignerPowers = Diadoc.Api.Proto.Invoicing.Signers.SignerPowers.PersonApprovedDocument,
                            SignerStatus = Diadoc.Api.Proto.Invoicing.Signers.SignerStatus.BuyerEmployee
                        }
                    };
      
                    UniversalTransferDocumentBuyerTitleInfo content = new UniversalTransferDocumentBuyerTitleInfo
                    {
                        DocumentCreator = myOrganization.FullName,
                        OperationContent = "подписан из системы",
                    };

                    content.Signers.Add(extSigner);

                    var buyerTitle = Api.GenerateUniversalTransferDocumentXmlForBuyer(authToken, content, boxGuid, document.MessageId, document.EntityId);

lincoln-6-echo avatar Oct 21 '20 06:10 lincoln-6-echo

К сожалению, не нашел логов от этих запросов. Вы к тому же документу пробуете сгенерировать ответный титул?

einfoman avatar Oct 21 '20 12:10 einfoman

К сожалению, не нашел логов от этих запросов. Вы к тому же документу пробуете сгенерировать ответный титул?

Сегодня пробовали проделать работу с действующей ЭП. Метод GenerateUniversalTransferDocumentXmlForBuyer снова выдает ошибку:

BaseUrl=https://diadoc-api.kontur.ru, PathAndQuery=/GenerateUniversalTransferDocumentXmlForBuyer?boxId=3e47b175-553c-4d8b-8f78-677e4ee2c6ce&sellerTitleMessageId=27b7dcee-064e-492f-bbde-b2c61419f314&sellerTitleAttachmentId=f4972904-8cf9-4678-9b34-a905891232ba, AdditionalMessage=Invalid data UserContractData: Line: 4, Position: 163, /UniversalTransferDocumentBuyerTitle[1]/Signers[1]/SignerDetails[1]/@SignerStatus: The 'SignerStatus' attribute is invalid - The value 'BuyerEmployee' is invalid according to its datatype 'Integer' - The string 'BuyerEmployee' is not a valid Integer value., StatusCode=BadRequest, DiadocErrorCode: Http.BadRequest

ругается на SignerStatus - что он должен быть Integer, а не string. Сам же статус в коде присваивается как значение: SignerStatus = Diadoc.Api.Proto.Invoicing.Signers.SignerStatus.BuyerEmployee;

Полный код вызова такой:

ExtendedSigner extSigner = new ExtendedSigner
            {
                BoxId = boxGuid,
                SignerCertificate = ReadCertContent(),
                SignerDetails = new ExtendedSignerDetails
                {
                    Surname = currentUser.LastName,
                    FirstName = currentUser.FirstName,
                    JobTitle = "Финансовый директор",
                    SignerType = Diadoc.Api.Proto.Invoicing.Signers.SignerType.LegalEntity,
                    SignerPowers = Diadoc.Api.Proto.Invoicing.Signers.SignerPowers.PersonMadeOperation,
                    SignerStatus = Diadoc.Api.Proto.Invoicing.Signers.SignerStatus.BuyerEmployee,
                    SignerPowersBase = "Должностные обязанности",
                    Inn = myOrganization.Inn
                }
            };

            UniversalTransferDocumentBuyerTitleInfo content = new UniversalTransferDocumentBuyerTitleInfo
            {
                DocumentCreator = myOrganization.FullName,
                OperationContent = "подписан из системы",
            };

            content.Signers.Add(extSigner);

            var buyerTitle = Api.GenerateUniversalTransferDocumentXmlForBuyer(authToken, content, boxGuid, messageID[1], messageID[0]);`

lincoln-6-echo avatar Nov 06 '20 13:11 lincoln-6-echo

Попробуйте указать SignerStatus Integer

enum SignerStatus {
    SellerEmployee = 1;                  // Работник организации продавца товаров (работ, услуг, имущественных прав);
    InformationCreatorEmployee = 2;      // Работник организации - составителя информации продавца;
    OtherOrganizationEmployee = 3;       // Работник иной уполномоченной организации;
    AuthorizedPerson= 4;                 // Уполномоченное физическое лицо (в том числе индивидуальный предприниматель)
    BuyerEmployee = 5;                   // Работник организации - покупателя (для документов в формате приказа №820);
    InformationCreatorBuyerEmployee = 6; // Работник организации - составителя файла обмена информации покупателя, если составитель файла обмена информации покупателя не является покупателем (для документов в формате приказа №820 и №423)

NataliaShumikhina avatar Nov 09 '20 10:11 NataliaShumikhina

Каким образом, если SignerStatus это enum? Прямое присвоение не сработает, а если делать делать преобразование типов, то также присвоится как enum.

Может ли быть ошибка внутри Api.GenerateUniversalTransferDocumentXmlForBuyer? Характер сообщения об ошибке похож на то, что при разборе структуры ExtendedSignerDetails внутри GenerateUniversalTransferDocumentXmlForBuyer, значение SignerStatus преобразуется к строке, а не к int.

lincoln-6-echo avatar Nov 09 '20 12:11 lincoln-6-echo

У вас было два примера документов:

  1. boxId=3e47b175-553c-4d8b-8f78-677e4ee2c6ce&sellerTitleMessageId=27b7dcee-064e-492f-bbde-b2c61419f314&sellerTitleAttachmentId=f4972904-8cf9-4678-9b34-a905891232ba - это XmlAcceptanceCertificate версии utd820_05_01_01, т.е. акт в формате 820 приказа, согласно таблице для него нужно использовать метод GenerateRecipientTitleXml либо универсальный метод GenerateTitleXml.
  2. boxId=05e7c27b-522c-4de2-8788-e1c844a3f12c&sellerTitleMessageId=643ab00e-f00f-43d8-bc8e-f8229a41e5bd&sellerTitleAttachmentId=ada730a2-fced-4fd9-bc8c-f56b5f596299 - это XmlAcceptanceCertificate версии utd_05_01_05, т.е. акт в формате 155 приказа, согласно таблице для него нужно использовать метод GenerateUniversalTransferDocumentXmlForBuyer либо универсальный метод GenerateTitleXml

Кроме того, в 155 и 820 формате отличается набор допустимых SignerStatus : для 155:

    SellerEmployee = 1;                  // Работник организации продавца товаров (работ, услуг, имущественных прав);
    InformationCreatorEmployee = 2;      // Работник организации - составителя информации продавца;
    OtherOrganizationEmployee = 3;       // Работник иной уполномоченной организации;
    AuthorizedPerson= 4;                 // Уполномоченное физическое лицо (в том числе индивидуальный предприниматель)

для 820:

    OtherOrganizationEmployee = 3;       // Работник иной уполномоченной организации;
    AuthorizedPerson= 4;                 // Уполномоченное физическое лицо (в том числе индивидуальный предприниматель)
    BuyerEmployee = 5;                   // Работник организации - покупателя (для документов в формате приказа №820);
    InformationCreatorBuyerEmployee = 6; // Работник организации - составителя файла обмена информации покупателя, если составитель файла обмена информации покупателя не является покупателем (для документов в формате приказа №820 и №423)

Проверьте, пожалуйста, что используется подходящий метод для формата документа и указан подходящий SignerStatus.

aeremina88 avatar Nov 11 '20 10:11 aeremina88