* business-prefs: add the bill_reg_width preference to save the value

* implement "Default Project" in the Bill register to enter a
	  default Bill-to customer/job.  It's only visible on Bills, not
	  Invoices.


git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@7116 57a11ea4-9604-0410-9ed3-97b8803252fd
This commit is contained in:
Derek Atkins 2002-07-11 05:20:52 +00:00
parent 0ebf4e00d1
commit 1f559cc1ae
8 changed files with 424 additions and 37 deletions

View File

@ -38,6 +38,11 @@
* modify the Entry Ledger query to pull in Billable Entries from * modify the Entry Ledger query to pull in Billable Entries from
Posted Bills that belong to an Invoice's Owner. Posted Bills that belong to an Invoice's Owner.
* business-prefs: add the bill_reg_width preference to save the value
* implement "Default Project" in the Bill register to enter a
default Bill-to customer/job. It's only visible on Bills, not
Invoices.
2002-07-09 Derek Atkins <derek@ihftp.com> 2002-07-09 Derek Atkins <derek@ihftp.com>
* "global-replace for-each-in-order for-each" because the former * "global-replace for-each-in-order for-each" because the former

View File

@ -164,7 +164,7 @@ entry_dom_tree_create (GncEntry *entry)
xmlAddChild(ret, int_to_dom_tree(entry_billable_string, xmlAddChild(ret, int_to_dom_tree(entry_billable_string,
gncEntryGetBillable (entry))); gncEntryGetBillable (entry)));
owner = gncEntryGetBillTo (entry); owner = gncEntryGetBillTo (entry);
if (owner && owner->type != GNC_OWNER_NONE) if (owner && owner->owner.undefined != NULL)
xmlAddChild (ret, gnc_owner_to_dom_tree (entry_billto_string, owner)); xmlAddChild (ret, gnc_owner_to_dom_tree (entry_billto_string, owner));
} }

View File

@ -148,7 +148,7 @@ invoice_dom_tree_create (GncInvoice *invoice)
gncInvoiceGetCommonCommodity (invoice))); gncInvoiceGetCommonCommodity (invoice)));
billto = gncInvoiceGetBillTo (invoice); billto = gncInvoiceGetBillTo (invoice);
if (billto && billto->type != GNC_OWNER_NONE) if (billto && billto->owner.undefined != NULL)
xmlAddChild (ret, gnc_owner_to_dom_tree (invoice_billto_string, billto)); xmlAddChild (ret, gnc_owner_to_dom_tree (invoice_billto_string, billto));
return ret; return ret;

View File

@ -147,7 +147,7 @@ GncEntry *gncEntryCreate (GNCBook *book)
entry->taxable = TRUE; entry->taxable = TRUE;
entry->dirty = FALSE; entry->dirty = FALSE;
entry->values_dirty = TRUE; entry->values_dirty = TRUE;
entry->billto.type = GNC_OWNER_NONE; entry->billto.type = GNC_OWNER_CUSTOMER;
xaccGUIDNew (&entry->guid, book); xaccGUIDNew (&entry->guid, book);
addObj (entry); addObj (entry);

View File

@ -98,7 +98,7 @@ GncInvoice *gncInvoiceCreate (GNCBook *book)
invoice->notes = CACHE_INSERT (""); invoice->notes = CACHE_INSERT ("");
invoice->billing_id = CACHE_INSERT (""); invoice->billing_id = CACHE_INSERT ("");
invoice->billto.type = GNC_OWNER_NONE; invoice->billto.type = GNC_OWNER_CUSTOMER;
invoice->active = TRUE; invoice->active = TRUE;
xaccGUIDNew (&invoice->guid, book); xaccGUIDNew (&invoice->guid, book);

View File

