<repo_name>trinh1999/MISA.AMIS_KeToan.TTSOnline.DT_Trinh<file_sep>/TTSOnline_DT.Trinh/FrontEnd/Misa.Amis.Vue/misa-amis-vuejs/src/js/common/common.js
import message from './message'
import $ from 'jquery'
import dayjs from "dayjs";

const common = {
  /**
   * Hủy hoặc thoát form dialog ==> tool-tip không hiện 
   *  CreatedBy: DT.Trinh 30/8/2021
   */
  turnOffValidate() {
    console.log($('.input-item input[type=text]'));
    var arrayInputText = $('.input-item input[type=text]');
    for (let i = 0; i < arrayInputText.length; i++) {
      arrayInputText[i].style.border = "";
      arrayInputText[i].nextElementSibling.style.display = "none";
    }
    var arrayInputEmail = $('.input-item input[type=email]');
    for (let i = 0; i < arrayInputEmail.length; i++) {
      arrayInputEmail[i].style.border = "";
      arrayInputEmail[i].nextElementSibling.style.display = "none";
    }
  },

  /**
   * check validate dữ liệu nếu dữ liệu không đúng
   * @param {*} input các elements input
   * @param {*} value key được đặt trên các thẻ input (ref)
   * @param {*} message thông báo lỗi cho người dùng biết
   * CreatedBy: DT.Trinh 30/8/2021
   */
  turnOnValidate(input, value, message) {
    input.style.border = "1px solid #F65454";
    input.nextElementSibling.style.display = "block";
    input.nextElementSibling.innerText = message;
    $(input).attr('validate', false);
    input.setAttribute('validate', false);
  },


  /**
   * validate dữ liệu
   * @param {*} input các element input có chứa ref
   * @param {*} value dữ liệu của ref được gán trên thẻ input
   * @returns true - đã check validate và dữ liệu đúng hết, false - dữ liệu đang sai
   * createdBy: DT.Trinh 30/8/2021
   */
  isValidateInput(input, value) {
    // check bắt buộc nhập
    if (value == '') {
      common.turnOnValidate(input, value, message.VALIDATE_MSG_NO_SUCCESS);
      return false;
    }
  },
  isFormatInput(input, value){
    var propName = input.getAttribute('prop-name');
    if (propName == "Email") {

      if (!common.isEmail(value)) {
        common.turnOnValidate(input, value, message.VALIDATE_FORMAT_MSG_NO_SUCCESS);
        return false;
      }
    }
    if (propName == "IdentityNumber") {
      if (!common.isIdentityNumber(value)) {
        common.turnOnValidate(input, value, message.VALIDATE_FORMAT_MSG_NO_SUCCESS);
        return false;
      }
    }
  },

  /**
     * Định dạng cho email
     * CreateBy DT.Trinh
     */
  isEmail(email) {
    //eslint-disable-next-line
    var regex = /^([a-zA-Z0-9_\.\-\+])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
    if (!regex.test(email)) {
      return false;
    } else {
      return true;
    }
  },
  /**
   * Định dạnh CMND
   * CreateBy DT.Trinh
   */
  isIdentityNumber(cmt) {
    //eslint-disable-next-line
    var regex = /^([0-9]{9}|[0-9]{12})+$/;
    if (!regex.test(cmt)) {
      return false;
    } else {
      return true;
    }
  },
  /**
   * Hàm format date thàng dạng yyyy-mm-dd
   *  CreateBy DT.Trinh
   */
  formatDateYMD(date) {
    if (date == null) {
      return new Date(date);
    }
    return dayjs(date).format("YYYY-MM-DD");
  },
  
}

