buffmomo

models.py

Feb 19th, 2024
140
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 18.75 KB | Source Code | 0 0
  1. import json
  2. from storages.backends.ftp import FTPStorage
  3.  
  4.  
  5. from django.core.exceptions import ValidationError
  6. from django.db import models
  7.  
  8.  
  9. from .constants import PAYMENT_METHODS
  10.  
  11.  
  12. fs = FTPStorage()
  13.  
  14.  
  15. class Shipper(models.Model):
  16.     shipper_name = models.CharField(
  17.         verbose_name="Shipper Name",
  18.         max_length=255,
  19.     )
  20.     shipper_address = models.TextField(verbose_name="Shipper Address")
  21.     shipper_contact = models.CharField(
  22.         verbose_name="Shipper Contact Number",
  23.         max_length=255,
  24.     )
  25.     shipper_email = models.EmailField(
  26.         verbose_name="Shipper Email", null=True, blank=True
  27.     )
  28.  
  29.     class Meta:
  30.         db_table = ""
  31.         managed = True
  32.         verbose_name = "Shipper"
  33.         verbose_name_plural = "Shippers"
  34.  
  35.     def __str__(self):
  36.         return self.shipper_name
  37.  
  38.     @property
  39.     def get_all_road_containers(self):
  40.         road_containers = RoadContainer.objects.filter(
  41.             shipper=self, container_number__current=True
  42.         )
  43.         return road_containers
  44.  
  45.     @property
  46.     def get_all_sea_containers(self):
  47.         sea_containers = SeaContainer.objects.filter(
  48.             shipper=self, container_number__current=True
  49.         )
  50.         return sea_containers
  51.  
  52.     @property
  53.     def get_containers(self):
  54.         from itertools import chain
  55.  
  56.         containers = chain(
  57.             RoadContainer.objects.filter(shipper=self, container_number__current=True),
  58.             SeaContainer.objects.filter(shipper=self, container_number__current=True),
  59.         )
  60.         return containers
  61.  
  62.  
  63. class Bank(models.Model):
  64.     name = models.CharField(max_length=100)
  65.     address = models.CharField(max_length=100)
  66.  
  67.     def __str__(self):
  68.         return self.name
  69.  
  70.  
  71. class Category(models.Model):
  72.     category_name = models.CharField(
  73.         verbose_name="Category Name",
  74.         max_length=10,
  75.         unique=True,
  76.     )
  77.  
  78.     class Meta:
  79.         db_table = ""
  80.         managed = True
  81.         verbose_name = "Category"
  82.         verbose_name_plural = "Categorys"
  83.  
  84.     def __str__(self):
  85.         return self.category_name
  86.  
  87.  
  88. class Owner(models.Model):
  89.     owner_name = models.CharField(
  90.         verbose_name="Owner",
  91.         max_length=255,
  92.         unique=True,
  93.     )
  94.     owner_primary_number = models.CharField(
  95.         verbose_name="Primary Phone Number",
  96.         max_length=10,
  97.         unique=True,
  98.     )
  99.     owner_secondary_number = models.CharField(
  100.         verbose_name="Secondary Phone Number",
  101.         max_length=10,
  102.         unique=True,
  103.         blank=True,
  104.         null=True,
  105.     )
  106.     owner_email = models.EmailField(
  107.         verbose_name="Email",
  108.         unique=True,
  109.     )
  110.  
  111.     def __str__(self):
  112.         return self.owner_name
  113.  
  114.  
  115. class Company(models.Model):
  116.     name = models.CharField(
  117.         max_length=200,
  118.         verbose_name="Company Name",
  119.     )
  120.     owner = models.ForeignKey(
  121.         to=Owner,
  122.         on_delete=models.CASCADE,
  123.     )
  124.  
  125.     def __str__(self):
  126.         return self.name
  127.  
  128.     def get_company_name(self):
  129.         return self.name
  130.  
  131.  
  132. class ContainerNumber(models.Model):
  133.     name = models.CharField(
  134.         verbose_name="Container Number", max_length=255, unique=True
  135.     )
  136.     current = models.BooleanField(verbose_name="Current")
  137.  
  138.     def clean(self):
  139.         if self.current:
  140.             existing_active_instance = ContainerNumber.objects.filter(
  141.                 current=True
  142.             ).exclude(pk=self.pk)
  143.             if existing_active_instance.exists():
  144.                 raise ValidationError(
  145.                     "There can be only one active Container Number at a time."
  146.                 )
  147.  
  148.     def save(self, *args, **kwargs):
  149.         self.full_clean()  # This will trigger the clean method before saving
  150.         super().save(*args, **kwargs)
  151.  
  152.     def __str__(self):
  153.         return self.name
  154.  
  155.  
  156. class LCLimit(models.Model):
  157.     bank = models.ForeignKey(Bank, on_delete=models.CASCADE)
  158.     company = models.ForeignKey(Company, on_delete=models.CASCADE)
  159.     limit_amount = models.DecimalField(max_digits=10, decimal_places=2)
  160.     expiry_date = models.DateField()
  161.     approval_percentage = models.IntegerField()
  162.  
  163.     def __str__(self):
  164.         return self.bank.name
  165.  
  166.     def total_value_in_usd(self):
  167.         sea_containers = SeaContainer.objects.filter(
  168.             bank=self.bank,
  169.             company=self.company,
  170.             documents_cleared=False,
  171.             container_number__current=True,
  172.         )
  173.         total_value = sum(
  174.             container.calculate_value_in_usd() or 0 for container in sea_containers
  175.         )
  176.         return total_value
  177.  
  178.  
  179. class MultiHisabFileField(models.Model):
  180.     file = models.FileField(
  181.         verbose_name="Multiple Hisab File",
  182.         storage=fs,
  183.     )
  184.  
  185.     def __str__(self):
  186.         return str(self.file.name)
  187.  
  188.  
  189. class PartyHisab(models.Model):
  190.     party_name = models.CharField(verbose_name="Party Name", max_length=255, null=True)
  191.     marka_name = models.CharField(
  192.         verbose_name="Party Marka Detail", max_length=255, null=True
  193.     )
  194.     hisab_date = models.DateField(verbose_name="Hisab Date", max_length=255, null=True)
  195.     hisab = models.ManyToManyField(to=MultiHisabFileField, verbose_name="Hisab Files")
  196.     remarks = models.TextField(verbose_name="Remarks")
  197.  
  198.     def __str__(self):
  199.         return str(self.marka_name)
  200.  
  201.     def get_marka_name_words(self):
  202.         if self.marka_name:
  203.             try:
  204.                 marka_name_json = self.marka_name.replace("'", '"')
  205.                 marka_list = json.loads(marka_name_json)
  206.  
  207.                 if not isinstance(marka_list, list):
  208.                     marka_list = [marka_list]
  209.                 words = [word.strip() for word in marka_list]
  210.                 return words
  211.             except json.JSONDecodeError:
  212.                 return []
  213.  
  214.         return []
  215.  
  216.  
  217. class Payment(models.Model):
  218.     payment_settled = models.BooleanField(default=False)
  219.     expiry_date = models.DateField()
  220.  
  221.     def __str__(self):
  222.         return f"Payment Settled:{self.payment_settled} - Expiry:{self.expiry_date}"
  223.  
  224.  
  225. class RoadContainer(models.Model):
  226.     container_number = models.ForeignKey(
  227.         to=ContainerNumber,
  228.         on_delete=models.SET_NULL,
  229.         null=True,
  230.         blank=True,
  231.     )
  232.  
  233.     company = models.ForeignKey(
  234.         to="Company",
  235.         on_delete=models.SET_NULL,
  236.         null=True,
  237.     )
  238.  
  239.     number = models.CharField(
  240.         verbose_name="Sea Container Number",
  241.         max_length=10,
  242.     )
  243.     payment_method = models.CharField(
  244.         max_length=6,
  245.         choices=PAYMENT_METHODS,
  246.         default="LC",
  247.     )
  248.     bill_of_lading = models.CharField(
  249.         verbose_name="Bill of Lading", max_length=50, null=True, blank=True
  250.     )
  251.     bill_of_lading_date = models.DateField(
  252.         verbose_name="Bill of Lading Date",
  253.         null=True,
  254.         blank=True,
  255.     )
  256.  
  257.     cartoon_number = models.PositiveIntegerField(
  258.         verbose_name="Loaded Cartoon Number",
  259.     )
  260.     refrence_number = models.CharField(
  261.         verbose_name="LC / TT / DAP number",
  262.         max_length=30,
  263.         unique=True,
  264.         null=True,
  265.         blank=True,
  266.     )
  267.     refrence_date = models.DateField(
  268.         verbose_name="LC / TT / DAP date",
  269.         null=True,
  270.         blank=True,
  271.     )
  272.  
  273.     proforma_invoice_number = models.CharField(
  274.         verbose_name="Proforma Invoice Number",
  275.         max_length=30,
  276.         unique=True,
  277.     )
  278.     proforma_invoice_date = models.DateField(
  279.         verbose_name="Proforma Invoice Date",
  280.     )
  281.     commercial_invoice_number = models.CharField(
  282.         verbose_name="Commercial Invoice Number",
  283.         max_length=30,
  284.         unique=True,
  285.         null=True,
  286.         blank=True,
  287.     )
  288.     commercial_invoice_date = models.DateField(
  289.         verbose_name="Commercial Invoice Date",
  290.         null=True,
  291.         blank=True,
  292.     )
  293.     customs_cleared = models.BooleanField(
  294.         verbose_name="Customs Clearance Status",
  295.         default=False,
  296.         # null=True,
  297.         blank=True,
  298.     )
  299.     customs_cleared_date = models.DateField(
  300.         verbose_name="Customs Cleared Date",
  301.         null=True,
  302.         blank=True,
  303.     )
  304.  
  305.     margin_percentage = models.PositiveSmallIntegerField(
  306.         verbose_name="Margin Percentage",
  307.         default="10",
  308.     )
  309.  
  310.     margin_amount = models.DecimalField(
  311.         verbose_name="Margin Amount",
  312.         # default="10",
  313.         max_digits=13,
  314.         null=True,
  315.         decimal_places=2,
  316.     )
  317.  
  318.     category = models.ForeignKey(
  319.         to=Category,
  320.         on_delete=models.SET_NULL,
  321.         blank=True,
  322.         null=True,
  323.     )
  324.     proforma_invoice_value = models.DecimalField(
  325.         verbose_name="Proforma Invoice Amount",
  326.         max_digits=13,
  327.         decimal_places=2,
  328.         blank=True,
  329.         null=True,
  330.     )
  331.  
  332.     commercial_invoice_value = models.DecimalField(
  333.         verbose_name="Commercial Invoice Amount",
  334.         max_digits=13,
  335.         decimal_places=2,
  336.         blank=True,
  337.         null=True,
  338.     )
  339.  
  340.     bank = models.ForeignKey(
  341.         to=Bank,
  342.         verbose_name="Bank",
  343.         on_delete=models.SET_NULL,
  344.         null=True,
  345.     )
  346.  
  347.     shipper = models.ForeignKey(
  348.         to=Shipper,
  349.         verbose_name="Shipper",
  350.         on_delete=models.SET_NULL,
  351.         null=True,
  352.         related_name="shipper_container",
  353.     )
  354.  
  355.     hisab_files = models.FileField(
  356.         verbose_name="Select Hisab Files",
  357.         null=True,
  358.         blank=True,
  359.         storage=fs,
  360.     )
  361.  
  362.     excel_file = models.FileField(
  363.         verbose_name="Excel File",
  364.         null=True,
  365.         blank=True,
  366.         storage=fs,
  367.     )
  368.     customs_excel_file = models.FileField(
  369.         verbose_name="Customs Excel File",
  370.         null=True,
  371.         blank=True,
  372.         storage=fs,
  373.     )
  374.     insurance_file = models.FileField(
  375.         storage=fs,
  376.         verbose_name="Insurance File",
  377.         null=True,
  378.         blank=True,
  379.     )
  380.     contianer_file = models.FileField(
  381.         verbose_name="Container Documents",
  382.         null=True,
  383.         blank=True,
  384.         storage=fs,
  385.     )
  386.     pragyapan_patra = models.FileField(
  387.         verbose_name="Pragyapan Patra",
  388.         null=True,
  389.         blank=True,
  390.         storage=fs,
  391.     )
  392.     dollar_rate = models.DecimalField(
  393.         verbose_name="Dollar Rate",
  394.         decimal_places=2,
  395.         max_digits=5,
  396.         blank=True,
  397.         null=True,
  398.     )
  399.  
  400.     documents_cleared = models.BooleanField(
  401.         verbose_name="Documents Cleared",
  402.         default=False,
  403.         # null=True,
  404.         # blank=True,
  405.     )
  406.  
  407.     class Meta:
  408.         db_table = ""
  409.         managed = True
  410.         verbose_name = "Road Container"
  411.         verbose_name_plural = "Road Containers"
  412.         unique_together = ("container_number", "number", "category")
  413.  
  414.     def calculate_value_in_usd(self):
  415.         if self.dollar_rate is not None and self.proforma_invoice_value is not None:
  416.             value_in_nrp = self.dollar_rate * self.proforma_invoice_value
  417.             return value_in_nrp
  418.         return None
  419.  
  420.     def __str__(self):
  421.         return f"{self.category} - {self.number}"
  422.  
  423.     def get_container_name(self):
  424.         return f"{self.category} - {self.number}"
  425.  
  426.     def get_type(self):
  427.         return "road"
  428.  
  429.  
  430. class RoadLoadingMarka(models.Model):
  431.     road_container = models.ForeignKey(
  432.         to=RoadContainer,
  433.         on_delete=models.SET_NULL,
  434.         null=True,
  435.         blank=True,
  436.     )
  437.     party_name = models.CharField(
  438.         verbose_name="Party Name",
  439.         max_length=255,
  440.         null=True,
  441.     )
  442.     bilty = models.ImageField(
  443.         null=True,
  444.         storage=fs,
  445.     )
  446.     bilty_number = models.CharField(
  447.         verbose_name="Bilty Number",
  448.         max_length=255,
  449.         null=True,
  450.     )
  451.     bilty_date = models.DateField(
  452.         null=True,
  453.     )
  454.     marka_name = models.CharField(
  455.         verbose_name="Marka Name",
  456.         max_length=255,
  457.         null=True,
  458.     )
  459.     bilty_cartoon_number = models.PositiveSmallIntegerField(
  460.         verbose_name="Cartoon",
  461.         null=True,
  462.     )
  463.     loaded_cartoon_number = models.PositiveSmallIntegerField(
  464.         verbose_name="Loaded Cartoon",
  465.         null=True,
  466.     )
  467.     bilty_rmb = models.DecimalField(
  468.         verbose_name="RMB",
  469.         decimal_places=2,
  470.         max_digits=5,
  471.         null=True,
  472.     )
  473.     place = models.CharField(
  474.         verbose_name="Bilty Place",
  475.         max_length=255,
  476.         null=True,
  477.     )
  478.     transport = models.CharField(
  479.         verbose_name="Transport",
  480.         max_length=155,
  481.         null=True,
  482.     )
  483.     remarks = models.TextField(
  484.         verbose_name="Remarks",
  485.         blank=True,
  486.         null=True,
  487.     )
  488.     packing_list = models.ImageField(
  489.         null=True,
  490.         blank=True,
  491.         storage=fs,
  492.     )
  493.  
  494.  
  495. class SeaContainer(models.Model):
  496.     container_number = models.ForeignKey(
  497.         to=ContainerNumber,
  498.         on_delete=models.SET_NULL,
  499.         null=True,
  500.         blank=True,
  501.     )
  502.  
  503.     company = models.ForeignKey(
  504.         to="Company",
  505.         on_delete=models.SET_NULL,
  506.         null=True,
  507.     )
  508.  
  509.     number = models.CharField(
  510.         verbose_name="Sea Container Number",
  511.         max_length=10,
  512.     )
  513.     payment_method = models.CharField(
  514.         max_length=6,
  515.         choices=PAYMENT_METHODS,
  516.         default="LC",
  517.     )
  518.     bill_of_lading = models.CharField(
  519.         verbose_name="Bill of Lading", max_length=50, null=True, blank=True
  520.     )
  521.     bill_of_lading_date = models.DateField(
  522.         verbose_name="Bill of Lading Date",
  523.         null=True,
  524.         blank=True,
  525.     )
  526.  
  527.     cartoon_number = models.PositiveIntegerField(
  528.         verbose_name="Loaded Cartoon Number",
  529.     )
  530.     refrence_number = models.CharField(
  531.         verbose_name="LC / TT / DAP number",
  532.         max_length=30,
  533.         unique=True,
  534.         null=True,
  535.         blank=True,
  536.     )
  537.     refrence_date = models.DateField(
  538.         verbose_name="LC / TT / DAP date",
  539.         null=True,
  540.         blank=True,
  541.     )
  542.  
  543.     proforma_invoice_number = models.CharField(
  544.         verbose_name="Proforma Invoice Number",
  545.         max_length=30,
  546.         unique=True,
  547.     )
  548.     proforma_invoice_date = models.DateField(
  549.         verbose_name="Proforma Invoice Date",
  550.     )
  551.     commercial_invoice_number = models.CharField(
  552.         verbose_name="Commercial Invoice Number",
  553.         max_length=30,
  554.         unique=True,
  555.         null=True,
  556.         blank=True,
  557.     )
  558.     commercial_invoice_date = models.DateField(
  559.         verbose_name="Commercial Invoice Date",
  560.         null=True,
  561.         blank=True,
  562.     )
  563.     customs_cleared = models.BooleanField(
  564.         verbose_name="Customs Clearance Status",
  565.         default=False,
  566.         # null=True,
  567.         blank=True,
  568.     )
  569.     customs_cleared_date = models.DateField(
  570.         verbose_name="Customs Cleared Date",
  571.         null=True,
  572.         blank=True,
  573.     )
  574.  
  575.     margin_percentage = models.PositiveSmallIntegerField(
  576.         verbose_name="Margin Percentage",
  577.         default="10",
  578.     )
  579.  
  580.     margin_amount = models.DecimalField(
  581.         verbose_name="Margin Amount",
  582.         # default="10",
  583.         max_digits=13,
  584.         null=True,
  585.         decimal_places=2,
  586.     )
  587.  
  588.     category = models.ForeignKey(
  589.         to=Category,
  590.         on_delete=models.SET_NULL,
  591.         blank=True,
  592.         null=True,
  593.     )
  594.     proforma_invoice_value = models.DecimalField(
  595.         verbose_name="Proforma Invoice Amount",
  596.         max_digits=13,
  597.         decimal_places=2,
  598.         blank=True,
  599.         null=True,
  600.     )
  601.  
  602.     commercial_invoice_value = models.DecimalField(
  603.         verbose_name="Commercial Invoice Amount",
  604.         max_digits=13,
  605.         decimal_places=2,
  606.         blank=True,
  607.         null=True,
  608.     )
  609.  
  610.     bank = models.ForeignKey(
  611.         to=Bank,
  612.         verbose_name="Bank",
  613.         on_delete=models.SET_NULL,
  614.         null=True,
  615.     )
  616.  
  617.     shipper = models.ForeignKey(
  618.         to=Shipper,
  619.         verbose_name="Shipper",
  620.         on_delete=models.SET_NULL,
  621.         null=True,
  622.     )
  623.  
  624.     hisab_files = models.FileField(
  625.         verbose_name="Select Hisab Files",
  626.         null=True,
  627.         blank=True,
  628.         storage=fs,
  629.     )
  630.  
  631.     excel_file = models.FileField(
  632.         verbose_name="Excel File",
  633.         null=True,
  634.         blank=True,
  635.         storage=fs,
  636.     )
  637.     customs_excel_file = models.FileField(
  638.         verbose_name="Customs Excel File",
  639.         null=True,
  640.         blank=True,
  641.         storage=fs,
  642.     )
  643.     insurance_file = models.FileField(
  644.         verbose_name="Insurance File",
  645.         null=True,
  646.         blank=True,
  647.         storage=fs,
  648.     )
  649.     contianer_file = models.FileField(
  650.         verbose_name="Container Documents",
  651.         null=True,
  652.         blank=True,
  653.         storage=fs,
  654.     )
  655.     pragyapan_patra = models.FileField(
  656.         verbose_name="Pragyapan Patra",
  657.         null=True,
  658.         blank=True,
  659.         storage=fs,
  660.     )
  661.     dollar_rate = models.DecimalField(
  662.         verbose_name="Dollar Rate",
  663.         decimal_places=2,
  664.         max_digits=5,
  665.         blank=True,
  666.         null=True,
  667.     )
  668.  
  669.     documents_cleared = models.BooleanField(
  670.         verbose_name="Documents Cleared",
  671.         default=False,
  672.     )
  673.  
  674.     class Meta:
  675.         db_table = ""
  676.         managed = True
  677.         verbose_name = "SeaContainer"
  678.         verbose_name_plural = "SeaContainers"
  679.         unique_together = ("container_number", "number", "category")
  680.  
  681.     def calculate_value_in_usd(self):
  682.         if self.dollar_rate is not None and self.proforma_invoice_value is not None:
  683.             value_in_nrp = self.dollar_rate * self.proforma_invoice_value
  684.             return value_in_nrp
  685.         return None
  686.  
  687.     def __str__(self):
  688.         return f"{self.category} - {self.number}"
  689.  
  690.     def get_container_name(self):
  691.         return f"{self.category} - {self.number}"
  692.  
  693.     def get_type(self):
  694.         return "sea"
  695.  
  696.  
  697. class SeaLoadingMarka(models.Model):
  698.     sea_container = models.ForeignKey(
  699.         to=SeaContainer,
  700.         on_delete=models.SET_NULL,
  701.         null=True,
  702.         blank=True,
  703.     )
  704.     party_name = models.CharField(
  705.         verbose_name="Party Name", max_length=255, default="Null"
  706.     )
  707.     marka_name = models.CharField(verbose_name="Marka Name", max_length=255)
  708.     cartoon_number = models.PositiveIntegerField(verbose_name="Cartoon")
  709.     cbm = models.DecimalField(
  710.         verbose_name="CBM",
  711.         decimal_places=2,
  712.         max_digits=5,
  713.         null=True,
  714.         default=0.00,
  715.     )
  716.  
  717.     # all_sent = models.BooleanField(verbose_name="Sent to Customer", default=False)
  718.     # remarks = models.TextField(verbose_name="Sent Remarks")
  719.     # chalan_image = models.ImageField(verbose_name="Document Chalan")
  720.  
  721.     def __str__(self):
  722.         return f"{self.sea_container} - {self.marka_name}"
  723.  
Advertisement
Add Comment
Please, Sign In to add comment