Разработка компонента создания документов

Компонент создания документов предоставляет модулю функцию создания карточек в системе Docsvision по поступившим от оператора ЭДО электронным документам.

Компонент должен реализовывать программный интерфейс IDocumentCreator.

Рекомендуется создавать свой компонент на основе класса DocumentCreator (сборка DocsVision.Edi.Runtime.BackOffice.dll). Далее приведена часть класса DocumentCreator с описанием.

public class DocumentCreator : IDocumentCreator
{

    public void Initialize(ObjectContext objectContext, Guid defaultKindId) (1)
    {
        ObjectContext = objectContext;
        this.defaultKindId = defaultKindId;

        UserSession = ObjectContext.GetService<UserSession>();

        documentService = ObjectContext.GetService<IDocumentService>();
        staffService = ObjectContext.GetService<IStaffService>();
        baseCardService = ObjectContext.GetService<IBaseCardService>();

        documentFilesHelper = new DocumentFilesHelper(UserSession, documentService, baseCardService, staffService);
        parentLinksCreator = new ParentLinksCreator(ObjectContext, UserSession);
    }


    public virtual bool CreateDocument(MessageData messageData, Guid partnerId, Guid partnerDepartmentId) (2)
    {
        bool isSaved = false;
        Document document = null;

        try
        {
            KindsCardKind newCardKind = GetNewDocumentKind(messageData, partnerId); (3)
            if (newCardKind == null)
            {
                return false;
            }

            document = documentService.CreateDocument(null, newCardKind); (4)

            if (messageData.DocumentDate.HasValue)
            {
                document.MainInfo.DeliveryDate = messageData.DocumentDate.Value;
            }

            document.MainInfo[CardDocument.MainInfo.ExternalNumber] = messageData.DocumentNumber;
            document.MainInfo[CardDocument.MainInfo.Content] = messageData.DocumentComment;
            document.MainInfo[CardDocument.MainInfo.RegDate] = DateTime.Now;
            document.MainInfo.Name = messageData.DocumentName;

            var senderRows = document.GetSection(CardDocument.SenderPartner.ID);
            BaseCardSectionRow senderRow;
            if (senderRows.Count == 0)
            {
                senderRow = new BaseCardSectionRow();
                senderRows.Add(senderRow);
            }
            else
            {
                senderRow = (BaseCardSectionRow)senderRows[0];
            }

            PartnersCompany partnersCompany = ObjectContext.GetObject<PartnersCompany>(partnerId);

            senderRow[CardDocument.SenderPartner.SenderOrg] = partnerId;
            senderRow[CardDocument.SenderPartner.SenderDep] = partnerDepartmentId;

            StaffEmployee employee = GetNewDocumentAuthor(messageData, partnerId);
            Guid employeeId = employee == null ? Guid.Empty : ObjectContext.GetObjectRef(employee).Id;

            if (employee != null)
            {
                document.MainInfo.Registrar = employee;
            }

            StaffUnit recipientDepartment = null;

(5)
            StaffEmployee recipient = null;
            StaffGroup recipientGroup = null;
            if (!string.IsNullOrEmpty(messageData.Recipient.DepartmentId))
            {
                OperatorsDepartment operatorsDepartment = ObjectContext.FindObject<OperatorsDepartment>(
                    new QueryObject(RefOperators.Departments.DepartmentId, messageData.Recipient.DepartmentId));
                if (operatorsDepartment != null)
                {
                    recipientDepartment = operatorsDepartment.Department;
                    recipient = operatorsDepartment.Recipient;
                    recipientGroup = operatorsDepartment.RecipientGroup;
                }
            }

            if (recipientDepartment == null)
            {
                OperatorsBox organizationBox = ObjectContext.FindObject<OperatorsBox>(
                    new QueryObject(RefOperators.Boxes.BoxId, messageData.Recipient.BoxId));
                if (organizationBox != null)
                {
                    recipientDepartment = organizationBox.Unit.Unit;
                    recipient = organizationBox.Unit.Recipient;
                    recipientGroup = organizationBox.Unit.RecipientGroup;
                }
            }

            if (recipientDepartment != null)
            {
                document.MainInfo[CardDocument.MainInfo.ResponsDepartment] = ObjectContext.GetObjectRef(recipientDepartment).Id;
            }

            if (recipientGroup != null)
            {
                foreach (StaffGroupItem groupItem in recipientGroup.GroupItems)
                {
                    BaseCardSectionRow recRow = new BaseCardSectionRow();
                    recRow[CardDocument.ReceiversStaff.ReceiverStaff] = groupItem.EmployeeId;
                    document.GetSection(CardDocument.ReceiversStaff.ID).Add(recRow);
                }
            }
            else if (recipient != null)
            {
                BaseCardSectionRow recRow = new BaseCardSectionRow();
                recRow[CardDocument.ReceiversStaff.ReceiverStaff] = ObjectContext.GetObjectRef(recipient).Id;
                document.GetSection(CardDocument.ReceiversStaff.ID).Add(recRow);
            }

            if (!string.IsNullOrEmpty(messageData.DocumentType))
            {
                SetDocumentType(messageData, document);
            }

            ObjectContext.SaveObject(document);
            isSaved = true;


            foreach (MessageFile messageFile in messageData.DocumentFiles) (6)
            {
                AddFileToDocument(document, messageFile, employeeId, partnersCompany.Name);
            }

            SetAdditionalAttributes(messageData, document);

            ObjectContext.SaveObject(document);


            parentLinksCreator.CreateParentLinks(document, (7)
                messageData.DocumentFiles.Select(item => item.OperatorParentEntityId).Where(item => !string.IsNullOrEmpty(item)).Distinct().ToList());

            Guid cardId = ObjectContext.GetObjectRef(document).Id;

            document.Description = baseCardService.GenerateDigest(document, UserSession.CardManager.GetCardData(cardId), null);

            ObjectContext.SaveObject(document);

            messageData.CardId = cardId;

            return true;
        }
        catch (Exception)
        {
            SafeRollback();
            try
            {
                if (isSaved)
                {
                    ObjectContext.DeleteObject(document);
                    ObjectContext.AcceptChanges();
                }
            }
            catch
            {
            }

            throw;
        }
    }


