Example #1
0
 public static string GetAccountNameCode(Transfer t)
 {
     string name = "";
     Subconto Account = t.Субконто1;
     if (Account != null)
         name = Account.Наименование + " (" + Account.Код + ")";
     return name;
 }
        public tbl_Cashflow CreateCashflow(Entities db, Transfer t)
        {
            tbl_Cashflow c = new tbl_Cashflow();
            
            c.UID1C = t.UID1C;

            //TMP
            c.MailSent = 1;

            c.Obj1cDocNumIn = t.НомерДокВходящий;
            c.ModifiedByID = Helper.GetSupervisorID();
            c.ModifiedOn = DateTime.Now;
            c.CreatedByID = Helper.GetSupervisorID();
            c.CreatedOn = DateTime.Now;

            string cID = Helper.getDs_CompanyID(t.Company);
            c.CompanyID = new Guid(cID);
            // 01 НОМЕР
            c.CFNumber = Helper.GetNextNumber(db);

            // 02 НАЗНАЧЕНИЕ
            c.Subject = t.НазначениеПлатежа;
            if(t.ВидДвижения != null)
            {
                if(t.ВидДвижения.Наименование.Length>0)
                c.Subject += " (" + t.ВидДвижения.Наименование + ")";
            }
            if(c.Subject.Length > 249)
            {
                c.Subject = c.Subject.Substring(0, 246) + "...";
            }

            // 03 ОТ            
            c.DocDate = DateTime.Parse(t.ДатаДок);

            // 04 ТИП
            CashflowType cashflowType;
            if (t.Приход > 0)
                cashflowType = CashflowType.Income;
            else
                cashflowType = CashflowType.Expense;
            c.TypeID = Helper.GetCashflowTypeID(cashflowType);

            // 05 СТАТЬЯ NULL
            c.ClauseID = DbHelper.GetCashflowClauseID(db, t.ВидДвижения, t.Company);

            // 06 КАТЕГОРИЯ NULL
            // 07 ОТВЕТСТВЕННЫЙ
            c.OwnerID = Helper.GetOwnerID();

            // 08 СОСТОЯНИЕ
            c.StatusID = new Guid(Constants.CashflowStateFinishedID);

            // 09 ИНЦИДЕНТ NULL
            // 10 ВОЗДЕЙСТВИЕ NULL
            // 11 PL - (UseAsPandL - P&L) NULL

            // 12 КАССА 
            c.CashAccountID = new Guid(Constants.CashflowKassaID);
            // 13 ПЛАНИРУЕМАЯ ДАТА
            c.EstimatedDate = DateTime.Parse(t.ДатаДок);

            // 14 ФАКТИЧЕСКАЯ ДАТА
            c.ActualDate = DateTime.Parse(t.ДатаДок);

            // 15 ТИП РАСХОДА-ДОХОДА NULL
            // 16 ПЕРИОД
            c.PeriodID = Helper.GetPeriodID(db, c.ActualDate.Value);

            // 00 Контрагент
            string comments = "";
            Guid? AccountID = DbHelper.GetAccountID(db, t);
            if (!AccountID.HasValue)
            {
                comments += "Контрагент не найден: " + Helper.GetAccountNameCode(t) + ".\r\n";
            }
            
            // 19 УЧИТЫВАТЬ ПРИ ВЗАИМОРАСЧЁТАХ NULL
            // 20 ДЕБИТОР-КРЕДИТОР NULL
            // 21 АВТОМАТИЧЕСКИ РАССЧИТЫВАТЬ СУММУ
            c.AutocalcAmount = 1;

            // 22 ВАЛЮТ            
            c.CurrencyID = DbHelper.ConvertToCurrencyID(t.Валюта);

            // 23 СУММА
            if (cashflowType == CashflowType.Income)
                c.Amount = (decimal)t.Приход;
            else
                c.Amount = -1 * (decimal)t.Расход;
            
            // 24 ВНУТРЕННИЙ КУРС
            c.CurrencyRate = (decimal)t.Курс;

            // 25 СУММА В БАЗОВОЙ ВАЛЮТЕ NULL
            //c.BasicAmount = (int)(c.Amount / c.CurrencyRate);
            // 26 КОНТАКТ NULL
            // 27 СЧЁТ NULL
            // 28 ДОГОВОР
            Guid? ContractID = DbHelper.GetContractID(db, t);
            if (ContractID.HasValue)
            {
                c.ContractID = ContractID;
            }
            else
            {
                string ContractName = DbHelper.GetContractName(t);
                if(!String.IsNullOrEmpty(ContractName))
                comments += "Договор не найден: " + ContractName  + ".";
            }            
            // 29 ПРОДАЖА - получаем из договора
            if (ContractID.HasValue)
            {
                c.OpportunityID = DbHelper.GetOpportunityIDFromContract(db, ContractID);
            }

            // 30 МЕНЕДЖЕР - получаем из договора
            if (ContractID.HasValue)
            {
                c.ManagerID = DbHelper.GetManagerIDFromContract(db, ContractID);
            }
            else
                if (AccountID.HasValue)
                {
                    c.ManagerID = DbHelper.GetManagerIDFromAccount(db, AccountID);
                }
                else
                {
                    c.ManagerID = DbHelper.GetDefaultManagerID();
                }

            // 31 если найден договор, но не найден контрагент
            if (ContractID.HasValue && !AccountID.HasValue)
            {
                AccountID = DbHelper.GetAccountIDFromContract(db, ContractID);
            }

            // 17 ПЛАТЕЛЬЩИК
            // 18 ПОЛУЧАТЕЛЬ
            if (cashflowType == CashflowType.Income)
            {
                c.PayerID = AccountID;
                c.RecipientID = DbHelper.GetCompanyID(t.Company);
            }
            else
            {
                c.PayerID = DbHelper.GetCompanyID(t.Company);
                c.RecipientID = AccountID;
            }

            c.DebtorCreditorID = c.PayerID;
            // если назначение содержит номер счёта
            string PayDetails = t.НазначениеПлатежа;
            string InvoiceString = "счет ";
            if (PayDetails.Contains(InvoiceString))
            {
                int NumStart = PayDetails.IndexOf(InvoiceString) + 5;
                string substr1 = PayDetails.Substring(NumStart);
                int NumEnd = substr1.IndexOf(' ');
                string InvoiceNumber = "";
                if (NumEnd >= 0)
                    InvoiceNumber = substr1.Substring(0, NumEnd);
                // найти счёт
                // фильтр по номеру счёта                
                List<tbl_Invoice> invoices = db.tbl_Invoice.Where(i => i.InvoiceNumber == InvoiceNumber).ToList();
                // фильтр по дате счёта (год)?
                invoices = invoices.Where(i => i.InvoiceDate.Year == DateTime.Now.Year).ToList();
                // фильтр по контрагенту
                if (AccountID.HasValue)
                {
                    invoices = invoices.Where(i => i.CustomerID == AccountID).ToList();
                }
                if (invoices.Count > 0)
                {
                    tbl_Invoice i = invoices.First();
                    c.InvoiceID = i.ID;
                }
            }
            if (comments.Length > 249)
            {
                comments = comments.Substring(0, 246) + "...";
            }
            c.Comments = comments;            

            //t.КоррСчёт - пока не использовать
            c.ID = Guid.NewGuid();

            return c;
        }
        List<BankStatement> ParseXmlFileBs(string filename)
        {
            List<BankStatement> statements = new List<BankStatement>();

            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.Load(filename);

            XmlNode bankNode = xmlDoc.SelectSingleNode("Bank");
            foreach (XmlNode statementNode in bankNode)
            {
                BankStatement bs = new BankStatement();
                bs.ДатаДок = statementNode.Attributes["ДатаДок"].Value;
                bs.НомерДок = statementNode.Attributes["НомерДок"].Value;
                bs.Валюта = statementNode.Attributes["Валюта"].Value;
                Console.WriteLine("{0} {1} {2}", bs.ДатаДок, bs.НомерДок, bs.Валюта);
                List<Transfer> transfers = new List<Transfer>();
                foreach (XmlNode transferNode in statementNode.ChildNodes)
                {
                    Transfer t = new Transfer();

                    t.UID1C = bs.НомерДок + "#" + transferNode.Attributes["Num"].Value;
                    t.ДатаДок = bs.ДатаДок;

                    //t.КоррСчёт = ;
                    t.НазначениеПлатежа = transferNode.Attributes["НазначениеПлатежа"].Value;
                    t.Субконто1 = new Subconto
                    {
                        Код = transferNode.Attributes["КонтрагентИНН"].Value,
                        Наименование = transferNode.Attributes["КонтрагентНаименование"].Value,
                        ТипСубконто = SubcontoType.Контрагент
                    };                    
                    t.Субконто2 = new Subconto
                    {
                        Код = transferNode.Attributes["ДоговорКод"].Value,
                        Наименование = transferNode.Attributes["ДоговорНаименование"].Value,
                        ТипСубконто = SubcontoType.Договор
                    };                    
                    t.Субконто3 = new Subconto
                    {
                        Код = "",
                        Наименование = "",
                        ТипСубконто = SubcontoType.Неопределено
                    };
                    t.Приход = Double.Parse(transferNode.Attributes["Приход"].Value.Replace(".", ","));
                    t.Расход = Double.Parse(transferNode.Attributes["Расход"].Value.Replace(".", ","));
                    t.Валюта = bs.Валюта;

                    t.ВидДвижения = new CashflowClause
                    {
                        Код = transferNode.Attributes["ВидДвиженияКод"].Value,
                        Наименование = transferNode.Attributes["ВидДвиженияНаименование"].Value,
                        РазрезДеятельности = "",
                        ВидДвижения = "",
                        RowNum = transferNode.Attributes["ВидДвиженияКод"].Value
                    };

                    t.Company = this.company;
                    t.НомерДокВходящий = transferNode.Attributes["НомерДокВходящий"].Value;

                    bool IsIncome = t.Приход > t.Расход;
                    //if (t.Валюта == "BYR")
                    //{
                    //    t.Курс = 1;
                    //}
                    //else
                    {
                        t.Курс = Double.Parse(transferNode.Attributes["КурсОплаты"].Value.Replace(".", ","));
                    }
                    bs.Transfers.Add(t);
                }
                statements.Add(bs);
            }
            return statements;
        }
 private Subconto GetSubconto(Transfer t, SubcontoType type)
 {
     if (t.Субконто1.ТипСубконто == type)
         return t.Субконто1;
     if (t.Субконто2.ТипСубконто == type)
         return t.Субконто2;
     if (t.Субконто3.ТипСубконто == type)
         return t.Субконто3;
     return null;
 }
 private void CommitTransferToLocalList(Entities db, Transfer t, BankStatement statement)
 {
     tbl_Cashflow c = CreateCashflow(db, t, statement.ДатаДок);
     statement.Cashflows.Add(c);
 }
        public void LoadFromDbf(string filename)
        {
            Helper.Log("Старт");
            OdbcConnection conn = new OdbcConnection();
            conn.ConnectionString = "Driver={Microsoft dBase Driver (*.dbf)};SourceType=DBF;SourceDB=" + filename + ";Exclusive=No; NULL=NO;DELETED=NO;BACKGROUNDFETCH=NO;";
            conn.Open();
            if (conn.State == System.Data.ConnectionState.Open)
            {
                OdbcCommand oCmd = conn.CreateCommand();
                oCmd.CommandText = "SELECT * FROM " + filename;
                DataTable ImportedTable = new DataTable();
                ImportedTable.Load(oCmd.ExecuteReader());
                ImportedRows.AddRange(ImportedTable.Select());

                DataRow[] statementRows = ImportedTable.Select("REKVTYPE = 'Документ.Выписка' AND REKVIZIT <> 'Субконто3'");

                for (int i = 0; i < statementRows.Length; i++)
                {
                    DataRow row = statementRows[i];

                    double StatementStartRowIndex = (double)row[0];
                    double StatementEndRowIndex = GetStatementEndIndex(StatementStartRowIndex);

                    BankStatement bs = new BankStatement();
                    bs.GUID = (double)row[0];
                    try
                    {
                        // ШАПКА
                        double BaseGUID = bs.GUID - 1;
                        bs.Наименование = row["REKVIZIT"].ToString();

                        Helper.Log(bs.Наименование);

                        DataRow rowID = ImportedRows[(int)(BaseGUID + 2)];
                        bs.НомерДок = rowID[5].ToString();
                        DataRow rowDate = ImportedRows[(int)(BaseGUID + 3)];
                        bs.ДатаДок = rowDate[5].ToString();
                        // ТАБЛИЧНАЯ ЧАСТЬ
                        List<Transfer> transfers = new List<Transfer>();
                        List<DataRow> TransferRows = new List<DataRow>();
                        string cond = "PARENTGUID = " + bs.GUID
                                        + " AND REKVIZIT = 'ВидДвижения'"
                                        + " AND REKVTYPE = 'Справочник.ДвиженияДенежныхСредств'";
                        TransferRows.AddRange(ImportedTable.Select(cond));
                        Console.WriteLine(bs.ДатаДок);

                        string Currency = GetStatementCurrency(StatementStartRowIndex, StatementEndRowIndex);

                        for (int j = 0; j < TransferRows.Count; j++)
                        {
                            DataRow transferBaseRow = TransferRows[j];

                            double TransferStartRowIndex = (double)transferBaseRow[0];
                            double TransferEndRowIndex = GetTransferEndIndex(TransferStartRowIndex);

                            int transferBaseGUID = (int)(double)transferBaseRow[0] - 1;
                            try
                            {
                                Transfer t = new Transfer();

                                t.КоррСчёт = ImportedRows[transferBaseGUID + 2][5].ToString();
                                t.НазначениеПлатежа = ImportedRows[transferBaseGUID + 1][5].ToString();
                                t.Субконто1 = GetSubconto(1, transferBaseGUID);
                                t.Субконто2 = GetSubconto(2, transferBaseGUID);
                                t.Субконто3 = GetSubconto(3, transferBaseGUID);
                                t.Приход = GetTransferAttributeDouble("Приход", transferBaseGUID);
                                t.Расход = GetTransferAttributeDouble("Расход", transferBaseGUID);
                                t.Валюта = Currency;

                                t.ВидДвижения = GetTransferCashflowAccount(transferBaseGUID);

                                t.Company = this.company;
                                t.НомерДокВходящий = GetTransferAttribute("НомерДокВходящий", transferBaseGUID);
                                if (bs.Наименование.Contains('т') && bs.Наименование.Contains('д'))
                                {
                                }
                                bool IsIncome = t.Приход > t.Расход;
                                if (t.Валюта == "BYR")
                                {
                                    t.Курс = 1;
                                }
                                else
                                {
                                    t.Курс = GetTransferRate(IsIncome, StatementStartRowIndex, StatementEndRowIndex, TransferStartRowIndex, TransferEndRowIndex);
                                }                               
                                bs.Transfers.Add(t);
                            }
                            catch (Exception e)
                            {
                                Helper.Log("ID=" + transferBaseGUID.ToString() + ": " + e.Message);
                            }
                        }
                        statements.Add(bs);
                        Helper.Log("Платежей в выписке: " + bs.Transfers.Count);
                    }
                    catch (Exception e)
                    {
                        Helper.Log(e.Message);
                    }
                }
                conn.Close();
                Helper.Log("Импорт из DBF завершен.");
                if (this.DEBUG)
                {
                    Console.WriteLine("Found statements: {0}\n", this.statements.Count);
                }
            }
        }
 private void CommitTransferToDatabase(Entities db, Transfer t, string docDate)
 {
     tbl_Cashflow c = CreateCashflow(db, t, docDate);
     db.tbl_Cashflow.Add(c);
     db.SaveChanges();
 }
 public static Guid? GetAccountID(Entities db, Transfer t)
 {
     Guid? AccountID = null;
     Subconto Account = t.Субконто1;
     if (Account != null)
     {
         string AccountUNN = Account.Код;
         AccountUNN = AccountUNN.ToLower().Replace('o', '0').Replace('о', '0'); // заменяем русскую и латинскую букву О на НОЛЬ
         AccountID = DbHelper.GetAccountID(db, AccountUNN);
     }
     return AccountID;
 }
 public static Guid? GetContractID(Entities db, Transfer t)
 {
     Guid? ContractID = null;
     Subconto Contract = t.Субконто2;
     if (Contract != null)
     {
         string ContractNumber = Helper.ParseContractCode(Contract.Код);
         ContractID = GetContractID(db, ContractNumber);
         if (ContractID == null)
         {
             ContractNumber = Helper.ParseContractNumber(Contract.Наименование);
             ContractID = GetContractID(db, ContractNumber);
         }
     }            
     return ContractID;
 }
 public static string GetContractName(Transfer t)
 {
     string name = "";
     Subconto Contract = t.Субконто2;
     if (Contract != null)
         name = Contract.Наименование;
     return name;
 }