"""Pydantic models for Resources."""
from datetime import datetime
from typing import ClassVar, Literal
from pydantic import Field, field_validator
from sapimclient import const
from .base import (
AdjustmentContext,
Assignment,
BusinessUnitAssignment,
Generic16Mixin,
Generic32Mixin,
Reference,
Resource,
RuleUsage,
SalesTransactionAssignment,
Value,
)
[docs]
class AppliedDeposit(Resource):
"""AppliedDeposit.
Note:
Supports only ``read`` operations.
"""
attr_endpoint: ClassVar[str] = 'api/v2/appliedDeposits'
attr_seq: ClassVar[str] = 'applied_deposit_seq'
applied_deposit_seq: str | None = None
position: str | Reference
payee: str | Reference
period: str | Reference
earning_group_id: str
earning_code_id: str
trial_pipeline_run: str
trial_pipeline_run_date: datetime
post_pipeline_run: str | None = None
post_pipeline_run_date: datetime | None = None
entry_number: str
value: Value
processing_unit: str | None = None
[docs]
class AuditLog(Resource):
"""Audit Log.
Note:
Supports only ``read`` operations.
"""
attr_endpoint: ClassVar[str] = 'api/v2/auditLogs'
attr_seq: ClassVar[str] = 'audit_log_seq'
audit_log_seq: str | None = None
event_date: datetime
event_type: str
event_description: str | None = None
business_unit: BusinessUnitAssignment
object_seq: str
object_name: str
object_type: str
user_id: str
model_seq: str | None = None
[docs]
class Balance(Resource):
"""Balance.
Note:
Supports only ``read`` operations.
"""
attr_endpoint: ClassVar[str] = 'api/v2/balances'
attr_seq: ClassVar[str] = 'balance_seq'
balance_seq: str | None = None
position: str | Reference
payee: str | Reference
period: str | Reference
earning_group_id: str
earning_code_id: str
trial_pipeline_run: str
trial_pipeline_run_date: datetime
apply_pipeline_run: str | None = None
apply_pipeline_run_date: datetime | None = None
post_pipeline_run: str | None = None
post_pipeline_run_date: datetime | None = None
balance_status_id: str
value: Value
processing_unit: str | None = None
[docs]
class BusinessUnit(Resource):
"""Business Unit."""
attr_endpoint: ClassVar[str] = 'api/v2/businessUnits'
attr_seq: ClassVar[str] = 'business_unit_seq'
business_unit_seq: str | None = None
name: str
description: str | None = None
mask: str | None = None
processing_unit: str | None = None
[docs]
class Calendar(Resource):
"""Calendar."""
attr_endpoint: ClassVar[str] = 'api/v2/calendars'
attr_seq: ClassVar[str] = 'calendar_seq'
calendar_seq: str | None = None
name: str
description: str | None = None
minor_period_type: str | Reference | None = None
major_period_type: str | Reference | None = None
created_by: str | None = Field(None, exclude=True, repr=False)
create_date: datetime | None = Field(None, exclude=True, repr=False)
modified_by: str | None = Field(None, exclude=True, repr=False)
[docs]
class CategoryClassifier(Resource):
"""categoryClassifier."""
attr_endpoint: ClassVar[str] = 'api/v2/categoryClassifiers'
attr_seq: ClassVar[str] = 'category_classifiers_seq'
category_classifiers_seq: str | None = None
category_tree: str | Reference
category: str | Reference
classifier: str | Reference
effective_start_date: datetime
effective_end_date: datetime
created_by: str | None = Field(None, exclude=True, repr=False)
create_date: datetime | None = Field(None, exclude=True, repr=False)
modified_by: str | None = Field(None, exclude=True, repr=False)
[docs]
class CategoryTree(Resource):
"""CategoryTree."""
attr_endpoint: ClassVar[str] = 'api/v2/categoryTrees'
attr_seq: ClassVar[str] = 'category_tree_seq'
category_tree_seq: str | None = None
name: str
description: str | None = None
classifier_selector_id: str | None = None
classifier_class: str
effective_start_date: datetime
effective_end_date: datetime
business_units: list[str] | None = None
created_by: str | None = Field(None, exclude=True, repr=False)
create_date: datetime | None = Field(None, exclude=True, repr=False)
modified_by: str | None = Field(None, exclude=True, repr=False)
[docs]
class Commission(Resource):
"""Commission.
TODO: No results.
"""
attr_endpoint: ClassVar[str] = 'api/v2/commissions'
attr_seq: ClassVar[str] = 'commission_seq'
commission_seq: str | None = None
position: str | Reference
payee: str | Reference
period: str | Reference
incentive: str | Reference
credit: str | Reference
pipeline_run: str
pipeline_run_date: datetime
value: Value
rate_value: Value
entry_number: Value
business_units: list[str] | None = None
processing_unit: str | None = None
is_private: bool | None = None
origin_type_id: str
[docs]
class Credit(Resource, Generic16Mixin):
"""Credit."""
attr_endpoint: ClassVar[str] = 'api/v2/credits'
attr_seq: ClassVar[str] = 'credit_seq'
credit_seq: str | None = None
name: str
position: str | Reference
payee: str | Reference
sales_order: str | Reference
sales_transaction: str | Reference | None = None
period: str | Reference
credit_type: str | Reference
value: Value
preadjusted_value: Value
origin_type_id: str
reason: str | Reference | None = None
rule: str | Reference | None = None
is_rollable: bool | None = None
roll_date: datetime | None = None
is_held: bool | None = None
release_date: datetime | None = None
pipeline_run: str | None = None
pipeline_run_date: datetime | None = None
compensation_date: datetime | None = None
comments: str | None = None
is_private: bool | None = None
business_units: list[str] | None = None
processing_unit: str | None = None
[docs]
class Deposit(Resource, Generic16Mixin):
"""Deposit."""
attr_endpoint: ClassVar[str] = 'api/v2/deposits'
attr_seq: ClassVar[str] = 'deposit_seq'
deposit_seq: str | None = None
name: str
earning_group_id: str
earning_code_id: str
payee: str | Reference
position: str | Reference
period: str | Reference
value: Value
preadjusted_value: Value
origin_type_id: str
reason: str | None = None
business_units: list[str] | None = None
rule: str | Reference | None = None
deposit_date: datetime | None = None
is_held: bool | None = None
release_date: datetime | None = None
pipeline_run: str | None = None
pipeline_run_date: datetime | None = None
processing_unit: str | None = None
comments: str | None = None
is_private: bool | None = None
model_seq: str | None = None
[docs]
class EarningGroupCode(Resource):
"""EarningGroupCode."""
attr_endpoint: ClassVar[str] = 'api/v2/earningGroupCodes'
attr_seq: ClassVar[str] = 'earning_group_code_seq'
earning_group_code_seq: str | None = None
earning_group_code: str
earning_code_id: str
earning_group_id: str
created_by: str | None = Field(None, exclude=True, repr=False)
create_date: datetime | None = Field(None, exclude=True, repr=False)
modified_by: str | None = Field(None, exclude=True, repr=False)
[docs]
class GenericClassifier(Resource, Generic16Mixin):
"""Generic Classifier."""
attr_endpoint: ClassVar[str] = 'api/v2/genericClassifiers'
attr_seq: ClassVar[str] = 'generic_classifier_seq'
generic_classifier_seq: str | None = None
name: str | None = None
description: str | None = None
classifier_id: str
classifier_seq: str
selector_id: str
effective_start_date: datetime
effective_end_date: datetime
business_units: list[str] | None = None
created_by: str | None = Field(None, exclude=True, repr=False)
create_date: datetime | None = Field(None, exclude=True, repr=False)
modified_by: str | None = Field(None, exclude=True, repr=False)
[docs]
class GenericClassifierType(Resource):
"""Generic Classifier Type."""
attr_endpoint: ClassVar[str] = 'api/v2/genericClassifierTypes'
attr_seq: ClassVar[str] = 'generic_classifier_type_seq'
generic_classifier_type_seq: int | None = None
name: str
[docs]
class GlobalFieldName(Resource):
"""Global Field Name."""
attr_endpoint: ClassVar[str] = 'api/v2/globalFieldNames'
attr_seq: ClassVar[str] = 'global_field_name_seq'
global_field_name_seq: str | None = None
name: str
description: str | None = None
global_field_name_data_type_length: int
# class Group(Resource):
# """Group."""
# attr_endpoint: ClassVar[str] = "api/v2/groups"
# attr_seq: ClassVar[str] = "group_seq"
# group_seq: str | None = None
# name: str
# description: str | None = None
[docs]
class Incentive(Resource, Generic16Mixin):
"""Incentive."""
attr_endpoint: ClassVar[str] = 'api/v2/incentives'
attr_seq: ClassVar[str] = 'incentive_seq'
incentive_seq: str | None = None
name: str | None = None
quota: Value | None = None
attainment: Value | None = None
position: str | Reference
payee: str | Reference
period: str | Reference
rule: str | Reference | None = None
value: Value
release_date: datetime | None = None
pipeline_run: str | None = None
pipeline_run_date: datetime | None = None
is_active: bool = True
is_private: bool | None = None
processing_unit: str | None = None
business_units: list[str] | None = None
[docs]
class Measurement(Resource, Generic16Mixin):
"""Measurement."""
attr_endpoint: ClassVar[str] = 'api/v2/measurements'
attr_seq: ClassVar[str] = 'measurement_seq'
measurement_seq: str | None = None
name: str
position: str | Reference
payee: str | Reference
period: str | Reference
rule: str | Reference | None = None
value: Value
pipeline_run: str | None = None
pipeline_run_date: datetime | None = None
number_of_credits: Value
is_private: bool | None = None
processing_unit: str | None = None
business_units: list[str] | None = None
[docs]
class PrimaryMeasurement(Measurement):
"""Primary Measurement."""
attr_endpoint: ClassVar[str] = 'api/v2/primaryMeasurements'
[docs]
class SecondaryMeasurement(Measurement):
"""Secondary Measurement."""
attr_endpoint: ClassVar[str] = 'api/v2/secondaryMeasurements'
[docs]
class Message(Resource):
"""Message."""
attr_endpoint: ClassVar[str] = 'api/v2/messages'
attr_seq: ClassVar[str] = 'message_seq'
message_seq: str | None = None
message_key: str
message_time_stamp: datetime
argument_count: int
sub_category: str
message_log: str
module: str
rule: str | Reference | None = None
payee: str | Reference | None = None
message_type: str
run_period: str | Reference | None = None
object_seq: str | None = None
sales_transaction: str | None = None
position: str | Reference | None = None
category: str | None = None
credit: str | None = None
[docs]
class MessageLog(Resource):
"""Message Log."""
attr_endpoint: ClassVar[str] = 'api/v2/messageLogs'
attr_seq: ClassVar[str] = 'message_log_seq'
message_log_seq: str | None = None
source_seq: str | None = None
component_name: str
log_date: datetime
log_name: str
[docs]
class Participant(Resource, Generic16Mixin):
"""Participant."""
attr_endpoint: ClassVar[str] = 'api/v2/participants'
attr_seq: ClassVar[str] = 'payee_seq'
payee_seq: str | None = None
payee_id: str
first_name: str | None = None
middle_name: str | None = None
last_name: str
participant_email: str | None = None
prefix: str | None = None
suffix: str | None = None
effective_start_date: datetime
effective_end_date: datetime
hire_date: datetime | None = None
termination_date: datetime | None = None
salary: Value | None = None
user_id: str
preferred_language: str | None = None
event_calendar: str | Reference | None = None
tax_id: str | None = None
business_units: list[str] | None = None
created_by: str | None = Field(None, exclude=True, repr=False)
create_date: datetime | None = Field(None, exclude=True, repr=False)
modified_by: str | None = Field(None, exclude=True, repr=False)
# class Payment(Resource):
# """Payment."""
# attr_endpoint: ClassVar[str] = "api/v2/payments"
# attr_seq: ClassVar[str] = "payment_seq"
# payment_seq: str | None = None
# position: str | Reference
# payee: str | Reference
# period: str | Reference
# earning_group_id: str
# earning_code_id: str
# trial_pipeline_run: str | None = None
# trial_pipeline_run_date: datetime | None = None
# post_pipeline_run: str | None = None
# post_pipeline_run_date: datetime | None = None
# reason: str | None = None
# value: Value
# processing_unit: str | None = None
[docs]
class PaymentMapping(Resource):
"""Payment Mapping."""
attr_endpoint: ClassVar[str] = 'api/v2/paymentMappings'
attr_seq: ClassVar[str] = 'payment_mapping_seq'
payment_mapping_seq: str | None = None
source_table_name: str
source_attribute: str
payment_attribute: str
[docs]
class PaymentSummary(Resource):
"""Payment Summary."""
attr_endpoint: ClassVar[str] = 'api/v2/paymentSummarys'
attr_seq: ClassVar[str] = 'payment_summary_seq'
payment_summary_seq: str | None = None
position: str | Reference
participant: str | Reference
period: str | Reference
earning_group_id: str
pipeline_run: str | None = None
pipeline_run_date: datetime | None = None
applied_deposit: Value | None = None
balance: Value | None = None
prior_balance: Value | None = None
outstanding_balance: Value | None = None
payment: Value | None = None
business_units: list[str] | None = None
processing_unit: str | None = None
[docs]
class Period(Resource):
"""Period."""
attr_endpoint: ClassVar[str] = 'api/v2/periods'
attr_seq: ClassVar[str] = 'period_seq'
period_seq: str | None = None
name: str
short_name: str
start_date: datetime
end_date: datetime
period_type: str | Reference
calendar: str | Reference
description: str | None = None
parent: str | Reference | None = None
created_by: str | None = Field(None, exclude=True, repr=False)
create_date: datetime | None = Field(None, exclude=True, repr=False)
modified_by: str | None = Field(None, exclude=True, repr=False)
[docs]
class PeriodType(Resource):
"""Period Type."""
attr_endpoint: ClassVar[str] = 'api/v2/periodTypes'
attr_seq: ClassVar[str] = 'period_type_seq'
period_type_seq: str | None = None
name: str
description: str | None = None
level: int | None = None
created_by: str | None = Field(None, exclude=True, repr=False)
create_date: datetime | None = Field(None, exclude=True, repr=False)
modified_by: str | None = Field(None, exclude=True, repr=False)
[docs]
class Pipeline(Resource):
"""Pipeline."""
attr_endpoint: ClassVar[str] = 'api/v2/pipelines'
attr_seq: ClassVar[str] = 'pipeline_run_seq'
pipeline_run_seq: str | None = None
command: (
Literal[
'PipelineRun',
'Import',
'XMLImport',
'ModelRun',
'MaintenanceRun',
'CleanupDeferredPipelineResults',
]
| None
)
stage_type: (
const.PipelineRunStages
| const.ImportStages
| const.XMLImportStages
| const.MaintenanceStages
| None
)
date_submitted: datetime
state: const.PipelineState
user_id: str
processing_unit: str | None = None
period: str | Reference | None = None
description: str | None = None
status: const.PipelineStatus | None = None
run_progress: float | None = None
start_time: datetime | None = None
stop_time: datetime | None = None
start_date_scheduled: datetime | None = None
batch_name: str | None = None
priority: int | None = Field(None, repr=False)
message: str | None = None
num_errors: int | None = Field(None, repr=False)
num_warnings: int | None = Field(None, repr=False)
run_mode: const.ImportRunMode | const.PipelineRunMode | None = Field(
None,
repr=False,
)
product_version: str | None = None
stored_proc_version: str | None = None
schema_version: str | None = None
remove_date: datetime | None = None
end_date_scheduled: datetime | None = None
run_parameters: str | None = None
trace_level: str | None = None
report_type_name: str | None = None
target_database: str | None = None
schedule_frequency: str | None = None
group_name: str | None = None
isolation_level: str | None = None
schedule_day: str | None = None
stage_tables: list[Assignment] | Assignment | None = Field(None, repr=False)
model_seq: str | None = None
model_run: str | None = None
@field_validator('run_progress', mode='before')
@classmethod
def percent_as_float(cls, value: str) -> float | None:
"""Convert percentage string to float."""
return int(value.removesuffix('%')) / 100 if value else None
[docs]
class PositionGroup(Resource):
"""Position."""
attr_endpoint: ClassVar[str] = 'api/v2/positionGroups'
attr_seq: ClassVar[str] = 'position_group_seq'
position_group_seq: str | None = None
name: str
business_units: list[str] | None = None
created_by: str | None = Field(None, exclude=True, repr=False)
create_date: datetime | None = Field(None, exclude=True, repr=False)
modified_by: str | None = Field(None, exclude=True, repr=False)
[docs]
class PositionRelation(Resource):
"""Position Relation."""
attr_endpoint: ClassVar[str] = 'api/v2/positionRelations'
attr_seq: ClassVar[str] = 'position_relation_seq'
position_relation_seq: str | None = None
name: str | None = None
effective_start_date: datetime
effective_end_date: datetime
parent_position: str | Reference
position_relation_type: str
child_position: str | Reference
created_by: str | None = Field(None, exclude=True, repr=False)
create_date: datetime | None = Field(None, exclude=True, repr=False)
modified_by: str | None = Field(None, exclude=True, repr=False)
[docs]
class PostalCode(Resource, Generic16Mixin):
"""Postal Code."""
attr_endpoint: ClassVar[str] = 'api/v2/postalCodes'
attr_seq: ClassVar[str] = 'classifier_seq'
classifier_seq: str | None = None
classifier_id: str
low_postal_code: str
high_postal_code: str
country: str
name: str | None = None
description: str | None = None
selector_id: str | None = None
effective_start_date: datetime
effective_end_date: datetime
business_units: list[str] | None = None
[docs]
class ProcessingUnit(Resource):
"""Processing Unit."""
attr_endpoint: ClassVar[str] = 'api/v2/processingUnits'
attr_seq: ClassVar[str] = 'processing_unit_seq'
processing_unit_seq: str | None = None
name: str
description: str | None = None
[docs]
class Product(Resource, Generic16Mixin):
"""Product."""
attr_endpoint: ClassVar[str] = 'api/v2/products'
attr_seq: ClassVar[str] = 'classifier_seq'
classifier_seq: str | None = None
classifier_id: str
name: str | None = None
cost: Value | None = None
price: Value | None = None
description: str | None = None
selector_id: str | None = None
effective_start_date: datetime
effective_end_date: datetime
business_units: list[str] | None = None
created_by: str | None = Field(None, exclude=True, repr=False)
create_date: datetime | None = Field(None, exclude=True, repr=False)
modified_by: str | None = Field(None, exclude=True, repr=False)
[docs]
class Quota(Resource):
"""Quota."""
attr_endpoint: ClassVar[str] = 'api/v2/quotas'
attr_seq: ClassVar[str] = 'quota_seq'
quota_seq: str | None = None
calendar: str | Reference
name: str
description: str | None = None
effective_start_date: datetime
effective_end_date: datetime
unit_type: str | Reference
model_seq: str | None = None
business_units: list[str] | None = None
created_by: str | None = Field(None, exclude=True, repr=False)
create_date: datetime | None = Field(None, exclude=True, repr=False)
modified_by: str | None = Field(None, exclude=True, repr=False)
[docs]
class SalesOrder(Resource, Generic16Mixin):
"""Sales Order."""
attr_endpoint: ClassVar[str] = 'api/v2/salesOrders'
attr_seq: ClassVar[str] = 'sales_order_seq'
sales_order_seq: str | None = None
order_id: str
pipeline_run: str | None = None
business_units: list[str] | None = None
processing_unit: str | None = None
model_seq: str | None = None
created_by: str | None = Field(None, exclude=True, repr=False)
create_date: datetime | None = Field(None, exclude=True, repr=False)
modified_by: str | None = Field(None, exclude=True, repr=False)
[docs]
class SalesTransaction(Resource, Generic32Mixin):
"""Sales Transaction."""
attr_endpoint: ClassVar[str] = 'api/v2/salesTransactions'
attr_seq: ClassVar[str] = 'sales_transaction_seq'
sales_transaction_seq: str | None = None
sales_order: str | Reference
line_number: Value
sub_line_number: Value
event_type: str | Reference
product_id: str | None = None
product_name: str | None = None
product_description: str | None = None
value: Value
preadjusted_value: Value | None = None
is_runnable: bool | None = None
compensation_date: datetime
number_of_units: Value | None = None
unit_value: Value | None = None
business_units: list[str] | None = None
processing_unit: str | None = None
model_seq: str | None = None
ship_to_address: str | None = None
bill_to_address: str | None = None
other_to_address: str | None = None
transaction_assignments: list[SalesTransactionAssignment] | None = None
payment_terms: str | None = None
accounting_date: datetime | None = None
discount_percent: Value | None = None
comments: str | None = None
native_currency_amount: Value | None = None
native_currency: str | None = None
pipeline_run: str | None = None
alternate_order_number: str | None = None
origin_type_id: str | None = None
adjustment_context: AdjustmentContext | None = None
is_purged: bool | None = None
reason: str | None = None
channel: str | None = None
po_number: str | None = None
data_source: str | None = None
discount_type: str | None = None
modification_date: datetime | None = None
[docs]
class User(Resource):
"""User."""
attr_endpoint: ClassVar[str] = 'api/v2/users'
attr_seq: ClassVar[str] = 'user_seq'
user_seq: str | None = None
id: str
user_name: str | None = None
description: str | None = None
email: str | None = None
read_only_business_unit_list: list[dict[Literal['name'], str]] | None = None
full_access_business_unit_list: list[dict[Literal['name'], str]] | None = None
preferred_language: str | None = None
last_login: datetime | None = None
created_by: str | None = Field(None, exclude=True, repr=False)
create_date: datetime | None = Field(None, exclude=True, repr=False)
modified_by: str | None = Field(None, exclude=True, repr=False)
[docs]
class PlanComponent(Resource):
"""Plan."""
attr_endpoint: ClassVar[str] = 'api/v2/planComponents'
attr_seq: ClassVar[str] = 'plan_component_seq'
plan_component_seq: str | None = None
name: str
description: str | None = None
calendar: str | Reference
effective_start_date: datetime
effective_end_date: datetime
business_units: list[str] | None = None
not_allow_update: bool = False
model_seq: str | None = None
created_by: str | None = Field(None, exclude=True, repr=False)
create_date: datetime | None = Field(None, exclude=True, repr=False)
modified_by: str | None = Field(None, exclude=True, repr=False)
[docs]
class Rule(Resource):
"""Rule."""
attr_endpoint: ClassVar[str] = 'api/v2/rules'
attr_seq: ClassVar[str] = 'rule_seq'
rule_seq: str | None = None
name: str
description: str | None = None
calendar: str | Reference
effective_start_date: datetime
effective_end_date: datetime
business_unit: list[BusinessUnitAssignment] | BusinessUnitAssignment | None = None
type: RuleUsage | None = None
not_allow_update: bool = False
model_seq: str | None = None
created_by: str | None = Field(None, exclude=True, repr=False)
create_date: datetime | None = Field(None, exclude=True, repr=False)
modified_by: str | None = Field(None, exclude=True, repr=False)
[docs]
class CreditRule(Rule):
"""Alias for Rule."""
[docs]
class CommissionRule(Rule):
"""Alias for Rule."""
[docs]
class DepositRule(Rule):
"""Alias for Rule."""
[docs]
class MeasurementRule(Rule):
"""Alias for Rule."""