export default common;<file_sep>/TTSOnline_DT.Trinh/BackEnd/MISA.AMIS/MISA.ApplicationCore/Interfaces/Services/IEmployeeService.cs
﻿using MISA.ApplicationCore.Entities;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MISA.ApplicationCore.Interfaces.Services
{
    public interface IEmployeeService: IBaseService<Employee>
    {
 
        #region METHOD
        /// <summary>
        /// Tạo mã mới
        /// </summary>
        /// <returns>Mã nhân viên mới</returns>
        ///CreateBy: DT.Trinh
        string GetNewEmployeeCode();

        /// <summary>
        /// Tìm kiếm
        /// </summary>
        /// <param name="filter">Object chứa nội dung lọc</param>   
        /// <returns>Danh sách khách hàng theo đk</returns>
        /// Created By : DT.Trinh
        public Paging<Employee> GetEmployeesByPaging(EmployeeFilter filter);
        #endregion

    }
}
<file_sep>/TTSOnline_DT.Trinh/BackEnd/MISA.AMIS/MISA.ApplicationCore/Interfaces/Repository/IEmployeeRepository.cs
﻿using MISA.ApplicationCore.Entities;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MISA.ApplicationCore.Interfaces.Repository
{
    public interface IEmployeeRepository: IBaseRepository<Employee>
    {
       
        /// <summary>
        /// Lấy mã mới
        /// </summary>
        /// <returns></returns>
        /// CreateBy: DT.Trinh
         string GetNewEmployeeCode();

        /// <summary>
        ///  Tìm kiếm 
        /// </summary>
        /// <param name="filter">Object chứa nội dung lọc</param>
        /// <returns>Danh sách khách hàng theo điều kiện lọc</returns>
        /// Created By : DT.Trinh
        public Paging<Employee> GetEmployeesByPaging(EmployeeFilter filter);


    }
}
<file_sep>/TTSOnline_DT.Trinh/BackEnd/MISA.AMIS/MISA.ApplicationCore/Entities/EmployeeFilter.cs
﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MISA.ApplicationCore.Entities
{
    public class EmployeeFilter
    {
        /// <summary>
        /// Trang hiện tại
        /// Created By : DT.Trinh
        /// </summary>
        public int PageIndex { get; set; } = 1;

        /// <summary>
        /// Số lượng bản ghi có trong 1 trang
        /// Created By : DT.Trinh
        /// </summary>
        public int PageSize { get; set; } = 10;

        /// <summary>
        /// Lọc theo Mã NV / SĐT / HọTen
        /// Created By : DT.Trinh
        /// </summary>
        public string KeySearch { get; set; } = "";

       
    }
}
<file_sep>/TTSOnline_DT.Trinh/BackEnd/MISA.AMIS/MISA.Infrastructure/Repository/BaseRepository.cs
﻿using Dapper;
using Microsoft.Extensions.Configuration;
using MISA.ApplicationCore.Entities;
using MISA.ApplicationCore.Interfaces.Repository;
using MISA.ApplicationCore.MISAAttribute;
using MySqlConnector;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

namespace MISA.Infrastructor.Repository
{
    public class BaseRepository<TEntity> : IBaseRepository<TEntity>, IDisposable where TEntity : BaseEntity
    {
        //Truy cập vào database
        //1. Khởi tạo thông tin kết nối database
        #region DECLARE

        /// <summary>
        /// Kết nối tới DB
        /// </summary>
        protected IDbConnection _dbConnection;

        /// <summary>
        /// Thông tin kết nối 
        /// </summary>
        public readonly string _connectionString;

        /// <summary>
        /// Tên bảng
        /// </summary>
        protected string _tableName;
        #endregion

        #region Contructor
        public BaseRepository(IConfiguration configuration)
        {
            _tableName = typeof(TEntity).Name;

            _connectionString = configuration.GetConnectionString("AmisDatabase");

            
        }

