from django.db import models

# Create your models here.
from django.utils.translation import gettext_lazy as _

class Vendor(models.Model):
    company=models.ForeignKey('company.Company',related_name='vendor3rd_company',verbose_name='所属企业',on_delete=models.CASCADE,blank=True,null=True)
    name=models.CharField(_('第三方单位名称'),max_length=100,unique=True)    
    code=models.CharField(_('代码'),max_length=10,blank=True,null=True)
    is_active=models.BooleanField(_('是否已上线'),default=True)
    synclogistics=models.BooleanField(_('同步物流数据'),default=False)
    redirect=models.CharField(_('消费者扫码跳转链接'),max_length=200,blank=True,null=True)
    parameter=models.CharField(_('跳转参数名'),max_length=20,blank=True,null=True)
    products=models.JSONField(_('指定产品'),default=list,blank=True,null=True)
    agents=models.JSONField(_('指定经销商'),default=list,blank=True,null=True)    
    remark=models.CharField(_('备注说明'),max_length=100,blank=True,null=True)
    tm=models.DateTimeField(_('时间'),auto_now_add=True)    
    
    class Meta:
        verbose_name = _('第三方信息')
        verbose_name_plural = _('第三方信息')
        #unique_together = ("company","code")

    def __str__(self):
        return self.name


#2022-03-08 一家第三方可能有多个跳转地址
class Redirect(models.Model):
    company=models.ForeignKey('company.Company',verbose_name='企业ID',related_name='redirect_company',on_delete=models.CASCADE)
    vendor=models.ForeignKey(Vendor,verbose_name=_('第三方ID'),related_name='redirect_vendor',blank=True,null=True,on_delete=models.CASCADE)
    code=models.CharField(_('前端跳转代码'),max_length=10,unique=True)
    is_active=models.BooleanField(_('是否已上线'),default=True)
    synclogistics=models.BooleanField(_('同步物流数据'),default=False)
    redirect=models.CharField(_('消费者扫码跳转链接'),max_length=200,blank=True,null=True)
    parameter=models.CharField(_('跳转参数名'),max_length=20,blank=True,null=True)
    products=models.JSONField(_('指定产品'),default=list,blank=True,null=True)
    agents=models.JSONField(_('指定经销商'),default=list,blank=True,null=True)    
    remark=models.CharField(_('备注说明'),max_length=100,blank=True,null=True)
    tm=models.DateTimeField(_('时间'),auto_now_add=True)    

    class Meta:
        verbose_name = _('第三方跳转')
        verbose_name_plural = _('第三方跳转')


class OrderSync(models.Model):
    company=models.ForeignKey('company.Company',verbose_name='企业ID',on_delete=models.CASCADE)
    vendor=models.ForeignKey(Vendor,verbose_name=_('第三方ID'),related_name='ordersync_vendor',blank=True,null=True,on_delete=models.CASCADE)
    through_3rd=models.CharField(_('第三方名称'),max_length=80,db_index=True)  
    dn_number=models.CharField(_('货运单/发货单号'),max_length=50,blank=True,null=True,db_index=True)       
    order_code=models.CharField(_('订单编号'),max_length=50,blank=True,null=True)    
    order_type=models.JSONField(_('订单类型'),default=dict,blank=True,null=True)
    products=models.JSONField(_('产品信息'),default=list,blank=True,null=True) #[{'code':'','name':'','qty':0,'unit':'','remark':''}]    
    customer=models.JSONField(_('客户信息'),default=dict,blank=True,null=True) 
    storehouse=models.JSONField(_('仓库信息'),default=dict,blank=True,null=True)       
    data=models.JSONField(_('数据'),default=dict,blank=True,null=True)
    is_ok=models.BooleanField(_('同步是否成功'),default=True)    
    remark=models.CharField(_('备注说明'),max_length=400,blank=True,null=True)
    dt=models.DateField(_('同步日期'),db_index=True,auto_now_add=True)
    tm=models.DateTimeField(_('同步时间'),auto_now_add=True)    
    tm_modify=models.DateTimeField(_('修改时间'),auto_now_add=True)
    
    # 2024-02-01 酒鬼TMS可能会删除订单
    is_delete=models.BooleanField(_('是否已删除'),default=False,blank=True,null=True,db_index=True)    
    deletion=models.JSONField(_('请求信息'),default=dict,blank=True,null=True) #{'key':'','tm':'','ip:''}
    # 2024-02-05 酒鬼TMS可能会传分销商信息
    distributor=models.JSONField(_('分销商信息'),default=dict,blank=True,null=True)
    # 2024-08-27
    data0=models.JSONField(_('原始数据'),default=dict,blank=True,null=True)

    
    class Meta:
        verbose_name = _('同步第三方发货单信息')
        verbose_name_plural = _('同步第三方发货单信息')



