Beispiel #1
0
        public HttpResponseMessage Post(HttpRequestMessage request, ExpenseListViewCriteria criteria)
        {
            return(CreateHttpResponse(request, () =>
            {
                HttpResponseMessage response = null;
                // Force params
                // Approved SyncStatusId
                criteria.SyncStatusId = 3;
                // Not exported
                criteria.Exported = 2;

                // GetAll
                criteria.Size = -1;

                SearchResultViewModel <ExpenseDto> expenseList = this.expenseAppService.Search(criteria);
                SearchResultViewModel <ExportExpenseDto> exportExpenseList = Mapper.Map <SearchResultViewModel <ExpenseDto>, SearchResultViewModel <ExportExpenseDto> >(expenseList);


                string connectionStringsConfigPath = HttpContext.Current.Server.MapPath("~/ConnectionStrings.config");

                XElement doc = XElement.Load($"{connectionStringsConfigPath}");

                string reportsContextConnectionString = doc.Descendants("add")
                                                        .Where(x => (string)x.Attribute("name") == "ReportsContext")
                                                        .Select(x => (string)x.Attribute("connectionString"))
                                                        .FirstOrDefault();
                using (SqlConnection connection =
                           new SqlConnection(reportsContextConnectionString ?? throw new InvalidOperationException("No se pudo establecer la conexión a la base de datos.")))
                {
                    const string ProviderAccountNumberQuery = @"SELECT CONVERT(int,PVMPRH_NROCTA) from PVMPRH where @ProveedorId = PVMPRH_NRODOC";

                    List <long> providersNotExported = new List <long>();
                    List <KeyValuePair <long, int> > existingProviders = new List <KeyValuePair <long, int> >();
                    long expensesExported = 0;
                    long expensesNotExported = 0;
                    DateTime CurrentDate = DateTime.Today;

                    foreach (ExportExpenseDto expense in exportExpenseList.Results)
                    {
                        Int32 providerAccountNumber = 0;
                        if (existingProviders.All(x => x.Key != expense.Provider.Cuit))
                        {
                            SqlCommand command = new SqlCommand(ProviderAccountNumberQuery, connection);
                            command.Parameters.AddWithValue("@ProveedorId", expense.Provider.Cuit);
                            connection.Open();
                            SqlDataReader reader = command.ExecuteReader();
                            try
                            {
                                if (reader.Read())
                                {
                                    providerAccountNumber = reader.GetInt32(0);
                                    if (providerAccountNumber != 0)
                                    {
                                        existingProviders.Insert(0, new KeyValuePair <long, int>(expense.Provider.Cuit, providerAccountNumber));
                                    }
                                }
                            }
                            catch (Exception e)
                            {
                                Console.WriteLine(e.Message);
                            }
                            finally
                            {
                                reader.Close();
                                command.Dispose();
                                connection.Close();
                            }
                        }
                        else
                        {
                            providerAccountNumber = existingProviders.Where(x => x.Key == expense.Provider.Cuit).Select(x => x.Value).FirstOrDefault();
                        }

                        if (providerAccountNumber != 0)
                        {
                            bool SIN_IVA = expense.Aliquot.Description == "SIN IVA";
                            string userCompanyGroupForExpense = expense.User.UserCompanyGroups.Where(x => x.Company.Id == expense.CompanyId).
                                                                Select(x => x.UserGroup.Code + x.Company.Id).
                                                                FirstOrDefault();
                            var stringifiedproviderAccountNumber = providerAccountNumber.ToString();
                            ReceiptHeader header = new ReceiptHeader()
                            {
                                SAR_CORMVH_IDENTI = expense.Id.ToString(),
                                SAR_CORMVH_CIRCOM = SIN_IVA ? CIRCOM.SIN_IVA : CIRCOM.IVA,
                                SAR_CORMVH_CIRAPL = SIN_IVA ? CIRCOM.SIN_IVA : CIRCOM.IVA,
                                SAR_CORMVH_CODEMP = "AL0" + expense.CompanyId,
                                SAR_CORMVH_CODORI = expense.Receipt,
                                SAR_CORMVH_CMPRAD = "N/A",
                                SAR_CORMVH_STATUS = 'N',
                                SAR_CORMVH_FCHMOV = CurrentDate,
                                SAR_CORMVH_NROCTA = stringifiedproviderAccountNumber.PadLeft(6)
                            };

                            receiptHeaderContext.Add(header);

                            var hasNotTaxesConcepts = Math.Abs(double.Parse(expense.NotTaxedConcepts)) > 0;

                            ReceiptItem itemDefault = new ReceiptItem()
                            {
                                SAR_CORMVI_IDENTI = expense.Id.ToString(),
                                SAR_CORMVI_TIPORI = expense.Category.Code,
                                SAR_CORMVI_CANTID = 1,
                                SAR_CORMVI_ARTORI = expense.CompanyId + expense.Category.Code + userCompanyGroupForExpense + "G",
                                SAR_CORMVI_NROITM = 1,
                                SAR_CORMVI_PRECIO = SIN_IVA ? expense.Total : expense.NetValue,
                                SAR_CORMVI_NROAPL = null,
                                SAR_CORMVI_ITMAPL = null
                            };

                            receiptItemContext.Add(itemDefault);

                            CreateDistribution(expense.Id, itemDefault.SAR_CORMVI_NROITM, expense.CompanyId, expense.User.Id_Erp);

                            D_Concepts Debe_concepts_default = new D_Concepts()
                            {
                                SAR_CORMVI08_IDENTI = expense.Id,
                                SAR_CORMVI08_IMPORT = expense.Total
                            };

                            debeConceptsRepository.Add(Debe_concepts_default);

                            H_Concepts Haber_concepts_default = new H_Concepts()
                            {
                                SAR_CORMVI09_IDENTI = expense.Id,
                                SAR_CORMVI09_CODCPT = expense.CompanyId + (expense.Payment.Description == "Efectivo" ? "E" : "T"),
                                SAR_CORMVI09_IMPORT = expense.Total
                            };

                            haberConceptsRepository.Add(Haber_concepts_default);

                            if (hasNotTaxesConcepts)
                            {
                                ReceiptItem secondLine = itemDefault.Clone();
                                secondLine.SAR_CORMVI_NROITM = 2;
                                secondLine.SAR_CORMVI_PRECIO = expense.NotTaxedConcepts;
                                secondLine.SAR_CORMVI_ARTORI = secondLine.SAR_CORMVI_ARTORI.Remove(secondLine.SAR_CORMVI_ARTORI.Length - 1, 1) + "N";
                                receiptItemContext.Add(secondLine);
                                CreateDistribution(expense.Id, secondLine.SAR_CORMVI_NROITM, expense.CompanyId, expense.User.Id_Erp);
                            }

                            string aliquotValue = expense.Aliquot.Value.ToString(CultureInfo.InvariantCulture);

                            if (!SIN_IVA)
                            {
                                TaxesDetails taxDetails = new TaxesDetails()
                                {
                                    SAR_CORMVI07_IDENTI = expense.Id.ToString(),
                                    SAR_CORMVI07_CODCPT = GetCODPT(aliquotValue),
                                    SAR_CORMVI07_INGRES = expense.NetValue,
                                    SAR_CORMVI07_IMPGRA = expense.NetValue,
                                    SAR_CORMVI07_PORCEN = aliquotValue,
                                    SAR_CORMVI07_NROITM = 1
                                };

                                taxesDetailsRepository.Add(taxDetails);
                            }


                            DistDimTesoH distDimTesoH = new DistDimTesoH()
                            {
                                SAR_CJRMVD10_IDENTI = expense.Id,
                                SAR_CJRMVD10_CODDIS = $"AL0{expense.CompanyId.ToString()}|{expense.User.Id_Erp}"
                            };

                            distDimTesoHRepository.Add(distDimTesoH);

                            this.reportsUnitOfWork.Commit();

                            expensesExported++;
                        }
                        else
                        {
                            expensesNotExported++;
                            if (!providersNotExported.Contains(expense.Provider.Cuit))
                            {
                                providersNotExported.Add(expense.Provider.Cuit);
                            }
                        }
                    }
                    foreach (var expense in expenseList.Results)
                    {
                        if (!providersNotExported.Contains(expense.Provider.Cuit))
                        {
                            expense.Exported = true;
                            expense.ExportedDateTime = DateTime.Now;
                            this.expenseRepository.Edit(Mapper.Map <ExpenseDto, Expense>(expense));
                            this.unitOfWork.Commit();
                        }
                    }

                    int notExportedProviders = providersNotExported.Count();
                    string providersPath = null;

                    if (notExportedProviders > 0)
                    {
                        ProviderListViewCriteria providersCriteria = new ProviderListViewCriteria()
                        {
                            Size = -1,
                            FileName = "Proveedores_inexistentes_exportacion_gastos"
                        };
                        SearchResultViewModel <ProviderDto> providersList = this.providerAppService.ExportData(providersCriteria, null, providersNotExported);
                        providersPath = this.SaveCsv <ProviderDto, ProviderListViewCriteria>(providersList,
                                                                                             providersCriteria,
                                                                                             providersCriteria.FileName + "_" + long.Parse(DateTime.Now.ToString("yyyyMMddHHmmss")),
                                                                                             false, null);
                    }
                    response = request.CreateResponse(HttpStatusCode.Created, new
                    {
                        success = true,
                        exported = expensesExported,
                        not_exported = expensesNotExported,
                        inexistent_providers = notExportedProviders,
                        error_providers_path = providersPath
                    });
                }
                return response;
            }));