        #endregion
        /// <summary>
        /// Thêm bản ghi
        /// </summary>
        /// <param name="entity">Bản ghi cần thêm</param>
        /// <returns>Trả về số bản ghi được thêm</returns>
        /// CreateBy: DT.Trinh
        public int Add(TEntity entity)
        {
            var rowEffects = 0;

            _dbConnection = new MySqlConnection(_connectionString);
            _dbConnection.Open();

            using (var transaction = _dbConnection.BeginTransaction())
            {
                try
                {
                    var parameters = MappingDbType(entity);

                    rowEffects = _dbConnection.Execute($"Proc_Insert{_tableName}", param: parameters, commandType: CommandType.StoredProcedure, transaction: transaction);

                    transaction.Commit();
                }
                catch (Exception)
                {
                    transaction.Rollback();
                    throw;
                }
            }

            return rowEffects;
        }

        /// <summary>
        /// Xóa bản ghi     
        /// </summary>
        /// <param name="entityId">Bản ghi cần xóa</param>
        /// <returns>Số bản ghi đã xóa</returns>
        ///  CreateBy: DT.Trinh
        public int Delete(Guid entityId)
        {
            _dbConnection = new MySqlConnection(_connectionString);

            _dbConnection.Open();

            var rowEffects = 0;

            using (var transaction = _dbConnection.BeginTransaction())
            {
                try
                {
                    var parameters = new DynamicParameters();

                    parameters.Add($"@{_tableName}Id", entityId);

                    rowEffects = _dbConnection.Execute($"Proc_Delete{_tableName}ById", param: parameters, commandType: CommandType.StoredProcedure, transaction: transaction);

                    transaction.Commit();
                }
                catch (Exception)
                {
                    transaction.Rollback();
                    throw;
                }
            }
          
            return rowEffects;
        }

        /// <summary>
        /// Hàm get ra danh sách
        /// </summary>
        /// <returns>List danh sách</returns>
        ///  CreateBy: DT.Trinh
        public IEnumerable<TEntity> Get()
        {
            _dbConnection = new MySqlConnection(_connectionString);

            _dbConnection.Open();

            var sql = $"Proc_Get{_tableName}s";

            var entities = _dbConnection.Query<TEntity>(sql, commandType: CommandType.StoredProcedure);

            return entities;
        }

        /// <summary>
        /// Lọc bản ghi theo tên thuộc tính và giá trị thuộc tính 
        /// </summary>
        /// <param name="entity">object</param>
        /// <param name="property">Tên thuộc tính</param>
        /// <returns></returns>
        /// CreateBy: DT.Trinh
        public TEntity GetByProp(TEntity entity, PropertyInfo property)
        {
            _dbConnection = new MySqlConnection(_connectionString);

            _dbConnection.Open();

            var propName = property.Name;

            var keyValue = entity.GetType().GetProperty($"{_tableName}Id").GetValue(entity);

            var propValue = entity.GetType().GetProperty(propName).GetValue(entity);

            var query = string.Empty;

            if (entity.EntityState == EntityState.AddNew)
            {
                query = $"SELECT * FROM {_tableName} WHERE {propName} = '{propValue}'";
            }
            else if (entity.EntityState == EntityState.Update)
            {
                query = $"SELECT * FROM {_tableName} WHERE {propName} = '{propValue}' AND {_tableName}Id <> '{keyValue}'";

            }
            else
            {
                return null;
            }
            var res = _dbConnection.QueryFirstOrDefault<TEntity>(query, commandType: CommandType.Text);
            return res;
        }
        /// <summary>
        /// Lọc theo id bản ghi
        /// </summary>
        /// <param name="entityId">id bản ghi</param>
        /// <returns></returns>
        /// CreateBy: DT.Trinh
        public TEntity GetById(Guid entityId)
        {
            _dbConnection = new MySqlConnection(_connectionString);

            _dbConnection.Open();

            var parameters = new DynamicParameters();

            parameters.Add($"@{_tableName}Id", entityId);

            var res = _dbConnection.Query<TEntity>($"Proc_Get{_tableName}ById", param: parameters, commandType: CommandType.StoredProcedure).FirstOrDefault();

            return res;
        }

