Пример #1
0
		///<summary></summary>
		public static void Update(Transaction trans) {
			if(RemotingClient.RemotingRole==RemotingRole.ClientWeb) {
				Meth.GetVoid(MethodBase.GetCurrentMethod(),trans);
				return;
			}
			Crud.TransactionCrud.Update(trans);
		}
Пример #2
0
		///<summary></summary>
		public static long Insert(Transaction trans) {
			if(RemotingClient.RemotingRole==RemotingRole.ClientWeb) {
				trans.TransactionNum=Meth.GetLong(MethodBase.GetCurrentMethod(),trans);
				return trans.TransactionNum;
			}
			return Crud.TransactionCrud.Insert(trans);
		}
Пример #3
0
		///<summary></summary>
		public Transaction Copy() {
			Transaction t=new Transaction();
			t.TransactionNum=TransactionNum;
			t.DateTimeEntry=DateTimeEntry;
			t.UserNum=UserNum;
			t.DepositNum=DepositNum;
			t.PayNum=PayNum;
			return t;
		}
		///<summary></summary>
		public FormTransactionEdit(long transNum,long accountNum)
		{
			//
			// Required for Windows Form Designer support
			//
			InitializeComponent();
			Lan.F(this);
			TransCur=Transactions.GetTrans(transNum);
			AccountOfOrigin=Accounts.GetAccount(accountNum);
			//AccountNumOrigin=accountNumOrigin;
		}
Пример #5
0
		///<summary></summary>
		public static bool IsReconciled(Transaction trans){
			if(RemotingClient.RemotingRole==RemotingRole.ClientWeb) {
				return Meth.GetBool(MethodBase.GetCurrentMethod(),trans);
			}
			string command="SELECT COUNT(*) FROM journalentry WHERE ReconcileNum !=0"
				+" AND TransactionNum="+POut.Long(trans.TransactionNum);
			if(Db.GetCount(command)=="0") {
				return false;
			}
			return true;
		}
Пример #6
0
 ///<summary>Also deletes all journal entries for the transaction.  Will later throw an error if journal entries attached to any reconciles.  Be sure to surround with try-catch.</summary>
 public static void Delete(Transaction trans)
 {
     if(RemotingClient.RemotingRole==RemotingRole.ClientWeb) {
         Meth.GetVoid(MethodBase.GetCurrentMethod(),trans);
         return;
     }
     string command="DELETE FROM journalentry WHERE TransactionNum="+POut.Long(trans.TransactionNum);
     Db.NonQ(command);
     command= "DELETE FROM transaction WHERE TransactionNum = "+POut.Long(trans.TransactionNum);
     Db.NonQ(command);
 }
Пример #7
0
		///<summary>Also deletes all journal entries for the transaction.  Will later throw an error if journal entries attached to any reconciles.  Be sure to surround with try-catch.</summary>
		public static void Delete(Transaction trans) {
			if(RemotingClient.RemotingRole==RemotingRole.ClientWeb) {
				Meth.GetVoid(MethodBase.GetCurrentMethod(),trans);
				return;
			}
			string command="SELECT IsLocked FROM journalentry j, reconcile r WHERE j.TransactionNum="+POut.Long(trans.TransactionNum)
				+" AND j.ReconcileNum = r.ReconcileNum";
			DataTable table=Db.GetTable(command);
			if(table.Rows.Count>0) {
				if(PIn.Int(table.Rows[0][0].ToString())==1) {
					throw new ApplicationException(Lans.g("Transactions","Not allowed to delete transactions because it is attached to a reconcile that is locked."));
				}
			}
			command="DELETE FROM journalentry WHERE TransactionNum="+POut.Long(trans.TransactionNum);
			Db.NonQ(command);
			command= "DELETE FROM transaction WHERE TransactionNum="+POut.Long(trans.TransactionNum);
			Db.NonQ(command);
		}
Пример #8
0
		private void Add_Click(){
			Transaction trans=new Transaction();
			trans.UserNum=Security.CurUser.UserNum;
			Transactions.Insert(trans);//we now have a TransactionNum, and datetimeEntry has been set
			FormTransactionEdit FormT=new FormTransactionEdit(trans.TransactionNum,AccountCur.AccountNum);
			FormT.IsNew=true;
			FormT.ShowDialog();
			if(FormT.DialogResult==DialogResult.Cancel){
				//no need to try-catch, since no journal entries were saved.
				Transactions.Delete(trans);
			}
			FillGrid();
		}
Пример #9
0
		///<summary>Only called once from FormPayment when trying to change an amount or an account on a payment that's already linked to the Accounting section or when trying to create a new link.  This automates updating the Accounting section.  Do not surround with try-catch, because it was already validated in ValidateLinkedEntries above.  Use -1 for newAcct to indicate no changed. The name is required to give descriptions to new entries.</summary>
		public static void AlterLinkedEntries(double oldAmt, double newAmt, bool isNew, long payNum, long newAcct,DateTime payDate,
			string patName)
		{
			//No need to check RemotingRole; no call to db.
			if(!Accounts.PaymentsLinked()) {
				return;//user has not even set up accounting links.
			}
			bool amtChanged=false;
			if(oldAmt!=newAmt) {
				amtChanged=true;
			}
			Transaction trans=Transactions.GetAttachedToPayment(payNum);//this gives us the oldAcctNum
			double absNew=newAmt;//absolute value of the new amount
			if(newAmt<0) {
				absNew=-newAmt;
			}
			//if(trans==null && (newAcct==0 || newAcct==-1)) {//then this method will not even be called
			if(trans==null) {//no previous link, but user is trying to create one.
				//this is the only case where a new trans is required.
				trans=new Transaction();
				trans.PayNum=payNum;
				trans.UserNum=Security.CurUser.UserNum;
				Transactions.Insert(trans);//sets entry date
				//first the deposit entry
				JournalEntry je=new JournalEntry();
				je.AccountNum=newAcct;//DepositAccounts[comboDepositAccount.SelectedIndex];
				je.CheckNumber=Lans.g("Payments","DEP");
				je.DateDisplayed=payDate;//it would be nice to add security here.
				if(absNew==newAmt){//amount is positive
					je.DebitAmt=newAmt;
				}
				else{
					je.CreditAmt=absNew;
				}
				je.Memo=Lans.g("Payments","Payment -")+" "+patName;
				je.Splits=Accounts.GetDescript(PrefC.GetLong(PrefName.AccountingCashIncomeAccount));
				je.TransactionNum=trans.TransactionNum;
				JournalEntries.Insert(je);
				//then, the income entry
				je=new JournalEntry();
				je.AccountNum=PrefC.GetLong(PrefName.AccountingCashIncomeAccount);
				//je.CheckNumber=;
				je.DateDisplayed=payDate;//it would be nice to add security here.
				if(absNew==newAmt) {//amount is positive
					je.CreditAmt=newAmt;
				}
				else {
					je.DebitAmt=absNew;
				}
				je.Memo=Lans.g("Payments","Payment -")+" "+patName;
				je.Splits=Accounts.GetDescript(newAcct);
				je.TransactionNum=trans.TransactionNum;
				JournalEntries.Insert(je);
				return;
			}
			//at this point, we have established that there is a previous transaction.
			List<JournalEntry> jeL=JournalEntries.GetForTrans(trans.TransactionNum);
			long oldAcct=0;
			JournalEntry jeDebit=null;
			JournalEntry jeCredit=null;
			bool signChanged=false;
			double absOld=oldAmt;//the absolute value of the old amount
			if(oldAmt<0){
				absOld=-oldAmt;
			}
			if(oldAmt<0 && newAmt>0){
				signChanged=true;
			}
			if(oldAmt>0 && newAmt<0){
				signChanged=true;
			}
			for(int i=0;i<2;i++){
				if(Accounts.GetAccount(jeL[i].AccountNum).AcctType==AccountType.Asset) {
					oldAcct=jeL[i].AccountNum;
				}
				if(jeL[i].DebitAmt==absOld) {
					jeDebit=jeL[i];
				}
				//old credit entry
				if(jeL[i].CreditAmt==absOld) {
					jeCredit=jeL[i];
				}
			}
			//Already validated that both je's are not null, and that oldAcct is not 0.
			if(newAcct==0){//detaching it from a linked transaction. We will delete the transaction
				//we don't care about the amount
				Transactions.Delete(trans);//we need to make sure this doesn't throw any exceptions by carefully checking all
					//possibilities in the validation routine above.
				return;
			}
			//Either the amount or the account changed on an existing linked transaction.
			bool acctChanged=false;
			if(newAcct!=-1 && oldAcct!=newAcct) {
				acctChanged=true;//changing linked acctNum
			}
			if(amtChanged){
				if(signChanged) {
					jeDebit.DebitAmt=0;
					jeDebit.CreditAmt=absNew;
					jeCredit.DebitAmt=absNew;
					jeCredit.CreditAmt=0;
				}
				else {
					jeDebit.DebitAmt=absNew;
					jeCredit.CreditAmt=absNew;
				}
			}
			if(acctChanged){
				if(jeDebit.AccountNum==oldAcct){
					jeDebit.AccountNum=newAcct;
				}
				if(jeCredit.AccountNum==oldAcct) {
					jeCredit.AccountNum=newAcct;
				}
			}
			JournalEntries.Update(jeDebit);
			JournalEntries.Update(jeCredit);
		}		
