/**
 * 
 */
package com.prolog.cs.biz.outbound.core;

import java.math.BigDecimal;

/**
 * @author cj
 * 
 */
public interface Constants {
	/**
	 * 0
	 */
	BigDecimal ZERO = BigDecimal.ZERO;
	/**
	 * 1
	 */
	BigDecimal ONE = BigDecimal.ONE;
	/**
	 * 10
	 */
	BigDecimal TEN = BigDecimal.TEN;
	/**
	 * 100
	 */
	BigDecimal HUNDRED = new BigDecimal(100);

	//String IDS_BUCKET_NAME = "jfids";

	/**
	 * JFIDS中grid使用
	 * 
	 * @author cj
	 * 
	 */
//	interface MODE {
//		String KEY = "$MODE";
//		String INSERT = "insert", UPDATE = "update", DEL = "del";
//	}

	/**
	 * BILL STATUS
	 * 
	 * @author wang
	 * 
	 */
	interface Status {
		/**
		 * 草稿
		 */
		String STATUS_NEW = "NEW";
		/**
		 * 修改
		 */
		String STATUS_UPDATE = "UPDATE";
		/**
		 * 提交待审
		 */
		String STATUS_SUBMIT = "SUBMIT";
		/**
		 * 搁置
		 */
		String STATUS_HOLD = "HOLD";
		/**
		 * 审批中
		 */
		String STATUS_APPROVING = "APPROVING";
		/**
		 * 审批完成
		 */
		String STATUS_APPROVED = "APPROVED";
		/**
		 * 否决
		 */
		String STATUS_REJECT = "REJECT";
		/**
		 * 记账
		 */
		String STATUS_CHECK = "CHECK";
		/**
		 * 作废
		 */
		String STATUS_CANCEL = "CANCEL";
		/**
		 * 终止
		 */
		String STATUS_TERMINATE = "TERMINATE";
		/**
		 * 确认
		 */
		String STATUS_COMFIRM = "COMFIRM";
		/**
		 * 删除
		 */
		String STATUS_DELETE = "DELETE";
	}
	
	/**
	 * 入库类型
	 * 
	 * @author wang
	 *
	 */
	interface RCV_TYPE {
		/**
		 * 采购入
		 */
		String ORDER_IN = "ORDER_IN";
		
		/**
		 * 其它入
		 */
		String OTHER_IN = "OTHER_IN";
	}
	
	/**
	 * 出库类型
	 * 
	 * @author wang
	 *
	 */
	interface OUT_TYPE {
		/**
		 * 采退返厂
		 */
		String RETURN_OUT = "RETURN_OUT";
		
		/**
		 * 其它出
		 */
		String OTHER_OUT = "OTHER_OUT";
	}


	/**
	 * 单据类型
	 */
	interface Bill_Type {

		/**
		 * 入库  订单入库 order_in  期初入库 other_in
		 */
		String ORDER_IN = "ORDER_IN";
		String OTHER_IN = "OTHER_IN";
		/**
		 * 采购单
		 */
		String PURCHASE = "PURCHASE";
		/**
		 * 采购退货
		 */
		String PURCHASE_RETURN = "PURCHASE_RETURN";

		/**
		 * 出库 return_out    other_out
		 */
		String RETURN_OUT = "RETURN_OUT";
		String OTHER_OUT = "OTHER_OUT";
		/**
		 * 移仓
		 */
		String MOVE_OUT = "MOVE_OUT";

		/**
		 * 损益
		 */
		String PL = "PL";

		/**
		 * 销售
		 */
		String SALE = "SALE";
		/**
		 * 销售退货
		 */
		String SALE_RETURN = "SALE_RETURN";
	}
	
	/**
	 * batch costing rule
	 * 
	 * @author wang
	 *
	 */
	enum BatchCostingRule {
		/**
		 * 最远成本
		 */
		FIFO,
		
		/**
		 * 最近成本
		 */
		LIFO,
		
		/**
		 * 商品默认进价
		 */
		ITEM
	}

	/**
	 * batch picking rule
	 * 
	 * @author wang
	 * 
	 */
	enum BatchPickingRule {
		/**
		 * first in first out
		 */
		FIFO,
		/**
		 * first in first out(保存即锁定批次)
		 */
		FIFO_LOCK,
		
		/**
		 * last in first out
		 */
		LIFO,

		/**
		 * first in first out(最多1批次)
		 */
		FIFO_1P,

		/**
		 * first in first out(最多2批次)
		 */
		FIFO_2P,

		/**
		 * first in first out(最多3批次)
		 */
		FIFO_3P,
		
		/**
		 * last in first out(最多1批次)
		 */
		LIFO_1P,
		
		/**
		 * last in first out(最多2批次)
		 */
		LIFO_2P,
		
		/**
		 * last in first out(最多3批次)
		 */
		LIFO_3P,
		
