/*
 * This program is part of the OpenLMIS logistics management information system platform software.
 * Copyright © 2013 VillageReach
 *
 * This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
 *  
 * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Affero General Public License for more details.
 * You should have received a copy of the GNU Affero General Public License along with this program.  If not, see http://www.gnu.org/licenses.  For additional information contact info@OpenLMIS.org. 
 */

package org.openlmis.core.domain;

import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import org.codehaus.jackson.annotate.JsonIgnoreProperties;
import org.codehaus.jackson.map.annotate.JsonSerialize;
import org.openlmis.core.exception.DataException;
import org.openlmis.upload.Importable;
import org.openlmis.upload.annotation.ImportField;

import static org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion.NON_EMPTY;

/**
 * ProgramProduct represents a product available under a program and program-product specific attributes like currentPrice and dosesPerMonth.
 * Also defines contract for upload of a ProgramProduct mapping.
 */
@Data
@NoArgsConstructor
@EqualsAndHashCode(callSuper = false)
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonSerialize(include = NON_EMPTY)
public class ProgramProduct extends BaseModel implements Importable {

  @ImportField(name = "Program Code", type = "String", nested = "code", mandatory = true)
  private Program program;

  @ImportField(name = "Product Code", type = "String", nested = "code", mandatory = true)
  private Product product;

  @ImportField(name = "Doses Per Month", type = "int", mandatory = true)
  private Integer dosesPerMonth;

  @ImportField(name = "Is Active", type = "boolean", mandatory = true)
  private Boolean active;

  @ImportField(mandatory = true, type = "String", name = "Product Category", nested = "code")
  private ProductCategory productCategory;

  private Long productCategoryId;

  private boolean fullSupply;

  @ImportField(name = "Display Order", type = "int")
  private Integer displayOrder;

  ProgramProductISA programProductIsa;

  private Money currentPrice;

  public ProgramProduct(Long id) {
    super(id);
  }

  public ProgramProduct(Program program, Product product, Integer dosesPerMonth, Boolean active) {
    this.program = program;
    this.product = product;
    this.dosesPerMonth = dosesPerMonth;
    this.active = active;
  }

  public ProgramProduct(Program program, Product product, Integer dosesPerMonth, Boolean active, Money currentPrice) {
    this.program = program;
    this.product = product;
    this.dosesPerMonth = dosesPerMonth;
    this.active = active;
    this.currentPrice = currentPrice;
  }

  public void validate() {
    if (currentPrice.isNegative()) throw new DataException("programProduct.invalid.current.price");
  }

  public ProgramProduct(ProgramProduct programProduct) {
    this.id = programProduct.id;
    this.program = programProduct.program;
    this.product = programProduct.product;
    this.dosesPerMonth = programProduct.dosesPerMonth;
    this.active = programProduct.active;
    this.currentPrice = programProduct.currentPrice;
    this.programProductIsa = programProduct.programProductIsa;
    this.displayOrder = programProduct.displayOrder;
    this.fullSupply = programProduct.fullSupply;
  }
}

@@ -2338,16 +2338,89 @@
 oryId;%0A%0A
+  @ImportField(name = %22Full Supply%22, type = %22boolean%22, mandatory = true)%0A
   privat

Make the program product, full supply csv importable.