Пример #10
0
		///<summary>Saves the selected rows to database.  MUST close window after this.</summary>
		private bool SaveToDB(){
			if(textDate.errorProvider1.GetError(textDate)!=""){
				MsgBox.Show(this,"Please fix data entry errors first.");
				return false;
			}
			//Prevent backdating----------------------------------------------------------------------------------------
			DateTime date=PIn.Date(textDate.Text);
			//We enforce security here based on date displayed, not date entered
			if(!Security.IsAuthorized(Permissions.DepositSlips,date)) {
				return false;
			}
			DepositCur.DateDeposit=PIn.Date(textDate.Text);
			//amount already handled.
			DepositCur.BankAccountInfo=PIn.String(textBankAccountInfo.Text);
			DepositCur.Memo=PIn.String(textMemo.Text);
			if(IsNew){
				if(gridPat.SelectedIndices.Length+gridIns.SelectedIndices.Length>18 && IsQuickBooks) {
					if(!MsgBox.Show(this,MsgBoxButtons.YesNo,"No more than 18 items will fit on a QuickBooks deposit slip. Continue anyway?")) {
						return false;
					}
				}
				else if(gridPat.SelectedIndices.Length+gridIns.SelectedIndices.Length>32) {
					if(!MsgBox.Show(this,MsgBoxButtons.YesNo,"No more than 32 items will fit on a deposit slip. Continue anyway?")) {
						return false;
					}
				}
				//Deposits.Insert(DepositCur);
				if(Accounts.DepositsLinked() && DepositCur.Amount>0) {
					if(IsQuickBooks) {//Create a deposit in QuickBooks.						
						if(!CreateDepositQB(true)) {
							return false;
						}
						Deposits.Insert(DepositCur);
					}
					else {
						Deposits.Insert(DepositCur);
						//create a transaction here
						Transaction trans=new Transaction();
						trans.DepositNum=DepositCur.DepositNum;
						trans.UserNum=Security.CurUser.UserNum;
						Transactions.Insert(trans);
						//first the deposit entry
						JournalEntry je=new JournalEntry();
						je.AccountNum=DepositAccounts[comboDepositAccount.SelectedIndex];
						je.CheckNumber=Lan.g(this,"DEP");
						je.DateDisplayed=DepositCur.DateDeposit;//it would be nice to add security here.
						je.DebitAmt=DepositCur.Amount;
						je.Memo=Lan.g(this,"Deposit");
						je.Splits=Accounts.GetDescript(PrefC.GetLong(PrefName.AccountingIncomeAccount));
						je.TransactionNum=trans.TransactionNum;
						JournalEntries.Insert(je);
						//then, the income entry
						je=new JournalEntry();
						je.AccountNum=PrefC.GetLong(PrefName.AccountingIncomeAccount);
						//je.CheckNumber=;
						je.DateDisplayed=DepositCur.DateDeposit;//it would be nice to add security here.
						je.CreditAmt=DepositCur.Amount;
						je.Memo=Lan.g(this,"Deposit");
						je.Splits=Accounts.GetDescript(DepositAccounts[comboDepositAccount.SelectedIndex]);
						je.TransactionNum=trans.TransactionNum;
						JournalEntries.Insert(je);
					}
				}
				else {//Deposits are not linked or deposit amount is not greater than 0.
					Deposits.Insert(DepositCur);
				}
			}
			else{
				Deposits.Update(DepositCur);
			}
			if(IsNew){//never allowed to change or attach more checks after initial creation of deposit slip
				for(int i=0;i<gridPat.SelectedIndices.Length;i++){
					PatPayList[gridPat.SelectedIndices[i]].DepositNum=DepositCur.DepositNum;
					Payments.Update(PatPayList[gridPat.SelectedIndices[i]],false);
				}
				for(int i=0;i<gridIns.SelectedIndices.Length;i++){
					ClaimPayList[gridIns.SelectedIndices[i]].DepositNum=DepositCur.DepositNum;
					ClaimPayments.Update(ClaimPayList[gridIns.SelectedIndices[i]]);
				}
			}
			if(IsNew) {
				SecurityLogs.MakeLogEntry(Permissions.DepositSlips,0,
					DepositCur.DateDeposit.ToShortDateString()+" New "+DepositCur.Amount.ToString("c"));
			}
			else {
				SecurityLogs.MakeLogEntry(Permissions.AdjustmentEdit,0,
					DepositCur.DateDeposit.ToShortDateString()+" "+DepositCur.Amount.ToString("c"));
			}
			return true;
		}