dkanavis

Untitled

Apr 3rd, 2019
133
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 18.30 KB | None | 0 0
  1. """
  2. Pilling: models
  3. """
  4. from datetime import datetime
  5.  
  6. from sqlalchemy import Column, Integer, BigInteger, Boolean, SmallInteger, \
  7.     ForeignKey, String, UniqueConstraint, DateTime
  8. from sqlalchemy.ext.declarative import declarative_base
  9. from sqlalchemy.orm import relationship
  10.  
  11. from pilling.db.mixins import TableMixin, SmallAutoIdMixin, DictMixin, \
  12.     BigAutoIdMixin
  13.  
  14. BASE = declarative_base()
  15.  
  16.  
  17. # Dict models
  18. class PaymentType(BASE, TableMixin, SmallAutoIdMixin, DictMixin):
  19.     """ Payment type data mapper """
  20.  
  21.  
  22. class BillType(BASE, TableMixin, SmallAutoIdMixin, DictMixin):
  23.     """ Bill type data mapper """
  24.  
  25.  
  26. class IdleProcessing(BASE, TableMixin, SmallAutoIdMixin, DictMixin):
  27.     """ Idle processing methods data mapper """
  28.  
  29.  
  30. class StatusProcessing(BASE, TableMixin, SmallAutoIdMixin, DictMixin):
  31.     """ Service status processing methods data mapper """
  32.  
  33.  
  34. class AccountingInterval(BASE, TableMixin, SmallAutoIdMixin, DictMixin):
  35.     """ Accounting intervals data mapper """
  36.  
  37.  
  38. # Data directory models
  39. class Organization(BASE, TableMixin, SmallAutoIdMixin, DictMixin):
  40.     """ Organization data mapper """
  41.  
  42.  
  43. class Provider(BASE, TableMixin, SmallAutoIdMixin, DictMixin):
  44.     """ Providers data mapper """
  45.  
  46.  
  47. class Currency(BASE, TableMixin, SmallAutoIdMixin, DictMixin):
  48.     """ Currency data mapper """
  49.  
  50.  
  51. class PaymentSystem(BASE, TableMixin, SmallAutoIdMixin, DictMixin):
  52.     """ Payment system data mapper """
  53.  
  54.  
  55. # Client/account models
  56. class Client(BASE, TableMixin, BigAutoIdMixin):
  57.     """ Client data mapper """
  58.     # If this item is locked for editing
  59.     locked = Column(Boolean, nullable=False, default=False)
  60.  
  61.     # Actuality time range
  62.     t_from = Column(DateTime, nullable=False, index=True)
  63.     t_to = Column(DateTime, nullable=True, index=True)
  64.  
  65.     # Remote system's ID
  66.     remote_id = Column(String(length=255), nullable=True, unique=True,
  67.                        index=True)
  68.  
  69.  
  70. class Contract(BASE, TableMixin, BigAutoIdMixin):
  71.     """ Client's contract data mapper """
  72.     # If this item is locked for editing
  73.     locked = Column(Boolean, nullable=False, default=False)
  74.  
  75.     # Actuality time range
  76.     t_from = Column(DateTime, nullable=False, index=True)
  77.     t_to = Column(DateTime, nullable=True, index=True)
  78.  
  79.     # Remote system's ID
  80.     remote_id = Column(String(length=255), nullable=True, unique=True,
  81.                        index=True)
  82.  
  83.     # Time since when all changes require complex logic and cannot be done
  84.     # explicitly
  85.     activation_time = Column(DateTime, nullable=True, index=True)
  86.  
  87.     # Client
  88.     client_id = Column(BigInteger, ForeignKey("client.id"), nullable=False,
  89.                        index=True)
  90.     client = relationship("Client")
  91.  
  92.     # Organization
  93.     organization_id = Column(SmallInteger, ForeignKey("organization.id"),
  94.                              nullable=False, index=True)
  95.     organization = relationship("Organization")
  96.  
  97.     # Provider
  98.     provider_id = Column(SmallInteger, ForeignKey("provider.id"),
  99.                          nullable=False, index=True)
  100.     provider = relationship("Provider")
  101.  
  102.     # Payment type
  103.     payment_type_id = Column(SmallInteger, ForeignKey("payment_type.id"),
  104.                              nullable=False, index=True)
  105.     payment_type = relationship("PaymentType")
  106.  
  107.     # Bill type
  108.     bill_type_id = Column(SmallInteger, ForeignKey("bill_type.id"),
  109.                           nullable=True, index=True)
  110.     bill_type = relationship("BillType")
  111.  
  112.  
  113. class Tariff(BASE, TableMixin, BigAutoIdMixin):
  114.     """ Tariff data mapper """
  115.     # Actuality time range
  116.     t_from = Column(DateTime, nullable=False, index=True)
  117.     t_to = Column(DateTime, nullable=True, index=True)
  118.  
  119.     # Name
  120.     name = Column(String(length=255), nullable=False)
  121.  
  122.     # Accounting interval: interval of service accounting in accordance with
  123.     # contract terms
  124.     accounting_interval_id = Column(
  125.         SmallInteger, ForeignKey("accounting_interval.id"), nullable=False)
  126.     accounting_interval = relationship("AccountingInterval")
  127.  
  128.     # Charge interval: interval of produced consumes
  129.     charge_interval_id = Column(
  130.         SmallInteger, ForeignKey("accounting_interval.id"), nullable=False)
  131.     charge_interval = relationship("AccountingInterval")
  132.  
  133.     # Virtual money unconditional sum
  134.     vm_unconditional = Column(BigInteger, nullable=False)
  135.     # Virtual money conditional sum
  136.     vm_conditional = Column(BigInteger, nullable=False)
  137.  
  138.     # Idle processing
  139.     idle_processing_id = Column(
  140.         SmallInteger, ForeignKey("idle_processing.id"), nullable=False)
  141.     idle_processing = relationship("IdleProcessing")
  142.  
  143.     # Service status processing
  144.     status_processing_id = Column(
  145.         SmallInteger, ForeignKey("status_processing.id"), nullable=False)
  146.     status_processing = relationship("StatusProcessing")
  147.  
  148.     # TODO: maybe some new tariff properties
  149.  
  150.  
  151. class ServicePackBundle(BASE, TableMixin, BigAutoIdMixin):
  152.     """ Service pack bundle data mapper """
  153.     # If this item is locked for editing
  154.     locked = Column(Boolean, nullable=False, default=False)
  155.  
  156.     # Actuality time range
  157.     t_from = Column(DateTime, nullable=False, index=True)
  158.     t_to = Column(DateTime, nullable=True, index=True)
  159.  
  160.     # Remote system's ID
  161.     remote_id = Column(String(length=255), nullable=True, unique=True,
  162.                        index=True)
  163.  
  164.     # Client
  165.     client_id = Column(BigInteger, ForeignKey("client.id"), nullable=False,
  166.                        index=True)
  167.     client = relationship("Client")
  168.  
  169.  
  170. class ServicePack(BASE, TableMixin, BigAutoIdMixin):
  171.     """ Client contract's service pack data mapper """
  172.     # If this item is locked for editing
  173.     locked = Column(Boolean, nullable=False, default=False)
  174.  
  175.     # Actuality time range
  176.     t_from = Column(DateTime, nullable=False, index=True)
  177.     t_to = Column(DateTime, nullable=True, index=True)
  178.  
  179.     # Remote system's ID
  180.     remote_id = Column(String(length=255), nullable=True, unique=True,
  181.                        index=True)
  182.  
  183.     # Contract
  184.     contract_id = Column(BigInteger, ForeignKey("contract.id"), nullable=False,
  185.                          index=True)
  186.     contract = relationship("Contract")
  187.  
  188.     # Service pack bundle
  189.     service_pack_bundle_id = Column(
  190.         BigInteger, ForeignKey("service_pack_bundle.id"), nullable=False,
  191.         index=True)
  192.     service_pack_bundle = relationship("ServicePackBundle")
  193.  
  194.  
  195. class ServicePackVar(BASE, TableMixin, BigAutoIdMixin):
  196.     """ Service pack options, time-log table """
  197.     # Actuality time range
  198.     t_from = Column(DateTime, nullable=False, index=True)
  199.     t_to = Column(DateTime, nullable=True, index=True)
  200.  
  201.     # Service pack
  202.     service_pack_id = Column(BigInteger, ForeignKey("service_pack.id"),
  203.                              nullable=False, index=True)
  204.     service_pack = relationship("ServicePack")
  205.  
  206.     # Tariff
  207.     tariff_id = Column(BigInteger, ForeignKey("tariff.id"),
  208.                        nullable=False, index=True)
  209.     tariff = relationship("Tariff")
  210.  
  211.     # Virtual money unconditional sum
  212.     vm_unconditional = Column(BigInteger, nullable=False)
  213.     # Virtual money conditional sum
  214.     vm_conditional = Column(BigInteger, nullable=False)
  215.  
  216.     # Discount percents
  217.     discount_percents = Column(Integer, nullable=False, default=0)
  218.     # Discount virtual money sum
  219.     discount_vm = Column(Integer, nullable=False, default=0)
  220.  
  221.     # Invoice issuing group
  222.     invoice_group = Column(SmallInteger, nullable=True)
  223.  
  224.     # State: financial suspension
  225.     st_fin_suspension = Column(Boolean, nullable=False, default=False)
  226.     # State: self (voluntary) suspension of services
  227.     st_self_suspension = Column(Boolean, nullable=False, default=False)
  228.     # State: forced (moderated) suspension of services
  229.     st_forced_suspension = Column(Boolean, nullable=False, default=False)
  230.     # State: free period due to money refund
  231.     st_refund = Column(Boolean, nullable=False, default=False)
  232.     # State: service pack freeze: no consumes will be produced.
  233.     # Needed for total account suspension when cancellation is undesirable
  234.     st_freeze = Column(Boolean, nullable=False, default=False)
  235.  
  236.  
  237. # Money models
  238. class Payment(BASE, TableMixin, BigAutoIdMixin):
  239.     """ Payment data mapper """
  240.  
  241.     # Outcome: negative payment, moneyback
  242.     outcome = Column(Boolean, nullable=False)
  243.     # Outcome finished: money fully returned
  244.     outcome_finished = Column(Boolean, nullable=False)
  245.  
  246.     # Payment system
  247.     payment_system_id = Column(SmallInteger, ForeignKey("payment_system.id"),
  248.                                nullable=False, index=True)
  249.     payment_system = relationship("PaymentSystem")
  250.     payment_system_remote_id = Column(String(length=255), nullable=True)
  251.  
  252.     # Organization
  253.     organization_id = Column(SmallInteger, ForeignKey("organization.id"),
  254.                              nullable=True, index=True)
  255.     organization = relationship("Organization")
  256.  
  257.     # Client
  258.     client_id = Column(BigInteger, ForeignKey("client.id"), nullable=False,
  259.                        index=True)
  260.     client = relationship("Client")
  261.  
  262.     # Currency
  263.     currency_id = Column(BigInteger, ForeignKey("currency.id"), nullable=False)
  264.     currency = relationship("Currency")
  265.  
  266.     # Payment sum. Cents
  267.     curr_sum = Column(BigInteger, nullable=False)
  268.     # Currency rate in virtual money cents
  269.     curr_rate = Column(Integer, nullable=False, default=100)
  270.     # Virtual money sum in cents
  271.     vm_sum = Column(BigInteger, nullable=False)
  272.  
  273.     # Payment time (money accounting time)
  274.     time = Column(DateTime, nullable=False, default=datetime.utcnow)
  275.     # Record creation time
  276.     created_at = Column(DateTime, nullable=False, default=datetime.utcnow)
  277.     # Payment cancellation time
  278.     cancelled_at = Column(DateTime, nullable=False)
  279.  
  280.     # Creation operator
  281.     create_operator = Column(String(length=255), nullable=False, index=True)
  282.     # Cancellation operator
  283.     cancel_operator = Column(String(length=255), nullable=True, index=True)
  284.  
  285.     # Comment
  286.     comment = Column(String(length=255), nullable=True)
  287.  
  288.     # Payment order, invoice, bill
  289.     pay_order_time = Column(DateTime, nullable=True)
  290.     pay_order_num = Column(String(length=255), nullable=True)
  291.     invoice_num = Column(String(length=255), nullable=True)
  292.     bill_num = Column(String(length=255), nullable=True)
  293.  
  294.     # Table Args
  295.     __table_args__ = (
  296.         # Unique payment system remote id inside each payment system
  297.         UniqueConstraint("payment_system_id", "payment_system_remote_id"),
  298.     )
  299.  
  300.  
  301. class MoneyTag(BASE, TableMixin, BigAutoIdMixin):
  302.     """ Money tags (payment - consume pre-association) data mapper """
  303.  
  304.     # Record creation time
  305.     created_at = Column(DateTime, nullable=False, default=datetime.utcnow)
  306.     # Record cancellation time
  307.     cancelled_at = Column(DateTime, nullable=False)
  308.  
  309.     # Creation operator
  310.     create_operator = Column(String(length=255), nullable=False, index=True)
  311.     # Cancellation operator
  312.     cancel_operator = Column(String(length=255), nullable=True, index=True)
  313.  
  314.  
  315. class Income(BASE, TableMixin, BigAutoIdMixin):
  316.     """ Income (money transfer from payment to account) data mapper """
  317.     # If this income is made from outcome
  318.     from_outcome = Column(Boolean, nullable=False, default=False)
  319.  
  320.     # Payment
  321.     payment_id = Column(BigInteger, ForeignKey("payment.id"), nullable=False,
  322.                         index=True)
  323.     payment = relationship("Payment")
  324.  
  325.     # Contract
  326.     contract_id = Column(BigInteger, ForeignKey("contract.id"),
  327.                          nullable=False, index=True)
  328.     contract = relationship("Contract")
  329.  
  330.     # Service pack
  331.     service_pack_id = Column(BigInteger, ForeignKey("service_pack.id"),
  332.                              nullable=False, index=True)
  333.     service_pack = relationship("ServicePack")
  334.  
  335.     # Payment system
  336.     payment_system_id = Column(SmallInteger, ForeignKey("payment_system.id"),
  337.                                nullable=False, index=True)
  338.     payment_system = relationship("PaymentSystem")
  339.  
  340.     # Money tag
  341.     money_tag_id = Column(BigInteger, ForeignKey("money_tag.id"),
  342.                           nullable=True, index=True)
  343.     money_tag = relationship("MoneyTag")
  344.  
  345.     # Virtual money produced
  346.     vm_produced = Column(Integer, nullable=False)
  347.     # Virtual money consumed
  348.     vm_consumed = Column(Integer, nullable=False)
  349.  
  350.     # Payment time (money accounting time)
  351.     time = Column(DateTime, nullable=False, default=datetime.utcnow)
  352.     # Record creation time
  353.     created_at = Column(DateTime, nullable=False, default=datetime.utcnow)
  354.     # Payment cancellation time
  355.     cancelled_at = Column(DateTime, nullable=False)
  356.  
  357.     # Creation operator
  358.     create_operator = Column(String(length=255), nullable=False, index=True)
  359.     # Cancellation operator
  360.     cancel_operator = Column(String(length=255), nullable=True, index=True)
  361.  
  362.  
  363. class Outcome(BASE, TableMixin, BigAutoIdMixin):
  364.     """ Outcome (moneyback or account-to-account transfer withdrawal).
  365.    Outcome is a negative income on a contract to be covered from income
  366.    by an expense """
  367.     # Payment system (from source)
  368.     payment_system_id = Column(SmallInteger, ForeignKey("payment_system.id"),
  369.                                nullable=False, index=True)
  370.     payment_system = relationship("PaymentSystem")
  371.  
  372.     # Contract. Outcome is per contract
  373.     contract_id = Column(BigInteger, ForeignKey("contract.id"),
  374.                          nullable=False, index=True)
  375.     contract = relationship("Contract")
  376.  
  377.     # Virtual money produced
  378.     vm_produced = Column(Integer, nullable=False)
  379.     # Virtual money consumed
  380.     vm_consumed = Column(Integer, nullable=False)
  381.  
  382.     # Payment time (money accounting time)
  383.     time = Column(DateTime, nullable=False, default=datetime.utcnow)
  384.     # Record creation time
  385.     created_at = Column(DateTime, nullable=False, default=datetime.utcnow)
  386.     # Payment cancellation time
  387.     cancelled_at = Column(DateTime, nullable=False)
  388.  
  389.     # Creation operator
  390.     create_operator = Column(String(length=255), nullable=False, index=True)
  391.     # Cancellation operator
  392.     cancel_operator = Column(String(length=255), nullable=True, index=True)
  393.  
  394.  
  395. class Expense(BASE, TableMixin, BigAutoIdMixin):
  396.     """ Expense (money withdrawal from income to consume or outcome) """
  397.     # Income, source
  398.     income_id = Column(BigInteger, ForeignKey("income.id"),
  399.                        nullable=False, index=True)
  400.     income = relationship("Income")
  401.  
  402.     # Consume, optional destination
  403.     consume_id = Column(BigInteger, ForeignKey("consume.id"),
  404.                         nullable=True, index=True)
  405.     consume = relationship("Consume")
  406.  
  407.     # Outcome, optional destination
  408.     outcome_id = Column(BigInteger, ForeignKey("outcome.id"),
  409.                         nullable=True, index=True)
  410.     outcome = relationship("Outcome")
  411.  
  412.     # Virtual money sum
  413.     vm_sum = Column(Integer, nullable=False)
  414.  
  415.     # Record creation time
  416.     created_at = Column(DateTime, nullable=False, default=datetime.utcnow)
  417.     # Payment cancellation time
  418.     cancelled_at = Column(DateTime, nullable=False)
  419.  
  420.     # Creation operator
  421.     create_operator = Column(String(length=255), nullable=False, index=True)
  422.     # Cancellation operator
  423.     cancel_operator = Column(String(length=255), nullable=True, index=True)
  424.  
  425.  
  426. class Outpay(BASE, TableMixin, BigAutoIdMixin):
  427.     """ Outpay (moneyback/account-to-account transfer action).
  428.    Many outpays may point to a single negative payment """
  429.     # Outcome, source
  430.     outcome_id = Column(BigInteger, ForeignKey("outcome.id"),
  431.                         nullable=False, index=True)
  432.     outcome = relationship("Outcome")
  433.  
  434.     # Payment, optional destination
  435.     payment_id = Column(BigInteger, ForeignKey("payment.id"), nullable=True,
  436.                         index=True)
  437.     payment = relationship("Payment")
  438.  
  439.     # Income, optional destination
  440.     income_id = Column(BigInteger, ForeignKey("income.id"), nullable=True,
  441.                        index=True)
  442.     income = relationship("Income")
  443.  
  444.     # Virtual money sum
  445.     vm_sum = Column(Integer, nullable=False)
  446.  
  447.     # Record creation time
  448.     created_at = Column(DateTime, nullable=False, default=datetime.utcnow)
  449.     # Payment cancellation time
  450.     cancelled_at = Column(DateTime, nullable=False)
  451.  
  452.     # Creation operator
  453.     create_operator = Column(String(length=255), nullable=False, index=True)
  454.     # Cancellation operator
  455.     cancel_operator = Column(String(length=255), nullable=True, index=True)
  456.  
  457.  
  458. class Consume(BASE, TableMixin, BigAutoIdMixin):
  459.     """ Money consume data mapper """
  460.     # Service pack
  461.     service_pack_id = Column(SmallInteger, ForeignKey("service_pack.id"),
  462.                              nullable=False, index=True)
  463.     service_pack = relationship("ServicePack")
  464.  
  465.     # Corresponding accounting period range
  466.     accounting_interval_from = Column(DateTime, nullable=True, index=True)
  467.     accounting_interval_to = Column(DateTime, nullable=True, index=True)
  468.  
  469.     # Corresponding charge period range
  470.     charge_interval_to = Column(DateTime, nullable=True, index=True)
  471.     charge_interval_from = Column(DateTime, nullable=True, index=True)
  472.  
  473.     # Virtual money produced
  474.     vm_produced = Column(Integer, nullable=False)
  475.     vm_produced_v = Column(Integer, nullable=False) # TODO: produced_v doc
  476.  
  477.     # Virtual money consumed
  478.     vm_consumed = Column(Integer, nullable=False)
  479.  
  480.     # Money tag (payment - consume pre-association)
  481.     money_tag_id = Column(BigInteger, ForeignKey("money_tag.id"),
  482.                           nullable=True, index=True)
  483.     money_tag = relationship("MoneyTag")
  484.     # Money tag type todo: money tag type doc
  485.     money_tag_type = Column(Integer, nullable=False, default=0)
  486.  
  487.     # Denormalization: service pack special statuses total time
  488.     # Financial suspension total time
  489.     st_fin_suspension_time = Column(Integer, nullable=False, default=0)
  490.     # Self (voluntary) suspension total time
  491.     st_self_suspension_time = Column(Integer, nullable=False, default=0)
  492.     # Forced (moderated) suspension total time
  493.     st_forced_suspension_time = Column(Integer, nullable=False, default=0)
  494.     # Free period due to money refund total time
  495.     st_refund_time = Column(Integer, nullable=False, default=0)
  496.     # Service pack freeze total time
  497.     st_freeze_time = Column(Integer, nullable=False, default=0)
Advertisement
Add Comment
Please, Sign In to add comment