Add Due-dates to Transactions and the SplitLedger for A/R, A/P

git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@6077 57a11ea4-9604-0410-9ed3-97b8803252fd
This commit is contained in:
Derek Atkins
2001-11-27 04:47:19 +00:00
parent 99421d8fa0
commit df4d874689
6 changed files with 186 additions and 4 deletions

View File

@@ -68,6 +68,9 @@ const char *void_time_str = "void-time";
const char *void_former_amt_str = "void-former-amount";
const char *void_former_val_str = "void-former-value";
/* KVP entry for date-due value */
#define TRANS_DATE_DUE_KVP "trans-date-due"
#define PRICE_SIGFIGS 6
#define ISO_DATELENGTH 30 /* length of an iso 8601 date string.
@@ -2412,6 +2415,18 @@ xaccTransSetDate (Transaction *trans, int day, int mon, int year)
xaccTransSetDateInternal(trans, TDATE_POSTED, ts.tv_sec, ts.tv_nsec);
}
void
xaccTransSetDateDueTS (Transaction *trans, const Timespec *ts)
{
kvp_value *value;
if (!trans || !ts) return;
value = kvp_value_new_timespec (*ts);
kvp_frame_set_slot_path (trans->kvp_data, value, TRANS_DATE_DUE_KVP, NULL);
kvp_value_delete (value);
}
/********************************************************************\
\********************************************************************/
@@ -2539,6 +2554,20 @@ xaccTransRetDateEnteredTS (Transaction *trans)
return (trans->date_entered);
}
void
xaccTransGetDateDueTS (Transaction *trans, Timespec *ts)
{
kvp_value *value;
if (!trans || !ts) return;
value = kvp_frame_get_slot_path (trans->kvp_data, TRANS_DATE_DUE_KVP, NULL);
if (value)
*ts = kvp_value_get_timespec (value);
else
xaccTransGetDatePostedTS (trans, ts);
}
int
xaccTransCountSplits (Transaction *trans)
{

View File

@@ -156,6 +156,9 @@ void xaccTransSetDateEnteredSecs (Transaction *trans, time_t time);
void xaccTransSetDateEnteredTS (Transaction *trans,
const Timespec *ts);
/* Dates for A/R and A/P "invoice" postings */
void xaccTransSetDateDueTS (Transaction *trans, const Timespec *ts);
/* set the Num, Description, and Notes fields */
void xaccTransSetNum (Transaction *trans, const char *num);
void xaccTransSetDescription (Transaction *trans, const char *desc);
@@ -212,6 +215,9 @@ void xaccTransGetDateEnteredTS (Transaction *trans, Timespec *ts);
Timespec xaccTransRetDateEnteredTS (Transaction *trans);
Timespec xaccTransRetDatePostedTS (Transaction *trans);
/* Dates for A/R and A/P "invoice" postings */
void xaccTransGetDateDueTS (Transaction *trans, Timespec *ts);
/* The xaccTransCountSplits() method returns the number of splits
* in a transaction.
*/

View File

@@ -88,8 +88,6 @@ gnc_split_register_set_cells (SplitRegister *reg, TableLayout *layout)
case ASSET_REGISTER:
case CREDIT_REGISTER:
case LIABILITY_REGISTER:
case PAYABLE_REGISTER:
case RECEIVABLE_REGISTER:
case INCOME_REGISTER:
case EXPENSE_REGISTER:
case EQUITY_REGISTER:
@@ -161,6 +159,64 @@ gnc_split_register_set_cells (SplitRegister *reg, TableLayout *layout)
break;
}
/* --------------------------------------------------------- */
case PAYABLE_REGISTER:
case RECEIVABLE_REGISTER:
{
curs = gnc_table_layout_get_cursor (layout,
CURSOR_SINGLE_LEDGER);
gnc_table_layout_set_cell (layout, curs, DATE_CELL, 0, 0);
gnc_table_layout_set_cell (layout, curs, DDUE_CELL, 0, 1);
gnc_table_layout_set_cell (layout, curs, NUM_CELL, 0, 2);
gnc_table_layout_set_cell (layout, curs, DESC_CELL, 0, 3);
gnc_table_layout_set_cell (layout, curs, MXFRM_CELL, 0, 4);
gnc_table_layout_set_cell (layout, curs, RECN_CELL, 0, 5);
gnc_table_layout_set_cell (layout, curs, DEBT_CELL, 0, 6);
gnc_table_layout_set_cell (layout, curs, CRED_CELL, 0, 7);
gnc_table_layout_set_cell (layout, curs, BALN_CELL, 0, 8);
curs_last = curs;
curs = gnc_table_layout_get_cursor (layout,
CURSOR_DOUBLE_LEDGER);
copy_cursor_row (layout, curs, curs_last, 0);
gnc_table_layout_set_cell (layout, curs, ACTN_CELL, 1, 2);
gnc_table_layout_set_cell (layout, curs, NOTES_CELL, 1, 3);
curs = gnc_table_layout_get_cursor (layout,
CURSOR_SINGLE_JOURNAL);
gnc_table_layout_set_cell (layout, curs, DATE_CELL, 0, 0);
gnc_table_layout_set_cell (layout, curs, DDUE_CELL, 0, 1);
gnc_table_layout_set_cell (layout, curs, NUM_CELL, 0, 2);
gnc_table_layout_set_cell (layout, curs, DESC_CELL, 0, 3);
gnc_table_layout_set_cell (layout, curs, TDEBT_CELL, 0, 4);
gnc_table_layout_set_cell (layout, curs, TCRED_CELL, 0, 5);
gnc_table_layout_set_cell (layout, curs, TBALN_CELL, 0, 6);
curs_last = curs;
curs = gnc_table_layout_get_cursor (layout,
CURSOR_DOUBLE_JOURNAL);
copy_cursor_row (layout, curs, curs_last, 0);
gnc_table_layout_set_cell (layout, curs, NOTES_CELL, 1, 3);
curs = gnc_table_layout_get_cursor (layout,
CURSOR_SPLIT);
gnc_table_layout_set_cell (layout, curs, ACTN_CELL, 0, 2);
gnc_table_layout_set_cell (layout, curs, MEMO_CELL, 0, 3);
gnc_table_layout_set_cell (layout, curs, XFRM_CELL, 0, 4);
gnc_table_layout_set_cell (layout, curs, RECN_CELL, 0, 5);
gnc_table_layout_set_cell (layout, curs, DEBT_CELL, 0, 6);
gnc_table_layout_set_cell (layout, curs, CRED_CELL, 0, 7);
break;
}
/* --------------------------------------------------------- */
case INCOME_LEDGER:
@@ -373,14 +429,17 @@ gnc_split_register_layout_add_cursors (SplitRegister *reg,
case ASSET_REGISTER:
case CREDIT_REGISTER:
case LIABILITY_REGISTER:
case PAYABLE_REGISTER:
case RECEIVABLE_REGISTER:
case INCOME_REGISTER:
case EXPENSE_REGISTER:
case EQUITY_REGISTER:
num_cols = 8;
break;
case PAYABLE_REGISTER:
case RECEIVABLE_REGISTER:
num_cols = 9;
break;
case INCOME_LEDGER:
case GENERAL_LEDGER:
case SEARCH_LEDGER:
@@ -437,6 +496,14 @@ gnc_split_register_layout_add_cells (SplitRegister *reg,
FALSE,
FALSE);
gnc_register_add_cell (layout,
DDUE_CELL,
DATE_CELL_TYPE_NAME,
N_("sample:12/12/2000") + 7,
CELL_ALIGN_RIGHT,
FALSE,
FALSE);
gnc_register_add_cell (layout,
NUM_CELL,
NUM_CELL_TYPE_NAME,

View File

@@ -81,6 +81,25 @@ gnc_split_register_save_cells (gpointer save_data,
xaccTransSetDatePostedTS (trans, &ts);
}
if (gnc_table_layout_get_cell_changed (reg->table->layout, DDUE_CELL, TRUE))
{
BasicCell *cell;
const char *value;
Timespec ts;
cell = gnc_table_layout_get_cell (reg->table->layout, DDUE_CELL);
value = gnc_basic_cell_get_value (cell);
/* commit any pending changes */
gnc_date_cell_commit ((DateCell *) cell);
DEBUG ("DATE: %s", value ? value : "(null)");
gnc_date_cell_get_date ((DateCell *) cell, &ts);
xaccTransSetDateDueTS (trans, &ts);
}
if (gnc_table_layout_get_cell_changed (reg->table->layout, NUM_CELL, TRUE))
{
BasicCell *cell;
@@ -327,6 +346,8 @@ gnc_split_register_save_template_cells (gpointer save_data,
if (gnc_table_layout_get_cell_changed (reg->table->layout,
DATE_CELL, TRUE) ||
gnc_table_layout_get_cell_changed (reg->table->layout,
DDUE_CELL, TRUE) ||
gnc_table_layout_get_cell_changed (reg->table->layout,
NUM_CELL, TRUE) ||
gnc_table_layout_get_cell_changed (reg->table->layout,

View File

@@ -116,6 +116,13 @@ gnc_split_register_get_date_label (VirtualLocation virt_loc,
return _("Date");
}
static const char *
gnc_split_register_get_due_date_label (VirtualLocation virt_loc,
gpointer user_data)
{
return _("Due Date");
}
static const char *
gnc_split_register_get_num_label (VirtualLocation virt_loc,
gpointer user_data)
@@ -602,6 +609,27 @@ gnc_split_register_get_border (VirtualLocation virt_loc,
}
}
static const char *
gnc_split_register_get_due_date_entry (VirtualLocation virt_loc,
gboolean translate,
gboolean *conditionally_changed,
gpointer user_data)
{
SplitRegister *reg = user_data;
Transaction *trans;
Split *split;
Timespec ts;
split = gnc_split_register_get_split (reg, virt_loc.vcell_loc);
trans = xaccSplitGetParent (split);
if (!trans)
return NULL;
xaccTransGetDateDueTS (trans, &ts);
return gnc_print_date (ts);
}
static const char *
gnc_split_register_get_date_entry (VirtualLocation virt_loc,
gboolean translate,
@@ -1503,6 +1531,10 @@ gnc_split_register_model_new (void)
gnc_split_register_get_date_entry,
DATE_CELL);
gnc_table_model_set_entry_handler (model,
gnc_split_register_get_due_date_entry,
DDUE_CELL);
gnc_table_model_set_entry_handler (model,
gnc_split_register_get_num_entry,
NUM_CELL);
@@ -1576,6 +1608,10 @@ gnc_split_register_model_new (void)
gnc_split_register_get_date_label,
DATE_CELL);
gnc_table_model_set_label_handler (model,
gnc_split_register_get_due_date_label,
DDUE_CELL);
gnc_table_model_set_label_handler (model,
gnc_split_register_get_num_label,
NUM_CELL);
@@ -1660,6 +1696,10 @@ gnc_split_register_model_new (void)
gnc_split_register_get_date_help,
DATE_CELL);
gnc_table_model_set_help_handler (model,
gnc_split_register_get_date_help,
DDUE_CELL);
gnc_table_model_set_help_handler (model,
gnc_split_register_get_num_help,
NUM_CELL);
@@ -1710,6 +1750,16 @@ gnc_split_register_model_new (void)
gnc_split_register_get_standard_io_flags,
DATE_CELL);
/* FIXME: We really only need a due date for 'invoices', not for
* 'payments' or 'receipts'. This implies we really only need the
* due-date for transactions that credit the RECEIVABLE or debit
* the PAYABLE account type.
*/
gnc_table_model_set_io_flags_handler
(model,
gnc_split_register_get_standard_io_flags,
DDUE_CELL);
gnc_table_model_set_io_flags_handler
(model,
gnc_split_register_get_standard_io_flags,
@@ -1853,10 +1903,18 @@ gnc_template_register_model_new (void)
gnc_split_register_get_inactive_date_entry,
DATE_CELL );
gnc_table_model_set_entry_handler( model,
gnc_split_register_get_inactive_date_entry,
DDUE_CELL );
gnc_table_model_set_io_flags_handler( model,
gnc_split_register_get_inactive_io_flags,
DATE_CELL );
gnc_table_model_set_io_flags_handler( model,
gnc_split_register_get_inactive_io_flags,
DDUE_CELL );
gnc_table_model_set_entry_handler (model,
gnc_template_register_get_xfrm_entry,
XFRM_CELL);

View File

@@ -72,6 +72,7 @@ typedef enum
#define BALN_CELL "balance"
#define CRED_CELL "credit"
#define DATE_CELL "date"
#define DDUE_CELL "date-due"
#define DEBT_CELL "debit"
#define DESC_CELL "description"
#define FCRED_CELL "credit-formula"