public Returner AddFT(FinancialTransaction Ft)
 {
     Ft.Confirmed = false;
     db.FinancialTransactions.Add(Ft);
     db.SaveChanges();
     return(new Returner
     {
         Data = Ft.Id,
         Message = Message.Financial_Transaction_Saved_Successfully
     });
 }
        public Returner AddImprest(FinancialTransaction FT)
        {
            var Employee = db.Employees.Single(p => p.Id == this.Id);

            FT.Statement       = "اضافة عهدة لعميل";
            FT.FromAccount     = Employee.ImprestAccID;
            FT.Confirmed       = false;
            FT.TransactionDate = DateTime.UtcNow.AddHours(3);
            db.FinancialTransactions.Add(FT);
            db.SaveChanges();
            return(new Returner
            {
                Message = Message.Imprest_Added_Successfully
            });
        }
        public Returner SaveWorkOrder(List <CustomerInvoiceLine> CIL, DateTime Date, int ProjID, int Acc, string Notes, double Total, int EditBy)
        {
            var CurrentProject = db.Projects.Where(p => p.Id == ProjID).SingleOrDefault();

            foreach (CustomerInvoiceLine item in CIL)
            {
                var CurrentStock = db.Stocks.Single(p => p.ProjectID == ProjID && p.ProductID == item.ProductId);
                CurrentStock.Quantity -= item.Qty;
                db.SaveChanges();
                StockTransaction ST = new StockTransaction();
                ST.Date      = Date;
                ST.StockID   = CurrentStock.Id;
                ST.ProductID = item.ProductId;
                ST.Quantity  = -item.Qty;
                ST.Type      = (int)StockTransactionsTypes.امر_عمل;
                db.StockTransactions.Add(ST);
                db.SaveChanges();
                var CurrentProduct      = db.Products.Single(p => p.Id == item.ProductId);
                FinancialTransaction Ft = new FinancialTransaction();
                Ft.Debit                   = item.Total;
                Ft.Credit                  = 0;
                Ft.LastEditBy              = EditBy;
                Ft.Confirmed               = false;
                Ft.Notes                   = Notes;
                Ft.Statement               = "امر شغل " + " بتاريخ " + Date.ToString("MM/dd/yyyy");
                Ft.TransactionDate         = Date;
                Ft.FromAccount             = CurrentProject.AccountID;
                Ft.ReferanceDocumentNumber = ST.Id;
                db.FinancialTransactions.Add(Ft);
                FinancialTransaction Ft1 = new FinancialTransaction();
                Ft1.Credit          = item.Total;
                Ft1.LastEditBy      = EditBy;
                Ft1.Confirmed       = false;
                Ft1.Notes           = Notes;
                Ft1.Statement       = "امر شغل " + " بتاريخ " + Date.ToString("MM/dd/yyyy");
                Ft1.TransactionDate = Date;
                Ft1.FromAccount     = CurrentProduct.AccountID;
                db.FinancialTransactions.Add(Ft1);
            }
            db.SaveChanges();
            return(new Returner
            {
                Message = Message.Work_Order_Saved_Successfully
            });
        }
        public Returner Add(List <CustomerInvoiceLine> LOSIL)
        {
            db.CustomerInvoices.Add(this);
            db.SaveChanges();
            foreach (CustomerInvoiceLine item in LOSIL)
            {
                item.InvoiceId = this.Id;
                db.CustomerInvoiceLines.Add(item);
                db.SaveChanges();
            }
            new Stock().Sells(this.Id);
            var Cussss = db.Customers.Single(p => p.ID == this.CustomerID);
            FinancialTransaction Ft = new FinancialTransaction();

            Ft.Confirmed               = false;
            Ft.Debit                   = 0;
            Ft.Credit                  = this.InvoiceNet;
            Ft.FromAccount             = 42;//sales account
            Ft.Notes                   = "";
            Ft.ReferanceDocumentNumber = this.Id;
            Ft.Statement               = "تسجيل فاتورة بيع للعميل " + Cussss.Name;
            Ft.TransactionDate         = DateTime.Now;
            db.FinancialTransactions.Add(Ft);
            db.SaveChanges();
            FinancialTransaction Ft1 = new FinancialTransaction();

            Ft1.Confirmed               = false;
            Ft1.Debit                   = this.InvoiceNet;
            Ft1.Credit                  = 0;
            Ft1.FromAccount             = Cussss.AccountID;//Customer account
            Ft1.Notes                   = "";
            Ft1.ReferanceDocumentNumber = this.Id;
            Ft1.Statement               = "تسجيل فاتورة بيع للعميل " + Cussss.Name;
            Ft1.TransactionDate         = DateTime.Now;
            db.FinancialTransactions.Add(Ft1);
            db.SaveChanges();
            return(new Returner
            {
                Message = Message.Invoice_Added_Successfully
            });
        }
        public Returner Add(List <SupplierInvoiceLine> LOSIL)
        {
            db.SupplierInvoices.Add(this);
            db.SaveChanges();
            foreach (SupplierInvoiceLine item in LOSIL)
            {
                item.InvoiceId = this.Id;
                db.SupplierInvoiceLines.Add(item);
                db.SaveChanges();
            }
            new Stock().Purchases(this.Id);
            FinancialTransaction Ft = new FinancialTransaction();

            Ft.Confirmed               = false;
            Ft.Debit                   = this.InvoiceNet;
            Ft.Credit                  = 0;
            Ft.FromAccount             = 52;//purchases account
            Ft.Notes                   = "";
            Ft.ReferanceDocumentNumber = this.Id;
            Ft.Statement               = "تسجيل فاتورة شراء للعميل " + this.Supplier.Name;
            Ft.TransactionDate         = DateTime.Now;
            db.FinancialTransactions.Add(Ft);
            db.SaveChanges();
            FinancialTransaction Ft1 = new FinancialTransaction();

            Ft1.Confirmed               = false;
            Ft1.Debit                   = this.InvoiceNet;
            Ft1.Credit                  = 0;
            Ft1.FromAccount             = this.Supplier.AccountingID;//sales account
            Ft1.Notes                   = "";
            Ft1.ReferanceDocumentNumber = this.Id;
            Ft1.Statement               = "تسجيل فاتورة شراء للعميل " + this.Supplier.Name;
            Ft1.TransactionDate         = DateTime.Now;
            db.FinancialTransactions.Add(Ft1);
            db.SaveChanges();
            return(new Returner
            {
                Message = Message.Invoice_Added_Successfully
            });
        }
        public Returner Depart(int EditBy)
        {
            var ITD = db.CustomerInvoices.Where(p => p.Id == this.Id).SingleOrDefault();

            ITD.Departed = true;
            db.SaveChanges();
            FinancialTransaction Ft = new FinancialTransaction();

            Ft.Credit          = ITD.InvoiceNet;
            Ft.Debit           = 0;
            Ft.LastEditBy      = EditBy;
            Ft.Notes           = "";
            Ft.Confirmed       = false;
            Ft.Statement       = "ترحيل فاتورة بيع";
            Ft.FromAccount     = ITD.Customer.AccountID;
            Ft.TransactionDate = DateTime.UtcNow.AddHours(3);
            db.FinancialTransactions.Add(Ft);
            db.SaveChanges();
            return(new Returner
            {
                Message = Message.Invoice_Departed_Successfully
            });
        }
        public Returner AddPenalty(FinancialTransaction FT)
        {
            var Employee = db.Employees.Single(p => p.Id == this.Id);

            FT.Statement       = "اضافة جزاء لعميل";
            FT.FromAccount     = Employee.PenaltyAccID;
            FT.Confirmed       = false;
            FT.TransactionDate = DateTime.UtcNow.AddHours(3);
            db.FinancialTransactions.Add(FT);
            db.SaveChanges();
            Payroll PR = new Payroll();

            PR.Amount = FT.Credit;
            PR.Date   = DateTime.Now;
            PR.EmpID  = Employee.Id;
            PR.Type   = (int)PayrollTypes.Penality;
            db.Payrolls.Add(PR);
            db.SaveChanges();
            return(new Returner
            {
                Message = Message.Penalty_Added_Successfully
            });
        }
        public Returner PayInstallment(int ID, int EditBy, DateTime PaymentDate, int RecievableAcc)
        {
            var Installment = db.Installments.Where(p => p.Id == ID).SingleOrDefault();

            Installment.PaymentDate = PaymentDate;
            db.SaveChanges();
            FinancialTransaction Ft = new FinancialTransaction();

            Ft.Credit                  = 0;
            Ft.Debit                   = Installment.Amount;
            Ft.FromAccount             = Installment.Customer.AccountID;
            Ft.LastEditBy              = EditBy;
            Ft.Notes                   = "";
            Ft.ReferanceDocumentNumber = Installment.Id;
            Ft.Confirmed               = false;
            Ft.Statement               = "دفع قسط " + Enum.GetName(typeof(UnitTypes), Installment.Contract.ProjectUnit.UnitType) + " من العميل " + Installment.Customer.Name;
            Ft.TransactionDate         = PaymentDate;
            db.FinancialTransactions.Add(Ft);
            FinancialTransaction Ft1 = new FinancialTransaction();

            Ft1.Debit                   = 0;
            Ft1.Credit                  = Installment.Amount;
            Ft1.FromAccount             = RecievableAcc;//Installment.Contract.ProjectUnit.AccountingID;
            Ft1.ReferanceDocumentNumber = Installment.Id;
            Ft1.LastEditBy              = EditBy;
            Ft1.Notes                   = "";
            Ft1.Confirmed               = false;
            Ft1.Statement               = "دفع قسط " + Enum.GetName(typeof(UnitTypes), Installment.Contract.ProjectUnit.UnitType) + " من العميل " + Installment.Customer.Name;
            Ft1.TransactionDate         = PaymentDate;
            db.FinancialTransactions.Add(Ft);
            db.SaveChanges();
            return(new Returner
            {
                Message = Message.Installment_Paid_Successfully
            });
        }
        public Returner Pay(double Total, int EditBy, DateTime PaymentDate, int ToAcc)
        {
            var E = db.Employees.Single(p => p.Id == this.Id);
            var lastTransaction = db.Payrolls.Where(p => p.EmpID == E.Id && p.Type == (int)PayrollTypes.Salary).OrderByDescending(p => p.Date).FirstOrDefault();

            if (lastTransaction != null)
            {
                switch (E.SalaryType)
                {
                case 1:
                    if (PaymentDate < ((DateTime)lastTransaction.Date).AddHours(24))
                    {
                        return(new Returner
                        {
                            Message = Message.Cannot_pay_salary_at_Wrong_time
                        });
                    }
                    break;

                case 2:
                    if (PaymentDate < ((DateTime)lastTransaction.Date).AddDays(15))
                    {
                        return(new Returner
                        {
                            Message = Message.Cannot_pay_salary_at_Wrong_time
                        });
                    }
                    break;

                case 3:
                    if (PaymentDate < ((DateTime)lastTransaction.Date).AddDays(30))
                    {
                        return(new Returner
                        {
                            Message = Message.Cannot_pay_salary_at_Wrong_time
                        });
                    }
                    break;

                case 4:
                    if (PaymentDate < ((DateTime)lastTransaction.Date).AddDays(7))
                    {
                        return(new Returner
                        {
                            Message = Message.Cannot_pay_salary_at_Wrong_time
                        });
                    }
                    break;
                }
            }
            Payroll PR = new Payroll();

            PR.Amount = Total;
            PR.Date   = PaymentDate;
            PR.EmpID  = E.Id;
            PR.Type   = (int)PayrollTypes.Salary;
            db.Payrolls.Add(PR);
            db.SaveChanges();
            FinancialTransaction Ft = new FinancialTransaction();

            Ft.Debit           = Total;
            Ft.Credit          = 0;
            Ft.FromAccount     = E.EmpAccID;
            Ft.LastEditBy      = EditBy;
            Ft.Notes           = "";
            Ft.Statement       = "دفع راتب للموظف " + E.Name;
            Ft.Confirmed       = false;
            Ft.TransactionDate = PaymentDate;
            db.FinancialTransactions.Add(Ft);
            FinancialTransaction Ft1 = new FinancialTransaction();

            Ft1.Credit          = Total;
            Ft1.Debit           = 0;
            Ft1.FromAccount     = ToAcc;
            Ft1.LastEditBy      = EditBy;
            Ft1.Notes           = "";
            Ft1.Statement       = "دفع راتب للموظف " + E.Name;
            Ft1.Confirmed       = false;
            Ft1.TransactionDate = PaymentDate;
            db.FinancialTransactions.Add(Ft);
            db.SaveChanges();
            return(new Returner
            {
                Message = Message.Salary_Paid_Successfully
            });
        }
        public Returner CreateContract(List <ContractOwner> LOCO, List <Installment> I, ProjectUnit PU, int OwnerID, int EditBy, int RecievableAcc)
        {
            db.Contracts.Add(this);
            db.SaveChanges();
            var CurrentContract = db.Contracts.Where(p => p.Id == this.Id).SingleOrDefault();

            foreach (ContractOwner CO in LOCO)
            {
                CurrentContract.ContractOwners.Add(CO);
            }
            db.SaveChanges();
            CurrentContract = db.Contracts.Where(p => p.Id == this.Id).SingleOrDefault();
            foreach (Installment III in I)
            {
                CurrentContract.Installments.Add(III);
            }
            db.SaveChanges();
            CurrentContract = db.Contracts.Where(p => p.Id == this.Id).SingleOrDefault();
            var CustomerIIDD        = CurrentContract.Installments.FirstOrDefault().ResponsibleID;
            var CurrentCustomer     = db.Customers.Single(p => p.ID == CustomerIIDD);
            var CurrentProjectUnit  = db.ProjectUnits.Single(p => p.Id == CurrentContract.UnitID);
            FinancialTransaction Ft = new FinancialTransaction();

            Ft.Credit                  = CurrentContract.Price;
            Ft.Debit                   = 0;
            Ft.FromAccount             = CurrentCustomer.AccountID;
            Ft.ReferanceDocumentNumber = CurrentContract.Id;
            Ft.LastEditBy              = EditBy;
            Ft.Notes                   = "";
            Ft.Statement               = "عقد بيع " + Enum.GetName(typeof(UnitTypes), CurrentProjectUnit.UnitType) + " للعميل " + CurrentCustomer.Name;
            Ft.Confirmed               = false;
            Ft.TransactionDate         = CurrentContract.Date;
            db.FinancialTransactions.Add(Ft);
            FinancialTransaction Ft6 = new FinancialTransaction();

            Ft6.Credit                  = 0;
            Ft6.Debit                   = CurrentContract.Price;
            Ft6.FromAccount             = 42;//حساب المبيعات
            Ft6.ReferanceDocumentNumber = CurrentContract.Id;
            Ft6.LastEditBy              = EditBy;
            Ft6.Notes                   = "";
            Ft6.Statement               = "عقد بيع " + Enum.GetName(typeof(UnitTypes), CurrentProjectUnit.UnitType) + " للعميل " + CurrentCustomer.Name;
            Ft6.Confirmed               = false;
            Ft6.TransactionDate         = CurrentContract.Date;
            db.FinancialTransactions.Add(Ft6);
            FinancialTransaction Ft1 = new FinancialTransaction();

            Ft1.Debit      = CurrentContract.Paid;
            Ft1.Credit     = 0;
            Ft1.LastEditBy = EditBy;
            Ft1.Confirmed  = false;
            Ft1.ReferanceDocumentNumber = CurrentContract.Id;
            Ft1.Notes           = "";
            Ft1.Statement       = "دفع مقدم بيع " + Enum.GetName(typeof(UnitTypes), CurrentProjectUnit.UnitType) + " للعميل " + CurrentCustomer.Name;
            Ft1.FromAccount     = CurrentCustomer.AccountID;
            Ft1.TransactionDate = CurrentContract.Date;
            db.FinancialTransactions.Add(Ft1);
            FinancialTransaction Ft10 = new FinancialTransaction();

            Ft10.Debit      = 0;
            Ft10.Credit     = CurrentContract.Paid;
            Ft10.LastEditBy = EditBy;
            Ft10.Confirmed  = false;
            Ft10.ReferanceDocumentNumber = CurrentContract.Id;
            Ft10.Notes           = "";
            Ft10.Statement       = "دفع مقدم بيع " + Enum.GetName(typeof(UnitTypes), CurrentProjectUnit.UnitType) + " للعميل " + CurrentCustomer.Name;
            Ft10.FromAccount     = RecievableAcc;
            Ft10.TransactionDate = CurrentContract.Date;
            db.FinancialTransactions.Add(Ft10);
            //foreach (Installment ite in CurrentContract.Installments)
            //{
            //    FinancialTransaction Ft2 = new FinancialTransaction();
            //    Ft2.Amount = ite.Amount;
            //    Ft2.FromAccount = CurrentCustomer.AccountID;
            //    Ft2.LastEditBy = EditBy;
            //    Ft2.Notes = "";
            //    Ft2.Statement = "قسط بيع " + Enum.GetName(typeof(UnitTypes), CurrentProjectUnit.UnitType) + " للعميل " + CurrentCustomer.Name;
            //    Ft2.ToAccount = 42;
            //    Ft2.Confirmed = false;
            //    Ft2.TransactionDate = ite.DueDate;
            //    Ft2.ReferanceDocumentNumber = ite.Id;
            //    db.FinancialTransactions.Add(Ft2);
            //}
            db.SaveChanges();
            var ProjU = db.ProjectUnits.Where(p => p.Id == PU.Id).SingleOrDefault();

            ProjU.Owner = OwnerID;
            db.SaveChanges();
            return(new Returner
            {
                Data = CurrentContract,
                Message = Message.Contract_Created_Successfully
            });
        }