Skip to content
This repository was archived by the owner on Mar 4, 2022. It is now read-only.

Commit aeefc18

Browse files
committed
Add Material amount chart over time
1 parent 95a4360 commit aeefc18

File tree

19 files changed

+381
-1551
lines changed

19 files changed

+381
-1551
lines changed

backend/Hesabdar/Controllers/DealController.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,10 @@ public async Task<IActionResult> PutDeal([FromRoute] int id, [FromBody] Deal dea
118118
#endregion
119119

120120
#region Payments Modify
121+
if(deal.DealPayment.Method == Models.Enums.PaymentMethod.Cash && !deal.DealPayment.Paid)
122+
{
123+
deal.DealPayment.Amount = 0;
124+
}
121125
deal.DealPayment.PayerId = deal.BuyerId;
122126
deal.DealPayment.PayeeId = deal.SellerId;
123127
deal.DealPrice.PayerId = deal.SellerId;
@@ -218,6 +222,10 @@ private async Task<IActionResult> PostDeal([FromBody] Deal deal)
218222
{
219223
deal.DealTime = DateTime.Now;
220224
}
225+
if(deal.DealPayment.Method == Models.Enums.PaymentMethod.Cash && !deal.DealPayment.Paid)
226+
{
227+
deal.DealPayment.Amount = 0;
228+
}
221229
deal.DealPrice.DueDate = deal.DealTime;
222230
deal.DealPrice.PayDate = deal.DealTime;
223231
deal.DealPrice.Method = Models.Enums.PaymentMethod.DealPrice;

backend/Hesabdar/Controllers/DealerController.cs

Lines changed: 40 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,26 @@ public DealerController(HesabdarContext context)
2525
[HttpGet]
2626
public IActionResult Dealers([FromQuery] int page = 1, [FromQuery] int perPage = 10, [FromQuery] string sort = "id desc", [FromQuery] string filter = "")
2727
{
28-
var dealers = _context.Dealer.Where(u => u.Id != 1).OrderBy(sort).PageResult(page, perPage);
28+
29+
var incomes = _context.Payment.Where(u => u.Paid).Where(u => u.PayerId == 1).GroupBy(u => u.PayeeId).Select(u => new { DealerId = u.Key, Amount = u.Select(i => i.Amount).DefaultIfEmpty(0).Sum()});
30+
var expenses = _context.Payment.Where(u => u.Paid).Where(u => u.PayeeId == 1).GroupBy(u => u.PayerId).Select(u => new { DealerId = u.Key, Amount = u.Select(i => i.Amount).DefaultIfEmpty(0).Sum()});
31+
32+
var dealers = (
33+
from d in _context.Dealer
34+
join i in incomes on d.Id equals i.DealerId into iIncome
35+
from income in iIncome.DefaultIfEmpty()
36+
join e in expenses on d.Id equals e.DealerId into iExpenses
37+
from expense in iExpenses.DefaultIfEmpty()
38+
where d.Id != 1
39+
select new Dealer {
40+
Address = d.Address,
41+
Id = d.Id,
42+
Name = d.Name,
43+
PhoneNumber = d.PhoneNumber,
44+
Timestamp = d.Timestamp,
45+
Balance = (expense.Amount) - (income.Amount),
46+
}
47+
).OrderBy(sort).PageResult(page, perPage);
2948
return Ok(dealers);
3049
}
3150

@@ -50,7 +69,26 @@ public async Task<IActionResult> GetDealer([FromRoute] int id)
5069
return BadRequest(ModelState);
5170
}
5271

53-
var dealer = await _context.Dealer.SingleOrDefaultAsync(m => m.Id == id);
72+
var incomes = _context.Payment.Where(u => u.Paid).Where(u => u.PayerId == 1).GroupBy(u => u.PayeeId).Select(u => new { DealerId = u.Key, Amount = u.Select(i => i.Amount).DefaultIfEmpty(0).Sum()});
73+
var expenses = _context.Payment.Where(u => u.Paid).Where(u => u.PayeeId == 1).GroupBy(u => u.PayerId).Select(u => new { DealerId = u.Key, Amount = u.Select(i => i.Amount).DefaultIfEmpty(0).Sum()});
74+
75+
var dealers = (
76+
from d in _context.Dealer
77+
join i in incomes on d.Id equals i.DealerId into iIncome
78+
from income in iIncome.DefaultIfEmpty()
79+
join e in expenses on d.Id equals e.DealerId into iExpenses
80+
from expense in iExpenses.DefaultIfEmpty()
81+
select new Dealer {
82+
Address = d.Address,
83+
Id = d.Id,
84+
Name = d.Name,
85+
PhoneNumber = d.PhoneNumber,
86+
Timestamp = d.Timestamp,
87+
Balance = (expense.Amount) - (income.Amount),
88+
}
89+
);
90+
91+
var dealer = await dealers.SingleOrDefaultAsync(m => m.Id == id);
5492