class ObjectSync(models.Model):
    company=models.ForeignKey('company.Company',verbose_name='企业ID',on_delete=models.CASCADE)
    through_3rd=models.CharField(_('第三方名称'),max_length=80,db_index=True,blank=True,null=True)  
    ip_address=models.CharField(_('ip地址'),max_length=100)
    app_name=models.CharField(_('app'),max_length=20)
    obj_name=models.CharField(_('obj'),max_length=20)
    src=models.JSONField(_('源数据'),default=dict,blank=True,null=True)
    result=models.JSONField(_('返回值'),default=dict,blank=True,null=True)
    dt=models.DateField(_('日期'),auto_now_add=True,db_index=True)
    tm=models.DateTimeField(_('时间'),auto_now_add=True)

    class Meta:
        verbose_name = _('同步第三方发货单信息')
        verbose_name_plural = _('同步第三方发货单信息')





#2022-02-21 喷码机数据上传BATCH
class InkJetBatch(models.Model):
    company=models.ForeignKey('company.Company',verbose_name=_('企业'),related_name='inkjetbatch_company', on_delete=models.CASCADE)
    user=models.ForeignKey('company.User',verbose_name=_('用户帐号'),on_delete=models.CASCADE)
    salesorder=models.ForeignKey('erp.SalesOrder',verbose_name=_('销售订单'),blank=True,null=True,on_delete=models.CASCADE)
    deliverynote=models.ForeignKey('inventory.DeliveryNote',verbose_name=_('发货单'),blank=True,null=True,on_delete=models.CASCADE)
    dn_number=models.CharField(_('发货单号'),max_length=50,blank=True,null=True)
    ordertype=models.ForeignKey('erp.OrderType',verbose_name=_('订单类型ID'),blank=True,null=True,on_delete=models.CASCADE)    
    store=models.ForeignKey('inventory.Storehouse',verbose_name=_('仓库'),blank=True,null=True,on_delete=models.CASCADE)
    product=models.ForeignKey('product.Product',verbose_name=_('产品'),blank=True,null=True,on_delete=models.CASCADE)    
    qty=models.IntegerField(_('订单数量'),blank=True,null=True)
    unit=models.CharField(_('订单单位'),max_length=20,blank=True,null=True)
    qty0=models.IntegerField(_('订单瓶数'),default=0)   #最小计量单位的数量    
    marking=models.CharField(_('喷码信息'),max_length=100,blank=True,null=True)
    dt = models.DateField(_('日期'), auto_now_add=True, db_index=True)
    tm = models.DateTimeField(_('时间'), auto_now_add=True)
    remark=models.CharField(_('备注说明'),max_length=50,blank=True,null=True)
    #2022-03-23
    outbound=models.BooleanField(_('是否已出库'),default=False)

    class Meta:
        verbose_name = _('喷码机数据上传BATCH')
        verbose_name_plural = _('喷码机数据上传BATCH')



