This seems to do the trick. Not sure if I'm doing something terrible here.
I don't recommend you do this unless you know what you're doing (I don't
lol).
https://gist.github.com/utkonos/1dad74716828c591c9839711fdb12f22
import pathlib
import sqlite3
bills = [{'id': '000001',
'date_opened': '12/31/2018',
'owner_id': '000001',
'billingid': '123123123123',
'notes': '',
'date': '',
'desc': 'Widget',
'action': 'Material',
'account': 'Expenses:Office Supplies',
'quantity': 1,
'price': '1000.00',
'disc_type': '',
'disc_how': '',
'discount': '',
'taxable': '',
'taxincluded': '',
'tax_table': '',
'date_posted': '12/31/2018',
'due_date': '12/31/2018',
'account_posted': 'Liabilities:Accounts Payable',
'memo_posted': '',
'accu_splits': ''},
{'id': '000001',
'date_opened': '01/31/2019',
'owner_id': '000001',
'billingid': '123123123126',
'notes': '',
'date': '',
'desc': 'Widget',
'action': 'Material',
'account': 'Expenses:Office Supplies',
'quantity': 1,
'price': '1000.00',
'disc_type': '',
'disc_how': '',
'discount': '',
'taxable': '',
'taxincluded': '',
'tax_table': '',
'date_posted': '01/31/2019',
'due_date': '01/31/2019',
'account_posted': 'Liabilities:Accounts Payable',
'memo_posted': '',
'accu_splits': ''}]
doclinks = {
'000001': {
'doclink': 'Path/To/Some1.pdf'
},
'000002': {
'doclink': 'Path/To/Some2.pdf'
}
}
db_path = pathlib.Path('testfile.gnucash')
con = .sqlite3connect(db_path)
cur = con.cursor()
for bill in bills:
rows = cur.execute('SELECT * FROM invoices WHERE owner_type = 4 AND id
= "{}"'.format(bill['id']))
for row in rows:
doclinks[bill['id']]['obj_guid'] = row[0]
rows = cur.execute('SELECT max(id) FROM slots')
slotid = rows.fetchone()[0] + 1
for doclink in doclinks.values():
cur.execute("INSERT INTO slots VALUES
({},'{}','assoc_uri',4,0,'{}',NULL,'1970-01-01
00:00:00',NULL,0,1,NULL)".format(slotid, doclink['obj_guid'],
doclink['doclink']))
con.commit()
slotid += 1
con.close()
On Sun, Jul 24, 2022 at 8:12 PM Robert Simmons <rsimmo...@gmail.com> wrote:
I don't see anything specific to linked documents in PieCash.
I see that the IU menu item "Manage Document Link...." calls
"gnc_plugin_page_invoice_cmd_link" in
gnucash/gnome/gnc-plugin-page-invoice.c
This is here:
https://github.com/Gnucash/gnucash/blob/bbb4113a5a996dcd7bb3494e0be900b275b49a4f/gnucash/gnome/gnc-plugin-page-invoice.c#L1342-L1396
On line 1389, there is a call to "gncInvoiceSetDocLink". This function is
in libgnucash/engine/gncInvoice.c
Here:
https://github.com/Gnucash/gnucash/blob/ce2b89fd8cae4c5c78ba6925e78d18fca6a3df6a/libgnucash/engine/gncInvoice.c#L550-L580
And this specifically is where the DocLink is set:
{
GValue v = G_VALUE_INIT;
g_value_init (&v, G_TYPE_STRING);
g_value_set_string (&v, doclink);
qof_instance_set_kvp (QOF_INSTANCE (invoice), &v, 1,
GNC_INVOICE_DOCLINK);
invoice->doclink = g_strdup (doclink);
g_value_unset (&v);
}
I don't see this "gncInvoiceSetDocLink" function in the Python bindings,
however (or the search function I'm using is not working).
Also, I don't see anything in the log that gnucash creates related to the
row in the "slots" table that represents the DocLink.
I'm going to experiment with just adding that row to the database myself
directly.
Using bills as the example (but I can do the same for other objects):
1. Import the bills from my CSV.
2. Query the database in the "invoices" table using the ID field from my
CSV for the matching row.
3. Query the "guid" for the ID from #2.
4. Create a new row in the "slots" table using the "guid" from #3 and
name="assoc_uri", "slot_type"=4, "int64_val"=0, and "string_val" set to the
relative path to the document. The rest of the fields in that row look
basically unused, so I'll set them to whatever is in the previous linked
document rows.
If you can identify something that I'm missing, please let me know.
Especially "OMG, you're forgetting X and will blow up Y if you try this."
On Sun, Jul 24, 2022 at 7:10 PM Geoff <cleanoutmys...@gmail.com> wrote:
Hi Robert
> Is there a way to include the document URI in the import CSV?
I don't believe so.
> could probably reverse engineer the database queries that are
> being made by reading the source code.
PieCash may be of interest:
https://github.com/sdementen/piecash
Regards
Geoff
=====
On 25/07/2022 6:58 am, Robert Simmons wrote:
> Please forgive me if this is the wrong place to ask this question. I
> searched the list and did not see this discussed, so if it was
discussed,
> also please forgive my searching mistake.
>
> I have built a Jupyter notebook that parses incoming bills in various
forms
> (some are PDF, some are CSV, and some are just saved HTML). The output
is
> the correct CSV for gnucash. After importing the data from this CSV, I
have
> almost everything I need except for one data point: the linked document.
> After the import process, I have to go one by one to each imported bill
or
> invoice and link the document manually in gnucash's UI.
>
> I opened the database and looked around and I can see that the linked
> documents are stored in the "slots" table with the "name" column set to
> "assoc_uri" set to the relative path to the document. The "slot_type"
is 4
> and the "obj_guid" I assume points to the invoice or whatever the
document
> is associated with. This is all very straightforward. I absolutely don't
> want to make changes from Jupyter directly to the database even though I
> could probably reverse engineer the database queries that are being
made by
> reading the source code.
>
> I have looked through the Python bindings and I don't see any
references to
> linking documents.
>
> Is there a way to include the document URI in the import CSV?
>
> Or
>
> Is there a Python binding that I'm missing or isn't documented that will
> allow me to link a document?
>
> Finally:
>
> Is adding a field for a linked document to the importer UI component a
> valid feature request?
> _______________________________________________
> gnucash-user mailing list
> gnucash-user@gnucash.org
> To update your subscription preferences or to unsubscribe:
> https://lists.gnucash.org/mailman/listinfo/gnucash-user
> If you are using Nabble or Gmane, please see
https://wiki.gnucash.org/wiki/Mailing_Lists for more information.
> -----
> Please remember to CC this list on all your replies.
> You can do this by using Reply-To-List or Reply-All.
_______________________________________________
gnucash-user mailing list
gnucash-user@gnucash.org
To update your subscription preferences or to unsubscribe:
https://lists.gnucash.org/mailman/listinfo/gnucash-user
If you are using Nabble or Gmane, please see
https://wiki.gnucash.org/wiki/Mailing_Lists for more information.
-----
Please remember to CC this list on all your replies.
You can do this by using Reply-To-List or Reply-All.