You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

339 lines
9.1 KiB

package controller;
import sugoi.form.Form;
import Common;
import sugoi.form.ListData.FormData;
import sugoi.form.elements.FloatInput;
import sugoi.form.elements.FloatSelect;
import sugoi.form.elements.IntSelect;
using Std;
class Product extends Controller
{
public function new()
{
super();
view.nav = ["contractadmin","products"];
}
@tpl('form.mtt')
function doEdit(d:db.Product) {
if (!app.user.canManageContract(d.contract)) throw t._("Forbidden access");
var f = sugoi.form.Form.fromSpod(d);
//stock mgmt ?
if (!d.contract.hasStockManagement()) f.removeElementByName('stock');
//VAT selector
f.removeElement( f.getElement('vat') );
var data :FormData<Float> = [];
for (k in app.user.amap.vatRates.keys()) {
data.push( { label:k, value:app.user.amap.vatRates[k] } );
}
f.addElement( new FloatSelect("vat", "TVA", data, d.vat ) );
f.removeElementByName("contractId");
//Product Taxonomy:
//view.taxo = db.TxpProduct.manager.all();
//f.addElement(new form.TxpProduct("txpProduct", "taxo",null,false) );
var txId = d.txpProduct == null ? "" : Std.string(d.txpProduct.id);
var html = '<div id="pInput"></div><script language="javascript">_.getProductInput("pInput","${d.name}","$txId","${f.name}");</script>';
f.addElement(new sugoi.form.elements.Html("html",html, 'Nom'),1);
if (f.isValid()) {
f.toSpod(d);
app.event(EditProduct(d));
d.update();
throw Ok('/contractAdmin/products/'+d.contract.id, t._("The product has been updated"));
}else{
app.event(PreEditProduct(d));
}
view.form = f;
view.title = t._("Modify a product");
}
@tpl("form.mtt")
public function doInsert(contract:db.Contract ) {
if (!app.user.isContractManager(contract)) throw Error("/", t._("Forbidden action"));
var d = new db.Product();
var f = sugoi.form.Form.fromSpod(d);
f.removeElementByName("contractId");
//stock mgmt ?
if (!contract.hasStockManagement()) f.removeElementByName('stock');
//vat selector
f.removeElement( f.getElement('vat') );
var data = [];
for (k in app.user.amap.vatRates.keys()) {
data.push( { value:app.user.amap.vatRates[k], label:k } );
}
f.addElement( new FloatSelect("vat", "TVA", data, d.vat ) );
var formName = f.name;
var html = '<div id="pInput"></div><script language="javascript">_.getProductInput("pInput","",null,"$formName");</script>';
f.addElement(new sugoi.form.elements.Html("html",html, 'Nom'),1);
if (f.isValid()) {
f.toSpod(d);
d.contract = contract;
app.event(NewProduct(d));
d.insert();
throw Ok('/contractAdmin/products/'+d.contract.id, t._("The product has been saved"));
}else{
app.event(PreNewProduct(contract));
}
view.form = f;
view.title = t._("Key-in a new product");
}
public function doDelete(p:db.Product) {
if (!app.user.canManageContract(p.contract)) throw t._("Forbidden access");
if (checkToken()) {
app.event(DeleteProduct(p));
var orders = db.UserContract.manager.search($productId == p.id, false);
if (orders.length > 0) {
throw Error("/contractAdmin", t._("Not possible to delete this product because some orders are referencing it"));
}
var cid = p.contract.id;
p.lock();
p.delete();
throw Ok("/contractAdmin/products/"+cid, t._("Product deleted"));
}
throw Error("/contractAdmin", t._("Token error"));
}
@tpl('product/import.mtt')
function doImport(c:db.Contract, ?args: { confirm:Bool } ) {
if (!app.user.canManageContract(c)) throw t._("Forbidden access");
var csv = new sugoi.tools.Csv();
csv.step = 1;
var request = sugoi.tools.Utils.getMultipart(1024 * 1024 * 4);
csv.setHeaders( ["productName","price","ref","desc","qt","unit","organic","floatQt","vat","stock"] );
view.contract = c;
// get the uploaded file content
if (request.get("file") != null) {
//convert to utf-8 if needed
var csvData = request.get("file");
try{
if (!haxe.Utf8.validate(csvData)){
csvData = haxe.Utf8.encode(csvData);
}
}catch (e:Dynamic){ }
var datas = csv.importDatasAsMap(csvData);
app.session.data.csvImportedData = datas;
csv.step = 2;
view.csv = csv;
}
if (args != null && args.confirm) {
var i : Iterable<Map<String,String>> = cast app.session.data.csvImportedData;
var fv = new sugoi.form.filters.FloatFilter();
for (p in i) {
if (p["productName"] != null){
var product = new db.Product();
product.name = p["productName"];
product.price = fv.filterString(p["price"]);
product.ref = p["ref"];
product.desc = p["desc"];
product.vat = fv.filterString(p["vat"]);
product.qt = fv.filterString(p["qt"]);
if(p["unit"]!=null){
product.unitType = switch(p["unit"].toLowerCase()){
case "kg" : Kilogram;
case "g" : Gram;
case "l" : Litre;
case "cl" : Centilitre;
case "litre" : Litre;
default : Piece;
}
}
if (p["stock"] != null) product.stock = fv.filterString(p["stock"]);
product.organic = p["organic"] != null;
product.hasFloatQt = p["floatQt"] != null;
product.contract = c;
product.insert();
}
}
view.numImported = app.session.data.csvImportedData.length;
app.session.data.csvImportedData = null;
csv.step = 3;
}
if (csv.step == 1) {
//reset import when back to import page
app.session.data.csvImportedData = null;
}
view.step = csv.step;
}
@tpl("product/categorize.mtt")
public function doCategorize(contract:db.Contract) {
if (!app.user.canManageContract(contract)) throw t._("Forbidden access");
if (db.CategoryGroup.get(app.user.amap).length == 0) throw Error("/contractAdmin", t._("You must first define categories before you can assign a category to a product"));
//var form = new sugoi.form.Form("cat");
//
//for ( g in db.CategoryGroup.get(app.user.amap)) {
//var data = [];
//for ( c in g.getCategories()) {
//data.push({key:Std.string(c.id),value:c.name});
//}
//form.addElement(new sugoi.form.elements.Selectbox("cats"+g.id,g.name,data));
//}
//
//view.form = form;
view.c = contract;
}
/**
* init du Tagger
* @param contract
*/
public function doCategorizeInit(contract:db.Contract) {
if (!app.user.canManageContract(contract)) throw t._("Forbidden access");
var data : TaggerInfos = {
products:[],
categories:[]
}
for (p in contract.getProducts()) {
data.products.push({product:p.infos(),categories:Lambda.array(Lambda.map(p.getCategories(),function(x) return x.id))});
}
for (cg in db.CategoryGroup.get(app.user.amap)) {
var x = { id:cg.id, categoryGroupName:cg.name, color:App.current.view.intToHex(db.CategoryGroup.COLORS[cg.color]),tags:[] };
for (t in cg.getCategories()) {
x.tags.push({id:t.id,name:t.name});
}
data.categories.push(x);
}
Sys.print(haxe.Json.stringify(data));
}
public function doCategorizeSubmit(contract:db.Contract) {
if (!app.user.canManageContract(contract)) throw t._("Forbidden access");
var data : TaggerInfos = haxe.Json.parse(app.params.get("data"));
db.ProductCategory.manager.unsafeDelete("delete from ProductCategory where productId in (" + Lambda.map(contract.getProducts(), function(t) return t.id).join(",")+")");
for (p in data.products) {
for (t in p.categories) {
var x = new db.ProductCategory();
x.category = db.Category.manager.get(t, false);
x.product = db.Product.manager.get(p.product.id,false);
x.insert();
}
}
Sys.print(t._("Modifications saved"));
}
@tpl('product/addimage.mtt')
function doAddImage(product:db.Product) {
if (!app.user.canManageContract(product.contract)) throw t._("Forbidden access");
view.c = product.contract;
view.image = product.image;
var request = sugoi.tools.Utils.getMultipart(1024 * 1024 * 12); //12Mb
if (request.exists("image")) {
//Image
var image = request.get("image");
if (image != null && image.length > 0) {
var img : sugoi.db.File = null;
if ( Sys.systemName() == "Windows") {
img = sugoi.db.File.create(request.get("image"), request.get("image_filename"));
}else {
img = sugoi.tools.UploadedImage.resizeAndStore(request.get("image"), request.get("image_filename"), 400, 400);
}
product.lock();
if (product.image != null) {
//efface ancienne
product.image.lock();
product.image.delete();
}
product.image = img;
product.update();
throw Ok('/product/addImage/'+product.id,'Image mise à jour');
}
}
}
@tpl('product/compose.mtt')
function doCompose(){
}
function doGetTaxo(){
var out : TxpDictionnary = {products:new Map(), categories:new Map(), subCategories:new Map()};
for ( p in db.TxpProduct.manager.all()){
out.products.set(p.id, {id:p.id, name:p.name, category:p.category.id, subCategory:p.subCategory.id});
}
for ( c in db.TxpCategory.manager.all()){
out.categories.set(c.id, {id:c.id,name:c.name });
}
for ( c in db.TxpSubCategory.manager.all()){
out.subCategories.set(c.id, {id:c.id,name:c.name });
}
Sys.print(haxe.Serializer.run(out));
}
}