class InkJetDetails(models.Model):
    batch=models.ForeignKey(InkJetBatch,verbose_name=_('喷码BATCH'),on_delete=models.CASCADE)   
    company_id=models.IntegerField(_('企业ID'))     
    salesorder_id=models.IntegerField(_('销售订单ID'),blank=True,null=True,db_index=True)
    deliverynote_id=models.IntegerField(_('发货单ID'),blank=True,null=True,db_index=True)
    product_id=models.IntegerField(_('产品ID'),blank=True,null=True,db_index=True)
    ordertype_id=models.IntegerField(_('订单类型ID'),blank=True,null=True,db_index=True)
    store_id=models.IntegerField(_('仓库ID'),blank=True,null=True,db_index=True)
    label_code=models.CharField(_('标签号码'),max_length=20,db_index=True)
    label_pk_id=models.BigIntegerField(_('主箱标ID'),blank=True,null=True,db_index=True)    
    label_id=models.BigIntegerField(_('标签ID'),blank=True,null=True)
    qty0=models.SmallIntegerField(_('折合瓶数'),blank=True,null=True)   #最小计量单位的数量
    label_pkg=models.SmallIntegerField(_('标签类别'),blank=True,null=True,db_index=True)
    is_ok=models.BooleanField(_('是否正常'),default=True,db_index=True)
    err=models.CharField(_('错误信息'),max_length=100,blank=True,null=True)
    dt = models.DateField(_('日期'), auto_now_add=True,db_index=True)
    tm = models.DateTimeField(_('时间'), auto_now_add=True)
    remark=models.CharField(_('备注说明'),max_length=50,blank=True,null=True)

    class Meta:
        verbose_name = _('喷码机数据上传明细')
        verbose_name_plural = _('喷码机数据上传明细')






# 2023-07-24 不需要推送第三方的客户列表
class Exemption(models.Model):
    company_id=models.IntegerField(_('企业ID'))
    vendor=models.ForeignKey(Vendor,verbose_name=_('第三方'),related_name='exemption_vendor',blank=True,null=True,on_delete=models.CASCADE)
    customer_id=models.IntegerField(_('经销商id'))
    customer_name=models.CharField(_('经销商名称'),max_length=100)
    tm_create=models.DateTimeField(_('创建时间'),blank=True,null=True)
    remark=models.CharField(_('备注说明'),max_length=100,blank=True,null=True)

    class Meta:
        verbose_name = _('不推送第三方的客户列表')
        verbose_name_plural = _('不推送第三方的客户列表')
        unique_together=('company_id','vendor','customer_id')

# 2023-07-24 需推送第三方的batch列表
class BatchPost(models.Model):
    batch=models.ForeignKey('inventory.Batch',verbose_name=_('销售出库BATCH'),on_delete=models.CASCADE)
    company_id=models.IntegerField(_('企业ID'))
    code=models.CharField(_('单据编号'),max_length=30,blank=True,null=True)
    vtype_id=models.SmallIntegerField(_('单据类型'),default=2,blank=True,null=True)
    vendor=models.ForeignKey(Vendor,verbose_name=_('第三方'),related_name='batchpost_vendor',blank=True,null=True,on_delete=models.CASCADE)
    customer=models.JSONField(_('客户信息'),default=dict,blank=True,null=True)
    product=models.JSONField(_('产品信息'),default=dict,blank=True,null=True)
    dt_voucher=models.DateField(_('单据日期'),blank=True,null=True)
    tm_voucher=models.DateTimeField(_('单据时间'),blank=True,null=True)
    tm_create=models.DateTimeField(_('生成时间'),blank=True,null=True,auto_now_add=True)
    tm_post=models.DateTimeField(_('首推时间'),blank=True,null=True)
    success=models.BooleanField(_('推送是否成功'),default=False,blank=True,null=True)
    log=models.JSONField(_('推送日志'),default=list,blank=True,null=True)
    carton_cnt=models.IntegerField(_('箱数'),blank=True,null=True)
    bottle_cnt=models.IntegerField(_('瓶数'),blank=True,null=True)
    remark=models.CharField(_('备注说明'),max_length=100,blank=True,null=True)

    class Meta:
        verbose_name=_('需推送第三方的batch列表')
        verbose_name_plural=_('需推送第三方的batch列表')
        unique_together=('batch','vendor')