5593
if (dealer == null)
5694
{

backend/Hesabdar/Controllers/PaymentController.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,28 +25,28 @@ public PaymentController(HesabdarContext context)
2525
[HttpGet]
2626
public IActionResult GetPayments([FromQuery] int page = 1, [FromQuery] int perPage = 10, [FromQuery] string sort = "id desc", [FromQuery] string filter = "")
2727
{
28-
var materials = _context.Payment.OrderBy(sort).PageResult(page, perPage);
28+
var materials = _context.Payment.Where(u => u.Amount > 0).OrderBy(sort).PageResult(page, perPage);
2929
return Ok(materials);
3030
}
3131

3232
[HttpGet("Dealer/{id}")]
3333
public IActionResult GetPaymentsOfDealer([FromRoute] int id, [FromQuery] int page = 1, [FromQuery] int perPage = 10, [FromQuery] string sort = "id desc", [FromQuery] string filter = "")
3434
{
35-
var payments = _context.Payment.Where(u => u.PayeeId == id || u.PayerId == id);
35+
var payments = _context.Payment.Where(u => u.Amount > 0).Where(u => u.PayeeId == id || u.PayerId == id);
3636
return Ok(payments);
3737
}
3838

3939
[HttpGet("Dealer/Incomes/{id}")]
4040
public IActionResult GetIncomesOfDealer([FromRoute] int id, [FromQuery] int page = 1, [FromQuery] int perPage = 10, [FromQuery] string sort = "id desc", [FromQuery] string filter = "")
4141
{
42-
var incomes = _context.Dealer.Where(u => u.Id == id).Include(u => u.Incomes).Select(u => u.Incomes);
42+
var incomes = _context.Dealer.Where(u => u.Id == id).Include(u => u.Incomes.Where(i => i.Amount > 0)).Select(u => u.Incomes);
4343
return Ok(incomes);
4444
}
4545

4646
[HttpGet("Dealer/Expenses/{id}")]
4747
public IActionResult GetExpensesOfDealer([FromRoute] int id, [FromQuery] int page = 1, [FromQuery] int perPage = 10, [FromQuery] string sort = "id desc", [FromQuery] string filter = "")
4848
{
49-
var expenses = _context.Dealer.Where(u => u.Id == id).Include(u => u.Expenses).Select(u => u.Expenses);
49+
var expenses = _context.Dealer.Where(u => u.Id == id).Include(u => u.Expenses.Where(e => e.Amount > 0)).Select(u => u.Expenses);
5050
return Ok(expenses);
5151
}
5252

backend/Hesabdar/Controllers/StatisticsController.cs

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -244,5 +244,61 @@ from sa in sai.DefaultIfEmpty()
244244

245245
return Ok(result);
246246
}
247+
248+
[HttpGet("Material/OverTime/{materialId}")]
249+
[HttpGet("Material/OverTime/{materialId}/{dealerId}")]
250+
public async Task<IActionResult> GetMaterialAmountOverTime([FromRoute] int materialId, [FromRoute] int? dealerId = null,[FromQuery] DateTime? start = null, [FromQuery] DateTime? end = null) {
251+
var startDate = start ?? DateTime.Now.Date;
252+
var endDate = end ?? DateTime.Now.Date;
253+
dealerId = dealerId ?? 1;
254+
var beforeAmount = (
255+
from DealItem in _context.DealItem
256+
join Deal in _context.Deal on DealItem.DealId equals Deal.Id
257+
where DealItem.MaterialId == materialId
258+
where Deal.DealTime.Date < startDate.Date
259+
where Deal.SellerId == dealerId || Deal.BuyerId == dealerId
260+
let coef = Deal.SellerId == dealerId ? -1 : 1
261+
select DealItem.Quantity * coef
262+
).DefaultIfEmpty(0).Sum();
263+
264+
var amounts = (
265+
from DealItem in _context.DealItem
266+
join Deal in _context.Deal on DealItem.DealId equals Deal.Id
267+
where DealItem.MaterialId == materialId
268+
where Deal.DealTime.Date >= startDate.Date && Deal.DealTime.Date <= endDate
269+
where Deal.SellerId == dealerId || Deal.BuyerId == dealerId
270+
let coef = Deal.SellerId == dealerId ? -1 : 1
271+
group new { Deal= Deal, DealItem = DealItem, coef= coef} by Deal.DealTime.Date into gg
272+
select new AmountOverDate{
273+
Date = gg.Key.Date,
274+
Amount = gg.Select(u => new {u.DealItem, u.coef}).Select(u => u.DealItem.Quantity * u.coef).DefaultIfEmpty(0).Sum()
275+
}
276+
).ToList();
277+
278+
var dates = Enumerable.Range(0, (int)(endDate - startDate).TotalDays + 1)
279+
.Select(x => startDate.AddDays(x))
280+
.ToList();
281+
282+
amounts = (from date in dates
283+
join a in amounts on date.Date equals a.Date into iAmount
284+
from Amount in iAmount.DefaultIfEmpty()
285+
select new AmountOverDate {
286+
Date = date.Date,
287+
Amount = Amount?.Amount ?? 0
288+
}).OrderBy(u => u.Date).ToList();
289+
290+
amounts.ForEach(u => {
291+
u.Amount += beforeAmount;
292+
beforeAmount = u.Amount;
293+
});
294+
295+
return Ok(amounts);
296+
}
297+
298+
private class AmountOverDate
299+
{
300+
public DateTime Date {get; set;}
301+
public decimal Amount { get; set; }
302+
}
247303
}
248304
}

