cliente su chiamate Lift web e Task manager
This commit is contained in:
parent
ba1bce42e6
commit
3ad207ebc9
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -51,6 +51,7 @@ using System.Data;
|
||||
using System.Linq;
|
||||
using Microsoft.Extensions.Primitives;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Runtime.CompilerServices;
|
||||
|
||||
namespace ApiPolo.Controllers
|
||||
{
|
||||
@ -490,6 +491,7 @@ namespace ApiPolo.Controllers
|
||||
private DbSet<Impianto>? _impianto;
|
||||
private DbSet<Sostituzione>? _sostituzione;
|
||||
private DbSet<ChiamateTable>? _chiatable;
|
||||
private DbSet<ChiamateTableTaskManager>? _chiatableTaskManager;
|
||||
private DbSet<ChiamataSeriale>? _chiamateser;
|
||||
private DbSet<Prog>? _chiamateprogr;
|
||||
private DbSet<Prog2>? _cpwarns;
|
||||
@ -2268,12 +2270,26 @@ namespace ApiPolo.Controllers
|
||||
case Clienti.VT:
|
||||
_chia = _VT_chiatable.Chi;
|
||||
break;
|
||||
case Clienti.LW:
|
||||
_chia = _LW_chiatable.Chi;
|
||||
break;
|
||||
|
||||
case Clienti.Tedesco:
|
||||
_chia = _Tedes_chiatable.Chi;
|
||||
break;
|
||||
|
||||
default:
|
||||
_chia = null;
|
||||
break;
|
||||
}
|
||||
return _chia;
|
||||
}
|
||||
private DbSet<ChiamateTableTaskManager> getChiamateTableTaskManagerByTenant(string tenant)
|
||||
{
|
||||
DbSet<ChiamateTableTaskManager>? _chia;
|
||||
|
||||
switch (tenant)
|
||||
{
|
||||
case Clienti.LW:
|
||||
_chia = _LW_chiatable.Chi;
|
||||
break;
|
||||
case Clienti.Syscom:
|
||||
_chia = _Sys_chiatable.Chi;
|
||||
break;
|
||||
@ -11682,10 +11698,10 @@ namespace ApiPolo.Controllers
|
||||
r.ore_viaggio = i.ore_viaggio;
|
||||
r.data_timbratura = i.data_timbratura;
|
||||
|
||||
if (ten.Equals(Clienti.Marrocco) && !string.IsNullOrEmpty(i.commessa))
|
||||
{
|
||||
i.commessa = i.commessa.Substring(0, 15);
|
||||
}
|
||||
//if (ten.Equals(Clienti.Marrocco) && !string.IsNullOrEmpty(i.commessa))
|
||||
//{
|
||||
// i.commessa = i.commessa.Substring(0, 15);
|
||||
//}
|
||||
r.commessa = i.commessa;
|
||||
r.tecnico = tecnico;
|
||||
|
||||
@ -12612,7 +12628,7 @@ namespace ApiPolo.Controllers
|
||||
var l = await _impianto.Where(t => t.imcodazi != null && t.imcodazi.Equals(ten)).ToListAsync();
|
||||
if (!string.IsNullOrEmpty(cli))
|
||||
{
|
||||
l = l.Where(t => t.descCliente != null && t.descCliente.Contains(cli)).ToList();
|
||||
l = l.Where(t => t.descCliente != null && t.descCliente.ToUpper().Contains(cli.ToUpper())).ToList();
|
||||
}
|
||||
l = l.Take(300).ToList();
|
||||
foreach (Impianto i in l)
|
||||
@ -13164,6 +13180,114 @@ namespace ApiPolo.Controllers
|
||||
|
||||
return o;
|
||||
}
|
||||
private async Task<ChiamateTableTaskManager> fillChiamateTableTaskManagerInput(ChiamateTableTaskManager i, string codimp, string tecnico, string tenant, string serialeLetto, string progLetto, string seriale_commessa)
|
||||
{
|
||||
|
||||
DateTime adesso = DateTime.Now;
|
||||
ChiamateTableTaskManager o = new ChiamateTableTaskManager();
|
||||
string codiceEsercizio = string.Empty;
|
||||
codiceEsercizio = Convert.ToString(adesso.Year);
|
||||
string nuovoSeriale = string.Empty;
|
||||
nuovoSeriale = getNuovoSerialeChiamata(serialeLetto);
|
||||
|
||||
o.chcodazi = i.chcodazi;
|
||||
o.chserial = nuovoSeriale;
|
||||
//o.chtipo = i.chtipo; scrivo tipo A per distinguere le chiamate normali da quelle inserite da app
|
||||
o.chtipo = "X";
|
||||
o.chcodese = codiceEsercizio;
|
||||
o.chnumero = Convert.ToDecimal(progLetto) + 1;
|
||||
o.chdata = adesso.Date;
|
||||
o.chora = adesso.Hour;
|
||||
o.chmin = adesso.Minute;
|
||||
o.chopins = i.chopins;
|
||||
o.chopass = i.chopass;
|
||||
o.chopchi = i.chopchi;
|
||||
o.chcodimp = codimp;
|
||||
o.chaziimp = i.chaziimp;
|
||||
|
||||
o.chtchiam = tecnico;
|
||||
o.chtmanut = i.chtmanut;
|
||||
o.chstato = "C";
|
||||
o.chdtapp = adesso.Date;
|
||||
o.choraapi = adesso.Hour;
|
||||
o.chminapi = adesso.Minute;
|
||||
o.choraapf = adesso.Hour + 1;
|
||||
o.chminapf = adesso.Minute;
|
||||
|
||||
//TODO il seriale della commessa lo devo avere e lo memorizzo qui
|
||||
//per ora prendo quello che scrivo sul template; poi quello che mi viene passato dalla ricerca
|
||||
o.chrifer = seriale_commessa;
|
||||
o.chtelef = i.chtelef;
|
||||
|
||||
o.chcodseg = i.chcodseg;
|
||||
o.chstopi = i.chstopi;
|
||||
o.chnote = i.chnote;
|
||||
o.chdtass = adesso.Date;
|
||||
o.chorass = adesso.Hour;
|
||||
o.chminass = adesso.Minute;
|
||||
o.chdtchi = i.chdtchi;
|
||||
o.chorachi = i.chorachi;
|
||||
o.chminchi = i.chminchi;
|
||||
o.chdtlin = i.chdtlin;
|
||||
o.chorali = i.chorali;
|
||||
o.chminli = i.chminli;
|
||||
|
||||
o.chdtlfi = i.chdtlfi;
|
||||
o.choralf = i.choralf;
|
||||
o.chminlf = i.chminlf;
|
||||
o.chvalfat = i.chvalfat;
|
||||
o.cpccchk = getCpccchk(10);
|
||||
o.chnrap1 = i.chnrap1;
|
||||
o.chsrap1 = i.chsrap1;
|
||||
o.chnrap2 = i.chnrap2;
|
||||
o.chsrap2 = i.chsrap2;
|
||||
o.chmodrac = i.chmodrac;
|
||||
o.chprgann = i.chprgann;
|
||||
o.chserchi = i.chserchi;
|
||||
o.chdesfat = i.chdesfat;
|
||||
o.chdessup = i.chdessup;
|
||||
o.chimpofa = i.chimpofa;
|
||||
o.chserdoc = i.chserdoc;
|
||||
o.chimpmat = i.chimpmat;
|
||||
o.chimpman = i.chimpman;
|
||||
o.chperman = i.chperman;
|
||||
o.chfleste = i.chfleste;
|
||||
o.chflstim = i.chflstim;
|
||||
o.chserext = i.chserext;
|
||||
o.chrifiutata = i.chrifiutata;
|
||||
|
||||
//o.chincarico = i.chincarico;
|
||||
//o.chserweb = i.chserweb;
|
||||
//o.chinlinea = i.chinlinea;
|
||||
//o.chtelesan = i.chtelesan;
|
||||
string _cli = string.Empty;
|
||||
_cli = await getCodCliByImp(tenant, codimp);
|
||||
o.cliente = _cli;
|
||||
return o;
|
||||
}
|
||||
private async Task<string> getCodCliByImp(string tenant, string codiceImpianto)
|
||||
{
|
||||
string codiceCliente = string.Empty;
|
||||
switch (tenant)
|
||||
{
|
||||
case Clienti.LW:
|
||||
_impianto = _LW_impianti.Impia;
|
||||
break;
|
||||
case Clienti.Syscom:
|
||||
_impianto = _Sys_impianti.Impia;
|
||||
break;
|
||||
default:
|
||||
// code block
|
||||
break;
|
||||
}
|
||||
var i = await _impianto.Where(t => t.imcodimp!=null && t.imcodimp.Equals(codiceImpianto)).ToListAsync();
|
||||
if(i!=null)
|
||||
{
|
||||
codiceCliente = i.First().imultcli;
|
||||
}
|
||||
|
||||
return codiceCliente;
|
||||
}
|
||||
private string getNuovoSerialeChiamata(string lastSerial)
|
||||
{
|
||||
//lunghezza 10 fissa
|
||||
@ -13184,7 +13308,9 @@ namespace ApiPolo.Controllers
|
||||
string serialeTemplate = string.Empty;
|
||||
|
||||
ChiamateTable t = new ChiamateTable();
|
||||
ChiamateTableTaskManager tm = new ChiamateTableTaskManager();
|
||||
var tt = new List<ChiamateTable>();
|
||||
var ttTaskManager = new List<ChiamateTableTaskManager>();
|
||||
if (string.IsNullOrEmpty(ten))
|
||||
{
|
||||
ten = tenConf;
|
||||
@ -13194,7 +13320,7 @@ namespace ApiPolo.Controllers
|
||||
ten = ten2;
|
||||
}
|
||||
_chiatable = getChiamateTableByTenant(ten);
|
||||
|
||||
_chiatableTaskManager = getChiamateTableTaskManagerByTenant(ten);
|
||||
|
||||
switch (ten)
|
||||
{
|
||||
@ -13203,6 +13329,13 @@ namespace ApiPolo.Controllers
|
||||
serialeTemplate = _confLette.seriale_template_chi;
|
||||
tt = await _chiatable.Where(t => t.chcodazi != null && t.chcodazi.Equals(ten2) && t.chserial != null && t.chserial.Equals(serialeTemplate)).ToListAsync();
|
||||
break;
|
||||
case Clienti.LW:
|
||||
case Clienti.Syscom:
|
||||
|
||||
_confLette = await readConf(tenConf);
|
||||
serialeTemplate = _confLette.seriale_template_chi;
|
||||
ttTaskManager = await _chiatableTaskManager.Where(t => t.chcodazi != null && t.chcodazi.Equals(ten2) && t.chserial != null && t.chserial.Equals(serialeTemplate)).ToListAsync();
|
||||
break;
|
||||
default:
|
||||
_confLette = await readConf(tenConf);
|
||||
serialeTemplate = _confLette.seriale_template_chi;
|
||||
@ -13278,21 +13411,22 @@ namespace ApiPolo.Controllers
|
||||
}
|
||||
break;
|
||||
case Clienti.LW:
|
||||
t = fillChiamateTableInput(tt.FirstOrDefault(), codimp, tecnico, ten, serLetto, progLetto, codice_commessa);
|
||||
|
||||
tm = await fillChiamateTableTaskManagerInput(ttTaskManager.FirstOrDefault(), codimp, tecnico, ten, serLetto, progLetto, codice_commessa);
|
||||
|
||||
using (var tranLW = _LW_chiatable.Database.BeginTransaction())
|
||||
{
|
||||
await _LW_chiatable.Chi.AddAsync(t);
|
||||
await _LW_chiatable.Chi.AddAsync(tm);
|
||||
await _LW_chiatable.SaveChangesAsync();
|
||||
tranLW.Commit();
|
||||
}
|
||||
break;
|
||||
case Clienti.Syscom:
|
||||
t = fillChiamateTableInput(tt.FirstOrDefault(), codimp, tecnico, ten, serLetto, progLetto, codice_commessa);
|
||||
tm = await fillChiamateTableTaskManagerInput(ttTaskManager.FirstOrDefault(), codimp, tecnico, ten, serLetto, progLetto, codice_commessa);
|
||||
|
||||
using (var transys = _Sys_chiatable.Database.BeginTransaction())
|
||||
{
|
||||
await _Sys_chiatable.Chi.AddAsync(t);
|
||||
await _Sys_chiatable.Chi.AddAsync(tm);
|
||||
await _Sys_chiatable.SaveChangesAsync();
|
||||
transys.Commit();
|
||||
}
|
||||
@ -13304,8 +13438,20 @@ namespace ApiPolo.Controllers
|
||||
}
|
||||
|
||||
_chiamate = getChiamateByTenant(ten);
|
||||
switch (ten)
|
||||
{
|
||||
case Clienti.LW:
|
||||
case Clienti.Syscom:
|
||||
var chiamata_newTM = _chiamate.Where(x => x.chserial.Equals(tm.chserial)).FirstOrDefault();
|
||||
c = fillChiamateOut(chiamata_newTM, ten);
|
||||
break;
|
||||
|
||||
default:
|
||||
var chiamata_new = _chiamate.Where(x => x.chserial.Equals(t.chserial)).FirstOrDefault();
|
||||
c = fillChiamateOut(chiamata_new, ten);
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
return c;
|
||||
}
|
||||
|
||||
212
ApiPolo/Models/ChiamateTableTaskManager.cs
Normal file
212
ApiPolo/Models/ChiamateTableTaskManager.cs
Normal file
@ -0,0 +1,212 @@
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
|
||||
namespace ApiPolo.Models
|
||||
{
|
||||
/// <summary>Tabella CHIAMATE (insert da app) per le installazioni di TaskManager</summary>
|
||||
public class ChiamateTableTaskManager
|
||||
{
|
||||
/// <summary></summary>
|
||||
[Key]
|
||||
public string? chcodazi { get; set; }
|
||||
|
||||
/// <summary></summary>
|
||||
[Key]
|
||||
public string? chserial { get; set; }
|
||||
|
||||
/// <summary></summary>
|
||||
public string? chcodese { get; set; }
|
||||
|
||||
/// <summary></summary>
|
||||
public string? chtipo { get; set; }
|
||||
|
||||
/// <summary></summary>
|
||||
[System.ComponentModel.DataAnnotations.Schema.Column(TypeName = "decimal(10, 0)")]
|
||||
public decimal? chnumero { get; set; }
|
||||
|
||||
/// <summary></summary>
|
||||
public DateTime? chdata { get; set; }
|
||||
|
||||
/// <summary></summary>
|
||||
public int? chora { get; set; }
|
||||
|
||||
/// <summary></summary>
|
||||
public int? chmin { get; set; }
|
||||
|
||||
/// <summary></summary>
|
||||
public int? chopins { get; set; }
|
||||
|
||||
/// <summary></summary>
|
||||
public int? chopass { get; set; }
|
||||
|
||||
/// <summary></summary>
|
||||
public int? chopchi { get; set; }
|
||||
|
||||
/// <summary></summary>
|
||||
public string? chcodimp { get; set; }
|
||||
|
||||
/// <summary></summary>
|
||||
public string? chaziimp { get; set; }
|
||||
|
||||
|
||||
|
||||
/// <summary></summary>
|
||||
public string? chtchiam { get; set; }
|
||||
|
||||
/// <summary></summary>
|
||||
public string? chtmanut { get; set; }
|
||||
|
||||
/// <summary></summary>
|
||||
public string? chstato { get; set; }
|
||||
|
||||
/// <summary></summary>
|
||||
public DateTime? chdtapp { get; set; }
|
||||
|
||||
/// <summary></summary>
|
||||
public int? choraapi { get; set; }
|
||||
|
||||
/// <summary></summary>
|
||||
public int? chminapi { get; set; }
|
||||
|
||||
/// <summary></summary>
|
||||
public int? choraapf { get; set; }
|
||||
|
||||
/// <summary></summary>
|
||||
public int? chminapf { get; set; }
|
||||
|
||||
/// <summary></summary>
|
||||
public string? chrifer { get; set; }
|
||||
|
||||
/// <summary></summary>
|
||||
public string? chtelef { get; set; }
|
||||
|
||||
|
||||
|
||||
/// <summary></summary>
|
||||
public string? chcodseg { get; set; }
|
||||
|
||||
/// <summary></summary>
|
||||
public string? chstopi { get; set; }
|
||||
|
||||
/// <summary></summary>
|
||||
public string? chnote { get; set; }
|
||||
|
||||
/// <summary></summary>
|
||||
public DateTime? chdtass { get; set; }
|
||||
|
||||
/// <summary></summary>
|
||||
public int? chorass { get; set; }
|
||||
|
||||
/// <summary></summary>
|
||||
public int? chminass { get; set; }
|
||||
|
||||
/// <summary></summary>
|
||||
public DateTime? chdtchi { get; set; }
|
||||
|
||||
/// <summary></summary>
|
||||
public int? chorachi { get; set; }
|
||||
|
||||
/// <summary></summary>
|
||||
public int? chminchi { get; set; }
|
||||
|
||||
/// <summary></summary>
|
||||
public DateTime? chdtlin { get; set; }
|
||||
|
||||
/// <summary></summary>
|
||||
public int? chorali { get; set; }
|
||||
|
||||
/// <summary></summary>
|
||||
public int? chminli { get; set; }
|
||||
|
||||
|
||||
|
||||
/// <summary></summary>
|
||||
public DateTime? chdtlfi { get; set; }
|
||||
|
||||
/// <summary></summary>
|
||||
public int? choralf { get; set; }
|
||||
|
||||
/// <summary></summary>
|
||||
public int? chminlf { get; set; }
|
||||
|
||||
/// <summary></summary>
|
||||
public string? chvalfat { get; set; }
|
||||
|
||||
/// <summary></summary>
|
||||
public string? cpccchk { get; set; }
|
||||
|
||||
/// <summary></summary>
|
||||
public int? chnrap1 { get; set; }
|
||||
|
||||
/// <summary></summary>
|
||||
public string? chsrap1 { get; set; }
|
||||
|
||||
/// <summary></summary>
|
||||
public int? chnrap2 { get; set; }
|
||||
|
||||
/// <summary></summary>
|
||||
public string? chsrap2 { get; set; }
|
||||
|
||||
/// <summary></summary>
|
||||
public string? chmodrac { get; set; }
|
||||
|
||||
/// <summary></summary>
|
||||
public int? chprgann { get; set; }
|
||||
|
||||
/// <summary></summary>
|
||||
public string? chserchi { get; set; }
|
||||
|
||||
/// <summary></summary>
|
||||
public string? chdesfat { get; set; }
|
||||
|
||||
/// <summary></summary>
|
||||
public string? chdessup { get; set; }
|
||||
|
||||
/// <summary></summary>
|
||||
[System.ComponentModel.DataAnnotations.Schema.Column(TypeName = "decimal(18, 4)")]
|
||||
public decimal? chimpofa { get; set; }
|
||||
|
||||
/// <summary></summary>
|
||||
public string? chserdoc { get; set; }
|
||||
|
||||
/// <summary></summary>
|
||||
[System.ComponentModel.DataAnnotations.Schema.Column(TypeName = "decimal(18, 4)")]
|
||||
public decimal? chimpmat { get; set; }
|
||||
|
||||
/// <summary></summary>
|
||||
[System.ComponentModel.DataAnnotations.Schema.Column(TypeName = "decimal(18, 4)")]
|
||||
public decimal? chimpman { get; set; }
|
||||
|
||||
/// <summary></summary>
|
||||
[System.ComponentModel.DataAnnotations.Schema.Column(TypeName = "decimal(6, 2)")]
|
||||
public decimal? chperman { get; set; }
|
||||
|
||||
/// <summary></summary>
|
||||
public string? chflstim { get; set; }
|
||||
|
||||
/// <summary></summary>
|
||||
public string? chfleste { get; set; }
|
||||
|
||||
/// <summary></summary>
|
||||
public string? chserext { get; set; }
|
||||
|
||||
/// <summary></summary>
|
||||
public string? chrifiutata { get; set; }
|
||||
|
||||
///// <summary></summary>
|
||||
//public string? chincarico { get; set; }
|
||||
|
||||
///// <summary></summary>
|
||||
//public string? chserweb { get; set; }
|
||||
|
||||
///// <summary></summary>
|
||||
//public string? chinlinea { get; set; }
|
||||
|
||||
///// <summary></summary>
|
||||
//public string? chpreinc { get; set; }
|
||||
|
||||
/// <summary>campo cliente su tabella chiamate di TaskManager </summary>
|
||||
public string? cliente { get; set; }
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
@ -7,7 +7,7 @@ namespace ApiPolo.Models.Lift_web_dbcontext
|
||||
public class LIFT_WEB_CHIAMATE_TABLE_DbContext : DbContext
|
||||
{
|
||||
/// <summary></summary>
|
||||
public DbSet<ChiamateTable>? Chi { get; set; }
|
||||
public DbSet<ChiamateTableTaskManager>? Chi { get; set; }
|
||||
|
||||
/// <summary></summary>
|
||||
public LIFT_WEB_CHIAMATE_TABLE_DbContext(DbContextOptions<LIFT_WEB_CHIAMATE_TABLE_DbContext> options) : base(options)
|
||||
@ -17,11 +17,12 @@ namespace ApiPolo.Models.Lift_web_dbcontext
|
||||
/// <summary></summary>
|
||||
protected override void OnModelCreating(ModelBuilder modelBuilder)
|
||||
{
|
||||
modelBuilder.Entity<ChiamateTable>().ToTable("CHIAMATE");
|
||||
modelBuilder.Entity<ChiamateTable>().HasKey(table => new {
|
||||
modelBuilder.Entity<ChiamateTableTaskManager>().ToTable("CHIAMATE");
|
||||
modelBuilder.Entity<ChiamateTableTaskManager>().HasKey(table => new {
|
||||
table.chcodazi,
|
||||
table.chserial
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -3,11 +3,11 @@ using Microsoft.EntityFrameworkCore;
|
||||
|
||||
namespace ApiPolo.Models.Security_dbcontext
|
||||
{
|
||||
/// <summary></summary>
|
||||
/// <summary>SYSCOM</summary>
|
||||
public class SECURITY_CHIAMATE_TABLE_DbContext:DbContext
|
||||
{
|
||||
/// <summary></summary>
|
||||
public DbSet<ChiamateTable>? Chi { get; set; }
|
||||
public DbSet<ChiamateTableTaskManager>? Chi { get; set; }
|
||||
|
||||
/// <summary></summary>
|
||||
public SECURITY_CHIAMATE_TABLE_DbContext(DbContextOptions<SECURITY_CHIAMATE_TABLE_DbContext> options) : base(options)
|
||||
@ -17,8 +17,8 @@ namespace ApiPolo.Models.Security_dbcontext
|
||||
/// <summary></summary>
|
||||
protected override void OnModelCreating(ModelBuilder modelBuilder)
|
||||
{
|
||||
modelBuilder.Entity<ChiamateTable>().ToTable("CHIAMATE");
|
||||
modelBuilder.Entity<ChiamateTable>().HasKey(table => new {
|
||||
modelBuilder.Entity<ChiamateTableTaskManager>().ToTable("CHIAMATE");
|
||||
modelBuilder.Entity<ChiamateTableTaskManager>().HasKey(table => new {
|
||||
table.chcodazi,
|
||||
table.chserial
|
||||
});
|
||||
|
||||
@ -10,7 +10,7 @@
|
||||
|
||||
//connessione non sicura: Encrypt=False
|
||||
|
||||
/*"ApiStr": "Data Source=172.25.30.1;Initial Catalog=API_POLO;User Id=sa; Password=p0l01nf.;Integrated Security=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False",*/
|
||||
//"ApiStr": "Data Source=172.25.30.1;Initial Catalog=API_POLO;User Id=sa; Password=p0l01nf.;Integrated Security=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False",
|
||||
"ApiStr": "Data Source=MARCO_PC\\SQL_2022;Initial Catalog=API_POLO;User Id=sa; Password=p0l01nf.;Integrated Security=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False",
|
||||
|
||||
/*"FERRA": "Data Source=10.0.0.10;Initial Catalog=AHR60_FERRARI;User Id=sa; Password=p0l01nf.;Integrated Security=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False",*/
|
||||
|
||||
Loading…
Reference in New Issue
Block a user