# 2023-10-26 MES需要绑瓶盖的企业
class BottleCapFcty(models.Model):
    company=models.OneToOneField('company.Company',verbose_name=_('企业名称'),on_delete=models.CASCADE,related_name='bottlecapfcty_company')
    erp_customer_id=models.IntegerField(_('天鉴ERP客户ID'))
    binding_type=models.SmallIntegerField(_('内外盖码绑定类型'),choices=(
        (1, '算法绑定'),
        (2, '扫码绑定')))    
    factories=models.CharField(_('瓶盖厂信息'),max_length=100,blank=True,null=True)
    dt = models.DateField(_('日期'), auto_now_add=True,db_index=True)
    tm = models.DateTimeField(_('时间'), auto_now_add=True)
    remark=models.CharField(_('备注说明'),max_length=100,blank=True,null=True)

    class Meta:
        verbose_name=_('需推送第三方的batch列表')
        verbose_name_plural=_('需推送第三方的batch列表')



# 2024-10-25
class MesBatch(models.Model):
    company=models.ForeignKey('company.Company',verbose_name=_('企业名称'),on_delete=models.CASCADE)
    vendor=models.CharField(_('第三方'),max_length=50)
    ip=models.CharField(_('IP地址'),max_length=100)
    product_code=models.CharField(_('产品编码'),max_length=100)
    product_name=models.CharField(_('产品名称'),max_length=150)
    product_id=models.IntegerField(_('产品ID'),blank=True,null=True)
    store_code=models.CharField(_('仓库编码'),max_length=50,blank=True,null=True)
    store_name=models.CharField(_('仓库名称'),max_length=100,blank=True,null=True)
    store_id=models.IntegerField(_('仓库ID'),blank=True,null=True)    
    shop=models.CharField(_('车间'),max_length=50,blank=True,null=True)
    line=models.CharField(_('产线'),max_length=50,blank=True,null=True)
    team=models.CharField(_('班组'),max_length=50,blank=True,null=True)
    batch_no=models.CharField(_('生产批次号'),max_length=50,blank=True,null=True)
    qc=models.CharField(_('质检员'),max_length=50,blank=True,null=True)    
    dt = models.DateField(_('日期'), auto_now_add=True,db_index=True)
    tm = models.DateTimeField(_('时间'), auto_now_add=True)
    remark=models.CharField(_('备注说明'),max_length=100,blank=True,null=True)

    class Meta:
        verbose_name=_('第三方推送产线数据batch')
        verbose_name_plural=_('第三方推送产线数据batch')


class MesDetails(models.Model):
    company=models.ForeignKey('company.Company',verbose_name=_('企业名称'),on_delete=models.CASCADE)
    batch=models.ForeignKey(MesBatch,verbose_name=_('数据batch'),on_delete=models.CASCADE)       
    stack=models.CharField(_('垛码'),max_length=50,blank=True,null=True)
    carton=models.CharField(_('箱码'),max_length=50,blank=True,null=True)
    box=models.CharField(_('盒码'),max_length=50,blank=True,null=True)
    bottle=models.CharField(_('瓶码'),max_length=50,blank=True,null=True)
    outter=models.CharField(_('盖外码'),max_length=50,blank=True,null=True)
    cap=models.CharField(_('盖内码'),max_length=50,blank=True,null=True)    
    carton_code=models.CharField(_('箱码'),max_length=20,blank=True,null=True,db_index=True)
    box_code=models.CharField(_('盒码'),max_length=20,blank=True,null=True,db_index=True)
    bottle_code=models.CharField(_('瓶码'),max_length=20,blank=True,null=True,db_index=True)
    outter_code=models.CharField(_('盖外码'),max_length=20,blank=True,null=True,db_index=True)
    cap_code=models.CharField(_('盖内码'),max_length=20,blank=True,null=True,db_index=True)  
    dt = models.DateField(_('日期'), auto_now_add=True,db_index=True)
    tm = models.DateTimeField(_('时间'), auto_now_add=True)
    remark=models.CharField(_('备注说明'),max_length=100,blank=True,null=True)

    class Meta:
        verbose_name=_('第三方推送产线数据明细')
        verbose_name_plural=_('第三方推送产线数据明细')


