I add item from this view :
struct InvoiceView: View {
@StateObject var itemsData = ItemsData()
@AppStorage("storeName") private var storeName = ""
@AppStorage("invoiceNumber") private var invoiceNumber = ""
@AppStorage("contactNumber") private var contactNumber = ""
@State private var invoiceDate = Date()
@AppStorage("customerName") private var customerName = ""
@AppStorage("customerAddress") private var customerAddress = ""
@AppStorage("cusContactNumber") private var cusContactNumber = ""
@State private var showingAddItem = false
@State private var showingHistoryView = false
// FOR CALCULATE TOTAL AMOUNT.
private var totalAmount: Double {
itemsData.items.reduce(0.0) { partialResult, item in
partialResult + item.price
// also can be expressed as { $0 + $1.amount }
}
}
// FOR CALCULATE DISCOUNT AMOUNT. (READING FROM AddView)
private var discountAmount: Double {
itemsData.items.reduce(0.0) { partialResult, item in
partialResult + item.discountAmount
// also can be expressed as { $0 + $1.amount }
}
}
// FOR CALCULATE VAT AMOUNT.
private var vatAmount1: Double {
itemsData.items.reduce(0.0) { partialResult, item in
if item.vat > 0 {
let netAmount = item.price / (1 + item.vat/100)
let vatamount = item.price - netAmount
return partialResult + vatamount
}
return partialResult
}
}
@State private var paymentM = "Cash"
let paymentsList = ["Cash", "BenefitPay", "Debit Card"]
@ObservedObject var historyData: historyData
@State private var type = "Income"
@ObservedObject var expenses: Expenses
var body: some View {
NavigationView {
List {
Section(header: Text("Store Details")) {
TextField("Store Name", text: $storeName)
TextField("Invoice number", text: $invoiceNumber)
TextField("contact number", text: $contactNumber)
}
Section{
DatePicker("Date", selection: $invoiceDate)
}
Section(header: Text("Customer Details")) {
TextField("Customer Name", text: $customerName)
TextField("Customer Address", text: $customerAddress)
TextField("contact number", text: $cusContactNumber)
}
Group {
Button{
showingAddItem = true
} label: {
HStack {
Image(systemName: "plus")
Text("Add Item")
}
}
.sheet(isPresented: $showingAddItem) {
AddView(ItemsData: itemsData)
}
ForEach(itemsData.items, id: \.id) { item in
HStack {
VStack(alignment: .leading) {
Text(item.name)
.lineLimit(3)
Text("x\(item.quantity.formatted())")
.foregroundColor(Color("grayed"))
}
Spacer()
VStack {
Text(item.price, format: .currency(code: Locale.current.currency?.identifier ?? "BD"))
.lineLimit(3)
}
}
}
.onDelete(perform: removeItem)
}
HStack {
Text("Discount amount")
Spacer()
Text("\(discountAmount.formatted(.currency(code: Locale.current.currency?.identifier ?? "BD")))")
.foregroundColor(.blue)
}
HStack {
Text("VAT amount")
Spacer()
Text("\(vatAmount1.formatted(.currency(code: Locale.current.currency?.identifier ?? "BD")))")
.foregroundColor(.red)
}
HStack {
VStack(alignment: .leading) {
Text("Total")
Text(vatAmount1 > 0 ? "inc. VAT" : "")
.foregroundColor(Color("grayed"))
}
Spacer()
Text("\(totalAmount.formatted(.currency(code: Locale.current.currency?.identifier ?? "BD")))")
.foregroundColor(.green)
}
Group {
Section {
Picker("payment method", selection: $paymentM) {
ForEach(paymentsList, id: \.self) {
Text($0)
}
}
}
}
}
.navigationTitle("Invoice Maker")
.navigationBarTitleDisplayMode(.inline)
.toolbar {
ToolbarItemGroup {
ShareLink("Export PDF", item: render())
Button("Save") {
let income = ExpenseItem(name: customerName, type: type, amount: totalAmount - vatAmount1, date: invoiceDate, vat: vatAmount1)
expenses.items.insert(income, at: 0)
let item = HistoryData(storN: storeName, storNum: contactNumber, invNum: invoiceNumber, dat: invoiceDate, cus: customerName, cusAddr: customerAddress, cusNum: cusContactNumber, price: totalAmount)
historyData.item.insert(item, at: 0)
}
}