backend/Hesabdar/Models/Dealer.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,15 @@ public class Dealer : BaseEntity
1616
[ForeignKey("Payer")]
1717
public virtual ICollection<Payment> Expenses { get; set; }
1818

19+
[NotMapped]
20+
public decimal? Balance {get; set;} = null;
21+
22+
public Dealer () {
23+
this.Expenses = new HashSet<Payment>();
24+
this.Incomes = new HashSet<Payment>();
25+
26+
}
27+
1928

2029
}
2130
}

frontend/client/App.vue

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,4 +132,10 @@ tr.is-empty>td>section.section {
132132
.p-datetime-picker-time .p-datetime-picker-time-h, .p-datetime-picker-time .p-datetime-picker-time-m {
133133
font-family: inherit !important;
134134
}
135+
.vpd-weekday {
136+
float: left !important;
137+
}
138+
.vpd-day {
139+
float: left !important;
140+
}
135141
</style>

frontend/client/services/statistics.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,5 +18,11 @@ export default {
1818
},
1919
getMonthlyPurchaseAndSalePrice() : Promise<any> {
2020
return Base.get('statistics', 'purchaseAndSale/price/monthly');
21+
},
22+
getMaterialAmountOverTime(materialId: number, dealerId: number, start: Date, end: Date) : Promise<any> {
23+
return Base.get('statistics', 'material/overtime/'+ materialId + '/' + dealerId + "?start=" +start.toString() + "&end=" + end.toString());
24+
},
25+
getMaterialAmountOverTimeforMainDealer(materialId: number, start: Date, end: Date) : Promise<any> {
26+
return Base.get('statistics', 'material/overtime/'+ materialId + "?start=" +start.toString() + "&end=" + end.toString());
2127
}
2228
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
<template>
2+
<div class="columns">
3+
<div class="column">
4+
<date-picker type="date" :auto-submit="true" format="YYYY-MM-DD " placeholder="اکنون" display-format="jYYYY/jMM/jDD" v-model="from" >
5+
<div slot="label">
6+
<span>از</span>
7+
</div>
8+
</date-picker>
9+
</div>
10+
<div class="column">
11+
<date-picker type="date" :auto-submit="true" format="YYYY-MM-DD " placeholder="اکنون" display-format="jYYYY/jMM/jDD" v-model="to" >
12+
<div slot="label">
13+
<span>تا</span>
14+
</div>
15+
</date-picker>
16+
</div>
17+
</div>
18+
</template>
19+
<script>
20+
export default {
21+
name: 'DateRange',
22+
props: {
23+
fromDate: {
24+
type: String,
25+
default: new Date().toString()
26+
},
27+
toDate: {
28+
type: String,
29+
default: new Date().toString()
30+
}
31+
},
32+
data () {
33+
return {
34+
from: new Date().toString(),
35+
to: new Date().toString()
36+
}
37+
},
38+
watch: {
39+
fromDate () {
40+
this.from = this.fromDate
41+
},
42+
toDate () {
43+
this.to = this.toDate
44+
},
45+
from () {
46+
this.$emit('update:fromDate', this.from)
47+
},
48+
to () {
49+
this.$emit('update:toDate', this.from)
50+
}
51+
}
52+
}
53+
</script>

frontend/client/views/deal/dealItem/List.vue

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
<b-table-column field="pricePerOne*quantity" label="قیمت" style="height:30px">
2020
{{ props.row.pricePerOne * props.row.quantity | currency('', 0) }}
2121
</b-table-column>
22-
<b-table-column label="" width="100">
22+
<b-table-column label="" width="20">
2323
<b-dropdown class="control" position="is-bottom-left">
2424
<button class="button is-link" type="button" slot="trigger">
2525
<template>
@@ -52,19 +52,19 @@
5252
<th>
5353
<p class="control has-addons is-expanded" style="direction:ltr">
5454
<tooltip :label="'بصورت پیشفرض قیمت آخرین '+ (saleOrPurchase == 'sale' ? 'فروش' : 'خرید') +' نمایش داده می شود'" type="primary">
55-
<button class="button is-primary">
55+
<button class="button is-primary" tabindex="-1">
5656
<span>
5757
؟
5858
</span>
5959
</button>
6060
</tooltip>
61-
<input style="direction:rtl; height: 30px" class="input is-expanded" ref="newPricePerOne" @keypress.enter="newRowPricePerOneUpdated" v-model="newRow.pricePerOne" />
61+
<input style="direction:rtl; height: 30px" class="input" ref="newPricePerOne" @keypress.enter="newRowPricePerOneUpdated" v-model="newRow.pricePerOne" />
6262
</p>
6363
</th>
6464
<th>
6565
{{newRow.pricePerOne * newRow.quantity || 0 | currency('', 0) }}
6666
</th>
67-
<th width="100">
67+
<th width="50">
6868
<button class="button is-primary is-fullwidth" v-on:click="add(newRow)" ><i class="fa fa-plus"></i></button>
6969
</th>
7070
</template>

frontend/client/views/deal/payment/index.vue

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -44,26 +44,28 @@
4444
</div>
4545
</div>
4646
<p>&nbsp;</p>
47-
<div class="control">
48-
<div class="columns">
49-
<div class="column">
50-
مقدار پرداخت :
51-
</div>
52-
<div class="control column is-two-thirds">
53-
<input class="input" placeholder="مقدار پرداخت" v-model="deal.dealPayment.amount">
47+
<template v-if="deal.dealPayment.method == 'Cheque' || (deal.dealPayment.method == 'Cash' && deal.dealPayment.paid)">
48+
<div class="control">
49+
<div class="columns">
50+
<div class="column">
51+
مقدار پرداخت :
52+
</div>
53+
<div class="control column is-two-thirds">
54+
<input class="input" placeholder="مقدار پرداخت" v-model="deal.dealPayment.amount">
55+
</div>
5456
</div>
5557
</div>
56-
</div>
57-
<div class="contol">
58-
<div class="columns">
59-
<div class="column">
60-
تاریخ پرداخت:
61-
</div>
62-
<div class="control column is-two-thirds">
63-
<date-picker type="datetime" :auto-submit="true" :editable="true" format="YYYY-MM-DD HH:mm" display-format="HH:mm jYYYY/jMM/jDD" :placeholder="newPayment ? 'اکنون' : ''" v-model="deal.dealPayment.payDate"></date-picker>
58+
<div class="contol">
59+
<div class="columns">
60+
<div class="column">
61+
تاریخ پرداخت:
62+
</div>
63+
<div class="control column is-two-thirds">
64+
<date-picker type="datetime" :auto-submit="true" :editable="true" format="YYYY-MM-DD HH:mm" display-format="HH:mm jYYYY/jMM/jDD" :placeholder="newPayment ? 'اکنون' : ''" v-model="deal.dealPayment.payDate"></date-picker>
65+
</div>
6466
</div>
6567
</div>
66-
</div>
68+
</template>
6769
</div>
6870
</form>
6971
</section>

0 commit comments

Comments
 (0)