public HttpResponseMessage AddInternalEmiRequisition([FromBody] InternalEmiRequisitionModel internalEmiRequisitionModel)
        {
            try
            {
                if (string.IsNullOrEmpty(internalEmiRequisitionModel.InternalRequisitionMaster.from_warehouse_id.ToString()))
                {
                    var formatter = RequestFormat.JsonFormaterString();
                    return(Request.CreateResponse(HttpStatusCode.OK, new Confirmation {
                        output = "error", msg = "Please Select From Warehouse!!"
                    }, formatter));
                }
                if (string.IsNullOrEmpty(internalEmiRequisitionModel.InternalRequisitionMaster.to_department.ToString()))
                {
                    var formatter = RequestFormat.JsonFormaterString();
                    return(Request.CreateResponse(HttpStatusCode.OK, new Confirmation {
                        output = "error", msg = "Please Select To Department!!"
                    }, formatter));
                }

                else
                {
                    internalEmiRequisitionRepository.AddInternalEmiRequisition(internalEmiRequisitionModel);
                    var formatter = RequestFormat.JsonFormaterString();
                    return(Request.CreateResponse(HttpStatusCode.OK, new Confirmation {
                        output = "success", msg = "Requisition save successfully"
                    }, formatter));
                }
            }
            catch (Exception ex)
            {
                var formatter = RequestFormat.JsonFormaterString();
                return(Request.CreateResponse(HttpStatusCode.OK, new Confirmation {
                    output = "error", msg = "Sorry Internal EMI Requisition Failed!"
                }, formatter));
            }
        }
        public long AddInternalEmiRequisition(InternalEmiRequisitionModel internalEmiRequisitionModel)
        {
            try
            {
                var internalRequisitionMasterData  = internalEmiRequisitionModel.InternalRequisitionMaster;
                var internalRequisitionDetailsList = internalEmiRequisitionModel.InternalRequisitionDetails;
                var receiveSerialNoDetailsList     = internalEmiRequisitionModel.ReceiveSerialNoDetails;
                var promotionDetailsList           = internalEmiRequisitionModel.PromotionDetails;
                var installmentDetails             = internalEmiRequisitionModel.InstallmentDetails;

                int save = 0;

                //Auto Number Creator
                long internalRequisitionSerial = _entities.internal_requisition_master.Max(re => (long?)re.internal_requisition_master_id) ?? 0;
                internalRequisitionSerial++;
                var    internalRequisitionSerialNo = internalRequisitionSerial.ToString().PadLeft(7, '0');
                string intReqNo = "INT-EMI-REQ-" + internalRequisitionSerialNo;

                //Master Table
                internalRequisitionMasterData.internal_requisition_no = intReqNo;
                internalRequisitionMasterData.from_warehouse_id       = internalEmiRequisitionModel.InternalRequisitionMaster.from_warehouse_id;
                internalRequisitionMasterData.to_department           = internalEmiRequisitionModel.InternalRequisitionMaster.to_department;
                internalRequisitionMasterData.customar_name           = internalEmiRequisitionModel.InternalRequisitionMaster.customar_name;
                internalRequisitionMasterData.mobile_no              = internalEmiRequisitionModel.InternalRequisitionMaster.mobile_no;
                internalRequisitionMasterData.requisition_date       = DateTime.Now;
                internalRequisitionMasterData.payment_type           = "EMI";
                internalRequisitionMasterData.pricing                = internalEmiRequisitionModel.InternalRequisitionMaster.pricing;
                internalRequisitionMasterData.remarks                = internalEmiRequisitionModel.InternalRequisitionMaster.remarks;
                internalRequisitionMasterData.requisition_status     = "Created";
                internalRequisitionMasterData.total_incentive_amount = internalRequisitionDetailsList.Sum(tin => tin.incentive_amount) ?? 0;
                internalRequisitionMasterData.total_amount           = internalEmiRequisitionModel.InternalRequisitionMaster.total_amount;
                internalRequisitionMasterData.created_by             = internalEmiRequisitionModel.InternalRequisitionMaster.created_by;
                internalRequisitionMasterData.created_date           = DateTime.Now;
                _entities.internal_requisition_master.Add(internalRequisitionMasterData);
                _entities.SaveChanges();

                //Details Table
                long internalRequisitionMasterId = internalRequisitionMasterData.internal_requisition_master_id;
                foreach (var item in internalRequisitionDetailsList)
                {
                    var internalRequisitionDetails = new internal_requisition_details
                    {
                        internal_requisition_master_id = internalRequisitionMasterId,
                        product_id         = item.product_id,
                        color_id           = item.color_id,
                        product_version_id = item.product_version_id,
                        quantity           = item.quantity,
                        price               = item.price,
                        amount              = item.amount,
                        is_gift             = false,
                        incentive_amount    = item.incentive_amount,
                        promotion_master_id = item.promotion_master_id,
                    };
                    _entities.internal_requisition_details.Add(internalRequisitionDetails);
                    save = _entities.SaveChanges();
                }

                //for promotion List---
                foreach (var item in promotionDetailsList)
                {
                    var internalRequisitionDetails = new internal_requisition_details
                    {
                        internal_requisition_master_id = internalRequisitionMasterId,
                        product_id         = item.product_id,
                        color_id           = item.color_id,
                        product_version_id = item.product_version_id,
                        quantity           = item.quantity,
                        price               = item.price,
                        amount              = item.amount,
                        is_gift             = true,
                        gift_type           = "Promotional",
                        incentive_amount    = item.incentive_amount,
                        promotion_master_id = item.promotion_master_id,
                    };
                    _entities.internal_requisition_details.Add(internalRequisitionDetails);
                    save = _entities.SaveChanges();
                }

                if (save > 0)
                {
                    var deliveryMaster = new delivery_master();


                    //Get To Warehouse Id
                    var toWarehouseId =
                        _entities.warehouses.SingleOrDefault(
                            a => a.warehouse_name == "Internal EMI Warehouse").warehouse_id;
                    //Get Delivery Party Id
                    var partyId = _entities.warehouses.SingleOrDefault(
                        a => a.warehouse_name == "Internal EMI Warehouse").party_id;
                    //Get Party Address
                    var partyAddress = _entities.parties.SingleOrDefault(
                        a => a.party_name == "Internal EMI").address;
                    long deliverySerial = _entities.delivery_master.Max(po => (long?)po.delivery_master_id) ?? 0;
                    deliverySerial++;

                    var    deliveryStr = deliverySerial.ToString().PadLeft(7, '0');
                    string deliveryNo  = "DN-INT-EMI-REQ" + "-" + deliveryStr;
                    deliveryMaster.delivery_no           = deliveryNo;
                    deliveryMaster.delivery_date         = DateTime.Now;
                    deliveryMaster.party_id              = partyId;
                    deliveryMaster.requisition_master_id = internalRequisitionMasterId;
                    deliveryMaster.courier_id            = 0;
                    deliveryMaster.courier_slip_no       = "";
                    deliveryMaster.delivery_address      = partyAddress;
                    deliveryMaster.created_by            = internalEmiRequisitionModel.InternalRequisitionMaster.created_by;
                    deliveryMaster.created_date          = DateTime.Now;
                    deliveryMaster.from_warehouse_id     = internalEmiRequisitionModel.InternalRequisitionMaster.from_warehouse_id;
                    deliveryMaster.to_warehouse_id       = toWarehouseId;
                    deliveryMaster.status              = "EMI-RFD";
                    deliveryMaster.remarks             = "DN-INT-EMI-REQ";
                    deliveryMaster.total_amount        = internalEmiRequisitionModel.InternalRequisitionMaster.total_amount;
                    deliveryMaster.lot_no              = "";
                    deliveryMaster.vehicle_no          = "DN-INT-EMI-REQ";
                    deliveryMaster.truck_driver_name   = "DN-INT-EMI-REQ";
                    deliveryMaster.truck_driver_mobile = "DN-INT-EMI-REQ";

                    _entities.delivery_master.Add(deliveryMaster);
                    _entities.SaveChanges();
                    long deliveryMasterId = deliveryMaster.delivery_master_id;

                    // Delivery Details Table
                    foreach (var item in internalRequisitionDetailsList)
                    {
                        var deliveryDetails = new delivery_details()
                        {
                            delivery_master_id   = deliveryMasterId,
                            product_id           = item.product_id,
                            color_id             = item.color_id,
                            product_version_id   = item.product_version_id,
                            delivered_quantity   = item.quantity,
                            is_gift              = item.is_gift,
                            requisition_quantity = item.quantity,
                            unit_price           = item.product_id,
                            line_total           = item.amount,
                            party_id             = partyId,
                            gift_type            = item.gift_type,
                            is_live_dummy        = false
                        };
                        _entities.delivery_details.Add(deliveryDetails);
                        int saved = _entities.SaveChanges();



                        if (saved > 0)
                        {
                            // update inventory
                            InventoryRepository updateInventoty = new InventoryRepository();
                            var intransitWarehouseId            =
                                _entities.warehouses.SingleOrDefault(k => k.warehouse_name == "In Transit").warehouse_id;
                            var masterDelivery = _entities.delivery_master.Find(deliveryMasterId);

                            //'39' virtual in-transit warehouse
                            updateInventoty.UpdateInventory("INT-EMI-REQ-DELIVERY", masterDelivery.delivery_no, masterDelivery.from_warehouse_id ?? 0, intransitWarehouseId, item.product_id ?? 0, item.color_id ?? 0, item.product_version_id ?? 0, 1,
                                                            item.quantity ?? 0, internalEmiRequisitionModel.InternalRequisitionMaster.created_by ?? 0);
                        }
                    }

                    foreach (var item in promotionDetailsList)
                    {
                        var deliveryDetails = new delivery_details()
                        {
                            delivery_master_id   = deliveryMasterId,
                            product_id           = item.product_id,
                            color_id             = item.color_id,
                            product_version_id   = item.product_version_id,
                            delivered_quantity   = item.quantity,
                            is_gift              = item.is_gift,
                            requisition_quantity = item.quantity,
                            unit_price           = item.product_id,
                            line_total           = item.amount,
                            party_id             = partyId,
                            gift_type            = item.gift_type,
                            is_live_dummy        = false
                        };
                        _entities.delivery_details.Add(deliveryDetails);
                        int saved = _entities.SaveChanges();



                        if (saved > 0)
                        {
                            // update inventory
                            InventoryRepository updateInventoty = new InventoryRepository();
                            var intransitWarehouseId            =
                                _entities.warehouses.SingleOrDefault(k => k.warehouse_name == "In Transit").warehouse_id;
                            var masterDelivery = _entities.delivery_master.Find(deliveryMasterId);

                            //'39' virtual in-transit warehouse
                            updateInventoty.UpdateInventory("INT-EMI-REQ-DELIVERY", masterDelivery.delivery_no, masterDelivery.from_warehouse_id ?? 0, intransitWarehouseId, item.product_id ?? 0, item.color_id ?? 0, item.product_version_id ?? 0, 1,
                                                            item.quantity ?? 0, internalEmiRequisitionModel.InternalRequisitionMaster.created_by ?? 0);
                        }
                    }
                    //For Party Journal

                    ////Get Party Account Balance
                    //var partyJournal =
                    //    _entities.party_journal.Where(pj => pj.party_id == partyId)
                    //        .OrderByDescending(p => p.party_journal_id)
                    //        .FirstOrDefault();
                    //decimal partyAccountBalance = 0;
                    //if (partyJournal != null)
                    //{
                    //    partyAccountBalance = partyJournal.closing_balance ?? 0;
                    //}

                    ////Find Invoice Total
                    //decimal invoiceTotal = 0;
                    //invoiceTotal = internalEmiRequisitionModel.InternalRequisitionMaster.total_amount ?? 0; //insert in both invoice master and party journal table

                    ////Account Balance
                    //decimal accountBalance = 0;
                    //accountBalance = invoiceTotal + partyAccountBalance;



                    //Invoice Master Table

                    long InvoiceSerial = _entities.invoice_master.Max(po => (long?)po.invoice_master_id) ?? 0;
                    InvoiceSerial++;
                    var    invStr    = InvoiceSerial.ToString().PadLeft(7, '0');
                    string invoiceNo = "INV-" + "INT-EMI-REQ" + "-" + invStr;

                    invoice_master insert_invoice = new invoice_master
                    {
                        invoice_no            = invoiceNo,
                        invoice_date          = System.DateTime.Now,
                        party_id              = partyId,
                        requisition_master_id = internalRequisitionMasterId,
                        company_id            = 0,
                        remarks          = internalEmiRequisitionModel.InternalRequisitionMaster.remarks,
                        created_by       = internalEmiRequisitionModel.InternalRequisitionMaster.created_by,
                        created_date     = DateTime.Now,
                        incentive_amount = internalRequisitionDetailsList.Sum(tin => tin.incentive_amount),
                        item_total       = internalEmiRequisitionModel.InternalRequisitionMaster.total_amount,
                        party_type_id    = 11,
                        rebate_total     = 0,
                        invoice_total    = 0,
                        account_balance  = 0,
                    };

                    _entities.invoice_master.Add(insert_invoice);
                    _entities.SaveChanges();
                    long InvoiceMasterId = insert_invoice.invoice_master_id;


                    //Invoice Details Table
                    foreach (var item in internalRequisitionDetailsList)
                    {
                        var getProductCategory =
                            _entities.products.SingleOrDefault(p => p.product_id == item.product_id).product_category_id;
                        var getProductUnit =
                            _entities.products.SingleOrDefault(p => p.product_id == item.product_id).unit_id;
                        var invoiceDetails_insert = new invoice_details
                        {
                            invoice_master_id   = InvoiceMasterId,
                            product_category_id = getProductCategory,
                            product_id          = item.product_id,
                            color_id            = item.color_id,
                            product_version_id  = item.product_version_id,
                            unit_id             = getProductUnit,
                            price         = item.price,
                            quantity      = item.quantity,
                            line_total    = item.amount,
                            is_gift       = false,
                            is_live_dummy = false
                        };

                        _entities.invoice_details.Add(invoiceDetails_insert);
                        _entities.SaveChanges();
                    }

                    //Invoice Details Table
                    foreach (var item in promotionDetailsList)
                    {
                        var getProductCategory =
                            _entities.products.SingleOrDefault(p => p.product_id == item.product_id).product_category_id;
                        var getProductUnit =
                            _entities.products.SingleOrDefault(p => p.product_id == item.product_id).unit_id;
                        var invoiceDetails_insert = new invoice_details
                        {
                            invoice_master_id   = InvoiceMasterId,
                            product_category_id = getProductCategory,
                            product_id          = item.product_id,
                            color_id            = item.color_id,
                            product_version_id  = item.product_version_id,
                            unit_id             = getProductUnit,
                            price         = item.price,
                            quantity      = item.quantity,
                            line_total    = item.amount,
                            is_gift       = true,
                            is_live_dummy = false
                        };

                        _entities.invoice_details.Add(invoiceDetails_insert);
                        _entities.SaveChanges();
                    }


                    //Party Journal
                    // partyJournalRepository.PartyJournalEntry("INVOICE", partyId ?? 0, 0, "Invoice", internalEmiRequisitionModel.InternalRequisitionMaster.created_by ?? 0, invoiceNo);


                    //Receive Serial Table

                    var intransitWarehouse =
                        _entities.warehouses.SingleOrDefault(k => k.warehouse_name == "In Transit").warehouse_id;
                    //Get Delivery Party Id

                    var partyIdForDelivery = _entities.warehouses.SingleOrDefault(
                        a => a.warehouse_name == "Internal EMI Warehouse").party_id;


                    foreach (var item in receiveSerialNoDetailsList)
                    {
                        receive_serial_no_details receiveSerialNoDetails = _entities.receive_serial_no_details.FirstOrDefault(r => r.imei_no == item.imei_no || r.imei_no2 == item.imei_no2);
                        receiveSerialNoDetails.current_warehouse_id = intransitWarehouse;
                        receiveSerialNoDetails.party_id             = partyIdForDelivery;
                        receiveSerialNoDetails.deliver_date         = DateTime.Now;
                        receiveSerialNoDetails.requisition_id       = internalRequisitionMasterId;
                        receiveSerialNoDetails.deliver_master_id    = deliveryMasterId;
                        receiveSerialNoDetails.is_gift       = item.is_gift;
                        receiveSerialNoDetails.is_live_dummy = false;
                        _entities.SaveChanges();
                    }

                    foreach (var item in installmentDetails)
                    {
                        var installmentDetailsList = new installment_details
                        {
                            internal_requisition_master_id = internalRequisitionMasterId,
                            installment_no     = item.installment_no,
                            installment_date   = item.installment_date,
                            installment_amount = item.installment_amount
                        };
                        _entities.installment_details.Add(installmentDetailsList);
                        save = _entities.SaveChanges();
                    }
                }
                return(1);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }