Beispiel #1
0
        public SyncItems SyncPaymentMethods()
        {
            var response = new SyncItems();

            _foccoWebFormaPagamentoRepository.ExecuteSqlCommand("UPDATE FoccoWebApiFormaPagamento SET Ativo = 0;");

            var apiReq = new GetPaymentConditionsCommandRequest();

            var apiResp = base._foccoErpApiCommands.GetPaymentConditionsCommand(apiReq);

            if (apiResp.Success && apiResp.GetPaymentConditionsResponse.Rows != null)
            {
                var rows = apiResp.GetPaymentConditionsResponse.Rows.DistinctBy(x => x.ID, null);
                foreach (var row in rows)
                {
                    InsertUpdatePaymentMethods(row);
                    response.TotalProcessedRows += 1;
                }

                base._unitOfWork.Commit();

                response.TotalRowCount = apiResp.GetPaymentConditionsResponse.Rows.Count;
            }

            response.EndOfRecords = true;

            return(response);
        }
Beispiel #2
0
 protected SyncEngine(SyncItems syncType, T service, bool fullSync = false, DateTime?offset = null, int limit = 100)
 {
     SyncType   = syncType;
     Service    = service;
     Limit      = limit;
     SyncOffset = offset ?? DateTime.UtcNow;
     // щоб випадково не пропустити офсетний елемент - добавимо його в зворотню синхронізацію
     RestoreOffset = SyncOffset.AddTicks(10);
     FullSync      = fullSync;
     using (StoreContext store = new StoreContext()
     {
         Trace = Trace
     })
     {
         if (!fullSync)
         {
             // визначаємо, чи успішною була попередня синхронізація, та її офсет
             if (store.SyncStates.FirstOrDefault(s => s.Type == syncType)?.Restoring == false)
             {
                 RestoreTo = GetSyncOffset(store);
             }
         }
         // перед початком синхронізації - відмічаємо в базі початок відновлення синхронізації
         // якщо синхронізація зупиниться до повного її відновлення - цей стан буде сигналізувати, про неповноту одержаних даних
         store.SyncStates.AddOrUpdate(new SyncState {
             Type = syncType, Restoring = true
         });
         store.SaveChanges();
     }
 }