        /// <summary>
        /// Cập nhật bản ghi
        /// </summary>
        /// <param name="entity"></param>
        /// <param name="entityId"></param>
        /// <returns></returns>
        /// CreatedBy: DT.Trinh
        public int Update(TEntity entity, Guid entityId)
        {
            var rowEffects = 0;

            _dbConnection = new MySqlConnection(_connectionString);

            _dbConnection.Open();

            using (var transaction = _dbConnection.BeginTransaction())
            {
                try
                {
                    var parameters = MappingDbType(entity);

                    rowEffects = _dbConnection.Execute($"Proc_Update{_tableName}", param: parameters, commandType: CommandType.StoredProcedure, transaction: transaction);

                    transaction.Commit();
                }
                catch (Exception)
                {
                    transaction.Rollback();
                    throw;
                }
            }

            return rowEffects;
        }

        /// <summary>
        /// Map dữ liệu của 1 entity sang thành dynamic parameters dùng cho truy vấn SQL
        /// </summary>
        /// <typeparam name="TEntity"></typeparam>
        /// <param name="entity"></param>
        /// <returns>dynamic parameters đã được format đúng</returns>
        /// CreatedBy: DT.Trinh
        protected DynamicParameters MappingDbType(TEntity entity)
        {
            var properties = entity.GetType().GetProperties();

            var parameters = new DynamicParameters();

            foreach (var property in properties)
            {
                var propertyName = property.Name;

                var propertyValue = property.GetValue(entity);

                var propertyType = property.PropertyType;

                if (propertyType == typeof(Guid) || propertyType == typeof(Guid?))
                {
                    parameters.Add($"@{propertyName}", propertyValue, DbType.String);
                }
                else
                {
                    parameters.Add($"@{propertyName}", propertyValue);
                }
            }

            return parameters;
        }

        /// <summary>
        /// Close kết nối
        /// </summary>
        ///  CreateBy: DT.Trinh
        public void Dispose()
        {
            if (_dbConnection != null && _dbConnection.State == ConnectionState.Open)
            {
                _dbConnection.Close();
                _dbConnection.Dispose();
            }
        }


    }
}
<file_sep>/TTSOnline_DT.Trinh/FrontEnd/Misa.Amis.Vue/misa-amis-vuejs/src/js/common/message.js
const meassage = {

    REFRESH_MSG_SUCCESS: "Bảng được tải lại thành công!",

    //khi ấn nút xóa nhiều mà chưa chọn bản ghi để xóa 
    WARNING_MSG_DELETE_NO_SELECT_ROW: "Mời chọn bản ghi cần xóa!",

    //Thêm nhân viên thành công
    ADD_MSG_SUCCESS: "Thêm nhân viên thành công!",

    //Thêm hoặc cập nhật không thành công
    ADD_UPDATE_MSG_NO_SUCCESS: "Dữ liệu không hợp lệ! Vui lòng xem lại thông tin đã nhập",

    //Sửa thông tin thành công
    EDIT_MSG_SUCCESS: "Sửa thông tin thành công!",

    //Thông báo 1 trường nào dấy bắt buộc nhập
    VALIDATE_MSG_NO_SUCCESS: "Thông tin này không được để trống!",
  
    //Thông báo yêu cầu nhập đủ trường thông tin bắt buộc
    VALIDATE_MSG_MIS_REQUIRED: "Nhập thiếu trường thông tin bắt buộc hoặc thông tin chưa đúng định dạng!",

    //Thông báo sai định dạng 
    VALIDATE_FORMAT_MSG_NO_SUCCESS: "Thông tin đã sai định dạng!",

    
    //Xóa nhân viên thành công
    DELETE_MSG_SUCCESS: "Xóa bản ghi thành công!",

    //Exception message
    EXCEPTION_MSG: "Có lỗi xảy ra! Vui lòng liên hệ với MISA",


}

export default meassage;