@isTest
public with sharing class AuthRentalApplyRepairBatchTest {
    public AuthRentalApplyRepairBatchTest() {

    }
    static testMethod void testMethod1() {
        User thisUser = [ select Id from User where Id = :UserInfo.getUserId() ];
        System.runAs ( thisUser ) {
            Oly_TriggerHandler.bypass('ContactTrigger');
            Oly_TriggerHandler.bypass('ContactTriggerHandler');
            ControllerUtil.EscapeNFM001Trigger = true;
            User myUser_Test = [select ID,name,email from user where Employee_No__c = 'om001744'];
            // 省
            Address_Level__c al = new Address_Level__c();
            al.Name = '東京';
            al.Level1_Code__c = 'CN-99';
            al.Level1_Sys_No__c = '999999';
            insert al;
            // 市
            Address_Level2__c al2 = new Address_Level2__c();
            al2.Level1_Code__c = 'CN-99';
            al2.Level1_Sys_No__c = '999999';
            al2.Level1_Name__c = '東京';
            al2.Name = '渋谷区';
            al2.Level2_Code__c = 'CN-9999';
            al2.Level2_Sys_No__c = '9999999';
            al2.Address_Level__c = al.id;
            insert al2;

            // 病院を作る
            Account hospital = new Account();
            hospital.recordtypeId = [Select Id FROM RecordType WHERE IsActive = true and SobjectType = 'Account' and DeveloperName = 'HP'].id;
            hospital.Name = 'test hospital';
            hospital.Is_Active__c = '有効';
            hospital.Attribute_Type__c = '卫生部';
            hospital.Speciality_Type__c = '综合医院';
            hospital.Grade__c = '一级';
            hospital.OCM_Category__c = 'SLTV';
            hospital.Is_Medical__c = '医疗机构';
            hospital.State_Master__c = al.id;
            hospital.City_Master__c = al2.id;
            hospital.Town__c = '东京';
            insert hospital;

            // 戦略科室を得る
            Account[] strategicDep = [SELECT ID, Name FROM Account WHERE parentId = :hospital.Id AND recordType.DeveloperName = 'Department_Class_OTH'];
            // 診療科を作る
            Account dep = new Account();
            dep.recordtypeId = [Select Id FROM RecordType WHERE IsActive = true and SobjectType = 'Account' and DeveloperName = 'Department_OTH'].id;
            dep.Name = 'test dep';
            dep.AgentCode_Ext__c = '9999998';
            dep.ParentId = strategicDep[0].Id;
            dep.Department_Class__c = strategicDep[0].Id;
            dep.Hospital__c = hospital.Id;
            insert dep;

            Contact contact2 = new Contact();
            contact2.AccountId = dep.Id;
            contact2.LastName = '責任者';
            // contact2.LastName = 'test1经销商';
            insert contact2;

            // 产品
            Product2 pro1 = new Product2(Name='name01',IsActive=true,Family='GI',
                    Fixture_Model_No__c='n01',Serial_Lot_No__c='S/N tracing',
                    Fixture_Model_No_T__c = 'n01',
                    ProductCode_Ext__c='pc01',Manual_Entry__c=false);
            Product2 pro2 = new Product2(Name='name02',IsActive=true,Family='GI',
                    Fixture_Model_No__c='n02',Serial_Lot_No__c='Lot tracing',
                    ProductCode_Ext__c='pc02',Manual_Entry__c=false);
            Product2 pro3 = new Product2(Name='name03',IsActive=true,Family='GI',
                    Fixture_Model_No__c='n03',Serial_Lot_No__c='Lot tracing',
                    ProductCode_Ext__c='pc03',Manual_Entry__c=false);
            insert new Product2[] {pro1, pro2, pro3};
            

            //---------------------------主体 两个附属品(个体管理 数量管理)
            // 保有设备A (主体)
            Asset assetA1 = new Asset(Asset_Owner__c = 'Olympus');
            assetA1.RecordTypeId = System.Label.Asset_RecordType;
            assetA1.SerialNumber = 'ass01';
            assetA1.Name = 'ass01';
            assetA1.AccountId = dep.Id;
            assetA1.Department_Class__c = strategicDep[0].Id;
            assetA1.Hospital__c = hospital.Id;
            assetA1.Product2Id = pro1.Id;
            assetA1.Quantity = 1;
            assetA1.Status = '有库存';
            assetA1.Manage_type__c = '个体管理';
            assetA1.Loaner_accsessary__c = false;
            assetA1.Product_category__c = 'GI';
            assetA1.Delete_Flag__c = false;
            assetA1.Freeze_sign__c = false;
            assetA1.Out_of_wh__c = 0;
            assetA1.Salesdepartment__c = '1.华北营业本部';
            assetA1.Internal_asset_location__c = '北京 备品中心';
            assetA1.Product_category__c = 'GI';
            assetA1.Equipment_Type__c = '产品试用';
            assetA1.SalesProvince__c = '北京';
            // 保有设备A (附属品 数量管理)
            Asset assetA2 = new Asset(Asset_Owner__c = 'Olympus');
            assetA2.RecordTypeId = System.Label.Asset_RecordType;
            assetA2.SerialNumber = 'ass02';
            assetA2.Name = 'ass02';
            assetA2.AccountId = dep.Id;
            assetA2.Department_Class__c = strategicDep[0].Id;
            assetA2.Hospital__c = hospital.Id;
            assetA2.Product2Id = pro2.Id;
            assetA2.Quantity = 10;
            assetA2.Status = '有库存';
            assetA2.Manage_type__c = '数量管理';
            assetA2.Loaner_accsessary__c = true;
            assetA2.Product_category__c = 'GI';
            assetA2.Delete_Flag__c = false;
            assetA2.Freeze_sign__c = false;
            assetA2.Out_of_wh__c = 3;
            assetA2.Salesdepartment__c = '1.华北营业本部';
            assetA2.Internal_asset_location__c = '北京 备品中心';
            assetA2.Product_category__c = 'GI';
            assetA2.Equipment_Type__c = '产品试用';
            assetA2.SalesProvince__c = '北京';
            // 保有设备A (附属品 个体管理)
            Asset assetA3 = new Asset(Asset_Owner__c = 'Olympus');
            assetA3.RecordTypeId = System.Label.Asset_RecordType;
            assetA3.SerialNumber = 'ass03';
            assetA3.Name = 'ass03';
            assetA3.AccountId = dep.Id;
            assetA3.Department_Class__c = strategicDep[0].Id;
            assetA3.Hospital__c = hospital.Id;
            assetA3.Product2Id = pro3.Id;
            assetA3.Quantity = 1;
            assetA3.Status = '有库存';
            assetA3.Manage_type__c = '个体管理';
            assetA3.Loaner_accsessary__c = true;
            assetA3.Product_category__c = 'GI';
            assetA3.Delete_Flag__c = false;
            assetA3.Freeze_sign__c = false;
            assetA3.Out_of_wh__c = 0;
            assetA3.Salesdepartment__c = '1.华北营业本部';
            assetA3.Internal_asset_location__c = '北京 备品中心';
            assetA3.Product_category__c = 'GI';
            assetA3.Equipment_Type__c = '产品试用';
            assetA3.SalesProvince__c = '北京';
            insert new Asset[] {assetA1, assetA2, assetA3};


            RepairSubOrder__c subRepair = new RepairSubOrder__c();
            subRepair.Name = 'test001';
            subRepair.Status__c = '待处理';
            insert subRepair;
            Repair__c rep = new Repair__c();
            rep.Hospital__c = hospital.Id;
            rep.Account__c = dep.Id;
            rep.engineerSendDate__c = Datetime.now();
            rep.Repair_Source__c = '从报修子单';
            rep.Delivered_Product__c = assetA1.Id;
            rep.AWS_Data_Id__c = '12314';
            rep.Status__c = '申请完毕';
            rep.RentalApplyCheck__c = true;
            rep.MAINITIAL__c = false;
            rep.Incharge_Staff__c = myUser_Test.Id;
            rep.Department_Class__c = strategicDep[0].Id;
            rep.RepairSubOrder__c = subRepair.Id;
            Insert rep;
            System.Test.startTest();
            Database.executeBatch(new AuthRentalApplyRepairBatch(),1);
            Database.executeBatch(new AuthRentalApplyRepairBatch(rep.id),1);
            Database.executeBatch(new AuthRentalApplyRepairBatch(rep.id,1<2),1);
            // Batchable(rep.id);
            System.Test.stopTest();
        }
        
    }


}