Example #1
0
 public production_report_supplier_model()
 {
     db = new production_report_supplier_db();
 }
        public void calculate(string id_warehouse)
        {
            var date_update = _context.production_report_suppliers
                              .Max(d => d.date_update) ?? new DateTime(1999, 1, 1);
            var date_update_current = DateTime.Now;
            //export
            var supply_query = _context.production_order_need_supplier_schedules
                               .Where(d => d.status_export != 2)
                               .Where(d => d.create_date > date_update)
                               .Where(d => _context.Fn_check_finish_approval(_context.production_orders.Where(t => t.id == d.id_production_order)
                                                                             .Select(t => t.id_approval).SingleOrDefault()) == true);

            var purchase_query = _context.business_purchase_order_import_dates
                                 .Where(d => d.status_import != 2)
                                 .Where(d => _context.Fn_check_finish_approval(_context.business_purchase_orders.Where(t => t.id == d.id_business_purchase_order)
                                                                               .Select(t => t.id_approval).SingleOrDefault()) == true);


            var list_item = supply_query
                            .Select(d => new { id_item = d.id_item, id_unit = d.id_unit_main }).Distinct().ToList();
            var listadd = new List <production_report_supplier_db>();

            for (int i = 0; i < list_item.Count; i++)
            {
                var delete = _context.production_report_suppliers
                             .Where(d => d.id_item == list_item[i].id_item)
                             .Where(t => t.date_production > date_update_current);
                _context.production_report_suppliers.RemoveRange(delete);
                _context.SaveChanges();

                var date_supplys = supply_query.Where(d => d.id_item == list_item[i].id_item)
                                   .Select(d => d.need_supplier_date).Distinct().ToList();

                if (date_supplys.Count == 0)
                {
                    continue;
                }
                var current_Stock = getcurretstockofitem(list_item[i].id_item);

                for (int d = 0; d < date_supplys.Count; d++)
                {
                    var db = new production_report_supplier_db()
                    {
                        date_update     = date_update_current,
                        id              = 0,
                        id_item         = list_item[i].id_item,
                        id_unit         = list_item[i].id_unit,
                        date_production = date_supplys[d]
                    };
                    db.quantity_current_stock_expected = current_Stock;

                    db.quantity_need_suply = supply_query.Where(d => d.id_item == list_item[i].id_item)
                                             .Where(t => t.need_supplier_date == date_supplys[d]).Sum(d => (decimal?)((d.quantity ?? 0) - (d.quantity_export ?? 0))) ?? 0;



                    var totalpurchase = purchase_query.Where(t => t.estimated_import_date < date_supplys[d])
                                        .Sum(d => (decimal?)((d.quantity ?? 0) - (d.quantity_import ?? 0))) ?? 0;



                    var totalsuplybefore = supply_query.Where(d => d.id_item == list_item[i].id_item)
                                           .Where(t => t.need_supplier_date < date_supplys[d]).Sum(d => (decimal?)((d.quantity ?? 0) - (d.quantity_export ?? 0))) ?? 0;
                    db.quantity_purchase_expected = totalpurchase - totalsuplybefore;
                    if (db.quantity_purchase_expected < 0)
                    {
                        db.quantity_purchase_expected = 0;
                    }

                    if (db.quantity_purchase_expected + db.quantity_current_stock_expected - db.quantity_need_suply < 0)
                    {
                        db.status = 2;
                    }
                    else
                    {
                        db.status = 1;
                    }

                    current_Stock = current_Stock - db.quantity_need_suply;

                    listadd.Add(db);
                }
                ;
            }
            _context.production_report_suppliers.AddRange(listadd);
            _context.SaveChanges();
        }