@isTest(SeeAllData=false)
public class DNUpsertBatchTest {
    static Account company;
    static Account section1; // 呼吸科
    static Account section2; // 消化科
    static Account olympus;
    static Account olympus1; // 呼吸科
    static Account olympus2; // 消化科
    static Account depart1;
    static Account depart2;
    @testSetup
    private static void initHpData() {
        ControllerUtil.EscapeNFM001Trigger = true;
        ID rectCoID = Schema.SObjectType.Account.getRecordTypeInfosByDeveloperName().get('HP').getRecordTypeId();
        ID rectDpt1ID = Schema.SObjectType.Account.getRecordTypeInfosByDeveloperName().get('Department_BF').getRecordTypeId();
        ID rectDpt2ID = Schema.SObjectType.Account.getRecordTypeInfosByDeveloperName().get('Department_GI').getRecordTypeId();

        // テストデータ
        company = new Account(
            RecordTypeId = rectCoID,
            Name = 'NFM110TestCompany',
            FSE_SP_Main_Leader__c = UserInfo.getUserId(),
            FSE_GI_Main_Leader__c = UserInfo.getUserId()
        );
        olympus = new Account(RecordTypeId = rectCoID, AgentCode_Ext__c = '9999999', Name = 'olympus');
        insert new List<Account>{ company, olympus };
        company = [SELECT Management_Code__c, Management_Code_Auto__c, Name, Id FROM Account WHERE Id = :company.Id];
        section1 = [
            SELECT Management_Code__c, Management_Code_Auto__c, Name, Id, Department_Class_Label__c
            FROM Account
            WHERE ParentId = :company.Id AND RecordType.name = '戦略科室分類 呼吸科'
        ];
        section2 = [
            SELECT Management_Code__c, Management_Code_Auto__c, Name, Id, Department_Class_Label__c
            FROM Account
            WHERE ParentId = :company.Id AND RecordType.name = '戦略科室分類 消化科'
        ];
        olympus1 = [
            SELECT Management_Code__c, Management_Code_Auto__c, Name, Id, Department_Class_Label__c
            FROM Account
            WHERE ParentId = :olympus.Id AND RecordType.name = '戦略科室分類 呼吸科'
        ];
        olympus2 = [
            SELECT Management_Code__c, Management_Code_Auto__c, Name, Id, Department_Class_Label__c
            FROM Account
            WHERE ParentId = :olympus.Id AND RecordType.name = '戦略科室分類 消化科'
        ];
        System.debug('section1.Department_Class_Label__c=' + section1.Department_Class_Label__c);
        System.debug('section2.Department_Class_Label__c=' + section2.Department_Class_Label__c);
        depart1 = new Account(
            RecordTypeId = rectDpt1ID,
            Name = '*',
            ParentId = section1.Id,
            Department_Class__c = section1.Id,
            Hospital__c = company.Id,
            Department_Name__c = 'NFM110TestDepart1'
        );
        depart2 = new Account(
            RecordTypeId = rectDpt2ID,
            Name = '*',
            ParentId = section2.Id,
            Department_Class__c = section2.Id,
            Hospital__c = company.Id,
            Department_Name__c = 'NFM110TestDepart2'
        );
        Account ocm = new Account(
            RecordTypeId = rectDpt2ID,
            Name = '*',
            ParentId = section2.Id,
            Department_Class__c = section2.Id,
            Hospital__c = company.Id,
            AgentCode_Ext__c = '9999900',
            Department_Name__c = 'NFM110TestDepart3'
        );
        Account olympus_return = new Account(
            RecordTypeId = rectDpt2ID,
            Name = '*',
            ParentId = olympus2.Id,
            Department_Class__c = olympus2.Id,
            Hospital__c = olympus.Id,
            AgentCode_Ext__c = '9999901',
            Department_Name__c = 'olympus_return'
        );
        insert new List<Account>{ depart1, depart2, ocm, olympus_return };
        depart1 = [SELECT Management_Code__c, Management_Code_Auto__c, Name, Id FROM Account WHERE Id = :depart1.Id];
        depart2 = [SELECT Management_Code__c, Management_Code_Auto__c, Name, Id FROM Account WHERE Id = :depart2.Id];
        Product2 prd = new Product2(
            Name = 'NFM110Prd1',
            ProductCode = 'NFM110Prd1',
            ProductCode_Ext__c = 'NFM110Prd1',
            Manual_Entry__c = false
        );
        insert prd;
        Product2__c pro1 = new Product2__c(Name = 'NFM110Prd1', OT_CODE_Text__c = 'NFM110Prd1', Product2__c = prd.id);
        insert pro1;

        NFM110Rest.GeneralData generalData1 = new NFM110Rest.GeneralData();
        NFM110Rest.ProductsDelivery ProductsDelivery = new NFM110Rest.ProductsDelivery();

        Datetime nowDT = Datetime.now();
        String nowStr = nowDT.format('yyyyMMddHHmm');
        ProductsDelivery.Monitoring = new NFMUtil.Monitoring();
        ProductsDelivery.Monitoring.MessageGroupNumber = nowStr + '01';

        ProductsDelivery.GeneralData = new List<NFM110Rest.GeneralData>{ generalData1 };
        generalData1.DeliveryNote = 'DeliveryNote';
        NFM110Rest.DnInformation dnInfo1 = new NFM110Rest.DnInformation();
        generalData1.DnInformation = new List<NFM110Rest.DnInformation>{ dnInfo1 };
        generalData1.EndUserNo = company.Management_Code_Auto__c;
        generalData1.DepartmentNo = depart1.Management_Code_Auto__c;
        generalData1.InquiryNo = 'test0001' + ',';
        dnInfo1.SorLMark = 'S';
        dnInfo1.OTCode = prd.ProductCode_Ext__c;
        dnInfo1.SerialNoorLotNo = '2577010001675';
        generalData1.DeliveryNote = '11111';

        NFM110Rest.GeneralData generalData2 = new NFM110Rest.GeneralData();
        NFM110Rest.ProductsDelivery ProductsDelivery1 = new NFM110Rest.ProductsDelivery();

        Datetime nowDT1 = Datetime.now();
        String nowStr1 = nowDT1.format('yyyyMMddHHmm');
        ProductsDelivery1.Monitoring = new NFMUtil.Monitoring();
        ProductsDelivery1.Monitoring.MessageGroupNumber = nowStr1 + '01';

        ProductsDelivery1.GeneralData = new List<NFM110Rest.GeneralData>{ generalData1 };
        generalData2.DeliveryNote = '';
        NFM110Rest.DnInformation dnInfo2 = new NFM110Rest.DnInformation();
        generalData2.DnInformation = new List<NFM110Rest.DnInformation>{ dnInfo2 };
        generalData2.EndUserNo = company.Management_Code_Auto__c;
        generalData2.DepartmentNo = depart1.Management_Code_Auto__c;
        generalData2.InquiryNo = 'test0001' + ',';
        dnInfo2.SorLMark = 'S';
        dnInfo2.OTCode = prd.ProductCode_Ext__c;
        dnInfo2.SerialNoorLotNo = '2577010001675';
        generalData2.DeliveryNote = '';

        BatchIF_Log__c rowData = NFMUtil.saveRowData(ProductsDelivery1.Monitoring, 'NFM110', ProductsDelivery1.GeneralData);
    }
    @isTest
    private static void test_void() {
        list<BatchIF_Log__c> rowDataList = [SELECT id FROM BatchIF_Log__c WHERE RowDataFlg__c = TRUE];
        rowDataList[0].IsUpsertDN__c = true;
        update rowDataList;
        System.Test.startTest();
        Database.executeBatch(new DNUpsertBatch(rowDataList[0].Id), 1);
        System.Test.stopTest();
    }
    @isTest
    private static void test_checkSerialNoorLotNo() {
        string a = 'strsA0trstr';
        string b = 'strA50trstr';
        string c = 'str250trstr';

        DNUpsertBatch.checkSerialNoorLotNo(a);
        DNUpsertBatch.checkSerialNoorLotNo(b);
        DNUpsertBatch.checkSerialNoorLotNo(c);
        DNUpsertBatch.checkSerialNoorLotNo(null);
    }
    //跑创建电子签收单的方法
    @isTest
    private static void test_upsertESign() {
        // 检索出签收单，并生成签收单map key 为DN号
        map<string, eSignForm__c> eSFMap = new Map<string, eSignForm__c>();

        //新建电子签收单
        eSignForm__c eSignForm = new eSignForm__c();
        eSignForm.Name = '::测试电子签收单';
        eSignForm.DNName__c = '112233';

        eSFMap.put(eSignForm.DNName__c, eSignForm);

        Statu_Achievements_DN__c sad = new Statu_Achievements_DN__c();
        sad.Name = '112233';
        sad.DeliveryDate_Raw__c = '1111';
        sad.Sales_assistant_name_text__c = UserInfo.getUserId();
        sad.RC_Manager__c = UserInfo.getUserId();
        sad.EsignTestAccount__c = true;
        sad.ReturnMark__c = false;

        list<Statu_Achievements_DN__c> DNList = new List<Statu_Achievements_DN__c>();
        DNList.add(sad);

        DNUpsertBatch.SetupeSignForm(eSFMap, DNList);
    }
    //跑创建签收单明细的方法
    @isTest
    private static void test_upsertESignLineItems() {
        list<Statu_Achievements_DN_details__c> insertSADNdetailList = new List<Statu_Achievements_DN_details__c>();

        Statu_Achievements_DN_details__c saddc = new Statu_Achievements_DN_details__c();
        saddc.DNName__c = '112233';
        saddc.CaseNumber__c = '112233';
        saddc.OTCode_Raw__c = '112233';
        insertSADNdetailList.add(saddc);

        map<string, eSignFormLineItem__c> eSFLMap = new Map<string, eSignFormLineItem__c>();

        //新建电子签收单明细
        eSignFormLineItem__c eSignFormLineItem = new eSignFormLineItem__c();
        eSignFormLineItem.Name = '::电子签收单明细';
        eSignFormLineItem.agencyGoodStatus__c = '完好';
        eSignFormLineItem.DNProductNo__c = '112233-112233-112233';
        eSignFormLineItem.Count__c = 0;

        eSFLMap.put(eSignFormLineItem.DNProductNo__c, eSignFormLineItem);

        // 检索出签收单，并生成签收单map key 为DN号
        map<string, eSignForm__c> eSFMap = new Map<string, eSignForm__c>();

        //新建电子签收单
        eSignForm__c eSignForm = new eSignForm__c();
        eSignForm.Name = '::测试电子签收单';
        eSignForm.DNName__c = '112233';

        eSFMap.put(eSignForm.DNName__c, eSignForm);

        Map<String, Product2> prdsMap = new Map<String, Product2>();
        Product2 prd = new Product2();
        prd.ProductCode_Ext__c = '112233';

        prdsMap.put(prd.ProductCode_Ext__c, prd);

        DNUpsertBatch.SetupeSignFormLineItems(insertSADNdetailList, eSFLMap, eSFMap, prdsMap);
        //Add By DTT - Li Jun Start 20230425
        OCM_Management_Province__c ocsmTest = new OCM_Management_Province__c();
        ocsmTest.Name = '其他';
        ocsmTest.Province__c = '北京市';
        ocsmTest.Window1__c = UserInfo.getUserId();
        insert ocsmTest;
        Map<String, OCM_Management_Province__c> provinceMap = DNUpsertBatch.getManagementProvince();
        //Add by DTT - Li Jun End 20230425
    }
}
