///<summary></summary> public static void Update(Transaction trans) { if(RemotingClient.RemotingRole==RemotingRole.ClientWeb) { Meth.GetVoid(MethodBase.GetCurrentMethod(),trans); return; } Crud.TransactionCrud.Update(trans); }
///<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); }
///<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; }
///<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; }
///<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); }
///<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); }
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(); }
///<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); }
///<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; }