diff --git a/.gitignore b/.gitignore index 804eb5d..98ed8fb 100644 --- a/.gitignore +++ b/.gitignore @@ -38,4 +38,5 @@ failed_records.csv successful_records.csv server.key server.crt -AssetWarranty.csv \ No newline at end of file +AssetWarranty.csv +FSL_Asset_Maintenance_Information__c.csv \ No newline at end of file diff --git a/prepared_steps/1_extract_data/mapping_support/SCQualificationSpecification__c_ProductUnitClass_Translation b/prepared_steps/1_extract_data/mapping_support/SCQualificationSpecification__c_ProductUnitClass_Translation new file mode 100644 index 0000000..64d977d --- /dev/null +++ b/prepared_steps/1_extract_data/mapping_support/SCQualificationSpecification__c_ProductUnitClass_Translation @@ -0,0 +1,16 @@ +PicklistValue.SCQualificationSpecification__c.ProductUnitClass.00 (standard) +PicklistValue.SCQualificationSpecification__c.ProductUnitClass.01 WHB +PicklistValue.SCQualificationSpecification__c.ProductUnitClass.02 FSB GAS +PicklistValue.SCQualificationSpecification__c.ProductUnitClass.03 FSB OTHER +PicklistValue.SCQualificationSpecification__c.ProductUnitClass.04 GAS INSTANTANEOUS +PicklistValue.SCQualificationSpecification__c.ProductUnitClass.05 STORAGE +PicklistValue.SCQualificationSpecification__c.ProductUnitClass.06 ELECTRO WATER HEATERS +PicklistValue.SCQualificationSpecification__c.ProductUnitClass.07 REGENERATIVE ENERGY +PicklistValue.SCQualificationSpecification__c.ProductUnitClass.08 AIR CONDITIONING +PicklistValue.SCQualificationSpecification__c.ProductUnitClass.10 SYSTEM COMPONENTS +PicklistValue.SCQualificationSpecification__c.ProductUnitClass.11 ELECTRICAL APPLIANCES +PicklistValue.SCQualificationSpecification__c.ProductUnitClass.12 MCHP (MICRO COMBINED HEAT AND POWER) +PicklistValue.SCQualificationSpecification__c.ProductUnitClass.13 HEATING SATELLITES +PicklistValue.SCQualificationSpecification__c.ProductUnitClass.14 RADIATORS +PicklistValue.SCQualificationSpecification__c.ProductUnitClass.40 OTHERS +PicklistValue.SCQualificationSpecification__c.ProductUnitClass.99 NON-ALLOCATED ARTICLES \ No newline at end of file diff --git a/prepared_steps/1_extract_data/mapping_support/SCQualificationSpecification__c_ProductUnitType_Translation b/prepared_steps/1_extract_data/mapping_support/SCQualificationSpecification__c_ProductUnitType_Translation new file mode 100644 index 0000000..8df33f0 --- /dev/null +++ b/prepared_steps/1_extract_data/mapping_support/SCQualificationSpecification__c_ProductUnitType_Translation @@ -0,0 +1,99 @@ +PicklistValue.SCQualificationSpecification__c.ProductUnitType.000 (standard) +PicklistValue.SCQualificationSpecification__c.ProductUnitType.011 WHB NON CONDENSING +PicklistValue.SCQualificationSpecification__c.ProductUnitType.012 WHB CONDENSING +PicklistValue.SCQualificationSpecification__c.ProductUnitType.021 FSB GAS NON CONDENSING +PicklistValue.SCQualificationSpecification__c.ProductUnitType.022 FSB GAS CONDENSING +PicklistValue.SCQualificationSpecification__c.ProductUnitType.031 OIL NON CONDENSING +PicklistValue.SCQualificationSpecification__c.ProductUnitType.032 OIL CONDENSING +PicklistValue.SCQualificationSpecification__c.ProductUnitType.033 SOLID FUEL +PicklistValue.SCQualificationSpecification__c.ProductUnitType.041 GAS INSTANTANEOUS NON CONDENSING +PicklistValue.SCQualificationSpecification__c.ProductUnitType.051 INDIRECT STORAGE +PicklistValue.SCQualificationSpecification__c.ProductUnitType.052 GAS STORAGE +PicklistValue.SCQualificationSpecification__c.ProductUnitType.053 ELECTRICAL STORAGE +PicklistValue.SCQualificationSpecification__c.ProductUnitType.054 BUFFER STORAGE +PicklistValue.SCQualificationSpecification__c.ProductUnitType.061 INSTANTANEOUS ELECTRIC WATERHEATERS +PicklistValue.SCQualificationSpecification__c.ProductUnitType.062 HOT BOILLING APPLIANCES +PicklistValue.SCQualificationSpecification__c.ProductUnitType.071 SOLAR ENERGY +PicklistValue.SCQualificationSpecification__c.ProductUnitType.072 DOMESTIC VENTILATION +PicklistValue.SCQualificationSpecification__c.ProductUnitType.073 HEAT PUMPS +PicklistValue.SCQualificationSpecification__c.ProductUnitType.074 ZEOLITE HEATING UNIT +PicklistValue.SCQualificationSpecification__c.ProductUnitType.075 PHOTOVOLTAIC +PicklistValue.SCQualificationSpecification__c.ProductUnitType.076 076 +PicklistValue.SCQualificationSpecification__c.ProductUnitType.081 AIR - AIR (DIRECT EXPANSION) +PicklistValue.SCQualificationSpecification__c.ProductUnitType.082 AIR - WATER +PicklistValue.SCQualificationSpecification__c.ProductUnitType.101 ACC. FLUE SYSTEMS +PicklistValue.SCQualificationSpecification__c.ProductUnitType.102 ACC. HYDRAULICS +PicklistValue.SCQualificationSpecification__c.ProductUnitType.103 ACC. CONTROLS +PicklistValue.SCQualificationSpecification__c.ProductUnitType.104 ACC. ELECTRICALS +PicklistValue.SCQualificationSpecification__c.ProductUnitType.105 ACC. SOLAR +PicklistValue.SCQualificationSpecification__c.ProductUnitType.106 ACC. OTHER +PicklistValue.SCQualificationSpecification__c.ProductUnitType.107 ACC. HEAT PUMP +PicklistValue.SCQualificationSpecification__c.ProductUnitType.108 ACC. SOLID FUEL +PicklistValue.SCQualificationSpecification__c.ProductUnitType.109 ACC. DOMESTIC VENTILATION +PicklistValue.SCQualificationSpecification__c.ProductUnitType.10C 10C +PicklistValue.SCQualificationSpecification__c.ProductUnitType.111 HEAT STORAGE +PicklistValue.SCQualificationSpecification__c.ProductUnitType.112 ROOM HEATER +PicklistValue.SCQualificationSpecification__c.ProductUnitType.113 HEATING WATER STORAGE +PicklistValue.SCQualificationSpecification__c.ProductUnitType.114 ELECTRICAL WHB +PicklistValue.SCQualificationSpecification__c.ProductUnitType.121 ICE - GAS MOTOR +PicklistValue.SCQualificationSpecification__c.ProductUnitType.122 FUEL CELL +PicklistValue.SCQualificationSpecification__c.ProductUnitType.131 HEATING SATELLITES 2-STRING-SYSTEM +PicklistValue.SCQualificationSpecification__c.ProductUnitType.132 HEATING SATELLITES 4-STRING-SYSTEM +PicklistValue.SCQualificationSpecification__c.ProductUnitType.141 TOWEL HEATERS +PicklistValue.SCQualificationSpecification__c.ProductUnitType.142 CAST IRON RADIATORS +PicklistValue.SCQualificationSpecification__c.ProductUnitType.143 STEEL PANEL 25MM RADIATORS +PicklistValue.SCQualificationSpecification__c.ProductUnitType.144 STEEL PANEL 33MM RADIATORS +PicklistValue.SCQualificationSpecification__c.ProductUnitType.145 FIX RADIATORS +PicklistValue.SCQualificationSpecification__c.ProductUnitType.301 Spares +PicklistValue.SCQualificationSpecification__c.ProductUnitType.401 GAS ROOM HEATERS +PicklistValue.SCQualificationSpecification__c.ProductUnitType.404 SKD +PicklistValue.SCQualificationSpecification__c.ProductUnitType.405 BACK BOILERS +PicklistValue.SCQualificationSpecification__c.ProductUnitType.406 Components +PicklistValue.SCQualificationSpecification__c.ProductUnitType.407 Radiator +PicklistValue.SCQualificationSpecification__c.ProductUnitType.409 OTHERS +PicklistValue.SCQualificationSpecification__c.ProductUnitType.501 External Sales Customer Service +PicklistValue.SCQualificationSpecification__c.ProductUnitType.601 Packages Whb +PicklistValue.SCQualificationSpecification__c.ProductUnitType.605 Packages Store Tank +PicklistValue.SCQualificationSpecification__c.ProductUnitType.607 Packages Solar +PicklistValue.SCQualificationSpecification__c.ProductUnitType.608 Packages Clima +PicklistValue.SCQualificationSpecification__c.ProductUnitType.609 Packages Fsb Oil +PicklistValue.SCQualificationSpecification__c.ProductUnitType.702 PL (Third Parties) +PicklistValue.SCQualificationSpecification__c.ProductUnitType.706 DK (Third Parties) +PicklistValue.SCQualificationSpecification__c.ProductUnitType.707 BE (Third Parties) +PicklistValue.SCQualificationSpecification__c.ProductUnitType.708 CH (Third) +PicklistValue.SCQualificationSpecification__c.ProductUnitType.710 GU Merchandise TG +PicklistValue.SCQualificationSpecification__c.ProductUnitType.711 GU Merchandise AT +PicklistValue.SCQualificationSpecification__c.ProductUnitType.712 GU Merchandise IT +PicklistValue.SCQualificationSpecification__c.ProductUnitType.713 GU Merchandise ES +PicklistValue.SCQualificationSpecification__c.ProductUnitType.714 GU Merchandise GB +PicklistValue.SCQualificationSpecification__c.ProductUnitType.715 GU Merchandise FR +PicklistValue.SCQualificationSpecification__c.ProductUnitType.717 GU Merchandise DK +PicklistValue.SCQualificationSpecification__c.ProductUnitType.718 GU Merchandise BE +PicklistValue.SCQualificationSpecification__c.ProductUnitType.719 GU Others Merchandise +PicklistValue.SCQualificationSpecification__c.ProductUnitType.721 GE Merchandise TG AT +PicklistValue.SCQualificationSpecification__c.ProductUnitType.723 GE Merchandise TG DK +PicklistValue.SCQualificationSpecification__c.ProductUnitType.724 GE Merchandise TG BE +PicklistValue.SCQualificationSpecification__c.ProductUnitType.730 GK Merchandise TG +PicklistValue.SCQualificationSpecification__c.ProductUnitType.731 GK Merchandise AT +PicklistValue.SCQualificationSpecification__c.ProductUnitType.732 GK Merchandise ES +PicklistValue.SCQualificationSpecification__c.ProductUnitType.741 EC Merchandise AT +PicklistValue.SCQualificationSpecification__c.ProductUnitType.742 GB (Third) EC +PicklistValue.SCQualificationSpecification__c.ProductUnitType.751 Merchandise TG AT For GE-MAG +PicklistValue.SCQualificationSpecification__c.ProductUnitType.753 Merchandise TG IT For GE-MAG +PicklistValue.SCQualificationSpecification__c.ProductUnitType.761 Spare Parts Merchandise AT +PicklistValue.SCQualificationSpecification__c.ProductUnitType.762 Spare Parts Merchandise IT +PicklistValue.SCQualificationSpecification__c.ProductUnitType.764 Spare Parts Merchandise GB +PicklistValue.SCQualificationSpecification__c.ProductUnitType.767 Spare Parts Merchandise DK +PicklistValue.SCQualificationSpecification__c.ProductUnitType.801 Advertising Material +PicklistValue.SCQualificationSpecification__c.ProductUnitType.809 Other Merchandise +PicklistValue.SCQualificationSpecification__c.ProductUnitType.821 Components +PicklistValue.SCQualificationSpecification__c.ProductUnitType.831 Aluminium +PicklistValue.SCQualificationSpecification__c.ProductUnitType.832 Brass +PicklistValue.SCQualificationSpecification__c.ProductUnitType.833 Services Rendered/Others +PicklistValue.SCQualificationSpecification__c.ProductUnitType.834 Siemens +PicklistValue.SCQualificationSpecification__c.ProductUnitType.841 Tools For Punching And Bending +PicklistValue.SCQualificationSpecification__c.ProductUnitType.842 Diecasting/Deburring Tools +PicklistValue.SCQualificationSpecification__c.ProductUnitType.843 Samples/Prototypes +PicklistValue.SCQualificationSpecification__c.ProductUnitType.901 Old Appliances +PicklistValue.SCQualificationSpecification__c.ProductUnitType.951 Dummy +PicklistValue.SCQualificationSpecification__c.ProductUnitType.999 NON-ALLOCATED ARTICLES \ No newline at end of file diff --git a/prepared_steps/1_extract_data/queries.json b/prepared_steps/1_extract_data/queries.json index be6ba64..631aca6 100644 --- a/prepared_steps/1_extract_data/queries.json +++ b/prepared_steps/1_extract_data/queries.json @@ -26,23 +26,45 @@ "query": "SELECT Id, InstalledBaseLocation__c, Role__c, ValidFrom__c, ValidTo__c, Account__c FROM SCInstalledBaseRole__c WHERE InstalledBaseLocation__r.Country__c = '{country}' AND InstalledBaseLocation__c IN ('a1B1r000008XXEdEAO', 'a1B1r000008XXEiEAO', 'a1B1r000008XXH8EAO')" },{ "sobject": "SCPriceList__c", + "useREST": true, "query": "SELECT Id, Name, Brand__r.Name, Country__c from SCPriceList__c WHERE Country__c = '{country}' AND PriceList__c != null" },{ "sobject": "SCPriceListItem__c", "query": "SELECT Id, Article__r.Name, Price__c, PriceUnit__c, Pricelist__c, ValidFrom__c, ValidTo__c, Article__r.EANCode__c, Pricelist__r.Brand__r.Name, Pricelist__r.Country__c FROM SCPriceListItem__c WHERE Country__c = '{country}' AND PriceList__c != null AND (ValidTo__c >= TODAY OR ValidFrom__c >= TODAY) AND Article__c = 'a0Gw000001R9slpEAB'" },{ "sobject": "SCResourceAssignment__c", - "query": "SELECT Id, ValidTo__c, ValidFrom__c, Country__c, City__c, PostalCode__c, District__c, Street__c, HouseNo__c, Extension__c, FlatNo__c, Floor__c, GeoY__c, GeoX__c, Resource__c, Resource__r.Employee__r.Name, Stock__c, Stock__r.ID2__c FROM SCResourceAssignment__c WHERE Country__c = '{country}' AND ValidTo__c >= TODAY" + "useREST": true, + "query": "SELECT Id, ValidTo__c, ValidFrom__c, Country__c, City__c, PostalCode__c, District__c, Street__c, HouseNo__c, Extension__c, FlatNo__c, Floor__c, GeoY__c, GeoX__c, Resource__c, Resource__r.Employee__r.Name, Stock__c, Stock__r.ID2__c, QualificationProfile__c FROM SCResourceAssignment__c WHERE Country__c = '{country}' AND ValidTo__c >= TODAY" },{ "sobject": "ContractTemplates", + "useREST": true, "query": "SELECT id, name, TemplateName__c, status__c, Brand__r.Name, Country__c, Runtime__c FROM SCContract__c WHERE Template__c = null AND Country__c = '{country}'" },{ "sobject": "SCContract__c", - "query": "SELECT id, name, Template__c, status__c, Brand__r.Name, Country__c, Runtime__c, EndDate__c, StartDate__c, Account__c, AccountOwner__c, IoT_Registration_Status__c FROM SCContract__c WHERE Template__c != null AND EndDate__c >= TODAY AND Country__c = '{country}' limit 3" + "query": "SELECT id, name, Template__c, status__c, Brand__r.Name, Country__c, Runtime__c, EndDate__c, StartDate__c, Account__c, AccountOwner__c, IoT_Registration_Status__c, Maintenance_price_inclusion_of_VAT__c, MaintenanceAfterDue__c, MaintenanceBeforeDue__c, MaintenanceCreationLeadtime__c, MaintenanceCreationShiftFactor__c, MaintenanceDuration__c, MaintenanceFirstDate__c, MaintenanceLastDate__c, MaintenanceInterval__c, MaintenancePriceRequired__c, util_MaintenancePrice__c, util_MaintenanceDuration__c, util_MaintenanceNextDate__c FROM SCContract__c WHERE Template__c != null AND EndDate__c >= TODAY AND Country__c = '{country}' limit 3" },{ "sobject": "WarrantyTerm", "useREST": true, "query": "SELECT Id, WarrantyTermName, WarrantyDuration, WarrantyType, pricebook2.country__c FROM WarrantyTerm WHERE Pricebook2Id = null OR pricebook2.Country__c = '{country}'" + },{ + "sobject": "SCQualificationProfile__c", + "useREST": true, + "query": "SELECT Id, Name, Description__c, Id2__c, Standard__c FROM SCQualificationProfile__c WHERE Name like '{country}%'" + },{ + "sobject": "SCQualificationProfileItem__c", + "useREST": true, + "query": "SELECT CertificationId__c,Id,Info__c,Level__c,ValidFrom__c,ValidTo__c, Name,Qualification__c FROM SCQualificationProfileItem__c WHERE Profile__r.Name Like '{country}%' AND (ValidTo__c >= TODAY OR ValidFrom__c >= TODAY)" + },{ + "sobject": "SCQualificationSpecification__c", + "useREST": true, + "query": "SELECT Id, Name, Brand__c, CertificationId__c, Combined__c, OrderType__c, QualificationProfile__c, ProductUnitType__c, ProductUnitClass__c FROM SCQualificationSpecification__c WHERE Country__c = '{country}'" + },{ + "sobject": "LastMaintenanceInformation", + "query": "SELECT Id, InstalledBase__r.SerialNo__c, Order__r.Closed__c FROM SCOrderItem__c WHERE Order__r.Status__c IN ('5506', '5508') AND InstalledBase__r.SerialNo__c != null AND Order__r.Type__c = '5707' AND Order__r.Country__c = '{country}'" + },{ + "sobject": "WorkType", + "useREST": true, + "query": "SELECT Id, Name from WorkType" } ] } \ No newline at end of file diff --git a/prepared_steps/2_transform_via_script/TransformScript.py b/prepared_steps/2_transform_via_script/TransformScript.py index 7f1c995..f563ab7 100644 --- a/prepared_steps/2_transform_via_script/TransformScript.py +++ b/prepared_steps/2_transform_via_script/TransformScript.py @@ -41,6 +41,10 @@ read_df_location_iot = pd.read_csv('../1_extract_data/results/ParentLocation.csv read_df_servicecontracttemplates = pd.read_csv('../1_extract_data/results/ContractTemplates.csv', header=0, keep_default_na=False, dtype=str) read_df_servicecontracts = pd.read_csv('../1_extract_data/results/SCContract__c.csv', header=0, keep_default_na=False, dtype=str) read_df_warrantyterm = pd.read_csv('../1_extract_data/results/WarrantyTerm.csv', header=0, keep_default_na=False, dtype=str) +read_df_qualificationprofile = pd.read_csv('../1_extract_data/results/SCQualificationProfile__c.csv', header=0, keep_default_na=False, dtype=str) +read_df_qualificationprofileitem = pd.read_csv('../1_extract_data/results/SCQualificationProfileItem__c.csv', header=0, keep_default_na=False, dtype=str) +read_df_lastmaintenance = pd.read_csv('../1_extract_data/results/LastMaintenanceInformation.csv', header=0, keep_default_na=False, dtype=str) +read_df_worktype = pd.read_csv('../1_extract_data/results/WorkType.csv', header=0, keep_default_na=False, dtype=str) # Columns for reindexing reindex_columns = ['Id','City__c','Country__c','GeoY__c','GeoX__c','PostalCode__c','Street__c','Extension__c','HouseNo__c','FlatNo__c','Floor__c'] @@ -53,8 +57,12 @@ reindex_columns_resourceassignment = ['Id', 'ValidTo__c', 'ValidFrom__c', 'Count reindex_columns_address_iot = ['Id', 'Country', 'CountryCode', 'Street', 'City', 'ParentId', 'PostalCode'] reindex_columns_location_iot = ['Id', 'Name'] reindex_columns_servicecontracttemplates = ['Id', 'Name', 'TemplateName__c', 'Status__c', 'Brand__r.Name', 'Country__c', 'Runtime__c'] -reindex_columns_servicecontracts = ['Id', 'Name', 'Template__c', 'Status__c', 'Brand__r.Name', 'Country__c', 'Runtime__c', 'EndDate__c', 'StartDate__c', 'Account__c', 'AccountOwner__c', 'IoT_Registration_Status__c'] +reindex_columns_servicecontracts = ['Id', 'Name', 'Template__c', 'Status__c', 'Brand__r.Name', 'Country__c', 'Runtime__c', 'EndDate__c', 'StartDate__c', 'Account__c', 'AccountOwner__c', 'IoT_Registration_Status__c', 'Maintenance_price_inclusion_of_VAT__c', 'MaintenanceAfterDue__c', 'MaintenanceBeforeDue__c', 'MaintenanceCreationLeadtime__c', 'MaintenanceCreationShiftFactor__c', 'MaintenanceDuration__c', 'MaintenanceFirstDate__c', 'MaintenanceLastDate__c', 'MaintenanceInterval__c', 'MaintenancePriceRequired__c', 'util_MaintenancePrice__c', 'util_MaintenanceDuration__c', 'util_MaintenanceNextDate__c'] reindex_columns_warrantyterm = ['Id', 'WarrantyTermName', 'WarrantyDuration', 'WarrantyType', 'Pricebook2'] +reindex_columns_qualificationprofile = ['Id', 'Name', 'Description__c', 'ID2__c', 'Standard__c'] +reindex_columns_qualificationprofileitem = ['CertificationId__c', 'Id', 'Info__c', 'Level__c', 'ValidFrom__c', 'ValidTo__c', 'Name', 'Qualification__c'] +reindex_columns_lastmaintenance = ['Id', 'InstalledBase__r.SerialNo__c', 'Order__r.Closed__c'] +reindex_columns_worktype = ['Id', 'Name'] # Reindex the columns to match the desired format df = read_df.reindex(reindex_columns, axis=1) @@ -69,6 +77,10 @@ df_location_iot = read_df_location_iot.reindex(reindex_columns_location_iot, axi df_servicecontracttemplates = read_df_servicecontracttemplates.reindex(reindex_columns_servicecontracttemplates, axis=1) df_servicecontract = read_df_servicecontracts.reindex(reindex_columns_servicecontracts, axis=1) df_warrantyterm = read_df_warrantyterm.reindex(reindex_columns_warrantyterm, axis=1) +df_qualificationprofile = read_df_qualificationprofile.reindex(reindex_columns_qualificationprofile, axis=1) +df_qualificationprofileitem = read_df_qualificationprofileitem.reindex(reindex_columns_qualificationprofileitem, axis=1) +df_lastmaintenance = read_df_lastmaintenance.reindex(reindex_columns_lastmaintenance, axis=1) +df_worktype = read_df_worktype.reindex(reindex_columns_worktype, axis=1) ##--------------------------------------------------------------------------## ## Update for IoT Addresses and Locations @@ -227,7 +239,7 @@ df_assetwarranty_standard['WarrantyTermId'] = standard_warranty['Id'].iloc[0] print(df_assetwarranty_standard) # Rename columns for asset warranty -df_assetwarranty_standard.columns = ['Asset.PKey__c', 'StartDate', 'EndDate', 'WarrantyTerm.Id'] +df_assetwarranty_standard.columns = ['Asset.PKey__c', 'StartDate', 'EndDate', 'WarrantyTerm.PKey__c'] #Fetching data for extended warranty where GuaranteeExtended__c is filled and different from GuaranteeStandard__c df_assetwarranty_extended = df_ib[ @@ -255,13 +267,19 @@ if(not df_assetwarranty_extended.empty): print(df_assetwarranty_extended) # Rename columns for asset warranty - df_assetwarranty_extended.columns = ['Asset.PKey__c', 'StartDate', 'EndDate', 'WarrantyTerm.Id'] + df_assetwarranty_extended.columns = ['Asset.PKey__c', 'StartDate', 'EndDate', 'WarrantyTerm.PKey__c'] + + # Convert EndDate to datetime and extract only the date part + df_assetwarranty_extended['EndDate'] = pd.to_datetime(df_assetwarranty_extended['EndDate']).dt.date # Add them to a merged df for saving purposes - df_assetwarranty_save = pd.concat(df_assetwarranty_standard, df_assetwarranty_extended) + df_assetwarranty_save = pd.concat([df_assetwarranty_standard, df_assetwarranty_extended]) else: df_assetwarranty_save = df_assetwarranty_standard +# Filter out rows where either StartDate or EndDate is empty or null +df_assetwarranty_save = df_assetwarranty_save.dropna(subset=['StartDate', 'EndDate']) + merged_df_ib = merged_df_ib.drop('GuaranteeStandard__c', axis=1) merged_df_ib = merged_df_ib.drop('GuaranteeExtended__c', axis=1) merged_df_ib = merged_df_ib.drop('WarrantyDuration__c', axis=1) @@ -364,6 +382,32 @@ for index, row in tqdm(merged_df_ib.iterrows(), total=len(merged_df_ib)): if product_group not in valid_groups: merged_df_ib.loc[index, 'Kind_of_Energy__c'] = None # or set to empty string +##--------------------------------------------------------------------------## +## Asset Maintenance Information +##--------------------------------------------------------------------------## + +# Create asset maintenance records based on last maintenance information +df_maintenance = pd.merge( + merged_df_ib[['SerialNumber', 'PKey__c']], + df_lastmaintenance[['InstalledBase__r.SerialNo__c', 'Order__r.Closed__c']], + left_on='SerialNumber', + right_on='InstalledBase__r.SerialNo__c', + how='inner' +) + +# Clean up the maintenance dataframe +df_maintenance = df_maintenance.drop('InstalledBase__r.SerialNo__c', axis=1) +df_maintenance.columns = ['SerialNumber', 'FSL_Asset__r.PKey__c', 'FSL_Maintenance_Date__c'] + +# Sort the maintenance records by SerialNumber and FSL_Maintenance_Date__c in descending order +df_maintenance = df_maintenance.sort_values(by=['SerialNumber', 'FSL_Maintenance_Date__c'], ascending=[True, False]) + +# Remove any duplicates +df_maintenance = df_maintenance.drop_duplicates(subset=['SerialNumber'], keep='first') + +# Extract just the date part from the FSL_Maintenance_Date__c field +df_maintenance['FSL_Maintenance_Date__c'] = pd.to_datetime(df_maintenance['FSL_Maintenance_Date__c']).dt.date + ##--------------------------------------------------------------------------## ## Pricebook2 and PricebookEntry ##--------------------------------------------------------------------------## @@ -519,6 +563,26 @@ df_servicecontracttemplates['Term'] = df_servicecontracttemplates['Term'].fillna ## Service Contract ##--------------------------------------------------------------------------## +# Create new dataframe for maintenance plan fields +df_maintenanceplan = df_servicecontract[['Id', 'StartDate__c', 'EndDate__c', 'Account__c', 'Maintenance_price_inclusion_of_VAT__c', 'MaintenanceAfterDue__c', + 'MaintenanceBeforeDue__c', 'MaintenanceCreationLeadtime__c', + 'MaintenanceCreationShiftFactor__c', 'MaintenanceDuration__c', + 'MaintenanceFirstDate__c', 'MaintenanceLastDate__c', + 'MaintenanceInterval__c', 'MaintenancePriceRequired__c', + 'util_MaintenancePrice__c', 'util_MaintenanceDuration__c', + 'util_MaintenanceNextDate__c']].copy() + +# Drop maintenance fields from service contract dataframe, except Id +maintenance_fields = ['Maintenance_price_inclusion_of_VAT__c', 'MaintenanceAfterDue__c', + 'MaintenanceBeforeDue__c', 'MaintenanceCreationLeadtime__c', + 'MaintenanceCreationShiftFactor__c', 'MaintenanceDuration__c', + 'MaintenanceFirstDate__c', 'MaintenanceLastDate__c', + 'MaintenanceInterval__c', 'MaintenancePriceRequired__c', + 'util_MaintenancePrice__c', 'util_MaintenanceDuration__c', + 'util_MaintenanceNextDate__c'] + +df_servicecontract = df_servicecontract.drop(maintenance_fields, axis=1) + df_servicecontract['Pricebook2.Name'] = ( df_servicecontract['Country__c'].astype(str).fillna('').str.upper() + ' ' + df_servicecontract['Brand__r.Name'].astype(str).fillna('').str.upper() + ' ' + @@ -539,6 +603,40 @@ df_servicecontract['TemplateCountry__c'] = df_servicecontract['BillingCountryCod df_servicecontract['Term'] = pd.to_numeric(df_servicecontract['Term'].str.extract('(\d+)')[0], errors='coerce') df_servicecontract['Term'] = df_servicecontract['Term'].fillna(0).astype(int) +##--------------------------------------------------------------------------## +## MaintenancePlan, MaintenanceAsset +##--------------------------------------------------------------------------## + +df_maintenanceplan.columns = ['ServiceContract.PKey__c', 'StartDate', 'AccountId', 'MaintenancePriceInclusionOfVAT__c', + 'MaintenanceWindowEndDays', 'MaintenanceWindowStartDays', 'GenerationTimeframe', + 'MaintenanceCreationShiftFactor__c', 'MaintenanceDuration__c', 'Frequency', 'MaintenancePriceRequired__c', + 'util_MaintenancePrice__c', 'util_MaintenanceDuration__c', 'util_MaintenanceNextDate__c'] + +# Add 'Days' to the 'GenerationTimeframe' column +df_maintenanceplan['GenerationTimeframeType'] = 'Days' + +maintenance_fields_to_drop = ['MaintenancePriceInclusionOfVAT__c', + 'MaintenanceCreationShiftFactor__c', 'MaintenanceDuration__c', + 'MaintenanceFirstDate__c', 'MaintenanceLastDate__c', + 'MaintenancePriceRequired__c', + 'util_MaintenancePrice__c', 'util_MaintenanceDuration__c', + 'util_MaintenanceNextDate__c'] + +df_maintenanceplan = df_maintenanceplan.drop(maintenance_fields_to_drop, axis=1) + +# Get the worktype ID for "Planned Maintenance" +maintenance_worktype_id = df_worktype[df_worktype['Name'] == 'Planned Maintenance']['Id'].iloc[0] + +# Add WorkTypeId to maintenance plan +df_maintenanceplan['WorkTypeId'] = maintenance_worktype_id + +##--------------------------------------------------------------------------## +## Skills +##--------------------------------------------------------------------------## + + + + ##--------------------------------------------------------------------------## ## Saving to CSV ##--------------------------------------------------------------------------## @@ -555,6 +653,7 @@ merged_df_location_iot.to_csv('../3_update_address_and_location_data_for_migrati df_servicecontracttemplates.to_csv('../14_insert_servicecontracttemplates_dummies/ServiceContract.csv', index=False) df_servicecontract.to_csv('../16_insert_servicecontract/ServiceContract_beforetransform.csv', index=False) df_assetwarranty_save.to_csv('../9_upsert_assets/AssetWarranty.csv', index=False) +df_maintenance.to_csv('../9_upsert_assets/FSL_Asset_Maintenance_Information__c.csv', index=False) ## end mapping print('Data has been successfully transformed and saved to CSV files.') \ No newline at end of file diff --git a/prepared_steps/9_upsert_assets/export.json b/prepared_steps/9_upsert_assets/export.json index 37c7417..b3499bb 100644 --- a/prepared_steps/9_upsert_assets/export.json +++ b/prepared_steps/9_upsert_assets/export.json @@ -19,7 +19,7 @@ "master": false },{ "query": "SELECT PKey__c,Product2Id,InstallDate,Name,Kind_of_Energy__c,Main_Product_Group__c,SerialNumber,Serialnumber_Exception__c,LocationId FROM Asset", - "operation": "Insert", + "operation": "Upsert", "externalId": "PKey__c", "master": true, "useValuesMapping": true, @@ -30,6 +30,11 @@ "master": true, "useValuesMapping": true, "useSourceCSVFile": true + },{ + "query": "SELECT FSL_Asset__c$Asset,FSL_Maintenance_Date__c FROM FSL_Asset_Maintenance_Information__c", + "master": true, + "operation": "Insert", + "useSourceCSVFile": true } ] } \ No newline at end of file