Мой сценарий следующий:
Пользователь назначается одной или нескольким группам счетов-фактур (которые содержат подробную информацию: имя пользователя).
Группа товаров (= InvoiceLine) имеет:
- ID
- Имя
- Количество
- Стоимость
- Стоимость установки
itemgroupDetail (= InvoiceLineDetail) имеет:
- ID
- ItemgroupID
- Имя пользователя
*Однако количество 1028 * My
зависит от количества пользователей. Пример:
Пользователь A, зарегистрированный в ноябре 2018 года, находится в списке «Группа G1».
Пользователь A, зарегистрированный в ноябре 2018 года, находится в списке «Группа G2».
Пользователь B, Зарегистрированный в ноябре 2018 года, находится в списке «Группа G3».
Пользователь B, зарегистрированный в марте 2018 года, находится в списке «Группа G1».
Пользователь C, зарегистрированный в марте 2018 года, находится в списке «Группа G3»
За что нужно выставить счет?Все группы товаров.Но если пользователь присоединяется в течение месяца выставления счета, сама группа также должна быть отдельной строкой счета-фактуры (поскольку новым пользователям необходимо выставлять счет один раз с затратами на настройку, в какую группу он входит).
Мои счета-фактуры (результат) должны выглядеть следующим образом:
Quantity Itemgroup
2 G1
1 G2
2 G3
1 G1 NEW
1 G2 NEW
1 G3 NEW
Моя проблема в том, что я не знаю, как мне следует решать тот факт, что мне нужно динамически создавать новые счета-фактуры (с новыми подробностями)).
Это код, который, как я знаю, имеет:
Я начинаю с создания строк счета-фактуры (но я НЕ УСТАНАВЛИВАЮЮ количество YET):
public List<Company_Recurring_Invoice_Line> getInvoiceLines(int invoiceID)
{
List<Company_Recurring_Invoice_Line> lines = new List<Company_Recurring_Invoice_Line>();
SqlCommand command = new SqlCommand(@"SELECT * FROM ITEMGROUPS", conn);
command.Parameters.Add("@invoiceID", SqlDbType.Int).Value = invoiceID;
conn.Open();
SqlDataReader reader = command.ExecuteReader();
while (reader.Read())
{
Company_Recurring_Invoice_Line line = new Company_Recurring_Invoice_Line();
line.invoiceID = invoiceID;
line.itemgroupID = int.Parse(reader["id"].ToString());
line.unitPrice = decimal.Parse(reader["price"].ToString());
line.description = reader["name"].ToString();
lines.Add(line);
}
conn.Close();
return lines;
}
Здесь и далееВ каждой строке счета-фактуры я перехожу к пользователям + задаю количество строки счета-фактуры и сохраняю детали в строке счета-фактуры:
public Company_Invoice getInvoiceLineDetails(Company_Recurring_Invoice invoice)
{
Company_Recurring_Invoice i = invoice;
foreach (Company_Recurring_Invoice_Line line in i.InvoiceLines)
{
getInvoiceLineDetails(line);
}
return i;
}
public Company_Recurring_Invoice_Line getInvoiceLineLineDetails(Company_Recurring_Invoice_Line _line)
{
Company_Recurring_Invoice_Line Line = _line;
Line.InvoiceLineDetails = new List<Company_Recurring_Invoice_Line_Detail>();
SqlCommand command = new SqlCommand(@"SELECT * FROM PERSON WHERE ITEMGROUPID = @ITEMGROUP", conn);
command.Parameters.Add("@ITEMGROUP", SqlDbType.Int).Value = Line.itemgroupID;
conn.Open();
SqlDataReader reader = command.ExecuteReader();
while (reader.Read())
{
// We create a new detail line (with the name of the user + check it's date)
//THIS IS WHERE I NEED TO CHECK IF THE MONTH OF THE USER = MONTH OF INVOICING AND ADD IT TO AN EXISTING OR NEW INVOICE LINE TOO
DateTime Date = DateTime.Parse(reader["joindate"].ToString());
Line.quantity++;
Company_Recurring_Invoice_Line_Detail detail = new Company_Recurring_Invoice_Line_Detail();
detail.Value = reader["name"].ToString();
detail.Company_Recurring_Invoice_Line = Line.InvoiceLineID;
Line.InvoiceLineDetails.Add(detail);
}
conn.Close();
return Line;
}
Мой код отлично работает для пользователей, которые не являются новыми (мои строки +детали генерируются идеально), но я ломаю голову, чтобы выяснить, как я могу реализовать тот факт, что ему также необходимо создать отдельную строку счета-фактуры, ЕСЛИ дата пользователя, например, 11. Имейте в виду, что НОВЫЕ строки счета-фактурытакже должны быть заполнены более чем одним пользователем.
Как лучше всего это реализовать?Поскольку оптимизация здесь не очень важна, я думал о том, чтобы просто создать отдельные методы для этого или новых классов (сначала генерировать старые, а затем создавать новые), но могу ли я сделать это без этого?