# 2024-12-21 第三方销售订单发货过帐
class OrderPosting(models.Model):
    '''
    目前订单都来自第三方，通过deliverynote关联订单信息
    每笔对订单有影响的batch(销售出库，销售退库）变动如新增修改（已设置级联删除）写入此表，以方便快捷实现订单管理
    '''
    ancestor=models.ForeignKey('company.Company',verbose_name=_('所属企业'),on_delete=models.CASCADE,related_name='orderposting_ancestor')
    company=models.ForeignKey('company.Company',verbose_name=_('所属公司'),on_delete=models.CASCADE,related_name='orderposting_company')
    deliverynote=models.ForeignKey('inventory.DeliveryNote',verbose_name=_('发货通知'),on_delete=models.CASCADE,related_name='orderposting_deliverynote')
    batch=models.ForeignKey('inventory.Batch',verbose_name=_('发货batch'),on_delete=models.CASCADE,related_name='orderposting_batch')
    user=models.ForeignKey('company.User',verbose_name=_('操作员'),on_delete=models.CASCADE,related_name='orderposting_user')
    dt_batch=models.DateField(_('发货batch日期'))
    product=models.ForeignKey('product.Product',verbose_name=_('产品'),on_delete=models.CASCADE,related_name='orderposting_product')
    qty=models.IntegerField(_('数量'))          # 正负整数    
    unit_id=models.SmallIntegerField(_('单位')) # 3:箱 1:瓶/盒
    dt = models.DateField(_('日期'), auto_now_add=True,db_index=True)
    tm = models.DateTimeField(_('时间'), auto_now_add=True)
    remark=models.CharField(_('备注说明'),max_length=100,blank=True,null=True)

    class Meta:
        verbose_name=_('订单发货过帐')
        verbose_name_plural=_('订单发货过帐')


# 2025-03-21 博智蒙古王预占订单
class OrderOccupy(models.Model):
    company=company=models.ForeignKey('company.Company',verbose_name=_('所属企业'),on_delete=models.CASCADE,related_name='orderoccupy_company')
    vendor=models.ForeignKey('company.Company',verbose_name=_('发货方'),on_delete=models.CASCADE,related_name='orderoccupy_vendor')
    agent=models.ForeignKey('company.Company',verbose_name=_('经销商'),on_delete=models.CASCADE,related_name='orderoccupy_agent',blank=True,null=True)
    src=models.CharField(_('来源第三方'), max_length=50)
    code=models.CharField(_('订单编号'),max_length=50)
    is_canceled=models.BooleanField(_('是否已取消'),db_index=True,blank=True,null=True,default=False)
    dt = models.DateField(_('日期'), auto_now_add=True,db_index=True)
    tm = models.DateTimeField(_('时间'), auto_now_add=True)
    remark=models.CharField(_('备注说明'),max_length=100,blank=True,null=True)
    
    class Meta:
        verbose_name=_('预占订单')
        verbose_name_plural=_('预占订单')
        unique_together=('company','code')
        

class OrderOccupyDetails(models.Model):
    company=models.ForeignKey('company.Company',verbose_name=_('所属企业'),on_delete=models.CASCADE,related_name='orderoccupydetails_company')
    order=models.ForeignKey(OrderOccupy,verbose_name=_('所属预占订单'),on_delete=models.CASCADE,related_name='orderoccupydetails_order')
    product=models.ForeignKey('product.Product',verbose_name=_('产品'),on_delete=models.CASCADE,related_name='orderoccupydetails_product')
    qty=models.IntegerField(_('数量'))
    unit_id=models.IntegerField(_('单位id'))
    unit_name=models.CharField(_('单位名称'),max_length=50)
    dt = models.DateField(_('日期'), auto_now_add=True,db_index=True)
    tm = models.DateTimeField(_('时间'), auto_now_add=True)
    remark=models.CharField(_('备注说明'),max_length=100,blank=True,null=True)

    class Meta:
        verbose_name=_('预占产品明细')
        verbose_name_plural=_('预占产品明细')

