"""Model for the USPhysicalProductView.""" from collections import OrderedDict from sqlalchemy import Column, Integer, String from sqlalchemy.ext.declarative import declarative_base from reporting.models.persister import get_all, get_filter from reporting.utils.physical_reporting import ( ProductSharedFieldsMixin, USCAProductSharedFieldsMixin, get_returns_disposition, ) BaseModel = declarative_base() def pricing_logic_to_override_custom_price_code(data): """Logic about Orchard Price Code.""" if data['Orchard Price Code'] and ( 'custom' not in data['Orchard Price Code'].lower() ): data['Orchard Price'] = data['Orchard Price Code'] data.pop('Orchard Price Code', None) class USPhysicalProductView( USCAProductSharedFieldsMixin, ProductSharedFieldsMixin, BaseModel ): """The US Physical Product View.""" __tablename__ = 'US_PHYSICAL_PRODUCT_VIEW' article_no = Column(String(18), name='ARTICLE_NO', nullable=False) product_code = Column(String(18), nullable=True, name='Product Code') open_scrap = Column(Integer, nullable=True, name='OPEN_SCRAP_QT') overstock_12_month_qt = Column( Integer, nullable=True, name='OVERSTOCK_12_MTD_QT' ) overstock_24_month_qt = Column( Integer, nullable=True, name='OVERSTOCK_24_MTD_QT' ) is_generic_product = Column( Integer, nullable=True, name='COOP_GENERIC_PRODUCT_IN' ) filter_data = [ {'column': 'Sub Label', 'alias': 'sub_label'}, {'column': 'Product Type', 'alias': 'product_type'}, {'column': 'Product Name', 'alias': 'product_name'}, {'column': 'Artist', 'alias': 'artist'}, {'column': 'Product Status', 'alias': 'product_status'}, {'column': 'UPC/EAN', 'alias': 'upc_ean'}, {'column': 'Product Code', 'alias': 'product_code'}, ] @classmethod def all(cls, params): """Get all for US Product View.""" filters = [ 'artist', 'product_status', 'product_type', 'product_name', 'sub_label', 'release_date', 'vendor_id', 'subacct_id', 'upc_ean', 'product_code', 'is_generic_product', ] return get_all(cls, params, filters) @classmethod def filter(cls, vendor_id, subaccount_id): """Get filter for US Product View.""" return get_filter( cls.__tablename__, vendor_id, subaccount_id, cls.filter_data ) @classmethod def headers(cls): """Get all headers.""" return [x for x in cls().to_dict().keys() if x != 'local_product_cd'] def metadata_to_dict(self): """To dict for the metadata rows.""" data = OrderedDict() data['local_product_cd'] = self.local_product_cd data['Product Name'] = self.product_name data['Artist'] = self.artist data['Label Name'] = self.label_name data['Sub Label'] = self.sub_label data['Genre'] = self.genre data['Sub Genre'] = self.sub_genre data['Product Code'] = self.product_code data['UPC/EAN'] = self.upc_ean try: data['Release Date'] = self.release_date.isoformat() except AttributeError: data['Release Date'] = '' data['Product Type'] = self.product_type data['Format'] = self.product_format data['Units Per Set'] = self.units_per_set data['Display Configuration'] = self.display_configuration data['Box Lot'] = self.boxlot data['Exclusive'] = self.exclusive data['Exclusive For'] = self.exclusive_for data['Orchard Price Code'] = self.orchard_price_code data['Orchard Price'] = self.orchard_price pricing_logic_to_override_custom_price_code(data) data['Wholesale Price'] = self.wholesale_price return data def to_dict(self): """To dictionary.""" data = self.metadata_to_dict() data['On Hand'] = self.on_hand data['Available'] = self.available data['Purchase Orders'] = self.purchase_orders data['Potential'] = self.potential data['Returns In Process'] = self.returns_in_process data['On Hold'] = self.on_hold data['Open Scrap'] = self.open_scrap data['Product Status'] = self.product_status data['Returnability'] = self.returnability data['Returns Disposition'] = get_returns_disposition( self.returns_disposition, self.returns_disposition_override ) data['12M Overstock'] = self.overstock_12_month_qt data['24M Overstock'] = self.overstock_24_month_qt data['Open Orders'] = self.open_orders data['Backorders'] = self.backorders data['Day1S#'] = self.day_1_s data['Day1R#'] = self.day_1_r data['Day1S$'] = self.day_1_s_dollars data['Day1R$'] = self.day_1_r_dollars data['5DayS#'] = self.five_day_s data['5DayR#'] = self.five_day_r data['5DayS$'] = self.five_day_s_dollars data['5DayR$'] = self.five_day_r_dollars data['MTDS#'] = self.mtds data['MTDR#'] = self.mtdr data['MTDS$'] = self.mtds_dollars data['MTDR$'] = self.mtdr_dollars data['3MS#'] = self.three_month_s data['3MR#'] = self.three_month_r data['3MS$'] = self.three_month_s_dollars data['3MR$'] = self.three_month_r_dollars data['12MS#'] = self.twelve_month_s data['12MR#'] = self.twelve_month_r data['12MS$'] = self.twelve_month_s_dollars data['12MR$'] = self.twelve_month_r_dollars data['24MS#'] = self.twenty_four_month_s data['24MR#'] = self.twenty_four_month_r data['24MS$'] = self.twenty_four_month_s_dollars data['24MR$'] = self.twenty_four_month_r_dollars data['CYTDS#'] = self.cytds data['CYTDR#'] = self.cytdr data['CYTDS$'] = self.cytds_dollars data['CYTDR$'] = self.cytdr_dollars data['RTDS#'] = self.rtds data['RTDR#'] = self.rtdr data['RTDS$'] = self.rtds_dollars data['RTDR$'] = self.rtdr_dollars return data