Dumped on 2015-04-16
actual bills
| F-Key | Name | Type | Description |
|---|---|---|---|
| pk_audit | integer | NOT NULL DEFAULT nextval('audit.audit_fields_pk_audit_seq'::regclass) | |
| row_version | integer | NOT NULL | |
| modified_when | timestamp with time zone | NOT NULL DEFAULT now() | |
| modified_by | name | NOT NULL DEFAULT "current_user"() | |
| pk | serial | PRIMARY KEY | |
| invoice_id | text |
UNIQUE
the ID of the bill |
|
| close_date | timestamp with time zone |
cannot add further bill_items after this date if not NULL |
|
| apply_vat | boolean |
NOT NULL
DEFAULT true
whether or not to apply VAT on the invoice |
|
| fk_receiver_identity | integer |
link to the receiver as a GNUmed identity, if known |
|
| fk_receiver_address | integer |
links the address of the receiver of the invoice |
|
| fk_doc | integer |
links to the document which contains the invoice PDF |
|
| comment | text |
arbitrary comments on bills |
| Name | Constraint |
|---|---|
| bill_bill_sane_comment | CHECK ((gm.is_null_or_non_empty_string(comment) IS TRUE)) |
| bill_bill_sane_invoice_id | CHECK ((gm.is_null_or_blank_string(invoice_id) IS FALSE)) |
| bill_bill_sane_recv_adr | CHECK (((fk_receiver_address IS NOT NULL) OR (close_date IS NULL))) |
Tables referencing this one via Foreign Key Constraints:
items patients currently *are* billed for
| F-Key | Name | Type | Description |
|---|---|---|---|
| pk_audit | integer | NOT NULL DEFAULT nextval('audit.audit_fields_pk_audit_seq'::regclass) | |
| row_version | integer | NOT NULL | |
| modified_when | timestamp with time zone | NOT NULL DEFAULT now() | |
| modified_by | name | NOT NULL DEFAULT "current_user"() | |
| pk | serial | PRIMARY KEY | |
| fk_provider | integer |
NOT NULL
by whom or on whose behalf did the billable activity happen |
|
| fk_encounter | integer |
NOT NULL
the encounter during which the billable action for this item took place |
|
| date_to_bill | date |
The date the bill item was caused. If NULL, use .fk_encounter -> .started |
|
| description | text |
Can be used to further explain the bill item over and above .fk_billable.description. |
|
| net_amount_per_unit | numeric |
NOT NULL
How much to charge for one unit of this bill item. |
|
| currency | text |
NOT NULL
Which currency to charge in. Must not be NULL if .net_amount_per_unit is not NULL. |
|
| status | text |
DEFAULT 'new'::text
the status of this item |
|
| fk_billable | integer |
NOT NULL
Links to the billable item this bill item stands for. |
|
| bill.pk | fk_bill | integer |
Links to the bill this bill item is on if any. |
| unit_count | integer |
NOT NULL
DEFAULT 1
The number of times this item is to be billed. 0 can be used for informative items. |
|
| amount_multiplier | numeric |
NOT NULL
DEFAULT 1
A multiplier to apply to .net_amount_per_unit. Can be used for discounts, rebates, or increases. Must be > 0. |
| Name | Constraint |
|---|---|
| bill_bill_item_sane_count | CHECK ((unit_count > (-1))) |
| bill_bill_item_sane_currency | CHECK ((gm.is_null_or_blank_string(currency) IS FALSE)) |
| bill_bill_item_sane_desc | CHECK ((gm.is_null_or_non_empty_string(description) IS TRUE)) |
| bill_bill_item_sane_multiplier | CHECK ((amount_multiplier > (0)::numeric)) |
| valid_stati | CHECK ((status = ANY (ARRAY['new'::text, 'transferred'::text]))) |
actual bills
| F-Key | Name | Type | Description |
|---|---|---|---|
| pk | serial | PRIMARY KEY | |
| fk_encounter_type | integer |
NOT NULL
Links to encounter type this billable is associated with. |
|
| fk_billable | integer |
NOT NULL
Links to the billable item the encounter type is associated with. |
| F-Key | Name | Type | Description |
|---|---|---|---|
| pk_bill_item | integer | ||
| billable_code | text | ||
| billable_description | text | ||
| item_detail | text | ||
| date_to_bill | timestamp with time zone | ||
| net_amount_per_unit | numeric | ||
| unit_count | integer | ||
| amount_multiplier | numeric | ||
| total_amount | numeric | ||
| vat | numeric | ||
| currency | text | ||
| raw_date_to_bill | date | ||
| billable_amount | numeric | ||
| vat_multiplier | numeric | ||
| billable_currency | text | ||
| billable_comment | text | ||
| billable_active | boolean | ||
| billable_discountable | boolean | ||
| catalog_long | text | ||
| catalog_short | text | ||
| catalog_version | text | ||
| catalog_language | text | ||
| pk_patient | integer | ||
| pk_encounter_type | integer | ||
| pk_provider | integer | ||
| pk_encounter_to_bill | integer | ||
| pk_bill | integer | ||
| pk_billable | integer | ||
| pk_data_source | integer | ||
| xmin_bill_item | xid |
SELECT b_bi.pk AS pk_bill_item
, r_b.code AS billable_code
, r_b.term AS billable_description
, b_bi.description AS item_detail
, COALESCE
(
(b_bi.date_to_bill)::timestamp with time zone
, c_enc.started
) AS date_to_bill
, b_bi.net_amount_per_unit
, b_bi.unit_count
, b_bi.amount_multiplier
, (
(
(b_bi.unit_count)::numeric * b_bi.net_amount_per_unit
) * b_bi.amount_multiplier
) AS total_amount
, (
(
(
(b_bi.unit_count)::numeric * b_bi.net_amount_per_unit
) * b_bi.amount_multiplier
) * r_b.vat_multiplier
) AS vat
, b_bi.currency
, b_bi.date_to_bill AS raw_date_to_bill
, r_b.amount AS billable_amount
, r_b.vat_multiplier
, r_b.currency AS billable_currency
, r_b.comment AS billable_comment
, r_b.active AS billable_active
, r_b.discountable AS billable_discountable
, r_ds.name_long AS catalog_long
, r_ds.name_short AS catalog_short
, r_ds.version AS catalog_version
, r_ds.lang AS catalog_language
, c_enc.fk_patient AS pk_patient
, c_enc.fk_type AS pk_encounter_type
, b_bi.fk_provider AS pk_provider
, b_bi.fk_encounter AS pk_encounter_to_bill
, b_bi.fk_bill AS pk_bill
, r_b.pk AS pk_billable
, r_b.fk_data_source AS pk_data_source
, b_bi.xmin AS xmin_bill_item
FROM (
(
(bill.bill_item b_bi
JOIN ref.billable r_b
ON (
(b_bi.fk_billable = r_b.pk)
)
)
LEFT JOIN ref.data_source r_ds
ON (
(r_b.fk_data_source = r_ds.pk)
)
)
LEFT JOIN clin.encounter c_enc
ON (
(b_bi.fk_encounter = c_enc.pk)
)
);
| F-Key | Name | Type | Description |
|---|---|---|---|
| pk_bill | integer | ||
| invoice_id | text | ||
| pk_receiver_identity | integer | ||
| total_amount | numeric | ||
| total_vat | numeric | ||
| total_amount_with_vat | numeric | ||
| percent_vat | numeric | ||
| currency | text | ||
| close_date | timestamp with time zone | ||
| apply_vat | boolean | ||
| comment | text | ||
| pk_receiver_address | integer | ||
| pk_doc | integer | ||
| pk_patient | integer | ||
| pk_bill_items | integer[] | ||
| xmin_bill | xid |
SELECT b_b.pk AS pk_bill
, b_b.invoice_id
, b_b.fk_receiver_identity AS pk_receiver_identity
, (
SELECT round
(sum
(v_bill_items.total_amount)
, 2
) AS round
FROM bill.v_bill_items
WHERE (v_bill_items.pk_bill = b_b.pk)
) AS total_amount
, (
SELECT round
(sum
(v_bill_items.vat)
, 2
) AS round
FROM bill.v_bill_items
WHERE (v_bill_items.pk_bill = b_b.pk)
) AS total_vat
, (
SELECT round
(sum
(
(v_bill_items.total_amount + v_bill_items.vat)
)
, 2
) AS round
FROM bill.v_bill_items
WHERE (v_bill_items.pk_bill = b_b.pk)
) AS total_amount_with_vat
, (
SELECT (v_bill_items.vat_multiplier *
(100)::numeric
)
FROM bill.v_bill_items
WHERE (v_bill_items.pk_bill = b_b.pk) LIMIT 1
) AS percent_vat
, (
SELECT v_bill_items.currency
FROM bill.v_bill_items
WHERE (v_bill_items.pk_bill = b_b.pk) LIMIT 1
) AS currency
, b_b.close_date
, b_b.apply_vat
, b_b.comment
, b_b.fk_receiver_address AS pk_receiver_address
, b_b.fk_doc AS pk_doc
, (
SELECT encounter.fk_patient
FROM clin.encounter
WHERE (encounter.pk =
(
SELECT bill_item.fk_encounter
FROM bill.bill_item
WHERE (bill_item.fk_bill = b_b.pk) LIMIT 1
)
)
) AS pk_patient
, (
SELECT array_agg
(sorted_values.pk_bill_item) AS array_agg
FROM (
SELECT b_vbi.pk_bill_item
FROM bill.v_bill_items b_vbi
WHERE (b_vbi.pk_bill = b_b.pk)
ORDER BY b_vbi.date_to_bill
, b_vbi.billable_code
) sorted_values
) AS pk_bill_items
, b_b.xmin AS xmin_bill
FROM bill.bill b_b;
select value from ( select id.pk_id, id.value::integer from dem.v_external_ids4identity id join dem.identity d_i on (id.value = d_i.pk::text) where id.pk_type = (select pk from dem.enum_ext_id_types where name = 'bill receiver' and issuer = 'GNUmed') and id.pk_identity = $1 union all select 0, $1 ) me limit 1;
Prevent bills to become void of items due to deletions/updates of bill items.
DECLARE _item_count integer; _msg text; BEGIN if TG_OP = 'UPDATE' then if OLD.fk_bill IS NULL then return NULL; end if; if OLD.fk_bill IS NOT DISTINCT FROM NEW.fk_bill then return NULL; end if; else if OLD.fk_bill is NULL then return NULL; end if; end if; -- we now either: -- DELETE with .fk_bill NOT NULL -- or: -- UPDATE with an .fk_bill change (including towards fk_bill = NULL) -- let us check whether the (previous) bill still exists -- at all or whether we are deleting the bill (and thereby -- setting our .fk_bill to NULL) -- only works at or below REPEATABLE READ after deletion of bill perform 1 from bill.bill where pk = OLD.fk_bill; if FOUND is FALSE then return NULL; end if; select count(1) into _item_count from bill.bill_item where fk_bill = OLD.fk_bill and pk != OLD.pk; if _item_count > 0 then return NULL; end if; _msg := '[bill.trf_prevent_empty_bills]: cannot remove (by ' || '<' || TG_OP || '>' ||') the only item (bill.bill_item.pk=' || coalesce(OLD.pk::text, '<NULL>'::text) || ') from bill (bill.bill_item.fk_bill=bill.bill.pk=' || coalesce(OLD.fk_bill::text, '<NULL>'::text) || ') '; raise exception unique_violation using message = _msg; return NULL; END;
Prevent bills to link to invoices of another patient.
DECLARE _doc_patient integer; _bill_patient integer; _msg text; BEGIN if NEW.fk_doc IS NULL then return NEW; end if; if TG_OP = 'UPDATE' then if OLD.fk_doc IS NOT DISTINCT FROM NEW.fk_doc then return NEW; end if; end if; -- we now either: -- INSERT with .fk_doc NOT NULL -- or: -- UPDATE with an .fk_bill change to a NON-NULL value select pk_patient into _doc_patient from blobs.v_doc_med where pk_doc = NEW.fk_doc; select pk_patient into _bill_patient from bill.v_bills where pk_bill = NEW.pk; if _doc_patient = _bill_patient then return NEW; end if; _msg := '[bill.trf_prevent_mislinked_bills]: patient mismatch between ' || 'bill (pk=' || NEW.pk || ', patient=' || _bill_patient || ') ' || 'and invoice (pk=' || NEW.fk_doc || ', patient=' || _doc_patient || ')'; raise exception integrity_constraint_violation using message = _msg; return NULL; END;
Generated by PostgreSQL Autodoc