Esempio n. 1
0
        /// <summary>
        /// Загрузить ПДН по договору асинхронно.
        /// </summary>
        /// <param name="document1C">Договор</param>
        /// <param name="pdnValue">Значение процента ПДН</param>
        /// <param name="cancellationToken">Токен отмены</param>
        public async Task LoadPDNFromFileAsync(CreditDocumentNResult document1C, double pdnValue,
                                               CancellationToken cancellationToken)
        {
            LoadPDNFromFileAsyncCheckParams(document1C);

            await UpdateAccountAndClientInfoAsync(document1C, cancellationToken);

            string account1CCode = document1C.CreditDocument.Code1C;

            using (IDBSource dbSource = new MKKContext()) {
                PDNResultDB pdn = await dbSource.PDNResultDBs.
                                  AsNoTracking().
                                  Where(i => i.Account1C.Account1CCode.Equals(account1CCode)).
                                  SingleOrDefaultAndErrorAsync <PDNResultDB, EFService1C>(cancellationToken);

                if (pdn == default)
                {
                    pdn = new PDNResultDB();
                    dbSource.Entry(pdn).State = EntityState.Added;
                }

                Account1C account1CInDB = await FindAccountAndLogErrorAsync <EFService1C>(account1CCode, cancellationToken);

                pdn.Account1C = account1CInDB;
                pdn.Percent   = pdnValue;
                dbSource.Entry(account1CInDB).State = EntityState.Unchanged;

                await dbSource.SaveChangesAndLogErrorAsync <EFService1C>(new LogShortMessage(
                                                                             message : "/*Метод {methodName}, document1C {document1C}, pdnValue {pdnValue}*/",
                                                                             "AddNewAccountRecordAsync", document1C, pdnValue),
                                                                         cancellationToken
                                                                         );
            }
        }
Esempio n. 2
0
        /// <summary>
        /// Обновить информацию по договору 1С асинхронно.
        /// </summary>
        /// <param name="document1C">Договора 1С</param>
        /// <param name="cancellationToken">Токен отмены</param>
        public async Task UpdateAccountAndClientInfoAsync(CreditDocumentNResult document1C,
                                                          CancellationToken cancellationToken)
        {
            UpdateAccountAndClientInfoCheckParams(document1C);

            Account1C account1C = (Account1C)document1C.CreditDocument;

            ClientDB[] clientDBs = ClientsFromAccount(document1C, account1C);

            ClientTask[] presentClientsTask = clientDBs.AsParallel().
                                              Select(i => new ClientTask()
            {
                ClientDB = i,
                Task     = FindClientAndLogErrorAsync <EFService1C>(i.Code1C, cancellationToken)
            }).
                                              WithCancellation(cancellationToken).
                                              ToArray();

            UpdateClientsInfo(presentClientsTask, cancellationToken);

            Account1C presentAccount1CTask = await FindAccountAndLogErrorAsync <EFService1C>(
                account1C.Account1CCode,
                cancellationToken,
                c => c.Client, o => o.Organization, sp => sp.SellPont, cht => cht.TypeOfCharge);

            await UpdateAccount1CInfoAsync(account1C, presentAccount1CTask, cancellationToken);

            if (clientDBs.Length > 1)
            {
                await UpdateGuarantorsAsync(clientDBs, cancellationToken);
            }
        }
Esempio n. 3
0
        /// <summary>
        /// Получить список клиентов из договора.
        /// </summary>
        /// <param name="document">Договор 1С из вебсервиса</param>
        /// <param name="account1C">Договор 1С</param>
        /// <returns>Список клиентов</returns>
        private static ClientDB[] ClientsFromAccount(CreditDocumentNResult document, Account1C account1C)
        {
            List <ClientDB> clientDBs = new List <ClientDB> {
                (ClientDB)document.CreditDocument.Client
            };

            foreach (ClientProfile client in document.CreditDocument?.Guarantors ?? new ClientProfile[0])
            {
                if (SOAP1C.StringToDateTime(client.BirthDate) < new DateTime(1920, 1, 1))
                {
                    LogAndThrowException <Exception, EFService1C>(_Logger,
                                                                  "",
                                                                  "Проверьте год рождения клиента {clientLastName} {clientFirstName} {clientSecondName}" +
                                                                  " (код клиента {clientID1C}). Год рождения:{clientBirthDate)}./* Метод {methodName}.*/",
                                                                  client.LastName, client.FirstName, client.SecondName, client.ID1C, client.BirthDate,
                                                                  "CreditDocumentNResult");
                }

                ClientDB           clientDB   = (ClientDB)client;
                List <GuarantorDB> guarantors = new List <GuarantorDB> {
                    new GuarantorDB()
                    {
                        Account = account1C
                    }
                };
                clientDB.GuarantorDBs = guarantors;

                clientDBs.Add(clientDB);
            }

            return(clientDBs.ToArray());
        }
