mirror of
https://github.com/Gnucash/gnucash.git
synced 2025-02-25 18:55:30 -06:00
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:
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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.
|
||||
*/
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user