@ -23,6 +23,10 @@
(gnc:make-internal-option (gnc:make-internal-option
"__gui" "invoice_reg_width" 0)) "__gui" "invoice_reg_width" 0))
(gnc:register-configuration-option
(gnc:make-internal-option
"__gui" "bill_reg_width" 0))
(gnc:register-configuration-option (gnc:register-configuration-option
(gnc:make-number-range-option (gnc:make-number-range-option
gnc:*business-label* (N_ "Number of Rows") gnc:*business-label* (N_ "Number of Rows")

View File

@ -112,6 +112,13 @@ struct _invoice_window {
GtkWidget * billing_id_entry; GtkWidget * billing_id_entry;
GtkWidget * terms_menu; GtkWidget * terms_menu;
/* Project Widgets (used for Bills only) */
GtkWidget * proj_frame;
GtkWidget * proj_cust_box;
GtkWidget * proj_cust_choice;
GtkWidget * proj_job_box;
GtkWidget * proj_job_choice;
gint width; gint width;
GncBillTerm * terms; GncBillTerm * terms;
@ -128,6 +135,8 @@ struct _invoice_window {
GncOwner owner; GncOwner owner;
GncOwner job; GncOwner job;
GncOwner proj_cust;
GncOwner proj_job;
}; };
/* Forward definitions for CB functions */ /* Forward definitions for CB functions */
@ -164,7 +173,8 @@ void gnc_invoice_window_statusbar_cb (GtkWidget *widget, gpointer data);
#define INV_WIDTH_PREFIX "invoice_reg" #define INV_WIDTH_PREFIX "invoice_reg"
#define BILL_WIDTH_PREFIX "bill_reg" #define BILL_WIDTH_PREFIX "bill_reg"
static int last_width = 0; static int inv_last_width = 0;
static int bill_last_width = 0;
static void gnc_invoice_update_window (InvoiceWindow *iw); static void gnc_invoice_update_window (InvoiceWindow *iw);
static InvoiceWindow * gnc_ui_invoice_modify (GncInvoice *invoice); static InvoiceWindow * gnc_ui_invoice_modify (GncInvoice *invoice);
@ -214,6 +224,12 @@ static void gnc_ui_to_invoice (InvoiceWindow *iw, GncInvoice *invoice)
gncInvoiceSetOwner (invoice, &(iw->job)); gncInvoiceSetOwner (invoice, &(iw->job));
else else
gncInvoiceSetOwner (invoice, &(iw->owner)); gncInvoiceSetOwner (invoice, &(iw->owner));
/* Only set the BillTo if we've actually got one */
if (gncOwnerGetJob (&iw->proj_job))
gncInvoiceSetBillTo (invoice, &iw->proj_job);
else
gncInvoiceSetBillTo (invoice, &iw->proj_cust);
} }
gncInvoiceCommitEdit (invoice); gncInvoiceCommitEdit (invoice);
@ -806,13 +822,29 @@ gnc_invoice_get_width_prefix (InvoiceWindow *iw)
} }
} }
static int *
gnc_invoice_get_width_integer (InvoiceWindow *iw)
{
switch (gncOwnerGetType (&iw->owner)) {
case GNC_OWNER_CUSTOMER:
return &inv_last_width;
case GNC_OWNER_VENDOR:
return &bill_last_width;
default:
g_warning ("invalid owner");
return &inv_last_width;
}
}
static void static void
gnc_invoice_save_size (InvoiceWindow *iw) gnc_invoice_save_size (InvoiceWindow *iw)
{ {
gdk_window_get_geometry (iw->dialog->window, NULL, NULL, &last_width, int *last_width = gnc_invoice_get_width_integer (iw);
NULL, NULL);
gnc_save_window_size (gnc_invoice_get_width_prefix (iw), last_width, 0); gdk_window_get_geometry (iw->dialog->window, NULL, NULL,
last_width, NULL, NULL);
gnc_save_window_size (gnc_invoice_get_width_prefix (iw), *last_width, 0);
} }
static void static void
@ -891,9 +923,8 @@ gnc_invoice_select_job_cb (gpointer jobp, gpointer user_data)
static void static void
gnc_invoice_update_job_choice (InvoiceWindow *iw) gnc_invoice_update_job_choice (InvoiceWindow *iw)
{ {
if (iw->job_choice) { if (iw->job_choice)
gtk_container_remove (GTK_CONTAINER (iw->job_box), iw->job_choice); gtk_container_remove (GTK_CONTAINER (iw->job_box), iw->job_choice);
}
/* If we don't have a real owner, then we obviously can't have a job */ /* If we don't have a real owner, then we obviously can't have a job */
if (iw->owner.owner.undefined == NULL) { if (iw->owner.owner.undefined == NULL) {
@ -929,6 +960,79 @@ gnc_invoice_update_job_choice (InvoiceWindow *iw)
gtk_widget_show_all (iw->job_choice); gtk_widget_show_all (iw->job_choice);
} }
static GNCSearchWindow *
gnc_invoice_select_proj_job_cb (gpointer jobp, gpointer user_data)
{
GncJob *j = jobp;
InvoiceWindow *iw = user_data;
GncOwner owner, *ownerp;
if (!iw) return NULL;
if (j) {
ownerp = gncJobGetOwner (j);
gncOwnerCopy (ownerp, &owner);
} else
gncOwnerCopy (&(iw->proj_cust), &owner);
return gnc_job_search (j, &owner, iw->book);
}
static int
gnc_invoice_proj_job_changed_cb (GtkWidget *widget, gpointer data)
{
InvoiceWindow *iw = data;
if (!iw)
return FALSE;
if (iw->dialog_type == VIEW_INVOICE)
return FALSE;
gnc_owner_get_owner (iw->proj_job_choice, &(iw->proj_job));
return FALSE;
}
static void
gnc_invoice_update_proj_job (InvoiceWindow *iw)
{
if (iw->proj_job_choice)
gtk_container_remove (GTK_CONTAINER (iw->proj_job_box),
iw->proj_job_choice);
switch (iw->dialog_type) {
case VIEW_INVOICE:
case EDIT_INVOICE:
iw->proj_job_choice =
gnc_owner_edit_create (NULL, iw->proj_job_box, iw->book, &(iw->job));
break;
case NEW_INVOICE:
case MOD_INVOICE:
if (iw->proj_cust.owner.undefined == NULL) {
iw->proj_job_choice = NULL;
} else {
iw->proj_job_choice =
gnc_general_search_new (GNC_JOB_MODULE_NAME, _("Select..."),
gnc_invoice_select_proj_job_cb, iw);
gnc_general_search_set_selected (GNC_GENERAL_SEARCH(iw->proj_job_choice),
gncOwnerGetJob (&iw->proj_job));
gnc_general_search_allow_clear (GNC_GENERAL_SEARCH (iw->proj_job_choice),
TRUE);
gtk_box_pack_start (GTK_BOX (iw->proj_job_box), iw->proj_job_choice,
TRUE, TRUE, 0);
gtk_signal_connect (GTK_OBJECT (iw->proj_job_choice), "changed",
GTK_SIGNAL_FUNC (gnc_invoice_proj_job_changed_cb),
iw);
}
break;
}
if (iw->proj_job_choice)
gtk_widget_show_all (iw->proj_job_choice);
}
static int static int
gnc_invoice_owner_changed_cb (GtkWidget *widget, gpointer data) gnc_invoice_owner_changed_cb (GtkWidget *widget, gpointer data)
{ {
@ -979,6 +1083,35 @@ gnc_invoice_owner_changed_cb (GtkWidget *widget, gpointer data)
return FALSE; return FALSE;
} }
static int
gnc_invoice_proj_cust_changed_cb (GtkWidget *widget, gpointer data)
{
InvoiceWindow *iw = data;
GncOwner owner;
if (!iw)
return FALSE;
if (iw->dialog_type == VIEW_INVOICE)
return FALSE;
gncOwnerCopy (&(iw->proj_cust), &owner);
gnc_owner_get_owner (iw->proj_cust_choice, &owner);
/* If this owner really changed, then reset ourselves */
if (!gncOwnerEqual (&owner, &(iw->proj_cust))) {
gncOwnerCopy (&owner, &(iw->proj_cust));
gncOwnerInitJob (&(iw->proj_job), NULL);
}
if (iw->dialog_type == EDIT_INVOICE)
return FALSE;
gnc_invoice_update_proj_job (iw);
return FALSE;
}
static void static void
gnc_invoice_dialog_close_handler (gpointer user_data) gnc_invoice_dialog_close_handler (gpointer user_data)
{ {
@ -1061,6 +1194,11 @@ gnc_invoice_window_refresh_handler (GHashTable *changes, gpointer user_data)
gncOwnerCopy (gncOwnerGetEndOwner (owner), &(iw->owner)); gncOwnerCopy (gncOwnerGetEndOwner (owner), &(iw->owner));
gncOwnerInitJob (&(iw->job), gncOwnerGetJob (owner)); gncOwnerInitJob (&(iw->job), gncOwnerGetJob (owner));
/* Copy the billto information into our window */
owner = gncInvoiceGetBillTo (invoice);
gncOwnerCopy (gncOwnerGetEndOwner (owner), &iw->proj_cust);
gncOwnerInitJob (&iw->proj_job, gncOwnerGetJob (owner));
/* Ok, NOW let's refresh ourselves */ /* Ok, NOW let's refresh ourselves */
gnc_invoice_update_window (iw); gnc_invoice_update_window (iw);
} }
@ -1107,9 +1245,12 @@ gnc_invoice_update_window (InvoiceWindow *iw)
invoice = iw_get_invoice (iw); invoice = iw_get_invoice (iw);
if (iw->owner_choice) { if (iw->owner_choice)
gtk_container_remove (GTK_CONTAINER (iw->owner_box), iw->owner_choice); gtk_container_remove (GTK_CONTAINER (iw->owner_box), iw->owner_choice);
}
if (iw->proj_cust_choice)
gtk_container_remove (GTK_CONTAINER (iw->proj_cust_box),
iw->proj_cust_choice);
switch (iw->dialog_type) { switch (iw->dialog_type) {
case VIEW_INVOICE: case VIEW_INVOICE:
@ -1117,38 +1258,56 @@ gnc_invoice_update_window (InvoiceWindow *iw)
iw->owner_choice = iw->owner_choice =
gnc_owner_edit_create (iw->owner_label, iw->owner_box, iw->book, gnc_owner_edit_create (iw->owner_label, iw->owner_box, iw->book,
&(iw->owner)); &(iw->owner));
iw->proj_cust_choice =
gnc_owner_edit_create (NULL, iw->proj_cust_box, iw->book,
&(iw->proj_cust));
break; break;
case NEW_INVOICE: case NEW_INVOICE:
case MOD_INVOICE: case MOD_INVOICE:
iw->owner_choice = iw->owner_choice =
gnc_owner_select_create (iw->owner_label, iw->owner_box, iw->book, gnc_owner_select_create (iw->owner_label, iw->owner_box, iw->book,
&(iw->owner)); &(iw->owner));
iw->proj_cust_choice =
gnc_owner_select_create (NULL, iw->proj_cust_box, iw->book,
&(iw->proj_cust));
gtk_signal_connect (GTK_OBJECT (iw->owner_choice), "changed", gtk_signal_connect (GTK_OBJECT (iw->owner_choice), "changed",
GTK_SIGNAL_FUNC (gnc_invoice_owner_changed_cb), GTK_SIGNAL_FUNC (gnc_invoice_owner_changed_cb),
iw); iw);
gtk_signal_connect (GTK_OBJECT (iw->proj_cust_choice), "changed",
GTK_SIGNAL_FUNC (gnc_invoice_proj_cust_changed_cb),
iw);
break; break;
} }
gnc_invoice_update_job_choice (iw); gnc_invoice_update_job_choice (iw);
gnc_invoice_update_proj_job (iw);
{
int * last_width = gnc_invoice_get_width_integer (iw);
switch (iw->dialog_type) { switch (iw->dialog_type) {
case VIEW_INVOICE: case VIEW_INVOICE:
case EDIT_INVOICE: case EDIT_INVOICE:
if (last_width == 0) if (*last_width == 0)
gnc_get_window_size (gnc_invoice_get_width_prefix (iw), &last_width, gnc_get_window_size (gnc_invoice_get_width_prefix (iw), last_width,
NULL); NULL);
gtk_window_set_default_size (GTK_WINDOW (iw->dialog), last_width, 0); gtk_window_set_default_size (GTK_WINDOW (iw->dialog), *last_width, 0);
break; break;
default: default:
break; break;
} }
}
gtk_widget_show_all (iw->dialog); gtk_widget_show_all (iw->dialog);
/* Hide the project frame for customer invoices */
if (iw->owner.type == GNC_OWNER_CUSTOMER)
gtk_widget_hide_all (iw->proj_frame);
acct_entry = glade_xml_get_widget (iw->xml, "acct_entry"); acct_entry = glade_xml_get_widget (iw->xml, "acct_entry");
/* We know that "invoice" (and "owner") exist now */ /* We know that "invoice" (and "owner") exist now */
@ -1323,6 +1482,7 @@ gnc_invoice_new_window (GNCBook *bookp, InvoiceDialogType type,
GncEntryLedger *entry_ledger = NULL; GncEntryLedger *entry_ledger = NULL;
GncOwnerType owner_type; GncOwnerType owner_type;
GncEntryLedgerType ledger_type; GncEntryLedgerType ledger_type;
GncOwner *billto;
g_assert (type != NEW_INVOICE && type != MOD_INVOICE); g_assert (type != NEW_INVOICE && type != MOD_INVOICE);
@ -1357,6 +1517,10 @@ gnc_invoice_new_window (GNCBook *bookp, InvoiceDialogType type,
gncOwnerInitJob (&(iw->job), gncOwnerGetJob (owner)); gncOwnerInitJob (&(iw->job), gncOwnerGetJob (owner));
owner_type = gncOwnerGetType (&iw->owner); owner_type = gncOwnerGetType (&iw->owner);
billto = gncInvoiceGetBillTo (invoice);
gncOwnerCopy (gncOwnerGetEndOwner (billto), &(iw->proj_cust));
gncOwnerInitJob (&iw->proj_job, gncOwnerGetJob (billto));
/* Find the dialog */ /* Find the dialog */
iw->xml = xml = gnc_glade_xml_new ("invoice.glade", "Invoice Entry Window"); iw->xml = xml = gnc_glade_xml_new ("invoice.glade", "Invoice Entry Window");
iw->dialog = glade_xml_get_widget (xml, "Invoice Entry Window"); iw->dialog = glade_xml_get_widget (xml, "Invoice Entry Window");
@ -1376,6 +1540,11 @@ gnc_invoice_new_window (GNCBook *bookp, InvoiceDialogType type,
iw->owner_label = glade_xml_get_widget (xml, "owner_label"); iw->owner_label = glade_xml_get_widget (xml, "owner_label");
iw->job_box = glade_xml_get_widget (xml, "job_hbox"); iw->job_box = glade_xml_get_widget (xml, "job_hbox");
/* grab the project widgets */
iw->proj_frame = glade_xml_get_widget (xml, "proj_frame");
iw->proj_cust_box = glade_xml_get_widget (xml, "proj_cust_hbox");
iw->proj_job_box = glade_xml_get_widget (xml, "proj_job_hbox");
/* grab the toolbar widgets */ /* grab the toolbar widgets */
iw->toolbar_dock = glade_xml_get_widget (xml, "toolbar_dock"); iw->toolbar_dock = glade_xml_get_widget (xml, "toolbar_dock");
iw->edit_button = glade_xml_get_widget (xml, "edit_button"); iw->edit_button = glade_xml_get_widget (xml, "edit_button");
@ -1521,6 +1690,7 @@ gnc_invoice_window_new_invoice (GNCBook *bookp, GncOwner *owner,
GladeXML *xml; GladeXML *xml;
GnomeDialog *iwd; GnomeDialog *iwd;
GtkWidget *hbox; GtkWidget *hbox;
GncOwner *billto;
if (invoice) { if (invoice) {
/* /*
@ -1559,6 +1729,10 @@ gnc_invoice_window_new_invoice (GNCBook *bookp, GncOwner *owner,
gncOwnerCopy (gncOwnerGetEndOwner(owner), &(iw->owner)); gncOwnerCopy (gncOwnerGetEndOwner(owner), &(iw->owner));
gncOwnerInitJob (&(iw->job), gncOwnerGetJob (owner)); gncOwnerInitJob (&(iw->job), gncOwnerGetJob (owner));
billto = gncInvoiceGetBillTo (invoice);
gncOwnerCopy (gncOwnerGetEndOwner (billto), &(iw->proj_cust));
gncOwnerInitJob (&iw->proj_job, gncOwnerGetJob (billto));
/* Find the dialog */ /* Find the dialog */
iw->xml = xml = gnc_glade_xml_new ("invoice.glade", "New Invoice Dialog"); iw->xml = xml = gnc_glade_xml_new ("invoice.glade", "New Invoice Dialog");
iw->dialog = glade_xml_get_widget (xml, "New Invoice Dialog"); iw->dialog = glade_xml_get_widget (xml, "New Invoice Dialog");
@ -1575,6 +1749,10 @@ gnc_invoice_window_new_invoice (GNCBook *bookp, GncOwner *owner,
iw->owner_label = glade_xml_get_widget (xml, "owner_label"); iw->owner_label = glade_xml_get_widget (xml, "owner_label");
iw->job_box = glade_xml_get_widget (xml, "job_hbox"); iw->job_box = glade_xml_get_widget (xml, "job_hbox");
/* grab the project widgets */
iw->proj_frame = glade_xml_get_widget (xml, "proj_frame");
iw->proj_cust_box = glade_xml_get_widget (xml, "proj_cust_hbox");
iw->proj_job_box = glade_xml_get_widget (xml, "proj_job_hbox");
hbox = glade_xml_get_widget (xml, "date_opened_hbox"); hbox = glade_xml_get_widget (xml, "date_opened_hbox");
iw->opened_date = gnc_date_edit_new (time(NULL), FALSE, FALSE); iw->opened_date = gnc_date_edit_new (time(NULL), FALSE, FALSE);

View File

@ -382,6 +382,119 @@
</widget> </widget>
</widget> </widget>
<widget>
<class>GtkFrame</class>
<name>proj_frame</name>
<label>Default Project</label>
<label_xalign>0</label_xalign>
<shadow_type>GTK_SHADOW_ETCHED_IN</shadow_type>
<child>
<padding>0</padding>
<expand>True</expand>
<fill>True</fill>
</child>
<widget>
<class>GtkHBox</class>
<name>hbox5</name>
<border_width>3</border_width>
<homogeneous>False</homogeneous>
<spacing>0</spacing>
<widget>
<class>GtkVBox</class>
<name>vbox15</name>
<border_width>3</border_width>
<homogeneous>True</homogeneous>
<spacing>0</spacing>
<child>
<padding>0</padding>
<expand>False</expand>
<fill>True</fill>
</child>
<widget>
<class>GtkLabel</class>
<name>label22</name>
<label>Customer</label>
<justify>GTK_JUSTIFY_RIGHT</justify>
<wrap>False</wrap>
<xalign>1</xalign>
<yalign>0.5</yalign>
<xpad>0</xpad>
<ypad>0</ypad>
<child>
<padding>0</padding>
<expand>False</expand>
<fill>False</fill>
</child>
</widget>
<widget>
<class>GtkLabel</class>
<name>label23</name>
<label>Job</label>
<justify>GTK_JUSTIFY_RIGHT</justify>
<wrap>False</wrap>
<xalign>1</xalign>
<yalign>0.5</yalign>
<xpad>0</xpad>
<ypad>0</ypad>
<child>
<padding>0</padding>
<expand>False</expand>
<fill>False</fill>
</child>
</widget>
</widget>
<widget>
<class>GtkVBox</class>
<name>vbox16</name>
<border_width>3</border_width>
<homogeneous>True</homogeneous>
<spacing>0</spacing>
<child>
<padding>0</padding>
<expand>True</expand>
<fill>True</fill>
</child>
<widget>
<class>GtkHBox</class>
<name>proj_cust_hbox</name>
<homogeneous>False</homogeneous>
<spacing>0</spacing>
<child>
<padding>0</padding>
<expand>True</expand>
<fill>True</fill>
</child>
<widget>
<class>Placeholder</class>
</widget>
</widget>
<widget>
<class>GtkHBox</class>
<name>proj_job_hbox</name>
<homogeneous>False</homogeneous>
<spacing>0</spacing>
<child>
<padding>0</padding>
<expand>True</expand>
<fill>True</fill>
</child>
<widget>
<class>Placeholder</class>
</widget>
</widget>
</widget>
</widget>
</widget>
<widget> <widget>
<class>GtkFrame</class> <class>GtkFrame</class>
<name>frame6</name> <name>frame6</name>
@ -1743,6 +1856,93 @@
</widget> </widget>
</widget> </widget>
<widget>
<class>GtkFrame</class>
<name>proj_frame</name>
<label>Default Project</label>
<label_xalign>0</label_xalign>
<shadow_type>GTK_SHADOW_ETCHED_IN</shadow_type>
<child>
<padding>3</padding>
<expand>True</expand>
<fill>True</fill>
</child>
<widget>
<class>GtkHBox</class>
<name>hbox8</name>
<border_width>3</border_width>
<homogeneous>False</homogeneous>
<spacing>0</spacing>
<widget>
<class>GtkLabel</class>
<name>label24</name>
<label>Customer: </label>
<justify>GTK_JUSTIFY_RIGHT</justify>
<wrap>False</wrap>
<xalign>1</xalign>
<yalign>0.5</yalign>
<xpad>0</xpad>
<ypad>0</ypad>
<child>
<padding>0</padding>
<expand>False</expand>
<fill>True</fill>
</child>
</widget>
<widget>
<class>GtkHBox</class>
<name>proj_cust_hbox</name>
<homogeneous>False</homogeneous>
<spacing>0</spacing>
<child>
<padding>0</padding>
<expand>True</expand>
<fill>True</fill>
</child>
<widget>
<class>Placeholder</class>
</widget>
</widget>
<widget>
<class>GtkLabel</class>
<name>label25</name>
<label>Job: </label>
<justify>GTK_JUSTIFY_RIGHT</justify>
<wrap>False</wrap>
<xalign>1</xalign>
<yalign>0.5</yalign>
<xpad>0</xpad>
<ypad>0</ypad>
<child>
<padding>0</padding>
<expand>False</expand>
<fill>True</fill>
</child>
</widget>
<widget>
<class>GtkHBox</class>
<name>proj_job_hbox</name>
<homogeneous>False</homogeneous>
<spacing>0</spacing>
<child>
<padding>0</padding>
<expand>True</expand>
<fill>True</fill>
</child>
<widget>
<class>Placeholder</class>
</widget>
</widget>
</widget>
</widget>
<widget> <widget>
<class>GtkFrame</class> <class>GtkFrame</class>
<name>ledger_frame</name> <name>ledger_frame</name>