Esempio n. 4
0
        /// <summary>
        /// Получить сохраненный ПДН по номеру договору 1С асинхронно.
        /// </summary>
        /// <param name="account1CCode">Номер договора из 1С</param>
        /// <param name="cancellationToken">Токен отмены</param>
        /// <returns>ПДН и дата анкеты, на основании которой был рассчитан ПДН</returns>
        public async Task <PDNInfoList> GetSavedPDNAsync(string account1CCode, CancellationToken cancellationToken)
        {
            GetSavedPDNCheckParams(account1CCode);

            using (IDBSource dbSource = new MKKContext()) {
                Account1C account1C = await FindAccountAsync(account1CCode, cancellationToken, i => i.PDNData);

                if ((account1C?.PDNCreditHistoryAnket ?? default) != default)
                {
                    PDNData[] pdnData = await dbSource.PDNDatas.
                                        Include(i => i.Account1C).
                                        Where(i => i.Account1C.Account1CCode.Equals(account1CCode)).
                                        ToArrayAndLogErrorAsync <PDNData, EFServicePDN>(cancellationToken);

                    CreditHistory creditHistory = await dbSource.CreditHistories.Where(i => i.ID == account1C.PDNCreditHistoryAnket).
                                                  FirstOrDefaultAndLogErrorAsync <CreditHistory, EFServicePDN>(cancellationToken);

                    return(new PDNInfoList {
                        PDNCards = pdnData.Where(i => i.PDNCalculateType == PDNCalculateType.Card)
                                   .Select(i => (PDNCard)i).ToArray(),
                        PDNNonCards = pdnData.Where(i => i.PDNCalculateType == PDNCalculateType.NonCard).Select(i => {
                            PDNNonCard result = i;
                            return result;
                        }).ToArray(),
                        CreditHistoryID = creditHistory.ID,
                        ReportDate = creditHistory.Date,
                        Account1CID = account1CCode
                    });
                }
            }

            return(default);
Esempio n. 5
0
        /// <summary>
        /// Добавить новую запись в БД асинхронно.
        /// </summary>
        /// <param name="account1CDB">Новая запись</param>
        /// <param name="cancellationToken">Токен отмены</param>
        private async Task AddNewAccountRecordAsync(Account1C account1CDB, CancellationToken cancellationToken)
        {
            using (MKKContext dbSource = new MKKContext()) {
                ClientDB accountClientDB = await FindClientAndLogErrorAsync <EFService1C>(account1CDB.Client.Code1C, cancellationToken);

                OrganizationDB organizationDB = await FindRequiredDBRecordByNameAndLogErrorAsync <OrganizationDB, EFService1C>(account1CDB.Organization.Name, cancellationToken);

                SellPontDB sellPointDB = await FindRequiredDBRecordByNameAndLogErrorAsync <SellPontDB, EFService1C>(account1CDB.SellPont.Name, account1CDB.SellPont.Code1C, cancellationToken);

                TypeOfChargeDB typeOfCharge = await FindRequiredDBRecordByNameAndLogErrorAsync <TypeOfChargeDB, EFService1C>(account1CDB.TypeOfCharge.Name, cancellationToken);

                AttachAndLogError <OrganizationDB, EFService1C>(dbSource, organizationDB);
                AttachAndLogError <SellPontDB, EFService1C>(dbSource, sellPointDB);
                AttachAndLogError <ClientDB, EFService1C>(dbSource, accountClientDB);
                AttachAndLogError <TypeOfChargeDB, EFService1C>(dbSource, typeOfCharge);

                account1CDB.Organization = organizationDB;
                account1CDB.SellPont     = sellPointDB;
                account1CDB.Client       = accountClientDB;
                account1CDB.TypeOfCharge = typeOfCharge;

                await dbSource.Account1Cs.AddAsync(account1CDB, cancellationToken);

                await dbSource.SaveChangesAndLogErrorAsync <EFService1C>(new LogShortMessage(
                                                                             message : "/*Метод {methodName}, account1C {account1C}*/",
                                                                             "AddNewAccountRecordAsync", account1CDB),
                                                                         cancellationToken
                                                                         );
            }
        }
Esempio n. 6
0
        /// <summary>
        /// Добавить в договор поручителей асинхронно.
        /// </summary>
        /// <param name="clientDB">Список клиентов, в том числе поручителей</param>
        /// <param name="account1C">Договор</param>
        /// <param name="cancellationToken">Токен отмены</param>
        private static async Task AddGuarantorsAsync(ClientDB[] clientDB, Account1C account1C,
                                                     CancellationToken cancellationToken)
        {
            using (IDBSource dbSource = new MKKContext()) {
                string[] guarantorsCode = clientDB.
                                          Where(j => j.GuarantorDBs != default).
                                          Select(j => j.Code1C).
                                          ToArray();

                ClientDB[] guarantors = dbSource.Clients.
                                        Where(i => guarantorsCode.Contains(i.Code1C)).
                                        ToArray();

                AttachAndLogError <Account1C, EFService1C>((MKKContext)dbSource, account1C);

                foreach (ClientDB guarantor in guarantors)
                {
                    GuarantorDB guarantorDB = new GuarantorDB()
                    {
                        Account = account1C, Client = guarantor
                    };
                    await dbSource.GuarantorDBs.AddAsync(guarantorDB, cancellationToken);
                }

                await dbSource.SaveChangesAndLogErrorAsync <EFService1C>(new LogShortMessage(
                                                                             message : "/*Метод {methodName}, clientDB {clientDB}, account1C {account1C}*/",
                                                                             "AddGuarantorsAsync", clientDB, account1C),
                                                                         cancellationToken
                                                                         );
            }
        }
Esempio n. 7
0
        /// <summary>
        /// Обновить список поручителей асинхронно.
        /// </summary>
        /// <param name="clientDB">Клиент</param>
        /// <param name="cancellationToken">Токен отмены</param>
        private static async Task UpdateGuarantorsAsync(ClientDB[] clientDB, CancellationToken cancellationToken)
        {
            string account1CCode = clientDB.Where(acc => acc.GuarantorDBs != default).
                                   Select(acc => acc.GuarantorDBs).FirstOrDefault().FirstOrDefault()?.Account.Account1CCode;
            Account1C account1C = await FindAccountAndLogErrorAsync <EFService1C>(account1CCode, cancellationToken);

            await DeleteGuarantorsAsync(account1C, cancellationToken);
            await AddGuarantorsAsync(clientDB, account1C, cancellationToken);
        }
Esempio n. 8
0
 /// <summary>
 /// Обновить/добавить по договору 1С запись в БД асинхронно.
 /// </summary>
 /// <param name="account1CDB">Договор из 1С</param>
 /// <param name="presentAccount1C">Договор из 1С в БД</param>
 /// <param name="cancellationToken">Токен отмены</param>
 private async Task UpdateAccount1CInfoAsync(Account1C account1CDB, Account1C presentAccount1C,
                                             CancellationToken cancellationToken)
 {
     if (presentAccount1C == default)
     {
         await AddNewAccountRecordAsync(account1CDB, cancellationToken);
     }
     else
     {
         await UpdateAccountRecordAsync(account1CDB, presentAccount1C, cancellationToken);
     }
 }
Esempio n. 9
0
        /// <summary>
        /// Обновить информацию по договору асинхронно.
        /// </summary>
        /// <param name="account1CDB">новый договор</param>
        /// <param name="presentAccount1C">Договор в базе</param>
        /// <param name="cancellationToken">Токен отмены</param>
        /// <returns></returns>
        private static async Task UpdateAccountRecordAsync(Account1C account1CDB, Account1C presentAccount1C,
                                                           CancellationToken cancellationToken)
        {
            using (IDBSource dbSource = new MKKContext()) {
                if (!presentAccount1C.Equals1CParams(account1CDB))
                {
                    AttachAndLogError <Account1C, EFService1C>((MKKContext)dbSource, presentAccount1C);

                    if (presentAccount1C.Client != default)
                    {
                        dbSource.Entry(presentAccount1C.Client).State = EntityState.Detached;
                    }

                    presentAccount1C.DateTime = account1CDB.DateTime;

                    ClientDB clientDB =
                        await FindClientAndLogErrorAsync <EFService1C>(account1CDB.Client.Code1C, cancellationToken);

                    dbSource.Entry(clientDB).State = EntityState.Unchanged;

                    presentAccount1C.Client = clientDB;
                    dbSource.Entry(presentAccount1C).State = EntityState.Modified;
                }

                if (presentAccount1C.Organization == default)
                {
                    await UpdateAccountAsync(dbSource, presentAccount1C, account1CDB.Organization, cancellationToken);
                }

                if (presentAccount1C.SellPont == default)
                {
                    await UpdateAccountAsync(dbSource, presentAccount1C, account1CDB.SellPont, cancellationToken);
                }

                if (presentAccount1C.TypeOfCharge == default && presentAccount1C.TypeOfCharge?.Name != account1CDB.TypeOfCharge.Name)
                {
                    await UpdateAccountAsync(dbSource, presentAccount1C, account1CDB.TypeOfCharge, cancellationToken);
                }

                if (presentAccount1C.AdditionAgrement != account1CDB.AdditionAgrement)
                {
                    presentAccount1C.AdditionAgrement      = account1CDB.AdditionAgrement;
                    dbSource.Entry(presentAccount1C).State = EntityState.Modified;
                }

                await dbSource.SaveChangesAndLogErrorAsync <EFService1C>(new LogShortMessage(
                                                                             message : "/*Метод {methodName}, document1C {document1C}, pdnValue {pdnValue}*/",
                                                                             "AddNewAccountRecordAsync", account1CDB, presentAccount1C, cancellationToken),
                                                                         cancellationToken
                                                                         );
            }
        }
Esempio n. 10
0
 /// <summary>
 /// Получить список сообщений по выбранному договору асинхронно.
 /// </summary>
 /// <param name="account">Договор</param>
 /// <param name="cancellationToken">Токен отмены</param>
 /// <returns>Задача с сообщениями</returns>
 private static async Task <List <PostsDB> > GetPostsInAccountAsync(Account1C account,
                                                                    CancellationToken cancellationToken)
 {
     using (IDBSource dbSource = new MKKContext()) {
         return(await dbSource.PostsDBs.
                AsNoTracking().
                Include(i => i.Account).
                Include(i => i.Author).
                Where(i => i.Account.Account1CCode.Equals(account.Account1CCode)).
                Select(i => i).
                ToListAndLogErrorAsync <PostsDB, EFServicePosts>(cancellationToken));
     }
 }
Esempio n. 11
0
        /// <summary>
        /// Обновить значение эккаунта асинхронно.
        /// </summary>
        /// <typeparam name="TEntity">Обновляемый тип данных</typeparam>
        /// <param name="dbSource">Источник данных</param>
        /// <param name="account1C">Счет</param>
        /// <param name="value">Новое значение</param>
        /// <param name="cancellationToken">Токен отмены</param>
        private static async Task UpdateAccountAsync <TEntity>(IDBSource dbSource, Account1C account1C, TEntity value,
                                                               CancellationToken cancellationToken) where TEntity : class, IDBTableName, new()
        {
            AttachAndLogError <Account1C, EFService1C>((MKKContext)dbSource, account1C);

            TEntity valueDB =
                await FindRequiredDBRecordByNameAndLogErrorAsync <TEntity, EFService1C>(value.Name, cancellationToken);

            string fieldName = valueDB.GetType().Name.Substring(0, (valueDB.GetType().Name.Length - "DB".Length));

            dbSource.Entry(valueDB).State = EntityState.Unchanged;
            account1C.GetType().GetProperty(fieldName)?.SetValue(account1C, valueDB);
            dbSource.Entry(account1C).State = EntityState.Modified;
        }
Esempio n. 12
0
        /// <summary>
        /// Удалить из договора всех поручителей асинхронно.
        /// </summary>
        /// <param name="account1C">Договор</param>
        /// <param name="cancellationToken">Токен отмены</param>
        private static async Task DeleteGuarantorsAsync(Account1C account1C, CancellationToken cancellationToken)
        {
            using (IDBSource dbSource = new MKKContext()) {
                IQueryable <GuarantorDB> guarantorDBs =
                    dbSource.GuarantorDBs.Where(gr => gr.Account1CID.Equals(account1C.Account1CCode));

                dbSource.GuarantorDBs.RemoveRange(guarantorDBs);

                await dbSource.SaveChangesAndLogErrorAsync <EFService1C>(new LogShortMessage(
                                                                             message : "/*Метод {methodName}, guarantorDBs {guarantorDBs}, account1C {account1C}*/",
                                                                             "DeleteGuarantorsAsync", guarantorDBs, account1C),
                                                                         cancellationToken
                                                                         );
            }
        }
Esempio n. 13
0
 /// <summary>
 /// Получить список сообщений по клиенту, кроме одного, асинхронно.
 /// </summary>
 /// <param name="account">Договор, до которого необходимо получить все сообщения</param>
 /// <param name="cancellationToken">Токен отмены</param>
 /// <returns>Задача с сообщениями</returns>
 private static async Task <List <PostsDB> > GetPostsByClientAsync(Account1C account,
                                                                   CancellationToken cancellationToken)
 {
     using (IDBSource dbSource = new NBCH_EF.MKKContext()) {
         return(await dbSource.PostsDBs.
                AsNoTracking().
                Include(i => i.Account).
                Include(i => i.Account.Client).
                Include(i => i.Author).
                Where(
                    i => i.Account.Client.ID.Equals(account.Client.ID) &&
                    i.Account.DateTime <= account.DateTime &&
                    !i.Account.Account1CCode.Equals(account.Account1CCode)
                    ).ToListAndLogErrorAsync <PostsDB, EFServicePosts>(cancellationToken));
     }
 }
Esempio n. 14
0
        /// <summary>
        /// Проверить доступ к договору по организации и логину пользователя.
        /// </summary>
        /// <param name="adLogin">Логин пользователя</param>
        /// <param name="account1CCode">Номер договора 1С</param>
        /// <param name="cancellationToken">Токен отмены</param>
        /// <returns></returns>
        internal static async Task <bool> HaveAccessToAccountAsync(string adLogin, string account1CCode,
                                                                   CancellationToken cancellationToken)
        {
            Account1C account = await FindAccountAsync(account1CCode, cancellationToken, i => i.Organization);

            Organizations[] orgs = OrganizationsByLogin(adLogin);

            foreach (Organizations organizations in orgs)
            {
                if (account.Organization.Name.Equals(organizations.GetDescription()))
                {
                    return(true);
                }
            }

            return(false);
        }
Esempio n. 15
0
        /// <summary>
        /// Установить проверяющего асинхронно.
        /// </summary>
        /// <param name="account1CCode">Номер договора 1С</param>
        /// <param name="login">Логин проверяющего</param>
        /// <param name="assignDate">Дата операции</param>
        /// <param name="timeZone">Часовой пояс проверяющего</param>
        /// <param name="cancellationToken">Токен отмены</param>
        public async Task SetInspectionAsync(string account1CCode, string login, DateTime assignDate, int timeZone,
                                             CancellationToken cancellationToken)
        {
            SetInspectionCheckParams(login, assignDate, timeZone);

            using (IDBSource dbSource = new MKKContext()) {
                Account1C account1C = await FindAccountAndLogErrorAsync <EFServiceInspecting>(account1CCode, cancellationToken);

                ADLoginsDB adLogin = Singleton <ProxyADLoginsDB> .Values[login];

                await dbSource.AccountInspectingDB.AddAsync(
                    new AccountInspectingDB()
                {
                    Account1CID    = account1C.Account1CCode,
                    OperationDate  = assignDate,
                    TimeZone       = timeZone,
                    UserPermission = PermissionLevel.GetInt(login),
                    ADLoginsDBID   = adLogin.ID
                },
                    cancellationToken);

                await dbSource.SaveChangesAndLogErrorAsync <EFServiceInspecting>(cancellationToken);
            }
        }
Esempio n. 16
0
        /// <summary>
        /// Получить все сообщения по договору асинхронно.
        /// </summary>
        /// <param name="adLogin">Логин пользователя AD</param>
        /// <param name="account1CCode">Номер договора 1С</param>
        /// <param name="cancellationToken">Токен отмены</param>
        /// <returns>Все сообщения по договору</returns>
        public async Task <Post[]> GetPostsAsync(string adLogin, string account1CCode, CancellationToken cancellationToken)
        {
            GetPostsCheckParams(adLogin, account1CCode);

            ADLoginsDB author  = Singleton <ProxyADLoginsDB> .Values[adLogin];
            Account1C  account = await FindAccountAndLogErrorAsync <EFServicePosts>(account1CCode, cancellationToken,
                                                                                    i => i.Client);

            if (account == default)
            {
                return(new Post[0]);
            }

            Task <List <PostsDB> > postsInAccountTask = GetPostsInAccountAsync(account, cancellationToken);
            Task <List <PostsDB> > postsByClientTask  = GetPostsByClientAsync(account, cancellationToken);

            List <PostsDB> posts = (await postsByClientTask).Where(i => i.Author.ID.Equals(author.ID) || CanReadAllPost(adLogin)).ToList();

            posts.AddRange((await postsInAccountTask).Where(i => i.Author.ID.Equals(author.ID) || CanReadAllPost(adLogin)).ToArray());

            Post[] result = posts.Select(i => (Post)i).ToArray();

            return(result);
        }