    public virtual void SetDocumentType(MessageData messageData, Document document) (8)
    {
        CardSection dataSection = UserSession.CardManager.CardTypes[CardDocument.ID].AllSections (9)
            .FirstOrDefault(item => string.Equals(item.Alias, CardDefs.UniversalDocumentData.Alias));
        if (dataSection == null)
        {
            return;
        }

        if (!dataSection.Fields.Contains(CardDefs.UniversalDocumentData.DocumentType))
        {
            return;
        }

        Field docTypeField = dataSection.Fields[CardDefs.UniversalDocumentData.DocumentType];
        var invoiceRows = document.GetSection(dataSection.Id);
        BaseCardSectionRow invoiceRow;
        if (invoiceRows.Count == 0)
        {
            invoiceRow = new BaseCardSectionRow();
            invoiceRows.Add(invoiceRow);
        }
        else
        {
            invoiceRow = (BaseCardSectionRow)invoiceRows[0];
        }

        invoiceRow[CardDefs.UniversalDocumentData.DocumentType] = docTypeField.EnumValues
            .FirstOrDefault(item => string.Equals(messageData.DocumentType, item.Alias, StringComparison.OrdinalIgnoreCase))?.Value;
    }

    public virtual void AddReplyFilesToDocument(MessageData messageData, Guid partnerId) (10)
    {
        try
        {
            StaffEmployee employee = GetNewDocumentAuthor(messageData, partnerId);
            Guid employeeId = employee == null ? Guid.Empty : ObjectContext.GetObjectRef(employee).Id;

            PartnersCompany partnersCompany = ObjectContext.GetObject<PartnersCompany>(partnerId);

            Document document = ObjectContext.GetObject<Document>(messageData.CardId);
            foreach (MessageFile messageFile in messageData.DocumentFiles)
            {
                AddFileToDocument(document, messageFile, employeeId, partnersCompany.Name);
            }

            ObjectContext.SaveObject(document);
        }
        catch
        {
            SafeRollback();
            throw;
        }
    }


    public virtual KindsCardKind GetNewDocumentKind(MessageData messageData, Guid partnerId) (11)
    {
        KindsCardKind cardKind = null;
        if (defaultKindId != Guid.Empty)
        {
            cardKind = ObjectContext.GetObject<KindsCardKind>(defaultKindId);
        }

        return cardKind ?? ObjectContext.GetObject<KindsCardKind>(IncomingDocumentKindId);
    }


    public virtual StaffEmployee GetNewDocumentAuthor(MessageData messageData, Guid partnerId) (12)
    {
        return staffService.GetCurrentEmployee();
    }


    public virtual void SetAdditionalAttributes(MessageData messageData, Document document) (13)
    {
    }


    public virtual void AddFileToDocument(Document document, MessageFile messageFile, Guid authorId, string partnerName) (14)
    {
        documentFilesHelper.AddSignedFileToDocument(document, messageFile, authorId, partnerName, true);
    }
}
1 Инициализация компонента.
2 Реализация метода создания карточки входящего документа по полученному от оператора ЭДО сообщению.
3 Получаем настройки вида карточек.
4 Создаём документ.
5 Группа из настроек подразделения или организации (указывается в получателях).
6 Добавление файлов из полученного сообщения в создаваемый документ.
7 Добавление ссылки на родительскую карточку, если поступило исправление формализованного документа.
8 Добавляет в карточку документа значение типа поступившего документа.
В собственной реализации метод может записывать типы документов по другой логике.
9 Секции и поля может не быть, если не грузили схему УПД.
10 Реализация метода переноса файлов из ответа контрагента в карточку.
11 Предоставляет вид создаваемого документа.
В собственной реализации метод может вычислять вид документа по другой логике.
12 Предоставляет автора создаваемого документа.
В собственной реализации метод может вычислять автора документа по другой логике.
13 Добавляет дополнительные атрибуты в создаваемый документ.
В собственной реализации метод может добавлять в карточку требуемые данные из полученного сообщения.
14 Добавляет в создаваемый документ файл из полученного сообщения.
В собственной реализации метод может добавлять файл, следуя иной логике.