示例#1
0
void
gnc_sx_incr_temporal_state(const SchedXaction *sx, SXTmpStateData *tsd )
{
    g_return_if_fail(tsd != NULL);
    tsd->last_date = xaccSchedXactionGetNextInstance (sx, tsd);
    if (xaccSchedXactionHasOccurDef (sx))
    {
        --tsd->num_occur_rem;
    }
    ++tsd->num_inst;
}
示例#2
0
static GncSxInstances*
_gnc_sx_gen_instances(gpointer *data, gpointer user_data)
{
    GncSxInstances *instances = g_new0(GncSxInstances, 1);
    SchedXaction *sx = (SchedXaction*)data;
    GDate *range_end = (GDate*)user_data;
    GDate creation_end, remind_end;
    GDate cur_date;
    void *sequence_ctx;

    instances->sx = sx;

    creation_end = *range_end;
    g_date_add_days(&creation_end, xaccSchedXactionGetAdvanceCreation(sx));
    remind_end = creation_end;
    g_date_add_days(&remind_end, xaccSchedXactionGetAdvanceReminder(sx));

    /* postponed */
    {
        GList *postponed = gnc_sx_get_defer_instances(sx);
        for ( ; postponed != NULL; postponed = postponed->next)
        {
            GDate inst_date;
            int seq_num;
            GncSxInstance *inst;

            g_date_clear(&inst_date, 1);
            inst_date = xaccSchedXactionGetNextInstance(sx, postponed->data);
            seq_num = gnc_sx_get_instance_count(sx, postponed->data);
            inst = gnc_sx_instance_new(instances, SX_INSTANCE_STATE_POSTPONED, &inst_date, postponed->data, seq_num);
            instances->instance_list = g_list_append(instances->instance_list, inst);
        }
    }

    /* to-create */
    g_date_clear(&cur_date, 1);
    sequence_ctx = gnc_sx_create_temporal_state(sx);
    cur_date = xaccSchedXactionGetInstanceAfter(sx, &cur_date, sequence_ctx);
    instances->next_instance_date = cur_date;
    while (g_date_valid(&cur_date) && g_date_compare(&cur_date, &creation_end) <= 0)
    {
        GncSxInstance *inst;
        int seq_num;
        seq_num = gnc_sx_get_instance_count(sx, sequence_ctx);
        inst = gnc_sx_instance_new(instances, SX_INSTANCE_STATE_TO_CREATE, &cur_date, sequence_ctx, seq_num);
        instances->instance_list = g_list_append(instances->instance_list, inst);
        gnc_sx_incr_temporal_state(sx, sequence_ctx);
        cur_date = xaccSchedXactionGetInstanceAfter(sx, &cur_date, sequence_ctx);
    }

    /* reminders */
    while (g_date_valid(&cur_date) && g_date_compare(&cur_date, &remind_end) <= 0)
    {
        GncSxInstance *inst;
        int seq_num;
        seq_num = gnc_sx_get_instance_count(sx, sequence_ctx);
        inst = gnc_sx_instance_new(instances, SX_INSTANCE_STATE_REMINDER, &cur_date, sequence_ctx, seq_num);
        instances->instance_list = g_list_append(instances->instance_list, inst);
        gnc_sx_incr_temporal_state(sx, sequence_ctx);
        cur_date = xaccSchedXactionGetInstanceAfter(sx, &cur_date, sequence_ctx);
    }

    return instances;
}