Beispiel #3
0
        protected void InitCommands()
        {
            CacheData = ReactiveCommand.CreateFromTask <Unit, IEnumerable <T> >(async(_) =>
            {
                return(await LoadDataFromTable());
            });

            CacheData.ThrownExceptions.Subscribe(ex =>
            {
                Debug.WriteLine($"Failed to CacheData: {ex.Message}");
            }).DisposeWith(Disposables);

            SyncItems = ReactiveCommand.CreateFromTask <Unit, SyncStatus>(async(_) =>
            {
                return(await PerformSync());
            });

            SyncItems.ThrownExceptions.Subscribe(ex =>
            {
                Debug.WriteLine($"Failed to SyncItems: {ex.Message}");
            }).DisposeWith(Disposables);

            IsSyncing = SyncItems.IsExecuting.StartWith(false).Publish().RefCount();

            CacheCollection = ReactiveCommand.Create <IList <T>, IList <T> >(data =>
            {
                UpdateCachedData(data);
                return(data);
            });

            CacheCollection.ThrownExceptions.Subscribe(ex =>
            {
                Debug.WriteLine($"Failed to CacheCollection: {ex.Message}");
            }).DisposeWith(Disposables);

            AddItem = ReactiveCommand.CreateFromTask <T, T>(async item =>
            {
                await Initialize();

                await Table.InsertAsync(item);

                return(item);
            });

            AddItem.ThrownExceptions.Subscribe(ex =>
            {
                Debug.WriteLine($"Failed to AddItem: {ex.Message}");
            }).DisposeWith(Disposables);

            UpdateItem = ReactiveCommand.CreateFromTask <T, T>(async item =>
            {
                await Initialize();

                await Table.UpdateAsync(item);

                return(item);
            });

            UpdateItem.ThrownExceptions.Subscribe(ex =>
            {
                Debug.WriteLine($"Failed to UpdateItem: {ex.Message}");
            }).DisposeWith(Disposables);

            DeleteItem = ReactiveCommand.CreateFromTask <T, T>(async item =>
            {
                await Initialize();

                await Table.DeleteAsync(item);

                return(item);
            });

            DeleteItem.ThrownExceptions.Subscribe(ex =>
            {
                Debug.WriteLine($"Failed to DeleteItem: {ex.Message}");
            }).DisposeWith(Disposables);

            Observable.Merge(AddItem, UpdateItem, DeleteItem)
            .Select(_ => Unit.Default)
            .Do(_ => Debug.WriteLine("Updating UI prior to syncing"))
            .SelectMany(async _ => await LoadDataFromTable())
            .Do(UpdateCachedData)
            .Select(_ => Unit.Default)
            .Do(_ => Debug.WriteLine("Syncing after changing items"))
            .InvokeCommand(this, x => x.SyncItems)
            .DisposeWith(Disposables);

            SyncItems.Where(x => x == SyncStatus.Synchronized)
            .Select(_ => Unit.Default)
            .Do(_ => Debug.WriteLine("Caching sync'd items"))
            .InvokeCommand(this, x => x.CacheData)
            .DisposeWith(Disposables);
        }
        public SyncItems SyncClientsProducts(int batchRecords, int skip, int clientCode, long cnpjCpf)
        {
            var response = new SyncItems();

            if (skip == 0)
            {
                _clienteprodutoRepository.ExecuteSqlCommand("UPDATE FoccoWebApiClienteProduto SET Ativo = 0 WHERE CodigoCliente = " + clientCode + ";");
            }

            var apiReq = new GetClientItemsCommandRequest()
            {
                GetClientItemsRequest = new GetClientItemsRequest()
                {
                    Skip = skip, Take = 250, CodigoCliente = clientCode, CnpjCpf = cnpjCpf
                }
            };

            while (true)
            {
                var apiResp = base._foccoErpApiCommands.GetClientItemsCommand(apiReq);

                if (apiResp.Success && apiResp.GetClientItemsResponse.ClientItems.Rows != null)
                {
                    var rows = apiResp.GetClientItemsResponse.ClientItems.Rows.DistinctBy(x => x.ID, null);
                    foreach (var row in rows)
                    {
                        InsertUpdateClientProduct(clientCode, row);
                        response.TotalProcessedRows += 1;
                    }

                    base._unitOfWork.Commit();

                    response.TotalRowCount = apiResp.GetClientItemsResponse.ClientItems.TotalRowCount;
                }
                else
                {
                    response.EndOfRecords = true;
                    break;
                }


                var controller = (response.TotalProcessedRows + apiReq.GetClientItemsRequest.Take) - batchRecords;

                if (controller <= 0)
                {
                    apiReq.GetClientItemsRequest.Skip += apiReq.GetClientItemsRequest.Take;
                }
                else
                {
                    if (apiReq.GetClientItemsRequest.Take > controller)
                    {
                        apiReq.GetClientItemsRequest.Skip += (apiReq.GetClientItemsRequest.Take - controller);
                    }
                    else
                    {
                        break;
                    }
                }
            }

            return(response);
        }
Beispiel #5
0
        public SyncItems SyncProducts(int batchRecords, int skip)
        {
            var response = new SyncItems();

            _produtoRepository.ExecuteSqlCommand("TRUNCATE TABLE FoccoWebApiProduto;");

            var apiReq = new GetItemsCommandRequest()
            {
                GetItemsRequest = new GetItemsRequest()
                {
                    Skip = skip, Take = 250
                }
            };

            while (true)
            {
                var apiResp = base._foccoErpApiCommands.GetItemsCommand(apiReq);

                if (apiResp.Success && apiResp.GetItemsResponse.Rows != null)
                {
                    var rows = apiResp.GetItemsResponse.Rows.DistinctBy(x => x.ID, null);
                    foreach (var row in rows)
                    {
                        InsertProduct(row);
                        response.TotalProcessedRows += 1;
                    }

                    base._unitOfWork.Commit();

                    response.TotalRowCount = apiResp.GetItemsResponse.TotalRowCount;
                }
                //else if (!apiResp.Success)
                //    throw apiResp.Exception;
                else
                {
                    response.EndOfRecords = true;
                    break;
                }


                var controller = (response.TotalProcessedRows + apiReq.GetItemsRequest.Take) - batchRecords;

                if (controller <= 0)
                {
                    apiReq.GetItemsRequest.Skip += apiReq.GetItemsRequest.Take;
                }
                else
                {
                    if (apiReq.GetItemsRequest.Take > controller)
                    {
                        apiReq.GetItemsRequest.Skip += (apiReq.GetItemsRequest.Take - controller);
                    }
                    else
                    {
                        break;
                    }
                }
            }

            return(response);
        }