BemsWebApplication.ServicePartner = function (params, viewInfo) {
    'use strict';

    var CmPartnerDataSource = BemsWebApplication.db.createDataSource('CmPartner');
    var PartnerInfo = ko.observableArray();
    var RowName;

    var partnerTypeDataSource = BemsWebApplication.db.createDataSource('CmPartnerType', false, false, true);
    var partnerTypes = ko.observableArray();
    var partnerFactory = BWA.Factory.Partner;

    var dataSourceOptions = {
        select: [
                 'SiteId',
                'PartnerId',
                'PartnerTypeId',
                'Name',
                'PhoneNo',
                'FaxNo',
                'RepresentativeName',
                'SalesName',
                'SalesPhoneNo',
                'AddressZip1',
                'AddressZip2',
                'Address1',
                'Adderss2',
                'HomepageUri',
                'Note',
                'IsUse',
                'CmPartnerType/Name'
        ],
        expand: [
            'CmPartnerType'
        ],

        extendOptions: {
            forceOriginalField: true
        },
        filter: [
            ['SiteId', '=', BWA.UserInfo.SiteId()],
            'and',
            ['PartnerTypeId', '=', 2]
        ]
    };
    var viewModel = BWA.DataGrid.createViewWithDataGrid(params, viewInfo, 'CmPartner', {
        dataSourceOptions: dataSourceOptions,
        columns: [
            { dataField: 'PartnerId', caption: $G('number'), width: '10%', alignment: 'center', allowFiltering: false, sortOrder: 'desc' },
            { dataField: 'Name', caption: '거래처명', width: '35%', alignment: 'center' },
            { dataField: 'RepresentativeName', caption: $G('companyRepresentativeName'), width: '15%', alignment: 'center' },
            { dataField: 'PhoneNo', caption: $G('companyPhoneNo'), width: '15%', alignment: 'center' },
            utils.datagrid.columnIsUse('10%')
        ],
        searchViewItems: [{ id: 'Name' }],
        handleViewShowing: function (dataModel) {
            $.when(
                partnerTypeDataSource.load()
            ).done(function (partnerTypeDataResult) {
                partnerTypes(partnerTypeDataResult[0]);
            });
        },
        handlePopupShowing: function (isNewInPopup, dataViewModel) {
            if (isNewInPopup()) { // 신규등록인 경우 
                // UI 에는별도로 표시하지 않음
                dataViewModel.PartnerTypeId(2);
            }
            CmPartnerDataSource.filter([
                ["SiteId", "=", BWA.UserInfo.SiteId()],
                'and',
                ["PartnerTypeId", "=", 2]
            ]);
            CmPartnerDataSource.load().done(function (result) {
                PartnerInfo(result);
            });
        },

        handleDataGridRowClick: function (id, dataGrid, clickRow, popupVisible) {
            var data = clickRow.data;
            RowName = data.Name;
            popupVisible(true);
        },

        beforeInsertingDataViewModel: function (dataModel, dbModelId) {

            var dfd = $.Deferred();
            var isDuplicated = false;

            for (var i = 0; i < PartnerInfo().length; i++) {
                if (dataModel.Name() == PartnerInfo()[i].Name()) {
                    isDuplicated = true;
                }
            }
            if (!BWA.DataUtil.isValidInputValue(dataModel.Name()) || dataModel.PhoneNo() == null || dataModel.RepresentativeName() == null)
                return dfd.resolve(false, '저장 혹은 수정 반드시 필수 입력 정보(*)를 모두 입력하셔야 합니다 (앞뒤공백 허용안함)');
            else {
                if (isDuplicated)
                    return dfd.resolve(false, '이미 동일 정보가 존재합니다.');
                else
                    return dfd.resolve(true);
            }
        },

        beforeUpdateDataViewModel: function () {

            var isDuplicated = false;
            for (var i = 0; i < PartnerInfo().length; i++) {
                if (viewModel.dataModel.Name() == PartnerInfo()[i].Name() && (RowName() != PartnerInfo()[i].Name())) {
                    isDuplicated = true;
                }
            }
            if (!BWA.DataUtil.isValidInputValue(viewModel.dataModel.Name()) || (_.isEmpty(viewModel.dataModel.Name()) 
                || _.isEmpty(viewModel.dataModel.PhoneNo()) || _.isEmpty(viewModel.dataModel.RepresentativeName()))) {
                utils.toast.show('저장 혹은 수정 반드시 필수 입력 정보(*)를 모두 입력하셔야 합니다 (앞뒤공백 허용안함)', 'error');
                return 0;
            }
            else {
                if (isDuplicated) {
                    utils.toast.show('이미 동일 이름이 존재합니다.', 'error');
                    return 0;
                }
                else
                    return 2;
            }
        },
    });

    return viewModel;
};