canvas 0.42.0__py3-none-any.whl → 0.44.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of canvas might be problematic. Click here for more details.
- {canvas-0.42.0.dist-info → canvas-0.44.0.dist-info}/METADATA +1 -2
- {canvas-0.42.0.dist-info → canvas-0.44.0.dist-info}/RECORD +47 -33
- canvas_cli/apps/auth/storage.py +65 -0
- canvas_cli/apps/auth/utils.py +6 -42
- canvas_generated/messages/effects_pb2.py +2 -2
- canvas_generated/messages/effects_pb2.pyi +12 -0
- canvas_sdk/effects/note/appointment.py +135 -50
- canvas_sdk/effects/note/base.py +108 -10
- canvas_sdk/effects/note/note.py +81 -22
- canvas_sdk/effects/patient/__init__.py +10 -2
- canvas_sdk/effects/patient/base.py +20 -1
- canvas_sdk/effects/patient/create_patient_external_identifier.py +40 -0
- canvas_sdk/effects/protocol_card/__init__.py +4 -1
- canvas_sdk/effects/protocol_card/protocol_card.py +2 -0
- canvas_sdk/utils/http.py +46 -2
- canvas_sdk/v1/data/__init__.py +45 -0
- canvas_sdk/v1/data/allergy_intolerance.py +6 -2
- canvas_sdk/v1/data/assessment.py +7 -3
- canvas_sdk/v1/data/billing.py +1 -1
- canvas_sdk/v1/data/business_line.py +35 -0
- canvas_sdk/v1/data/claim.py +321 -0
- canvas_sdk/v1/data/claim_line_item.py +140 -0
- canvas_sdk/v1/data/command.py +12 -3
- canvas_sdk/v1/data/condition.py +7 -2
- canvas_sdk/v1/data/detected_issue.py +9 -3
- canvas_sdk/v1/data/device.py +9 -3
- canvas_sdk/v1/data/discount.py +21 -0
- canvas_sdk/v1/data/fields.py +37 -0
- canvas_sdk/v1/data/imaging.py +18 -6
- canvas_sdk/v1/data/invoice.py +62 -0
- canvas_sdk/v1/data/lab.py +36 -12
- canvas_sdk/v1/data/line_item_transaction.py +83 -0
- canvas_sdk/v1/data/medication.py +6 -2
- canvas_sdk/v1/data/observation.py +9 -3
- canvas_sdk/v1/data/organization.py +3 -1
- canvas_sdk/v1/data/patient.py +17 -1
- canvas_sdk/v1/data/patient_consent.py +92 -0
- canvas_sdk/v1/data/payment_collection.py +35 -0
- canvas_sdk/v1/data/payor_specific_charge.py +28 -0
- canvas_sdk/v1/data/posting.py +225 -0
- canvas_sdk/v1/data/protocol_override.py +6 -2
- canvas_sdk/v1/data/questionnaire.py +6 -2
- canvas_sdk/v1/data/user.py +2 -0
- canvas_sdk/v1/data/utils.py +10 -0
- protobufs/canvas_generated/messages/effects.proto +7 -0
- {canvas-0.42.0.dist-info → canvas-0.44.0.dist-info}/WHEEL +0 -0
- {canvas-0.42.0.dist-info → canvas-0.44.0.dist-info}/entry_points.txt +0 -0
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
from decimal import Decimal
|
|
2
|
+
from typing import Any, Self
|
|
3
|
+
|
|
4
|
+
from django.db import models
|
|
5
|
+
from django.db.models import Q, Sum
|
|
6
|
+
from django.db.models.functions import Coalesce
|
|
7
|
+
|
|
8
|
+
from canvas_sdk.v1.data.note import PracticeLocationPOS
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class ClaimLineItemStatus(models.TextChoices):
|
|
12
|
+
"""ClaimLineItemStatus."""
|
|
13
|
+
|
|
14
|
+
ACTIVE = "active", "Active"
|
|
15
|
+
REMOVED = "removed", "Removed"
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class LineItemCodes(models.TextChoices):
|
|
19
|
+
"""LineItemCodes."""
|
|
20
|
+
|
|
21
|
+
COPAY = "COPAY"
|
|
22
|
+
UNLINKED = "UNLINKED"
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class FamilyPlanningOptions(models.TextChoices):
|
|
26
|
+
"""FamilyPlanningOptions."""
|
|
27
|
+
|
|
28
|
+
YES = ("Y", "Yes")
|
|
29
|
+
NO = ("N", "No")
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class ClaimLineItemQuerySet(models.QuerySet):
|
|
33
|
+
"""ClaimLineItemQuerySet."""
|
|
34
|
+
|
|
35
|
+
def filter(self, *args: Any, **kwargs: Any) -> Self:
|
|
36
|
+
"""Apply standard filtering to the QuerySet."""
|
|
37
|
+
return super().filter(*args, **kwargs)
|
|
38
|
+
|
|
39
|
+
def exclude(self, *args: Any, **kwargs: Any) -> Self:
|
|
40
|
+
"""Apply standard exclusion to the QuerySet."""
|
|
41
|
+
return super().exclude(*args, **kwargs)
|
|
42
|
+
|
|
43
|
+
def apply_ordering(self) -> Self:
|
|
44
|
+
"""Apply ordering to the QuerySet."""
|
|
45
|
+
return self.order_by("from_date", "-proc_code")
|
|
46
|
+
|
|
47
|
+
def active(self) -> Self:
|
|
48
|
+
"""Return only active claim line items."""
|
|
49
|
+
return self.exclude(status=ClaimLineItemStatus.REMOVED).apply_ordering()
|
|
50
|
+
|
|
51
|
+
def exclude_removed_line_item_without_active_posting(self) -> Self:
|
|
52
|
+
"""Exclude out any line items that are deleted without any active postings."""
|
|
53
|
+
return (
|
|
54
|
+
self.filter(
|
|
55
|
+
Q(status=ClaimLineItemStatus.ACTIVE)
|
|
56
|
+
| Q(
|
|
57
|
+
newlineitempayments__isnull=False,
|
|
58
|
+
newlineitempayments__entered_in_error__isnull=True,
|
|
59
|
+
)
|
|
60
|
+
| Q(
|
|
61
|
+
newlineitemadjustments__isnull=False,
|
|
62
|
+
newlineitemadjustments__entered_in_error__isnull=True,
|
|
63
|
+
)
|
|
64
|
+
| Q(
|
|
65
|
+
lineitemtransfers__isnull=False,
|
|
66
|
+
lineitemtransfers__entered_in_error__isnull=True,
|
|
67
|
+
)
|
|
68
|
+
)
|
|
69
|
+
.exclude_removed_line_items_without_balances()
|
|
70
|
+
.apply_ordering()
|
|
71
|
+
.distinct()
|
|
72
|
+
)
|
|
73
|
+
|
|
74
|
+
def exclude_removed_line_items_without_balances(self) -> Self:
|
|
75
|
+
"""Exclude removed line items with zero balances."""
|
|
76
|
+
return (
|
|
77
|
+
self.annotate(
|
|
78
|
+
sum_of_all_payments=Coalesce(Sum("newlineitempayments__amount"), Decimal(0)),
|
|
79
|
+
sum_of_all_adjustments=Coalesce(Sum("newlineitemadjustments__amount"), Decimal(0)),
|
|
80
|
+
sum_of_all_transfers=Coalesce(Sum("lineitemtransfers__amount"), Decimal(0)),
|
|
81
|
+
)
|
|
82
|
+
.exclude(
|
|
83
|
+
Q(
|
|
84
|
+
status=ClaimLineItemStatus.REMOVED,
|
|
85
|
+
sum_of_all_payments=0,
|
|
86
|
+
sum_of_all_adjustments=0,
|
|
87
|
+
sum_of_all_transfers=0,
|
|
88
|
+
)
|
|
89
|
+
)
|
|
90
|
+
.distinct()
|
|
91
|
+
)
|
|
92
|
+
|
|
93
|
+
def exclude_copay_and_unlinked(self) -> Self:
|
|
94
|
+
"""Exclude both co-pay and unlinked line items."""
|
|
95
|
+
return self.exclude(
|
|
96
|
+
proc_code__in=[LineItemCodes.UNLINKED.value, LineItemCodes.COPAY.value]
|
|
97
|
+
).apply_ordering()
|
|
98
|
+
|
|
99
|
+
def exclude_copay(self) -> Self:
|
|
100
|
+
"""Exclude only co-pay line items."""
|
|
101
|
+
return self.exclude(proc_code=LineItemCodes.COPAY.value).apply_ordering()
|
|
102
|
+
|
|
103
|
+
def exclude_unlinked(self) -> Self:
|
|
104
|
+
"""Exclude only unlinked line items."""
|
|
105
|
+
return self.exclude(proc_code=LineItemCodes.UNLINKED.value).apply_ordering()
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
class ClaimLineItem(models.Model):
|
|
109
|
+
"""ClaimLineItem."""
|
|
110
|
+
|
|
111
|
+
class Meta:
|
|
112
|
+
managed = False
|
|
113
|
+
db_table = "canvas_sdk_data_quality_and_revenue_claimlineitem_001"
|
|
114
|
+
|
|
115
|
+
objects = ClaimLineItemQuerySet.as_manager()
|
|
116
|
+
|
|
117
|
+
dbid = models.BigIntegerField(primary_key=True)
|
|
118
|
+
billing_line_item = models.ForeignKey("v1.BillingLineItem", on_delete=models.CASCADE, null=True)
|
|
119
|
+
claim = models.ForeignKey("v1.Claim", on_delete=models.CASCADE, related_name="line_items")
|
|
120
|
+
status = models.CharField(choices=ClaimLineItemStatus.choices)
|
|
121
|
+
charge = models.DecimalField(max_digits=8, decimal_places=2)
|
|
122
|
+
from_date = models.CharField()
|
|
123
|
+
thru_date = models.CharField()
|
|
124
|
+
narrative = models.CharField()
|
|
125
|
+
ndc_code = models.CharField()
|
|
126
|
+
ndc_dosage = models.CharField()
|
|
127
|
+
ndc_measure = models.CharField()
|
|
128
|
+
place_of_service = models.CharField(choices=PracticeLocationPOS.choices)
|
|
129
|
+
proc_code = models.CharField()
|
|
130
|
+
display = models.CharField()
|
|
131
|
+
remote_chg_id = models.CharField()
|
|
132
|
+
units = models.IntegerField()
|
|
133
|
+
epsdt = models.CharField()
|
|
134
|
+
family_planning = models.CharField(choices=FamilyPlanningOptions.choices)
|
|
135
|
+
|
|
136
|
+
created = models.DateTimeField()
|
|
137
|
+
modified = models.DateTimeField()
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
__exports__ = ("ClaimLineItem", "ClaimLineItemStatus", "LineItemCodes", "FamilyPlanningOptions")
|
canvas_sdk/v1/data/command.py
CHANGED
|
@@ -13,9 +13,18 @@ class Command(models.Model):
|
|
|
13
13
|
dbid = models.BigIntegerField(primary_key=True)
|
|
14
14
|
created = models.DateTimeField()
|
|
15
15
|
modified = models.DateTimeField()
|
|
16
|
-
originator = models.ForeignKey(
|
|
17
|
-
|
|
18
|
-
|
|
16
|
+
originator = models.ForeignKey(
|
|
17
|
+
"v1.CanvasUser", on_delete=models.DO_NOTHING, null=True, related_name="commands_originated"
|
|
18
|
+
)
|
|
19
|
+
committer = models.ForeignKey(
|
|
20
|
+
"v1.CanvasUser", on_delete=models.DO_NOTHING, null=True, related_name="commands_committed"
|
|
21
|
+
)
|
|
22
|
+
entered_in_error = models.ForeignKey(
|
|
23
|
+
"v1.CanvasUser",
|
|
24
|
+
on_delete=models.DO_NOTHING,
|
|
25
|
+
null=True,
|
|
26
|
+
related_name="commands_entered_in_error",
|
|
27
|
+
)
|
|
19
28
|
state = models.CharField()
|
|
20
29
|
patient = models.ForeignKey("v1.Patient", on_delete=models.DO_NOTHING, null=True)
|
|
21
30
|
note = models.ForeignKey("v1.Note", on_delete=models.DO_NOTHING, related_name="commands")
|
canvas_sdk/v1/data/condition.py
CHANGED
|
@@ -50,14 +50,19 @@ class Condition(models.Model):
|
|
|
50
50
|
id = models.UUIDField()
|
|
51
51
|
dbid = models.BigIntegerField(primary_key=True)
|
|
52
52
|
deleted = models.BooleanField()
|
|
53
|
-
entered_in_error = models.ForeignKey(
|
|
54
|
-
|
|
53
|
+
entered_in_error = models.ForeignKey(
|
|
54
|
+
"v1.CanvasUser", on_delete=models.DO_NOTHING, null=True, related_name="+"
|
|
55
|
+
)
|
|
56
|
+
committer = models.ForeignKey(
|
|
57
|
+
"v1.CanvasUser", on_delete=models.DO_NOTHING, null=True, related_name="+"
|
|
58
|
+
)
|
|
55
59
|
patient = models.ForeignKey(
|
|
56
60
|
"v1.Patient", on_delete=models.DO_NOTHING, related_name="conditions", null=True
|
|
57
61
|
)
|
|
58
62
|
onset_date = models.DateField()
|
|
59
63
|
resolution_date = models.DateField()
|
|
60
64
|
clinical_status = models.CharField(choices=ClinicalStatus.choices)
|
|
65
|
+
surgical = models.BooleanField()
|
|
61
66
|
|
|
62
67
|
|
|
63
68
|
class ConditionCoding(models.Model):
|
|
@@ -14,9 +14,15 @@ class DetectedIssue(models.Model):
|
|
|
14
14
|
modified = models.DateTimeField()
|
|
15
15
|
identified = models.DateTimeField()
|
|
16
16
|
deleted = models.BooleanField()
|
|
17
|
-
originator = models.ForeignKey(
|
|
18
|
-
|
|
19
|
-
|
|
17
|
+
originator = models.ForeignKey(
|
|
18
|
+
"v1.CanvasUser", on_delete=models.DO_NOTHING, null=True, related_name="+"
|
|
19
|
+
)
|
|
20
|
+
committer = models.ForeignKey(
|
|
21
|
+
"v1.CanvasUser", on_delete=models.DO_NOTHING, null=True, related_name="+"
|
|
22
|
+
)
|
|
23
|
+
entered_in_error = models.ForeignKey(
|
|
24
|
+
"v1.CanvasUser", on_delete=models.DO_NOTHING, null=True, related_name="+"
|
|
25
|
+
)
|
|
20
26
|
patient = models.ForeignKey(
|
|
21
27
|
"v1.Patient", on_delete=models.DO_NOTHING, related_name="detected_issues", null=True
|
|
22
28
|
)
|
canvas_sdk/v1/data/device.py
CHANGED
|
@@ -12,9 +12,15 @@ class Device(models.Model):
|
|
|
12
12
|
dbid = models.BigIntegerField(primary_key=True)
|
|
13
13
|
created = models.DateTimeField()
|
|
14
14
|
modified = models.DateTimeField()
|
|
15
|
-
originator = models.ForeignKey(
|
|
16
|
-
|
|
17
|
-
|
|
15
|
+
originator = models.ForeignKey(
|
|
16
|
+
"v1.CanvasUser", on_delete=models.DO_NOTHING, null=True, related_name="+"
|
|
17
|
+
)
|
|
18
|
+
committer = models.ForeignKey(
|
|
19
|
+
"v1.CanvasUser", on_delete=models.DO_NOTHING, null=True, related_name="+"
|
|
20
|
+
)
|
|
21
|
+
entered_in_error = models.ForeignKey(
|
|
22
|
+
"v1.CanvasUser", on_delete=models.DO_NOTHING, null=True, related_name="+"
|
|
23
|
+
)
|
|
18
24
|
patient = models.ForeignKey(
|
|
19
25
|
"v1.Patient", on_delete=models.DO_NOTHING, related_name="devices", null=True
|
|
20
26
|
)
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
from django.db import models
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class Discount(models.Model):
|
|
5
|
+
"""Model to represent a discount applied to a claim or patient posting."""
|
|
6
|
+
|
|
7
|
+
class Meta:
|
|
8
|
+
managed = False
|
|
9
|
+
db_table = "canvas_sdk_data_quality_and_revenue_discount_001"
|
|
10
|
+
|
|
11
|
+
dbid = models.BigIntegerField(primary_key=True)
|
|
12
|
+
name = models.CharField()
|
|
13
|
+
adjustment_group = models.CharField()
|
|
14
|
+
adjustment_code = models.CharField()
|
|
15
|
+
discount = models.DecimalField(max_digits=8, decimal_places=2)
|
|
16
|
+
|
|
17
|
+
created = models.DateTimeField()
|
|
18
|
+
modified = models.DateTimeField()
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
__exports__ = ("Discount",)
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
from typing import Any, cast
|
|
2
|
+
|
|
3
|
+
from django import forms
|
|
4
|
+
from django.contrib.postgres.fields import ArrayField
|
|
5
|
+
from django.forms import SelectMultiple
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class ArraySelectMultiple(SelectMultiple):
|
|
9
|
+
"""ArraySelectMultiple."""
|
|
10
|
+
|
|
11
|
+
def value_omitted_from_data(self, data: Any, files: Any, name: str) -> bool:
|
|
12
|
+
"""Override to check if the value is omitted from data."""
|
|
13
|
+
return False
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class ChoiceArrayField(ArrayField):
|
|
17
|
+
"""ChoiceArrayField."""
|
|
18
|
+
|
|
19
|
+
def formfield(
|
|
20
|
+
self,
|
|
21
|
+
form_class: type[forms.Field] | None = None,
|
|
22
|
+
choices_form_class: type[forms.ChoiceField] | None = None,
|
|
23
|
+
**kwargs: Any,
|
|
24
|
+
) -> forms.Field:
|
|
25
|
+
"""Override formfield to use a custom widget."""
|
|
26
|
+
defaults = {
|
|
27
|
+
"form_class": forms.TypedMultipleChoiceField,
|
|
28
|
+
"choices": self.base_field.choices,
|
|
29
|
+
"coerce": self.base_field.to_python,
|
|
30
|
+
"widget": ArraySelectMultiple,
|
|
31
|
+
}
|
|
32
|
+
defaults.update(kwargs)
|
|
33
|
+
|
|
34
|
+
return cast(forms.Field, super(ArrayField, self).formfield(**defaults)) # type: ignore[arg-type]
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
__exports__ = ()
|
canvas_sdk/v1/data/imaging.py
CHANGED
|
@@ -19,10 +19,16 @@ class ImagingOrder(models.Model):
|
|
|
19
19
|
dbid = models.BigIntegerField(primary_key=True)
|
|
20
20
|
created = models.DateTimeField()
|
|
21
21
|
modified = models.DateTimeField()
|
|
22
|
-
originator = models.ForeignKey(
|
|
22
|
+
originator = models.ForeignKey(
|
|
23
|
+
"v1.CanvasUser", on_delete=models.DO_NOTHING, null=True, related_name="+"
|
|
24
|
+
)
|
|
23
25
|
deleted = models.BooleanField()
|
|
24
|
-
committer = models.ForeignKey(
|
|
25
|
-
|
|
26
|
+
committer = models.ForeignKey(
|
|
27
|
+
"v1.CanvasUser", on_delete=models.DO_NOTHING, null=True, related_name="+"
|
|
28
|
+
)
|
|
29
|
+
entered_in_error = models.ForeignKey(
|
|
30
|
+
"v1.CanvasUser", on_delete=models.DO_NOTHING, related_name="+"
|
|
31
|
+
)
|
|
26
32
|
patient = models.ForeignKey(
|
|
27
33
|
"v1.Patient", on_delete=models.DO_NOTHING, related_name="imaging_orders", null=True
|
|
28
34
|
)
|
|
@@ -52,10 +58,16 @@ class ImagingReview(models.Model):
|
|
|
52
58
|
dbid = models.BigIntegerField(primary_key=True)
|
|
53
59
|
created = models.DateTimeField()
|
|
54
60
|
modified = models.DateTimeField()
|
|
55
|
-
originator = models.ForeignKey(
|
|
61
|
+
originator = models.ForeignKey(
|
|
62
|
+
"v1.CanvasUser", on_delete=models.DO_NOTHING, null=True, related_name="+"
|
|
63
|
+
)
|
|
56
64
|
deleted = models.BooleanField()
|
|
57
|
-
committer = models.ForeignKey(
|
|
58
|
-
|
|
65
|
+
committer = models.ForeignKey(
|
|
66
|
+
"v1.CanvasUser", on_delete=models.DO_NOTHING, null=True, related_name="+"
|
|
67
|
+
)
|
|
68
|
+
entered_in_error = models.ForeignKey(
|
|
69
|
+
"v1.CanvasUser", on_delete=models.DO_NOTHING, null=True, related_name="+"
|
|
70
|
+
)
|
|
59
71
|
patient_communication_method = models.CharField(choices=ReviewPatientCommunicationMethod)
|
|
60
72
|
# TODO - uncomment when Note model is complete
|
|
61
73
|
# note = models.ForeignKey('v1.Note', on_delete=models.DO_NOTHING, related_name="imaging_reviews", null=True)
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
from django.db import models
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class InvoiceRecipients(models.TextChoices):
|
|
5
|
+
"""Choices for invoice recipients."""
|
|
6
|
+
|
|
7
|
+
PATIENT = "patient", "Patient"
|
|
8
|
+
GUARANTOR = "guarantor", "Guarantor"
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class InvoiceStatus(models.TextChoices):
|
|
12
|
+
"""Choices for invoice status."""
|
|
13
|
+
|
|
14
|
+
ACTIVE = "active", "Active"
|
|
15
|
+
ERROR = "error", "Error"
|
|
16
|
+
ARCHIVED = "archived", "Archived"
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class InvoiceWorkflow(models.TextChoices):
|
|
20
|
+
"""Choices for invoice workflow."""
|
|
21
|
+
|
|
22
|
+
AUTOMATED = "automated", "Automated"
|
|
23
|
+
ADHOC = "adhoc", "Adhoc"
|
|
24
|
+
BATCH = "batch", "Batch"
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class InvoiceSentMeans(models.TextChoices):
|
|
28
|
+
"""Choices for how the invoice was sent."""
|
|
29
|
+
|
|
30
|
+
MAIL = "mail", "Mail"
|
|
31
|
+
EMAIL = "e-mail", "E-mail"
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class Invoice(models.Model):
|
|
35
|
+
"""Represents a full invoice for a patient."""
|
|
36
|
+
|
|
37
|
+
class Meta:
|
|
38
|
+
managed = False
|
|
39
|
+
db_table = "canvas_sdk_data_quality_and_revenue_invoicefull_001"
|
|
40
|
+
|
|
41
|
+
dbid = models.BigIntegerField(primary_key=True)
|
|
42
|
+
originator = models.ForeignKey(
|
|
43
|
+
"v1.CanvasUser", on_delete=models.PROTECT, related_name="generated_invoices"
|
|
44
|
+
)
|
|
45
|
+
recipient = models.ForeignKey("v1.Patient", on_delete=models.CASCADE, related_name="invoices")
|
|
46
|
+
recipient_type = models.CharField(max_length=10, choices=InvoiceRecipients.choices)
|
|
47
|
+
total_amount = models.DecimalField(max_digits=8, decimal_places=2)
|
|
48
|
+
# invoice_pdf = models.FileField(blank=True, null=True, upload_to=invoice_upload)
|
|
49
|
+
status = models.CharField(max_length=10, choices=InvoiceStatus.choices)
|
|
50
|
+
workflow = models.CharField(max_length=10, choices=InvoiceWorkflow.choices)
|
|
51
|
+
# claims = models.ManyToManyField("v1.Claim", related_name="full_invoices")
|
|
52
|
+
error_message = models.TextField()
|
|
53
|
+
sent_mean = models.CharField(max_length=6, choices=InvoiceSentMeans.choices)
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
__exports__ = (
|
|
57
|
+
"Invoice",
|
|
58
|
+
"InvoiceRecipients",
|
|
59
|
+
"InvoiceStatus",
|
|
60
|
+
"InvoiceWorkflow",
|
|
61
|
+
"InvoiceSentMeans",
|
|
62
|
+
)
|
canvas_sdk/v1/data/lab.py
CHANGED
|
@@ -61,9 +61,15 @@ class LabReport(models.Model):
|
|
|
61
61
|
original_date = models.DateTimeField()
|
|
62
62
|
date_performed = models.DateTimeField()
|
|
63
63
|
custom_document_name = models.CharField()
|
|
64
|
-
originator = models.ForeignKey(
|
|
65
|
-
|
|
66
|
-
|
|
64
|
+
originator = models.ForeignKey(
|
|
65
|
+
"v1.CanvasUser", on_delete=models.DO_NOTHING, null=True, related_name="+"
|
|
66
|
+
)
|
|
67
|
+
committer = models.ForeignKey(
|
|
68
|
+
"v1.CanvasUser", on_delete=models.DO_NOTHING, null=True, related_name="+"
|
|
69
|
+
)
|
|
70
|
+
entered_in_error = models.ForeignKey(
|
|
71
|
+
"v1.CanvasUser", on_delete=models.DO_NOTHING, null=True, related_name="+"
|
|
72
|
+
)
|
|
67
73
|
deleted = models.BooleanField()
|
|
68
74
|
|
|
69
75
|
|
|
@@ -89,10 +95,16 @@ class LabReview(models.Model):
|
|
|
89
95
|
dbid = models.BigIntegerField(primary_key=True)
|
|
90
96
|
created = models.DateTimeField()
|
|
91
97
|
modified = models.DateTimeField()
|
|
92
|
-
originator = models.ForeignKey(
|
|
98
|
+
originator = models.ForeignKey(
|
|
99
|
+
"v1.CanvasUser", on_delete=models.DO_NOTHING, null=True, related_name="+"
|
|
100
|
+
)
|
|
93
101
|
deleted = models.BooleanField()
|
|
94
|
-
committer = models.ForeignKey(
|
|
95
|
-
|
|
102
|
+
committer = models.ForeignKey(
|
|
103
|
+
"v1.CanvasUser", on_delete=models.DO_NOTHING, null=True, related_name="+"
|
|
104
|
+
)
|
|
105
|
+
entered_in_error = models.ForeignKey(
|
|
106
|
+
"v1.CanvasUser", on_delete=models.DO_NOTHING, null=True, related_name="+"
|
|
107
|
+
)
|
|
96
108
|
internal_comment = models.TextField()
|
|
97
109
|
message_to_patient = models.CharField()
|
|
98
110
|
status = models.CharField()
|
|
@@ -194,10 +206,16 @@ class LabOrder(models.Model):
|
|
|
194
206
|
dbid = models.BigIntegerField(primary_key=True)
|
|
195
207
|
created = models.DateTimeField()
|
|
196
208
|
modified = models.DateTimeField()
|
|
197
|
-
originator = models.ForeignKey(
|
|
209
|
+
originator = models.ForeignKey(
|
|
210
|
+
"v1.CanvasUser", on_delete=models.DO_NOTHING, null=True, related_name="+"
|
|
211
|
+
)
|
|
198
212
|
deleted = models.BooleanField()
|
|
199
|
-
committer = models.ForeignKey(
|
|
200
|
-
|
|
213
|
+
committer = models.ForeignKey(
|
|
214
|
+
"v1.CanvasUser", on_delete=models.DO_NOTHING, null=True, related_name="+"
|
|
215
|
+
)
|
|
216
|
+
entered_in_error = models.ForeignKey(
|
|
217
|
+
"v1.CanvasUser", on_delete=models.DO_NOTHING, null=True, related_name="+"
|
|
218
|
+
)
|
|
201
219
|
patient = models.ForeignKey(
|
|
202
220
|
"v1.Patient", on_delete=models.DO_NOTHING, related_name="lab_orders", null=True
|
|
203
221
|
)
|
|
@@ -240,10 +258,16 @@ class LabOrderReason(models.Model):
|
|
|
240
258
|
dbid = models.BigIntegerField(primary_key=True)
|
|
241
259
|
created = models.DateTimeField()
|
|
242
260
|
modified = models.DateTimeField()
|
|
243
|
-
originator = models.ForeignKey(
|
|
261
|
+
originator = models.ForeignKey(
|
|
262
|
+
"v1.CanvasUser", on_delete=models.DO_NOTHING, null=True, related_name="+"
|
|
263
|
+
)
|
|
244
264
|
deleted = models.BooleanField()
|
|
245
|
-
committer = models.ForeignKey(
|
|
246
|
-
|
|
265
|
+
committer = models.ForeignKey(
|
|
266
|
+
"v1.CanvasUser", on_delete=models.DO_NOTHING, null=True, related_name="+"
|
|
267
|
+
)
|
|
268
|
+
entered_in_error = models.ForeignKey(
|
|
269
|
+
"v1.CanvasUser", on_delete=models.DO_NOTHING, null=True, related_name="+"
|
|
270
|
+
)
|
|
247
271
|
order = models.ForeignKey(
|
|
248
272
|
LabOrder, on_delete=models.DO_NOTHING, related_name="reasons", null=True
|
|
249
273
|
)
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
from django.db import models
|
|
2
|
+
from django.db.models import QuerySet
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
class AbstractLineItemQuerySet(models.QuerySet):
|
|
6
|
+
"""AbstractLineItemQuerySet."""
|
|
7
|
+
|
|
8
|
+
def active(self) -> QuerySet:
|
|
9
|
+
"""Filter out line items that have been entered in error."""
|
|
10
|
+
return self.filter(entered_in_error__isnull=True)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class AbstractLineItemTransaction(models.Model):
|
|
14
|
+
"""Abstract class with common properties for both payments and adjustments."""
|
|
15
|
+
|
|
16
|
+
class Meta:
|
|
17
|
+
abstract = True
|
|
18
|
+
|
|
19
|
+
objects = AbstractLineItemQuerySet.as_manager()
|
|
20
|
+
|
|
21
|
+
dbid = models.BigIntegerField(primary_key=True)
|
|
22
|
+
posting = models.ForeignKey(
|
|
23
|
+
"v1.BasePosting", related_name="%(class)ss", on_delete=models.PROTECT
|
|
24
|
+
)
|
|
25
|
+
billing_line_item = models.ForeignKey(
|
|
26
|
+
"v1.BillingLineItem", related_name="%(class)ss", on_delete=models.PROTECT
|
|
27
|
+
)
|
|
28
|
+
amount = models.DecimalField(max_digits=8, decimal_places=2)
|
|
29
|
+
|
|
30
|
+
created = models.DateTimeField()
|
|
31
|
+
modified = models.DateTimeField()
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class NewLineItemPayment(AbstractLineItemTransaction):
|
|
35
|
+
"""Subclass that represents a payment on a billing line item."""
|
|
36
|
+
|
|
37
|
+
class Meta:
|
|
38
|
+
managed = False
|
|
39
|
+
db_table = "canvas_sdk_data_quality_and_revenue_newlineitempayment_001"
|
|
40
|
+
|
|
41
|
+
charged = models.DecimalField(max_digits=8, decimal_places=2)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
class AbstractLineItemAdjustment(AbstractLineItemTransaction):
|
|
45
|
+
"""Abstract subclass with common fields for both adjustment and transfer."""
|
|
46
|
+
|
|
47
|
+
class Meta:
|
|
48
|
+
abstract = True
|
|
49
|
+
|
|
50
|
+
code = models.CharField()
|
|
51
|
+
group = models.CharField()
|
|
52
|
+
|
|
53
|
+
deviated_from_posting_ruleset = models.BooleanField()
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
class NewLineItemAdjustment(AbstractLineItemAdjustment):
|
|
57
|
+
"""Subclass for billing line item adjustments."""
|
|
58
|
+
|
|
59
|
+
class Meta:
|
|
60
|
+
managed = False
|
|
61
|
+
db_table = "canvas_sdk_data_quality_and_revenue_newlineitemadjustment_001"
|
|
62
|
+
|
|
63
|
+
write_off = models.BooleanField()
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
class LineItemTransfer(AbstractLineItemAdjustment):
|
|
67
|
+
"""Subclass for billing line item balance transfer to other coverages or patient."""
|
|
68
|
+
|
|
69
|
+
class Meta:
|
|
70
|
+
managed = False
|
|
71
|
+
db_table = "canvas_sdk_data_quality_and_revenue_lineitemtransfer_001"
|
|
72
|
+
|
|
73
|
+
transfer_to = models.ForeignKey(
|
|
74
|
+
"v1.ClaimCoverage", related_name="transfers", on_delete=models.PROTECT, null=True
|
|
75
|
+
)
|
|
76
|
+
transfer_to_patient = models.BooleanField(default=False)
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
__exports__ = (
|
|
80
|
+
"NewLineItemPayment",
|
|
81
|
+
"NewLineItemAdjustment",
|
|
82
|
+
"LineItemTransfer",
|
|
83
|
+
)
|
canvas_sdk/v1/data/medication.py
CHANGED
|
@@ -44,8 +44,12 @@ class Medication(models.Model):
|
|
|
44
44
|
"v1.Patient", on_delete=models.DO_NOTHING, related_name="medications", null=True
|
|
45
45
|
)
|
|
46
46
|
deleted = models.BooleanField()
|
|
47
|
-
entered_in_error = models.ForeignKey(
|
|
48
|
-
|
|
47
|
+
entered_in_error = models.ForeignKey(
|
|
48
|
+
"v1.CanvasUser", on_delete=models.DO_NOTHING, null=True, related_name="+"
|
|
49
|
+
)
|
|
50
|
+
committer = models.ForeignKey(
|
|
51
|
+
"v1.CanvasUser", on_delete=models.DO_NOTHING, null=True, related_name="+"
|
|
52
|
+
)
|
|
49
53
|
status = models.CharField(choices=Status.choices)
|
|
50
54
|
start_date = models.DateTimeField()
|
|
51
55
|
end_date = models.DateTimeField()
|
|
@@ -34,9 +34,15 @@ class Observation(models.Model):
|
|
|
34
34
|
dbid = models.BigIntegerField(primary_key=True)
|
|
35
35
|
created = models.DateTimeField()
|
|
36
36
|
modified = models.DateTimeField()
|
|
37
|
-
originator = models.ForeignKey(
|
|
38
|
-
|
|
39
|
-
|
|
37
|
+
originator = models.ForeignKey(
|
|
38
|
+
"v1.CanvasUser", on_delete=models.DO_NOTHING, null=True, related_name="+"
|
|
39
|
+
)
|
|
40
|
+
committer = models.ForeignKey(
|
|
41
|
+
"v1.CanvasUser", on_delete=models.DO_NOTHING, null=True, related_name="+"
|
|
42
|
+
)
|
|
43
|
+
entered_in_error = models.ForeignKey(
|
|
44
|
+
"v1.CanvasUser", on_delete=models.DO_NOTHING, null=True, related_name="+"
|
|
45
|
+
)
|
|
40
46
|
deleted = models.BooleanField()
|
|
41
47
|
patient = models.ForeignKey(
|
|
42
48
|
"v1.Patient", on_delete=models.DO_NOTHING, related_name="observations", null=True
|
|
@@ -25,7 +25,9 @@ class Organization(models.Model):
|
|
|
25
25
|
group_npi_number = models.CharField()
|
|
26
26
|
group_taxonomy_number = models.CharField()
|
|
27
27
|
include_zz_qualifier = models.BooleanField()
|
|
28
|
-
main_location = models.OneToOneField(
|
|
28
|
+
main_location = models.OneToOneField(
|
|
29
|
+
"v1.PracticeLocation", on_delete=models.DO_NOTHING, related_name="+"
|
|
30
|
+
)
|
|
29
31
|
|
|
30
32
|
|
|
31
33
|
__exports__ = ("Organization",)
|
canvas_sdk/v1/data/patient.py
CHANGED
|
@@ -52,6 +52,9 @@ class Patient(models.Model):
|
|
|
52
52
|
first_name = models.CharField()
|
|
53
53
|
last_name = models.CharField()
|
|
54
54
|
birth_date = models.DateField()
|
|
55
|
+
business_line = models.ForeignKey(
|
|
56
|
+
"v1.BusinessLine", on_delete=models.DO_NOTHING, related_name="patients"
|
|
57
|
+
)
|
|
55
58
|
sex_at_birth = models.CharField(choices=SexAtBirth.choices)
|
|
56
59
|
created = models.DateTimeField()
|
|
57
60
|
modified = models.DateTimeField()
|
|
@@ -129,6 +132,16 @@ class Patient(models.Model):
|
|
|
129
132
|
return None
|
|
130
133
|
return pharmacy_setting
|
|
131
134
|
|
|
135
|
+
@property
|
|
136
|
+
def preferred_full_name(self) -> str:
|
|
137
|
+
"""Returns the patient's preferred full name, taking nickname into consideration."""
|
|
138
|
+
return " ".join(n for n in (self.preferred_first_name, self.last_name, self.suffix) if n)
|
|
139
|
+
|
|
140
|
+
@property
|
|
141
|
+
def preferred_first_name(self) -> str:
|
|
142
|
+
"""Returns the patient's preferred first name, taking nickname into consideration."""
|
|
143
|
+
return self.nickname or self.first_name
|
|
144
|
+
|
|
132
145
|
|
|
133
146
|
class PatientContactPoint(models.Model):
|
|
134
147
|
"""A class representing a patient contact point."""
|
|
@@ -197,7 +210,10 @@ class PatientExternalIdentifier(models.Model):
|
|
|
197
210
|
created = models.DateTimeField()
|
|
198
211
|
modified = models.DateTimeField()
|
|
199
212
|
patient = models.ForeignKey(
|
|
200
|
-
"v1.Patient",
|
|
213
|
+
"v1.Patient",
|
|
214
|
+
related_name="external_identifiers",
|
|
215
|
+
on_delete=models.DO_NOTHING,
|
|
216
|
+
null=True,
|
|
201
217
|
)
|
|
202
218
|
use = models.CharField()
|
|
203
219
|
identifier_type = models.CharField()
|