		/**
		 * 剩余保质天数 >= P1 (SA_GP_V.GP_Shelf_GT_P1)（先进先出）
		 */
		GP_Shelf_GT_P1,
		
		/**
		 * 剩余保质天数 >= P2 (SA_GP_V.GP_Shelf_GT_P2)（先进先出）
		 */
		GP_Shelf_GT_P2,
		
		/**
		 * 剩余保质天数 >= P3 (SA_GP_V.GP_Shelf_GT_P3)（先进先出）
		 */
		GP_Shelf_GT_P3
		;
	}

	/**
	 * 
	 * @author wang
	 * 
	 */
	enum InventoryStatement {
		/**
		 * 
		 */
		ADD_ONSALE,
		/**
		 * 
		 */
		REDUCE_ONSALE,
		/**
		 * 
		 */
		ADD_ONSALE_RETURN,
		/**
		 * 
		 */
		REDUCE_ONSALE_RETURN,
		/**
		 * 
		 */
		ADD_ONPURCHASE,
		/**
		 * 
		 */
		REDUCE_ONPURCHASE,
		/**
		 * 
		 */
		ADD_ONPURCHASE_RETURN,
		/**
		 * 
		 */
		REDUCE_ONPURCHASE_RETURN,
		/**
		 * 
		 */
		ADD_ONMOVE_OUT,
		/**
		 * 
		 */
		REDUCE_ONMOVE_OUT,
		/**
		 * 
		 */
		ADD_ONMOVE_IN,
		/**
		 * 
		 */
		REDUCE_ONMOVE_IN,
		/**
		 * 
		 */
		ADD_ONALLOCATE,
		/**
		 * 
		 */
		REDUCE_ONALLOCATE,
		/**
		 * 
		 */
		ADD_ONHAND,
		/**
		 * 
		 */
		REDUCE_ONHAND,
		/**
		 * 只生成挑批次列表，不处理库存
		 */
		ADD_PICK_LIST,
		/**
		 * 按可拣数量(onhand - on_out)
		 */
		PICK_BY_NET_QUANTITY,
		/**
		 * 按实有数量(onhand)
		 */
		PICK_BY_ONHAND_QUANTITY;
	}

	enum TxnStatement {

		/**
		 * 入库审核
		 */
		RCV,
		/**
		 * 采购单审核
		 */
		PURCHASE,
		/**
		 * 采购退货单审核
		 */
		PURCHASE_RETURN,

		/**
		 * 出库审核(返厂出，其它出)
		 */
		OUT,
		/**
		 * 移仓审核
		 */
		MOVE_OUT,
		/**
		 * 移仓审核
		 */
		MOVE_IN,
		/**
		 * 损益审核
		 */
		PL,
		/**
		 * 销售订单审核
		 */
		SALE_ORDER,
		/**
		 * 销售审核
		 */
		SALE,
		/**
		 * 销售退货审核
		 */
		SALE_RETURN
	}


	/**
	 * 拆箱算法
	 * 
	 * @author wang
	 * 
	 */
	enum UnpackingAlgorithm {
		/**
		 * (Next Fit), 零散箱较少, 速度稍慢 ，优先最大包装，其次中包装，最后小包装 
		 * 尽量保留整箱
		 */
		NF,
		/**
		 * 
		 * (First Fit)， 零散箱多, 速度快 按最小单位匹配，全部拆最小单位
		 * 最少库位匹配
		 */
		FF,
		/**
		 * 
		 */
		NF_FF,
		
		NF_NF
	}

	enum TxnWmsStatement {
		
		/**
		 * 入库审核
		 */
		WMS_RCV,
		/**
		 * 出库审核()
		 */
		WMS_OUT,
		/**
		 * 移库审核
		 */
		WMS_MOVE_OUT,
		/**
		 * 移库审核
		 */
		WMS_MOVE_IN,
		/**
		 * 损益审核
		 */
		WMS_PL
		
	}


	/**
	 * 经营方式
	 * 
	 * @author wang
	 *
	 */
	enum SalesMode {
		/**
		 * 经销
		 */
		JX,
		/**
		 * 代销
		 */
		DX;
	}

	/**
	 * 库存状态
	 */
	enum StockStatusEnum {
		/**
		 * 库存状态
		 */
		STATUS1("1","合格"),
		STATUS2("2","不合格"),
		STATUS3("3","待检"),
		STATUS4("4","退货");

		private String key;
		private String value;

		StockStatusEnum(String key, String value) {
			this.key = key;
			this.value = value;
		}

		public static String find(String key) {
			for (StockStatusEnum stockStatusEnum : values()) {
				if (stockStatusEnum.getKey().equals(key)) {
					return stockStatusEnum.getValue();
				}
			}
			return null;
		}

		public String getKey() {
			return key;
		}

		public void setKey(String key) {
			this.key = key;
		}

		public String getValue() {
			return value;
		}

		public void setValue(String value) {
			this.value = value;
		}
	}




}
