* Estimates as Tex or Pdf
* Estimate edition [mix Mvc&Ajax] * Billable&Bankable properties on profiles
This commit is contained in:
@ -41,13 +41,13 @@
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\WorkFlowProvider\WorkFlowProvider.csproj">
|
||||
<Project>{821FF72D-9F4B-4A2C-B95C-7B965291F119}</Project>
|
||||
<Name>WorkFlowProvider</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\yavscModel\YavscModel.csproj">
|
||||
<Project>{68F5B80A-616E-4C3C-91A0-828AA40000BD}</Project>
|
||||
<Name>YavscModel</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\WorkFlowProvider\NpgsqlWorkflow.csproj">
|
||||
<Project>{821FF72D-9F4B-4A2C-B95C-7B965291F119}</Project>
|
||||
<Name>NpgsqlWorkflow</Name>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
</Project>
|
@ -12,36 +12,46 @@ namespace WorkFlowProvider
|
||||
{
|
||||
public class NpgsqlContentProvider: ProviderBase, IContentProvider
|
||||
{
|
||||
public StatusChange[] GetWrittingStatuses (long wrid)
|
||||
{
|
||||
throw new NotImplementedException ();
|
||||
}
|
||||
public StatusChange[] GetEstimateStatuses (long estid)
|
||||
{
|
||||
throw new NotImplementedException ();
|
||||
}
|
||||
public void TagWritting (long wrid, string tag)
|
||||
{
|
||||
throw new NotImplementedException ();
|
||||
}
|
||||
public void DropTagWritting (long wrid, string tag)
|
||||
{
|
||||
throw new NotImplementedException ();
|
||||
}
|
||||
public void SetWrittingStatus (long wrtid, int status, string username)
|
||||
{
|
||||
throw new NotImplementedException ();
|
||||
}
|
||||
public void SetEstimateStatus (long estid, int status, string username)
|
||||
{
|
||||
throw new NotImplementedException ();
|
||||
}
|
||||
public void Dispose ()
|
||||
{
|
||||
throw new NotImplementedException ();
|
||||
}
|
||||
public void Install (System.Data.IDbConnection cnx)
|
||||
{
|
||||
throw new NotImplementedException ();
|
||||
}
|
||||
|
||||
public void Uninstall (System.Data.IDbConnection cnx, bool removeConfig)
|
||||
{
|
||||
throw new NotImplementedException ();
|
||||
}
|
||||
|
||||
public Estimate[] GetEstimates (string client)
|
||||
{
|
||||
throw new NotImplementedException ();
|
||||
}
|
||||
|
||||
public void Install ()
|
||||
{
|
||||
throw new NotImplementedException ();
|
||||
}
|
||||
|
||||
public void Uninstall ()
|
||||
{
|
||||
throw new NotImplementedException ();
|
||||
}
|
||||
|
||||
public ConfigurationSection DefaultConfig (string appName, string cnxStr)
|
||||
{
|
||||
throw new NotImplementedException ();
|
||||
}
|
||||
|
||||
public bool Active {
|
||||
get {
|
||||
throw new NotImplementedException ();
|
||||
@ -51,53 +61,6 @@ namespace WorkFlowProvider
|
||||
}
|
||||
}
|
||||
|
||||
public StatusChange[] GetWrittingStatuses (long wrid)
|
||||
{
|
||||
throw new NotImplementedException ();
|
||||
}
|
||||
|
||||
public StatusChange[] GetEstimateStatuses (long estid)
|
||||
{
|
||||
throw new NotImplementedException ();
|
||||
}
|
||||
|
||||
public void DropTagWritting (long wrid, string tag)
|
||||
{
|
||||
throw new NotImplementedException ();
|
||||
}
|
||||
|
||||
public void SetWrittingStatus (long wrtid, int status, string username)
|
||||
{
|
||||
throw new NotImplementedException ();
|
||||
}
|
||||
|
||||
public void SetEstimateStatus (long estid, int status, string username)
|
||||
{
|
||||
throw new NotImplementedException ();
|
||||
}
|
||||
|
||||
public void TagWritting (long wrid, string tag)
|
||||
{
|
||||
throw new NotImplementedException ();
|
||||
}
|
||||
|
||||
|
||||
|
||||
public string Order (IWFOrder c)
|
||||
{
|
||||
throw new NotImplementedException ();
|
||||
}
|
||||
|
||||
public IContent GetBlob (string orderId)
|
||||
{
|
||||
throw new NotImplementedException ();
|
||||
}
|
||||
|
||||
public int GetStatus (string orderId)
|
||||
{
|
||||
throw new NotImplementedException ();
|
||||
}
|
||||
|
||||
public string[] Statuses {
|
||||
get {
|
||||
return new string[] { "Created", "Validated", "Success", "Error" };
|
||||
@ -108,6 +71,24 @@ namespace WorkFlowProvider
|
||||
return new bool[] { false, false, true, true };
|
||||
}
|
||||
}
|
||||
public Estimate[] GetEstimates (string client)
|
||||
{
|
||||
using (NpgsqlConnection cnx = CreateConnection ()) {
|
||||
using (NpgsqlCommand cmd = cnx.CreateCommand ()) {
|
||||
cmd.CommandText =
|
||||
"select _id from estimate where client = @clid";
|
||||
cmd.Parameters.Add ("@clid", client);
|
||||
cnx.Open ();
|
||||
List<Estimate> ests = new List<Estimate> ();
|
||||
using (NpgsqlDataReader rdr = cmd.ExecuteReader ()) {
|
||||
while (rdr.Read ()) {
|
||||
ests.Add(GetEstimate(rdr.GetInt64(0)));
|
||||
}
|
||||
}
|
||||
return ests.ToArray();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void DropWritting (long wrid)
|
||||
{
|
||||
@ -143,7 +124,7 @@ namespace WorkFlowProvider
|
||||
using (NpgsqlConnection cnx = CreateConnection ()) {
|
||||
using (NpgsqlCommand cmd = cnx.CreateCommand ()) {
|
||||
cmd.CommandText =
|
||||
"select title,username from estimate where _id = @estid";
|
||||
"select title,username,client,description from estimate where _id = @estid";
|
||||
|
||||
cmd.Parameters.Add ("@estid", estimid);
|
||||
cnx.Open ();
|
||||
@ -155,8 +136,13 @@ namespace WorkFlowProvider
|
||||
est = new Estimate ();
|
||||
est.Title = rdr.GetString(
|
||||
rdr.GetOrdinal("title"));
|
||||
est.Owner = rdr.GetString(
|
||||
est.Responsible = rdr.GetString(
|
||||
rdr.GetOrdinal("username"));
|
||||
est.Client = rdr.GetString (
|
||||
rdr.GetOrdinal ("client"));
|
||||
int index = rdr.GetOrdinal ("description");
|
||||
if (!rdr.IsDBNull (index))
|
||||
est.Description = rdr.GetString (index);
|
||||
est.Id = estimid;
|
||||
using (NpgsqlCommand cmdw = new NpgsqlCommand ("select _id, productid, ucost, count, description from writtings where estimid = @estid", cnx)) {
|
||||
cmdw.Parameters.Add("@estid", estimid);
|
||||
@ -166,8 +152,9 @@ namespace WorkFlowProvider
|
||||
lw = new List<Writting> ();
|
||||
while (rdrw.Read ()) {
|
||||
Writting w = new Writting ();
|
||||
w.Description = rdrw.GetString (
|
||||
rdrw.GetOrdinal ("description"));
|
||||
int dei = rdrw.GetOrdinal ("description");
|
||||
if (!rdrw.IsDBNull (dei))
|
||||
w.Description = rdrw.GetString (dei);
|
||||
int opi = rdrw.GetOrdinal ("productid");
|
||||
if (!rdrw.IsDBNull (opi))
|
||||
w.ProductReference = rdrw.GetString(opi);
|
||||
@ -217,14 +204,18 @@ namespace WorkFlowProvider
|
||||
}
|
||||
}
|
||||
|
||||
public void SetTitle (long estid, string newTitle)
|
||||
public void UpdateEstimate (Estimate estim)
|
||||
{
|
||||
using (NpgsqlConnection cnx = CreateConnection ()) {
|
||||
using (NpgsqlCommand cmd = cnx.CreateCommand ()) {
|
||||
cmd.CommandText =
|
||||
"update estimate set title = @tit where _id = @estid";
|
||||
cmd.Parameters.Add ("@tit", newTitle);
|
||||
cmd.Parameters.Add ("@estid", estid);
|
||||
"update estimate set title = @tit, username = @un, " +
|
||||
"description = @descr, client = @cli where _id = @estid";
|
||||
cmd.Parameters.Add ("@tit", estim.Title);
|
||||
cmd.Parameters.Add ("@un", estim.Responsible);
|
||||
cmd.Parameters.Add ("@descr", estim.Description);
|
||||
cmd.Parameters.Add ("@cli", estim.Client);
|
||||
cmd.Parameters.Add ("@estid", estim.Id);
|
||||
cnx.Open ();
|
||||
cmd.ExecuteNonQuery ();
|
||||
cnx.Close ();
|
||||
@ -272,20 +263,27 @@ namespace WorkFlowProvider
|
||||
}
|
||||
|
||||
|
||||
public long CreateEstimate (string client, string title)
|
||||
public Estimate CreateEstimate (string responsible, string client, string title, string description)
|
||||
{
|
||||
using (NpgsqlConnection cnx = CreateConnection ()) {
|
||||
using (NpgsqlCommand cmd = cnx.CreateCommand ()) {
|
||||
cmd.CommandText =
|
||||
"insert into estimate (title,username,applicationname) " +
|
||||
"values (@tit,@un,@app) returning _id";
|
||||
"insert into estimate (title,description,username,client,applicationname) " +
|
||||
"values (@tit,@descr,@resp,@un,@app) returning _id";
|
||||
cmd.Parameters.Add ("@tit", title);
|
||||
cmd.Parameters.Add ("@un", client);
|
||||
cmd.Parameters.Add ("@resp", responsible);
|
||||
cmd.Parameters.Add ("@descr", description);
|
||||
cmd.Parameters.Add("@app", ApplicationName);
|
||||
cnx.Open ();
|
||||
long res = (long)cmd.ExecuteScalar ();
|
||||
Estimate created = new Estimate ();
|
||||
created.Id = (long)cmd.ExecuteScalar ();
|
||||
cnx.Close ();
|
||||
return res;
|
||||
created.Title = title;
|
||||
created.Description = description;
|
||||
created.Client = client;
|
||||
created.Responsible = responsible;
|
||||
return created;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -319,12 +317,6 @@ namespace WorkFlowProvider
|
||||
{
|
||||
return new NpgsqlConnection (cnxstr);
|
||||
}
|
||||
#region IDisposable implementation
|
||||
public void Dispose ()
|
||||
{
|
||||
|
||||
}
|
||||
#endregion
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -11,7 +11,7 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SalesCatalog", "SalesCatalo
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "YavscModel", "yavscModel\YavscModel.csproj", "{68F5B80A-616E-4C3C-91A0-828AA40000BD}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WorkFlowProvider", "WorkFlowProvider\WorkFlowProvider.csproj", "{821FF72D-9F4B-4A2C-B95C-7B965291F119}"
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NpgsqlWorkflow", "WorkFlowProvider\NpgsqlWorkflow.csproj", "{821FF72D-9F4B-4A2C-B95C-7B965291F119}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "YavscClient", "yavscclient\YavscClient.csproj", "{EEFCECE6-3B7F-4BBE-B7AF-69377AF3CF39}"
|
||||
EndProject
|
||||
|
@ -43,13 +43,7 @@ namespace Yavsc.Controllers
|
||||
return new Profile (ProfileBase.Create (user));
|
||||
}
|
||||
|
||||
[Authorize]
|
||||
public ActionResult Profile(Profile model)
|
||||
{
|
||||
ViewData ["UserName"] = Membership.GetUser ().UserName;
|
||||
model = GetProfile ((string)ViewData ["UserName"]);
|
||||
return View (model);
|
||||
}
|
||||
|
||||
// TODO [ValidateAntiForgeryToken]
|
||||
public ActionResult DoLogin (LoginModel model, string returnUrl)
|
||||
{
|
||||
@ -200,14 +194,22 @@ namespace Yavsc.Controllers
|
||||
}
|
||||
|
||||
|
||||
[Authorize]
|
||||
[HttpGet]
|
||||
public ActionResult Profile(Profile model)
|
||||
{
|
||||
ViewData ["UserName"] = Membership.GetUser ().UserName;
|
||||
model = GetProfile ((string) ViewData ["UserName"]);
|
||||
return View (model);
|
||||
}
|
||||
|
||||
[Authorize]
|
||||
[HttpPost]
|
||||
//public ActionResult UpdateProfile(HttpPostedFileBase Avatar, string Address, string CityAndState, string ZipCode, string Country, string WebSite)
|
||||
public ActionResult UpdateProfile(Profile model, HttpPostedFileBase AvatarFile)
|
||||
public ActionResult Profile(Profile model, HttpPostedFileBase AvatarFile)
|
||||
{
|
||||
string username = Membership.GetUser ().UserName;
|
||||
|
||||
ViewData ["UserName"] = username;
|
||||
if (AvatarFile != null) {
|
||||
|
||||
if (AvatarFile.ContentType == "image/png") {
|
||||
@ -233,14 +235,36 @@ namespace Yavsc.Controllers
|
||||
"BlogVisible", model.BlogVisible);
|
||||
HttpContext.Profile.SetPropertyValue (
|
||||
"CityAndState", model.CityAndState);
|
||||
HttpContext.Profile.SetPropertyValue (
|
||||
"ZipCode", model.ZipCode);
|
||||
HttpContext.Profile.SetPropertyValue (
|
||||
"Country", model.Country);
|
||||
HttpContext.Profile.SetPropertyValue (
|
||||
"WebSite", model.WebSite);
|
||||
HttpContext.Profile.SetPropertyValue (
|
||||
"Name", model.Name);
|
||||
HttpContext.Profile.SetPropertyValue (
|
||||
"Phone", model.Phone);
|
||||
HttpContext.Profile.SetPropertyValue (
|
||||
"Mobile", model.Mobile);
|
||||
HttpContext.Profile.SetPropertyValue (
|
||||
"BankCode", model.BankCode);
|
||||
HttpContext.Profile.SetPropertyValue (
|
||||
"WicketCode", model.WicketCode);
|
||||
HttpContext.Profile.SetPropertyValue (
|
||||
"AccountNumber", model.AccountNumber);
|
||||
HttpContext.Profile.SetPropertyValue (
|
||||
"BankedKey", model.BankedKey);
|
||||
HttpContext.Profile.SetPropertyValue (
|
||||
"BIC", model.BIC);
|
||||
HttpContext.Profile.SetPropertyValue (
|
||||
"IBAN", model.IBAN);
|
||||
HttpContext.Profile.Save ();
|
||||
ViewData ["Message"] = "Profile enregistré.";
|
||||
|
||||
}
|
||||
// HttpContext.Profile.SetPropertyValue("Avatar",Avatar);
|
||||
return RedirectToAction ("Profile");
|
||||
return View (model);
|
||||
}
|
||||
|
||||
[Authorize]
|
||||
|
@ -225,7 +225,7 @@ namespace Yavsc.Controllers
|
||||
return UserPost (model.PostId);
|
||||
}
|
||||
}
|
||||
return View (model);
|
||||
return UserPost (model.PostId);
|
||||
}
|
||||
|
||||
string defaultAvatar;
|
||||
|
@ -14,12 +14,20 @@ using System.Net;
|
||||
using WorkFlowProvider;
|
||||
using System.Web.Security;
|
||||
using Yavsc.Model.WorkFlow;
|
||||
using System.Reflection;
|
||||
using System.Collections.Generic;
|
||||
using Yavsc.Model.RolesAndMembers;
|
||||
using Yavsc.Controllers;
|
||||
using Yavsc.Formatters;
|
||||
using System.Text;
|
||||
using System.Web.Profile;
|
||||
|
||||
namespace Yavsc.ApiControllers
|
||||
{
|
||||
|
||||
public class FrontOfficeController : ApiController
|
||||
{
|
||||
|
||||
[AcceptVerbs("GET")]
|
||||
public Catalog Catalog ()
|
||||
{
|
||||
@ -77,6 +85,52 @@ namespace Yavsc.ApiControllers
|
||||
return est;
|
||||
}
|
||||
|
||||
[AcceptVerbs("GET")]
|
||||
public HttpResponseMessage GetTexEstim(long estimid)
|
||||
{
|
||||
return new HttpResponseMessage () {
|
||||
Content = new ObjectContent (typeof(string),
|
||||
getTexEstim (estimid),
|
||||
new TexFormatter ())
|
||||
};
|
||||
}
|
||||
|
||||
private string getTexEstim(long estimid)
|
||||
{
|
||||
Yavsc.templates.Estim tmpe = new Yavsc.templates.Estim();
|
||||
Estimate e = WorkFlowManager.GetEstimate (estimid);
|
||||
tmpe.Session = new Dictionary<string,object>();
|
||||
tmpe.Session.Add ("estim", e);
|
||||
Profile pr = AccountController.GetProfile (e.Responsible);
|
||||
tmpe.Session.Add ("from", pr);
|
||||
tmpe.Session.Add ("to", pr);
|
||||
tmpe.Init ();
|
||||
return tmpe.TransformText ();
|
||||
}
|
||||
/// <summary>
|
||||
/// Gets the estimate in pdf format from tex generation.
|
||||
/// </summary>
|
||||
/// <returns>The estim pdf.</returns>
|
||||
/// <param name="estimid">Estimid.</param>
|
||||
public HttpResponseMessage GetEstimPdf(long estimid)
|
||||
{
|
||||
Estimate estim = WorkFlowManager.GetEstimate (estimid);
|
||||
|
||||
Profile prpro = new Profile(ProfileBase.Create(estim.Responsible));
|
||||
if (!prpro.IsBankable)
|
||||
throw new Exception ("NotBankable:"+estim.Responsible);
|
||||
|
||||
Profile prcli = new Profile(ProfileBase.Create(estim.Client));
|
||||
if (!prcli.IsBillable)
|
||||
throw new Exception ("NotBillable:"+estim.Client);
|
||||
|
||||
return new HttpResponseMessage () {
|
||||
Content = new ObjectContent (
|
||||
typeof(Estimate),
|
||||
estim,
|
||||
new EstimToPdfFormatter ())
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -20,39 +20,54 @@ namespace Yavsc.Controllers
|
||||
/// </summary>
|
||||
public class FrontOfficeController : Controller
|
||||
{
|
||||
[Authorize]
|
||||
public ActionResult Estimates ()
|
||||
{
|
||||
string username = Membership.GetUser ().UserName;
|
||||
return View(WorkFlowManager.GetEstimates (username));
|
||||
}
|
||||
|
||||
[Authorize]
|
||||
public ActionResult Estimate(Estimate model,string submit)
|
||||
{
|
||||
if (ModelState.IsValid) {
|
||||
ViewData ["WebApiUrl"] = "http://"+ Request.Url.Authority + "/api/WorkFlow";
|
||||
string username = HttpContext.User.Identity.Name;
|
||||
if (submit == null) {
|
||||
if (model.Id > 0) {
|
||||
Estimate f = WorkFlowManager.GetEstimate (model.Id);
|
||||
if (f == null) {
|
||||
ModelState.AddModelError ("Id", "Wrong Id");
|
||||
return View (model);
|
||||
}
|
||||
if (username != f.Owner)
|
||||
if (!Roles.IsUserInRole ("FrontOffice"))
|
||||
throw new UnauthorizedAccessException ("You're not allowed to view/modify this estimate");
|
||||
if (submit == "Update") {
|
||||
if (model != f) {
|
||||
WorkFlowManager.SetTitle (model.Id, model.Title);
|
||||
}
|
||||
} else if (submit == null) {
|
||||
model = f;
|
||||
}
|
||||
ModelState.Clear ();
|
||||
string username = HttpContext.User.Identity.Name;
|
||||
if (username != model.Responsible
|
||||
&& username != model.Client
|
||||
&& !Roles.IsUserInRole ("FrontOffice"))
|
||||
throw new UnauthorizedAccessException ("You're not allowed to view this estimate");
|
||||
|
||||
} else if (model.Id == 0 && submit=="Create") {
|
||||
// Create the estimate
|
||||
model.Id=WorkFlowManager.CreateEstimate (username,
|
||||
model.Title);
|
||||
model.Owner = username;
|
||||
}
|
||||
} else if (ModelState.IsValid) {
|
||||
|
||||
ViewData ["WebApiUrl"] = "http://" + Request.Url.Authority + "/api/WorkFlow";
|
||||
string username = HttpContext.User.Identity.Name;
|
||||
if (username != model.Responsible
|
||||
&& username != model.Client
|
||||
&& !Roles.IsUserInRole ("FrontOffice"))
|
||||
throw new UnauthorizedAccessException ("You're not allowed to modify this estimate");
|
||||
|
||||
if (model.Id == 0)
|
||||
model = WorkFlowManager.CreateEstimate (
|
||||
username,
|
||||
model.Client, model.Title, model.Description);
|
||||
else
|
||||
WorkFlowManager.UpdateEstimate (model);
|
||||
|
||||
}
|
||||
return View(model);
|
||||
}
|
||||
|
||||
|
||||
|
||||
[AcceptVerbs("GET")]
|
||||
public ActionResult Catalog ()
|
||||
{
|
||||
|
@ -26,10 +26,10 @@ namespace Yavsc.ApiControllers
|
||||
|
||||
[HttpGet]
|
||||
[Authorize]
|
||||
public long CreateEstimate (string title)
|
||||
public Estimate CreateEstimate (string title,string client,string description)
|
||||
{
|
||||
return WorkFlowManager.CreateEstimate (
|
||||
Membership.GetUser().UserName,title);
|
||||
Membership.GetUser().UserName,client,title,description);
|
||||
}
|
||||
|
||||
[HttpGet]
|
||||
|
112
web/Formatters/EstimToPdfFormatter.cs
Normal file
112
web/Formatters/EstimToPdfFormatter.cs
Normal file
@ -0,0 +1,112 @@
|
||||
//
|
||||
// EstimToPdfFormatter.cs
|
||||
//
|
||||
// Author:
|
||||
// Paul Schneider <paulschneider@free.fr>
|
||||
//
|
||||
// Copyright (c) 2014 Paul Schneider
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Lesser General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Lesser General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Lesser General Public License
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Net.Http.Headers;
|
||||
using System.Net.Http.Formatting;
|
||||
using Yavsc.Model.WorkFlow;
|
||||
using Yavsc.Model.RolesAndMembers;
|
||||
using System.Web.Profile;
|
||||
using System.Web;
|
||||
using System.Diagnostics;
|
||||
|
||||
namespace Yavsc.Formatters
|
||||
{
|
||||
public class EstimToPdfFormatter: BufferedMediaTypeFormatter
|
||||
{
|
||||
public EstimToPdfFormatter ()
|
||||
{
|
||||
SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/pdf"));
|
||||
}
|
||||
|
||||
public override bool CanReadType(Type type)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
public override bool CanWriteType(System.Type type)
|
||||
{
|
||||
if (type == typeof(Estimate))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
Type enumerableType = typeof(IEnumerable<Estimate>);
|
||||
return enumerableType.IsAssignableFrom(type);
|
||||
}
|
||||
}
|
||||
|
||||
public override void WriteToStream (Type type, object value, Stream stream, HttpContentHeaders contentHeaders)
|
||||
{
|
||||
// TODO create a type containing generation parameters, including a template path, and generate from them
|
||||
|
||||
Yavsc.templates.Estim tmpe = new Yavsc.templates.Estim();
|
||||
tmpe.Session = new Dictionary<string,object>();
|
||||
Estimate e = value as Estimate;
|
||||
tmpe.Session.Add ("estim", e);
|
||||
|
||||
Profile prpro = new Profile (ProfileBase.Create (e.Responsible));
|
||||
|
||||
var pbc = ProfileBase.Create (e.Client);
|
||||
Profile prcli = new Profile (pbc);
|
||||
if (!prpro.IsBankable)
|
||||
throw new Exception ("This provider is not bankable.");
|
||||
tmpe.Session.Add ("from", prpro);
|
||||
tmpe.Session.Add ("to", prcli);
|
||||
tmpe.Init ();
|
||||
|
||||
string content = tmpe.TransformText ();
|
||||
|
||||
string name = string.Format ("tmpestimtex{0}", e.Id);
|
||||
string fullname = Path.Combine (
|
||||
HttpRuntime.CodegenDir, name);
|
||||
FileInfo fi = new FileInfo(fullname + ".tex");
|
||||
FileInfo fo = new FileInfo(fullname + ".pdf");
|
||||
using (StreamWriter sw = new StreamWriter (fi.FullName))
|
||||
{
|
||||
sw.Write (content);
|
||||
}
|
||||
using (Process p = new Process ()) {
|
||||
p.StartInfo.WorkingDirectory = HttpRuntime.CodegenDir;
|
||||
p.StartInfo = new ProcessStartInfo ();
|
||||
p.StartInfo.UseShellExecute = false;
|
||||
p.StartInfo.FileName = "/usr/bin/texi2pdf";
|
||||
p.StartInfo.Arguments =
|
||||
string.Format ("--batch -o {0} {1}",
|
||||
fo.FullName,
|
||||
fi.FullName);
|
||||
p.Start ();
|
||||
p.WaitForExit ();
|
||||
}
|
||||
|
||||
using (StreamReader sr = new StreamReader (fo.FullName)) {
|
||||
byte[] buffer = File.ReadAllBytes (fo.FullName);
|
||||
stream.Write(buffer,0,buffer.Length);
|
||||
}
|
||||
fi.Delete();
|
||||
fo.Delete();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
68
web/Formatters/TexFormatter.cs
Normal file
68
web/Formatters/TexFormatter.cs
Normal file
@ -0,0 +1,68 @@
|
||||
//
|
||||
// TexFormatter.cs
|
||||
//
|
||||
// Author:
|
||||
// Paul Schneider <paulschneider@free.fr>
|
||||
//
|
||||
// Copyright (c) 2014 Paul Schneider
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Lesser General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Lesser General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Lesser General Public License
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
using System;
|
||||
using System.Net.Http.Formatting;
|
||||
using System.Net.Http.Headers;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Net.Http;
|
||||
|
||||
namespace Yavsc.Formatters
|
||||
{
|
||||
public class TexFormatter : BufferedMediaTypeFormatter
|
||||
{
|
||||
public TexFormatter ()
|
||||
{
|
||||
SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/x-tex"));
|
||||
|
||||
}
|
||||
|
||||
public override bool CanWriteType(System.Type type)
|
||||
{
|
||||
if (type == typeof(string))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
Type enumerableType = typeof(IEnumerable<string>);
|
||||
return enumerableType.IsAssignableFrom(type);
|
||||
}
|
||||
}
|
||||
|
||||
public override bool CanReadType(Type type)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
public override void WriteToStream (Type type, object value, Stream stream, HttpContentHeaders contentHeaders)
|
||||
{
|
||||
// TODO create a type containing T4 parameters, and generate from them
|
||||
using (var writer = new StreamWriter(stream))
|
||||
{
|
||||
string doc = value as string;
|
||||
writer.Write (doc);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -7,6 +7,7 @@ using System.Web;
|
||||
using System.Web.Mvc;
|
||||
using System.Web.Routing;
|
||||
using System.Web.Http;
|
||||
using Yavsc.Formatters;
|
||||
|
||||
namespace Yavsc
|
||||
{
|
||||
@ -43,7 +44,7 @@ namespace Yavsc
|
||||
protected void Application_Start ()
|
||||
{
|
||||
AreaRegistration.RegisterAllAreas ();
|
||||
|
||||
GlobalConfiguration.Configuration.Formatters.Add (new TexFormatter ());
|
||||
GlobalConfiguration.Configuration.Routes.MapHttpRoute(
|
||||
name: "DefaultApi",
|
||||
routeTemplate: "api/{controller}/{action}/{*id}",
|
||||
|
@ -39,3 +39,6 @@ table.tablesorter thead tr .headerSortDown {
|
||||
table.tablesorter thead tr .headerSortDown, table.tablesorter thead tr .headerSortUp {
|
||||
background-color: #123;
|
||||
}
|
||||
tr.selected td {
|
||||
background-color:#102010;
|
||||
}
|
@ -5,14 +5,25 @@
|
||||
</asp:Content>
|
||||
|
||||
<asp:Content ID="MainContentContent" ContentPlaceHolderID="MainContent" runat="server">
|
||||
<%= Html.ActionLink("Changer de mot de passe","ChangePassword", "Account")%>
|
||||
|
||||
<%= Html.ValidationSummary() %>
|
||||
<% using(Html.BeginForm("UpdateProfile", "Account", FormMethod.Post, new { enctype = "multipart/form-data" })) %>
|
||||
<% using(Html.BeginForm("Profile", "Account", FormMethod.Post, new { enctype = "multipart/form-data" })) %>
|
||||
<% { %>
|
||||
|
||||
<h2>Informations générales</h2>
|
||||
<table class="layout">
|
||||
<tr><td align="right">
|
||||
<%= Html.LabelFor(model => model.Name) %></td><td>
|
||||
<%= Html.TextBox("Name") %>
|
||||
<%= Html.ValidationMessage("Name", "*") %></td></tr>
|
||||
<tr><td align="right">
|
||||
<%= Html.LabelFor(model => model.Phone) %></td><td>
|
||||
<%= Html.TextBox("Phone") %>
|
||||
<%= Html.ValidationMessage("Phone", "*") %></td></tr>
|
||||
<tr><td align="right">
|
||||
<%= Html.LabelFor(model => model.Mobile) %></td><td>
|
||||
<%= Html.TextBox("Mobile") %>
|
||||
<%= Html.ValidationMessage("Mobile", "*") %></td></tr>
|
||||
<tr><td align="right">
|
||||
<%= Html.LabelFor(model => model.Address) %></td><td>
|
||||
<%= Html.TextBox("Address") %>
|
||||
<%= Html.ValidationMessage("Address", "*") %></td></tr>
|
||||
@ -21,6 +32,10 @@
|
||||
<%= Html.TextBox("CityAndState") %>
|
||||
<%= Html.ValidationMessage("CityAndState", "*") %></td></tr>
|
||||
<tr><td align="right">
|
||||
<%= Html.LabelFor(model => model.ZipCode) %></td><td>
|
||||
<%= Html.TextBox("ZipCode") %>
|
||||
<%= Html.ValidationMessage("ZipCode", "*") %></td></tr>
|
||||
<tr><td align="right">
|
||||
<%= Html.LabelFor(model => model.Country) %></td><td>
|
||||
<%= Html.TextBox("Country") %>
|
||||
<%= Html.ValidationMessage("Country", "*") %></td></tr>
|
||||
@ -42,6 +57,74 @@ Avatar </td><td> <img class="avatar" src="/Blogs/Avatar?user=<%=ViewData["User
|
||||
<%= Html.ValidationMessage("AvatarFile", "*") %></td></tr>
|
||||
|
||||
</table>
|
||||
|
||||
<h2>Informations de facturation</h2>
|
||||
<table class="layout">
|
||||
<tr>
|
||||
<td align="right">
|
||||
<%= Html.LabelFor(model => model.BankCode) %>
|
||||
</td>
|
||||
<td>
|
||||
<%= Html.TextBox("BankCode") %>
|
||||
<%= Html.ValidationMessage("BankCode", "*") %>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="right">
|
||||
<%= Html.LabelFor(model => model.WicketCode) %></td>
|
||||
<td>
|
||||
<%= Html.TextBox("WicketCode") %>
|
||||
<%= Html.ValidationMessage("WicketCode", "*") %>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td align="right">
|
||||
<%= Html.LabelFor(model => model.AccountNumber) %></td>
|
||||
<td>
|
||||
<%= Html.TextBox("AccountNumber") %>
|
||||
<%= Html.ValidationMessage("AccountNumber", "*") %>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
|
||||
<tr>
|
||||
<td align="right">
|
||||
<%= Html.LabelFor(model => model.BankedKey) %></td>
|
||||
<td>
|
||||
<%= Html.TextBox("BankedKey") %>
|
||||
<%= Html.ValidationMessage("BankedKey", "*") %>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td align="right">
|
||||
<%= Html.LabelFor(model => model.BIC) %></td>
|
||||
<td>
|
||||
<%= Html.TextBox("BIC") %>
|
||||
<%= Html.ValidationMessage("BIC", "*") %>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td align="right">
|
||||
<%= Html.LabelFor(model => model.IBAN) %></td>
|
||||
<td>
|
||||
<%= Html.TextBox("IBAN") %>
|
||||
<%= Html.ValidationMessage("IBAN", "*") %>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
|
||||
</table>
|
||||
|
||||
|
||||
<input type="submit"/>
|
||||
<% } %>
|
||||
</asp:Content>
|
||||
|
||||
|
||||
<asp:Content ID="MASC1" ContentPlaceHolderID="MASContent" runat="server">
|
||||
<%= Html.ActionLink("Changer de mot de passe","ChangePassword", "Account")%>
|
||||
</asp:Content>
|
||||
|
||||
|
@ -13,12 +13,16 @@
|
||||
<% using (Html.BeginForm("Estimate","FrontOffice")) { %>
|
||||
<%= Html.LabelFor(model => model.Title) %>:<%= Html.TextBox( "Title" ) %>
|
||||
<%= Html.ValidationMessage("Title", "*") %>
|
||||
<% if (Model.Id > 0) { %>
|
||||
<br/>
|
||||
<%= Html.LabelFor(model => model.Owner) %>:<%=Model.Owner%>
|
||||
<%= Html.ValidationMessage("Owner", "*") %>
|
||||
<%= Html.LabelFor(model => model.Responsible) %>:<%=Model.Responsible%>
|
||||
<%= Html.Hidden ("Responsible") %>
|
||||
<%= Html.ValidationMessage("Responsible", "*") %>
|
||||
<br/>
|
||||
<%= Html.LabelFor(model => model.Ciffer) %>:<%=Model.Ciffer%>
|
||||
<%= Html.LabelFor(model => model.Client) %>:<%=Html.TextBox( "Client" ) %>
|
||||
<%= Html.ValidationMessage("Client", "*") %>
|
||||
<br/>
|
||||
<%= Html.LabelFor(model => model.Description) %>:<%=Html.TextArea( "Description") %>
|
||||
<%= Html.ValidationMessage("Description", "*") %>
|
||||
<br/>
|
||||
<%= Html.LabelFor(model => model.Id) %>:<%=Model.Id%>
|
||||
<%= Html.Hidden( "Id" ) %>
|
||||
@ -31,7 +35,7 @@
|
||||
<% } %>
|
||||
|
||||
|
||||
|
||||
<% if (Model.Id>0) { %>
|
||||
|
||||
<table class="tablesorter">
|
||||
<thead>
|
||||
@ -76,12 +80,14 @@
|
||||
|
||||
<form id="writeform">
|
||||
<input type="button" id="btndtl" value="+"/>
|
||||
|
||||
<div id="writearea" style="display:none;">
|
||||
<input type="button" id="btnnew" value="Nouvelle écriture"/>
|
||||
<input type="hidden" name="estid" id="estid" value="<%=Model.Id%>"/>
|
||||
<label for="Description">Description:</label>
|
||||
<input type="text" name="Description" id="Description" />
|
||||
<label for="UnitaryCost">Prix unitaire:</label>
|
||||
<input type="number" name="UnitaryCost" id="UnitaryCost"/>
|
||||
<input type="number" name="UnitaryCost" id="UnitaryCost" step="0.01"/>
|
||||
<label for="Count">Quantité:</label>
|
||||
<input type="number" name="Count" id="Count"/>
|
||||
<label for="ProductReference">Référence du produit:</label>
|
||||
@ -94,9 +100,11 @@
|
||||
<tt id="msg" class="message"></tt>
|
||||
<style>
|
||||
.row { cursor:pointer; }
|
||||
table.tablesorter td:hover { background-color: rgb(64,0,0); }
|
||||
table.tablesorter td:hover { background-color: rgba(0,64,0,0.5); }
|
||||
.hidden { display:none; }
|
||||
</style>
|
||||
.selected *, .odd .selected { font-size-adjust: +1; background-color: rgb(0,64,0); }
|
||||
|
||||
</style>
|
||||
<script>
|
||||
|
||||
jQuery.support.cors = true;
|
||||
@ -112,7 +120,11 @@
|
||||
|
||||
function wredit(pwrid)
|
||||
{
|
||||
|
||||
$("#wr"+wrid.value).removeClass("selected");
|
||||
$("#wrid").val(pwrid);
|
||||
if (wrid.value!=0)
|
||||
$("#wr"+wrid.value).addClass("selected");
|
||||
if (pwrid>0) {
|
||||
$("#btncreate").addClass("hidden");
|
||||
$("#btnmodify").removeClass("hidden");
|
||||
@ -124,9 +136,6 @@
|
||||
}
|
||||
}
|
||||
|
||||
$(document).ready(function () {
|
||||
// bug at no row: $(".tablesorter").tablesorter( {sortList: [[0,0], [1,0]]} );
|
||||
|
||||
function delRow() {
|
||||
$.ajax({
|
||||
url: "<%=ViewData["WebApiUrl"]+"/DropWritting"%>",
|
||||
@ -148,6 +157,7 @@
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
function setRow() {
|
||||
var wrt = GetWritting();
|
||||
|
||||
@ -167,9 +177,9 @@
|
||||
$("#msg").text(xhr.status+" : "+xhr.responseText);}
|
||||
});
|
||||
}
|
||||
//data: {estid: estid, wr: { Id: 0, UnitaryCost: wrt.UnitaryCost, Count: wrt.Count, ProductReference: wrt.ProductReference, Description: wrt.Description}},
|
||||
|
||||
function addRow(){
|
||||
|
||||
function addRow(){
|
||||
var wrt = GetWritting();
|
||||
var estid = parseInt($("#Id").val());
|
||||
$.ajax({
|
||||
@ -181,34 +191,46 @@
|
||||
success: function (data) {
|
||||
wrt.Id = Number(data);
|
||||
wredit(wrt.Id);
|
||||
$("<tr class=\"row\" id=\"wr"+wrt.Id+"\"><td>"+wrt.Description+"</td><td>"+wrt.ProductReference+"</td><td>"+wrt.Count+"</td><td>"+wrt.UnitaryCost+"</td></tr>").appendTo("#wrts")
|
||||
$("<tr class=\"row\" id=\"wr"+wrt.Id+"\"><td>"+wrt.Description+"</td><td>"+wrt.ProductReference+"</td><td>"+wrt.Count+"</td><td>"+wrt.UnitaryCost+"</td></tr>").appendTo("#wrts");
|
||||
},
|
||||
error: function (xhr, ajaxOptions, thrownError) {
|
||||
$("#msg").text(xhr.status+" : "+xhr.responseText);}
|
||||
});
|
||||
|
||||
$(".wr"+wrt.Id).click(onEditRow(e));
|
||||
}
|
||||
|
||||
$("#btncreate").click(addRow);
|
||||
$("#btnmodify").click(setRow);
|
||||
$("#btndrop").click(delRow);
|
||||
function ShowDtl(val)
|
||||
{
|
||||
document.getElementById("writearea").style.display = val ? "block" : "none";
|
||||
document.getElementById("btndtl").value = val ? "-" : "+";
|
||||
}
|
||||
|
||||
$("#btndtl").click(function(){ShowDtl(document.getElementById("writearea").style.display != "block");});
|
||||
|
||||
$(".row").click(function (e) {
|
||||
function onEditRow(e) {
|
||||
ShowDtl(true);
|
||||
var cells = e.delegateTarget.getElementsByTagName("TD");
|
||||
var wrid = Number(e.delegateTarget.id.substr(2));
|
||||
wredit(wrid);
|
||||
var hid=e.delegateTarget.id;
|
||||
var vwrid = Number(hid.substr(2));
|
||||
wredit(vwrid);
|
||||
$("#Description").val(cells[0].innerHTML);
|
||||
$("#ProductReference").val(cells[1].innerHTML);
|
||||
$("#Count").val(cells[2].innerHTML);
|
||||
$("#UnitaryCost").val(Number(cells[3].innerHTML.replace(",",".")));
|
||||
}
|
||||
|
||||
$(document).ready(function () {
|
||||
// bug when no row: $(".tablesorter").tablesorter( {sortList: [[0,0], [1,0]]} );
|
||||
|
||||
$("#btncreate").click(addRow);
|
||||
$("#btnmodify").click(setRow);
|
||||
$("#btndrop").click(delRow);
|
||||
$("#btndtl").click(function(){ShowDtl(document.getElementById("writearea").style.display != "block");});
|
||||
$(".row").click(function (e) {onEditRow(e);});
|
||||
$("#btnnew").click(function () {
|
||||
wredit(0);
|
||||
$("#Description").val("");
|
||||
$("#ProductReference").val("");
|
||||
$("#Count").val(1);
|
||||
$("#UnitaryCost").val(0);
|
||||
});
|
||||
});
|
||||
</script>
|
||||
|
8
web/Views/FrontOffice/Estimates.aspx
Normal file
8
web/Views/FrontOffice/Estimates.aspx
Normal file
@ -0,0 +1,8 @@
|
||||
<%@ Page Title="My estimates" Language="C#" MasterPageFile="~/Models/App.master" Inherits="System.Web.Mvc.ViewPage<IEnumerable<Estimate>>" %>
|
||||
<asp:Content ID="MainContentContent" ContentPlaceHolderID="MainContent" runat="server">
|
||||
<% foreach (Estimate estim in Model) { %>
|
||||
<%= Html.ActionLink(estim.Id.ToString(),"Estimate",new {Id=estim.Id}) %>
|
||||
<% } %>
|
||||
</asp:Content>
|
||||
<asp:Content ID="MASContentContent" ContentPlaceHolderID="MASContent" runat="server">
|
||||
</asp:Content>
|
@ -140,6 +140,15 @@ http://msdn2.microsoft.com/en-us/library/b5ysx397.aspx
|
||||
<add name="ZipCode" />
|
||||
<add name="WebSite" />
|
||||
<add name="Country" />
|
||||
<add name="Name" />
|
||||
<add name="Phone" />
|
||||
<add name="Mobile" />
|
||||
<add name="BankCode" />
|
||||
<add name="IBAN" />
|
||||
<add name="BIC" />
|
||||
<add name="WicketCode" />
|
||||
<add name="AccountNumber" />
|
||||
<add name="BankedKey" />
|
||||
</properties>
|
||||
</profile>
|
||||
<blog defaultProvider="NpgsqlBlogProvider">
|
||||
|
@ -116,6 +116,9 @@
|
||||
<Folder Include="Theme\green\" />
|
||||
<Folder Include="Theme\blue\" />
|
||||
<Folder Include="Theme\dark\" />
|
||||
<Folder Include="templates\" />
|
||||
<Folder Include="Formatters\" />
|
||||
<Folder Include="install\" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="Controllers\HomeController.cs" />
|
||||
@ -148,6 +151,12 @@
|
||||
<Compile Include="Controllers\BlogsApiController.cs" />
|
||||
<Compile Include="Controllers\AdminController.cs" />
|
||||
<Compile Include="Helpers\T.cs" />
|
||||
<Compile Include="templates\Estim.cs">
|
||||
<DependentUpon>Estim.tt</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="templates\TexEstimInit.cs" />
|
||||
<Compile Include="Formatters\TexFormatter.cs" />
|
||||
<Compile Include="Formatters\EstimToPdfFormatter.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Content Include="Views\Web.config" />
|
||||
@ -225,6 +234,7 @@
|
||||
<Content Include="Theme\dark\bg.gif" />
|
||||
<Content Include="Theme\dark\desc.gif" />
|
||||
<Content Include="Theme\dark\style.css" />
|
||||
<Content Include="Views\FrontOffice\Estimates.aspx" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
|
||||
<Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" />
|
||||
@ -246,6 +256,11 @@
|
||||
<None Include="instdbws.sql" />
|
||||
<None Include="RegistrationMail.txt" />
|
||||
<None Include="Catalog.xml" />
|
||||
<None Include="templates\Estim.tt">
|
||||
<Generator>TextTemplatingFilePreprocessor</Generator>
|
||||
<LastGenOutput>Estim.cs</LastGenOutput>
|
||||
</None>
|
||||
<None Include="install\instdb.sql" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\NpgsqlMRPProviders\NpgsqlMRPProviders.csproj">
|
||||
@ -260,10 +275,6 @@
|
||||
<Project>{90BF2234-7252-4CD5-B2A4-17501B19279B}</Project>
|
||||
<Name>SalesCatalog</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\WorkFlowProvider\WorkFlowProvider.csproj">
|
||||
<Project>{821FF72D-9F4B-4A2C-B95C-7B965291F119}</Project>
|
||||
<Name>WorkFlowProvider</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\WebControls\WebControls.csproj">
|
||||
<Project>{59E1DF7B-FFA0-4DEB-B5F3-76EBD98D5356}</Project>
|
||||
<Name>WebControls</Name>
|
||||
@ -276,5 +287,9 @@
|
||||
<Project>{68F5B80A-616E-4C3C-91A0-828AA40000BD}</Project>
|
||||
<Name>YavscModel</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\WorkFlowProvider\NpgsqlWorkflow.csproj">
|
||||
<Project>{821FF72D-9F4B-4A2C-B95C-7B965291F119}</Project>
|
||||
<Name>NpgsqlWorkflow</Name>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
|
1
web/install/instdb.sql
Normal file
1
web/install/instdb.sql
Normal file
@ -0,0 +1 @@
|
||||
|
167
web/templates/Estim.tex
Normal file
167
web/templates/Estim.tex
Normal file
@ -0,0 +1,167 @@
|
||||
\documentclass[french,11pt]{article}
|
||||
\usepackage{babel}
|
||||
\usepackage[T1]{fontenc}
|
||||
\usepackage[utf8]{inputenc}
|
||||
\usepackage[a4paper]{geometry}
|
||||
\usepackage{units}
|
||||
\usepackage{bera}
|
||||
\usepackage{graphicx}
|
||||
\usepackage{fancyhdr}
|
||||
\usepackage{fp}
|
||||
|
||||
\def\TVA{20} % Taux de la TVA
|
||||
|
||||
\def\TotalHT{0}
|
||||
\def\TotalTVA{0}
|
||||
|
||||
|
||||
\newcommand{\AjouterService}[2]{% Arguments : Désignation, prix
|
||||
\FPround{\montant}{#2}{2}
|
||||
\FPadd{\TotalHT}{\TotalHT}{\montant}
|
||||
\eaddto\ListeProduits{#1 & \montant \cr}
|
||||
}
|
||||
|
||||
|
||||
\newcommand{\AfficheResultat}{%
|
||||
\ListeProduits
|
||||
|
||||
\FPeval{\TotalTVA}{\TotalHT * \TVA / 100}
|
||||
\FPadd{\TotalTTC}{\TotalHT}{\TotalTVA}
|
||||
\FPround{\TotalHT}{\TotalHT}{2}
|
||||
\FPround{\TotalTVA}{\TotalTVA}{2}
|
||||
\FPround{\TotalTTC}{\TotalTTC}{2}
|
||||
\global\let\TotalHT\TotalHT
|
||||
\global\let\TotalTVA\TotalTVA
|
||||
\global\let\TotalTTC\TotalTTC
|
||||
|
||||
\cr
|
||||
\hline
|
||||
\textbf{Total} & & & \TotalHT
|
||||
}
|
||||
|
||||
\newcommand*\eaddto[2]{% version développée de \addto
|
||||
\edef\tmp{#2}%
|
||||
\expandafter\addto
|
||||
\expandafter#1%
|
||||
\expandafter{\tmp}%
|
||||
}
|
||||
|
||||
\newcommand{\ListeProduits}{}
|
||||
|
||||
|
||||
|
||||
|
||||
%%%%%%%%%%%%%%%%%%%%% A MODIFIER DANS LA FACTURE %%%%%%%%%%%%%%%%%%%%%
|
||||
|
||||
\def\FactureNum {<none>} % Numéro de facture
|
||||
\def\FactureAcquittee {non} % Facture acquittée : oui/non
|
||||
\def\FactureLieu {Suresnes} % Lieu de l'édition de la facture
|
||||
\def\FactureObjet {Facture} % Objet du document
|
||||
% Description de la facture
|
||||
\def\FactureDescr {%
|
||||
|
||||
Cette facture concerne la prestation de coiffure a domicile du Mardi 23 Septembre 2014 à Meudon, 6 rue de la Verrerie.
|
||||
}
|
||||
|
||||
% Infos Client
|
||||
\def\ClientNom{M. Dupont} % Nom du client
|
||||
\def\ClientAdresse{% % Adresse du client
|
||||
Zenosphere : Anthony Courtois (DG)\\
|
||||
6 rue de la Verrerie\\
|
||||
92190 MEUDON\\
|
||||
Mobile: 06 47 60 25 50
|
||||
}
|
||||
|
||||
% Liste des produits facturés : Désignation, prix
|
||||
\AjouterService {Forfait Coiffure} {75}
|
||||
%\AjouterService {Frais de déplacement} {0.84}
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
|
||||
|
||||
|
||||
|
||||
\geometry{verbose,tmargin=4em,bmargin=8em,lmargin=6em,rmargin=6em}
|
||||
\setlength{\parindent}{0pt}
|
||||
\setlength{\parskip}{1ex plus 0.5ex minus 0.2ex}
|
||||
|
||||
\thispagestyle{fancy}
|
||||
\pagestyle{fancy}
|
||||
\setlength{\parindent}{0pt}
|
||||
|
||||
\renewcommand{\headrulewidth}{0pt}
|
||||
\cfoot{
|
||||
Soraya Coiffure - 2 boulevard Aristide Briand - 92150 SURESNES \newline
|
||||
\small{
|
||||
E-mail: soraya.boudjouraf@free.fr\\
|
||||
Téléphone mobile: +33(0)6 37 57 42 74\\
|
||||
Téléphone fixe: +33(0)9 80 90 36 42
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
\begin{document}
|
||||
|
||||
% Logo de la société
|
||||
%\includegraphics{logo.jpg}
|
||||
|
||||
% Nom et adresse de la société
|
||||
Soraya Schneider\\
|
||||
2 boulevard Aristide Briand\\
|
||||
Bat V\\
|
||||
92150 SURESNES\\
|
||||
|
||||
Facture n°\FactureNum
|
||||
|
||||
|
||||
{\addtolength{\leftskip}{10.5cm} %in ERT
|
||||
\textbf{\ClientNom} \\
|
||||
\ClientAdresse \\
|
||||
|
||||
} %in ERT
|
||||
|
||||
|
||||
\hspace*{10.5cm}
|
||||
\FactureLieu, le \today
|
||||
|
||||
~\\~\\
|
||||
|
||||
\textbf{Objet : \FactureObjet \\}
|
||||
|
||||
\textnormal{\FactureDescr}
|
||||
|
||||
~\\
|
||||
|
||||
\begin{center}
|
||||
\begin{tabular}{lrrr}
|
||||
\textbf{Désignation ~~~~~~} & \textbf{Montant (EUR)} \\
|
||||
\hline
|
||||
\AfficheResultat{}
|
||||
\end{tabular}
|
||||
\end{center}
|
||||
|
||||
\begin{flushright}
|
||||
\textit{Auto entreprise en franchise de TVA}\\
|
||||
|
||||
\end{flushright}
|
||||
~\\
|
||||
|
||||
\ifthenelse{\equal{\FactureAcquittee}{oui}}{
|
||||
Facture acquittée.
|
||||
}{
|
||||
|
||||
À régler par chèque ou par virement bancaire :
|
||||
|
||||
\begin{center}
|
||||
\begin{tabular}{|c c c c|}
|
||||
\hline \textbf{Code banque} & \textbf{Code guichet} & \textbf{N° de Compte} & \textbf{Clé RIB} \\
|
||||
20041 & 00001 & 1225647F020 & 05 \\
|
||||
\hline \textbf{IBAN N°} & \multicolumn{3}{|l|}{ FR 91 20041 00001 1225647F020 05 } \\
|
||||
\hline \textbf{Code BIC} & \multicolumn{3}{|l|}{ PSSTFRPPPAR } \\
|
||||
\hline
|
||||
\end{tabular}
|
||||
\end{center}
|
||||
|
||||
}
|
||||
|
||||
\end{document}
|
188
web/templates/Estim.tt
Normal file
188
web/templates/Estim.tt
Normal file
@ -0,0 +1,188 @@
|
||||
<#@ template language="C#" #>
|
||||
<#@ output extension=".tex" #>
|
||||
<#@ assembly name="System.Core" #>
|
||||
<#@ assembly name="$(SolutionDir)/web/bin/YavscModel.dll" #>
|
||||
<#@ import namespace="System.Linq" #>
|
||||
<#@ import namespace="System.Text" #>
|
||||
<#@ import namespace="System.Collections.Generic" #>
|
||||
<#@ import namespace="Yavsc.Model.WorkFlow" #>
|
||||
<#@ import namespace="Yavsc.Model.RolesAndMembers" #>
|
||||
|
||||
<#@ parameter type="Estimate" name="estim" #>
|
||||
<#@ parameter type="Profile" name="from" #>
|
||||
<#@ parameter type="Profile" name="to" #>
|
||||
|
||||
|
||||
\documentclass[french,11pt]{article}
|
||||
\usepackage{babel}
|
||||
\usepackage[T1]{fontenc}
|
||||
\usepackage[utf8]{inputenc}
|
||||
\usepackage[a4paper]{geometry}
|
||||
\usepackage{units}
|
||||
\usepackage{bera}
|
||||
\usepackage{graphicx}
|
||||
\usepackage{fancyhdr}
|
||||
\usepackage{fp}
|
||||
|
||||
\def\TVA{20} % Taux de la TVA
|
||||
|
||||
\def\TotalHT{0}
|
||||
\def\TotalTVA{0}
|
||||
|
||||
|
||||
\newcommand{\AjouterService}[2]{% Arguments : Désignation, prix
|
||||
\FPround{\montant}{#2}{2}
|
||||
\FPadd{\TotalHT}{\TotalHT}{\montant}
|
||||
\eaddto\ListeProduits{#1 & \montant \cr}
|
||||
}
|
||||
|
||||
|
||||
\newcommand{\AfficheResultat}{%
|
||||
\ListeProduits
|
||||
|
||||
\FPeval{\TotalTVA}{\TotalHT * \TVA / 100}
|
||||
\FPadd{\TotalTTC}{\TotalHT}{\TotalTVA}
|
||||
\FPround{\TotalHT}{\TotalHT}{2}
|
||||
\FPround{\TotalTVA}{\TotalTVA}{2}
|
||||
\FPround{\TotalTTC}{\TotalTTC}{2}
|
||||
\global\let\TotalHT\TotalHT
|
||||
\global\let\TotalTVA\TotalTVA
|
||||
\global\let\TotalTTC\TotalTTC
|
||||
|
||||
|
||||
\cr
|
||||
\hline
|
||||
\textbf{Total} & & & \TotalHT
|
||||
}
|
||||
|
||||
\newcommand*\eaddto[2]{% version développée de \addto
|
||||
\edef\tmp{#2}%
|
||||
\expandafter\addto
|
||||
\expandafter#1%
|
||||
\expandafter{\tmp}%
|
||||
}
|
||||
|
||||
\newcommand{\ListeProduits}{}
|
||||
|
||||
|
||||
|
||||
|
||||
%%%%%%%%%%%%%%%%%%%%% A MODIFIER DANS LA FACTURE %%%%%%%%%%%%%%%%%%%%%
|
||||
|
||||
\def\FactureNum {<#= estim.Id.ToString() #>} % Numéro de facture
|
||||
\def\FactureAcquittee {non} % Facture acquittée : oui/non
|
||||
\def\FactureLieu {<#= from.CityAndState #>} % Lieu de l'édition de la facture
|
||||
\def\FactureObjet {Facture} % Objet du document
|
||||
% Description de la facture
|
||||
\def\FactureDescr {%
|
||||
<#= estim.Title #>
|
||||
}
|
||||
|
||||
% Infos Client
|
||||
\def\ClientNom{<#= to.Name #>} % Nom du client
|
||||
\def\ClientAdresse{% % Adresse du client
|
||||
<#= to.Address #>\\
|
||||
<#= to.ZipCode #> <#= to.CityAndState #>\\
|
||||
<# if (!string.IsNullOrWhiteSpace(to.Phone)) { #>
|
||||
Téléphone fixe: <#= to.Phone #>\\
|
||||
<# } #>
|
||||
<# if (!string.IsNullOrWhiteSpace(to.Mobile)) { #>
|
||||
Mobile: <#= to.Mobile #>\\
|
||||
<# } #>
|
||||
E-mail: <#= to.Email #>
|
||||
}
|
||||
|
||||
% Liste des produits facturés : Désignation, prix
|
||||
|
||||
<# foreach (Writting wr in estim.Lines) { #>
|
||||
\AjouterService {<#=wr.Description#> <# if (!string.IsNullOrWhiteSpace(wr.ProductReference)) { #>
|
||||
(<#=wr.ProductReference#>)<# } #>} {<#=wr.UnitaryCost*wr.Count#>}
|
||||
<# } #>
|
||||
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
|
||||
|
||||
|
||||
|
||||
\geometry{verbose,tmargin=4em,bmargin=8em,lmargin=6em,rmargin=6em}
|
||||
\setlength{\parindent}{0pt}
|
||||
\setlength{\parskip}{1ex plus 0.5ex minus 0.2ex}
|
||||
|
||||
\thispagestyle{fancy}
|
||||
\pagestyle{fancy}
|
||||
\setlength{\parindent}{0pt}
|
||||
|
||||
\renewcommand{\headrulewidth}{0pt}
|
||||
\cfoot{
|
||||
<#=from.Name#> - <#=from.Address #> - <#= from.CityAndState #> \newline
|
||||
\small{
|
||||
E-mail: <#= from.Email #>
|
||||
<# if (!string.IsNullOrWhiteSpace(from.Mobile)) { #> - Téléphone mobile: <#= from.Mobile #><# } #>
|
||||
<# if (!string.IsNullOrWhiteSpace(from.Phone)) { #> - Téléphone fixe: <#= from.Phone #><# } #>
|
||||
}
|
||||
}
|
||||
|
||||
\begin{document}
|
||||
|
||||
% Logo de la société
|
||||
%\includegraphics{logo.jpg}
|
||||
|
||||
% Nom et adresse de la société
|
||||
<#= from.Name #>\\
|
||||
<#= from.Address #>\\
|
||||
<#=from.ZipCode #> <#=from.CityAndState#>\\
|
||||
|
||||
Facture n°\FactureNum
|
||||
|
||||
|
||||
{\addtolength{\leftskip}{10.5cm} %in ERT
|
||||
\textbf{\ClientNom} \\
|
||||
\ClientAdresse \\
|
||||
|
||||
} %in ERT
|
||||
|
||||
|
||||
\hspace*{10.5cm}
|
||||
\FactureLieu, le \today
|
||||
|
||||
~\\~\\
|
||||
|
||||
\textbf{Objet : \FactureObjet \\}
|
||||
|
||||
\textnormal{\FactureDescr}
|
||||
|
||||
~\\
|
||||
|
||||
\begin{center}
|
||||
\begin{tabular}{lrrr}
|
||||
\textbf{Désignation ~~~~~~} & \textbf{Montant (EUR)} \\
|
||||
\hline
|
||||
\AfficheResultat{}
|
||||
\end{tabular}
|
||||
\end{center}
|
||||
|
||||
\begin{flushright}
|
||||
\textit{Auto entreprise en franchise de TVA}\\
|
||||
|
||||
\end{flushright}
|
||||
~\\
|
||||
|
||||
\ifthenelse{\equal{\FactureAcquittee}{oui}}{
|
||||
Facture acquittée.
|
||||
}{
|
||||
|
||||
À régler par chèque ou par virement bancaire :
|
||||
|
||||
\begin{center}
|
||||
\begin{tabular}{|c c c c|}
|
||||
\hline \textbf{Code banque} & \textbf{Code guichet} & \textbf{N° de Compte} & \textbf{Clé RIB} \\
|
||||
<#= from.BankCode #> & <#= from.WicketCode #> & <#=from.AccountNumber #> & <#=from.BankedKey#> \\
|
||||
\hline \textbf{IBAN N°} & \multicolumn{3}{|l|}{ <#= from.IBAN #> } \\
|
||||
\hline \textbf{Code BIC} & \multicolumn{3}{|l|}{ <#= from.BIC #> } \\
|
||||
\hline
|
||||
\end{tabular}
|
||||
\end{center}
|
||||
|
||||
}
|
||||
|
||||
\end{document}
|
2
web/templates/T4TemplateEstimate.cs
Normal file
2
web/templates/T4TemplateEstimate.cs
Normal file
@ -0,0 +1,2 @@
|
||||
|
||||
|
33
web/templates/TexEstimInit.cs
Normal file
33
web/templates/TexEstimInit.cs
Normal file
@ -0,0 +1,33 @@
|
||||
//
|
||||
// TexEstimInit.cs
|
||||
//
|
||||
// Author:
|
||||
// Paul Schneider <paulschneider@free.fr>
|
||||
//
|
||||
// Copyright (c) 2014 Paul Schneider
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Lesser General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Lesser General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Lesser General Public License
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
using System;
|
||||
|
||||
namespace Yavsc.templates
|
||||
{
|
||||
public partial class Estim
|
||||
{
|
||||
public void Init ()
|
||||
{
|
||||
this.Initialize();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2,63 +2,158 @@ using System;
|
||||
using System.ComponentModel;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.Web.Profile;
|
||||
using System.Web.Security;
|
||||
|
||||
namespace Yavsc.Model.RolesAndMembers
|
||||
{
|
||||
public class Profile
|
||||
{
|
||||
[DisplayName("Adresse")]
|
||||
[StringLength(2047)]
|
||||
[DisplayName ("Nom complet")]
|
||||
[StringLength (1024)]
|
||||
public string Name { get; set; }
|
||||
|
||||
[DisplayName ("Adresse")]
|
||||
[StringLength (2047)]
|
||||
public string Address { get; set; }
|
||||
|
||||
[DisplayName("Ville")]
|
||||
[StringLength(255)]
|
||||
[DisplayName ("Ville")]
|
||||
[StringLength (255)]
|
||||
public string CityAndState { get; set; }
|
||||
|
||||
[DisplayName("Code Postal")]
|
||||
[StringLength(9)]
|
||||
[DisplayName ("Code Postal")]
|
||||
[StringLength (9)]
|
||||
public string ZipCode { get; set; }
|
||||
|
||||
[DisplayName("Pays")]
|
||||
[StringLength(99)]
|
||||
[DisplayName ("Pays")]
|
||||
[StringLength (99)]
|
||||
public string Country { get; set; }
|
||||
|
||||
[DisplayName("Site Web")]
|
||||
[StringLength(255)]
|
||||
[DisplayName ("Site Web")]
|
||||
[StringLength (255)]
|
||||
public string WebSite { get; set; }
|
||||
|
||||
[DisplayName("Blog visible")]
|
||||
[DisplayName ("Blog visible")]
|
||||
public bool BlogVisible { get; set; }
|
||||
|
||||
[DisplayName("Titre du blog")]
|
||||
[DisplayName ("Titre du blog")]
|
||||
[StringLength (255)]
|
||||
public string BlogTitle { get; set; }
|
||||
|
||||
public Profile():base()
|
||||
[DisplayName ("Téléphone fixe")]
|
||||
[StringLength (15)]
|
||||
public string Phone { get; set; }
|
||||
|
||||
[DisplayName ("Portable")]
|
||||
[StringLength (15)]
|
||||
public string Mobile { get; set; }
|
||||
|
||||
[DisplayName ("E-mail")]
|
||||
[StringLength (1024)]
|
||||
public string Email { get; set; }
|
||||
|
||||
[DisplayName ("Code BIC")]
|
||||
[StringLength (15)]
|
||||
public string BIC { get; set; }
|
||||
|
||||
[DisplayName ("Code IBAN")]
|
||||
[StringLength (33)]
|
||||
public string IBAN { get; set; }
|
||||
|
||||
|
||||
[DisplayName ("Code Banque")]
|
||||
[StringLength (5)]
|
||||
public string BankCode { get; set; }
|
||||
|
||||
[DisplayName ("Code Guichet")]
|
||||
[StringLength (5)]
|
||||
public string WicketCode { get; set; }
|
||||
|
||||
[DisplayName ("Numéro de compte")]
|
||||
[StringLength (15)]
|
||||
public string AccountNumber { get; set; }
|
||||
|
||||
[DisplayName ("Clé RIB")]
|
||||
public int BankedKey { get; set; }
|
||||
|
||||
public bool IsBankable { get {
|
||||
return IsBillable
|
||||
&& !string.IsNullOrWhiteSpace (BankCode)
|
||||
&& !string.IsNullOrWhiteSpace (BIC)
|
||||
&& !string.IsNullOrWhiteSpace (IBAN)
|
||||
&& !string.IsNullOrWhiteSpace (BankCode)
|
||||
&& !string.IsNullOrWhiteSpace (WicketCode)
|
||||
&& !string.IsNullOrWhiteSpace (AccountNumber)
|
||||
&& BankedKey != 0; } }
|
||||
|
||||
public bool IsBillable {
|
||||
get {
|
||||
return !string.IsNullOrWhiteSpace (Name)
|
||||
&& !string.IsNullOrWhiteSpace (Address)
|
||||
&& !string.IsNullOrWhiteSpace (CityAndState)
|
||||
&& !string.IsNullOrWhiteSpace (ZipCode)
|
||||
&& !string.IsNullOrWhiteSpace (Email)
|
||||
&& !(string.IsNullOrWhiteSpace (Phone) &&
|
||||
string.IsNullOrWhiteSpace (Mobile));
|
||||
}
|
||||
}
|
||||
|
||||
public Profile () : base ()
|
||||
{
|
||||
}
|
||||
|
||||
public Profile(ProfileBase profile)
|
||||
public Profile (ProfileBase profile)
|
||||
{
|
||||
object b = profile.GetPropertyValue ("BlogVisible");
|
||||
BlogVisible = (b is DBNull) ? true : (bool)b;
|
||||
BlogVisible = (b == null) ? true : (bool)b;
|
||||
|
||||
object s = profile.GetPropertyValue ("BlogTitle");
|
||||
BlogTitle = (s is DBNull) ? null : (string)s;
|
||||
|
||||
s = profile.GetPropertyValue("Address");
|
||||
Address = (s is DBNull)?null:(string)s;
|
||||
s = profile.GetPropertyValue ("Address");
|
||||
Address = (s is DBNull) ? null : (string)s;
|
||||
|
||||
s = profile.GetPropertyValue("CityAndState");
|
||||
CityAndState = (s is DBNull)?null:(string)s;
|
||||
s = profile.GetPropertyValue ("CityAndState");
|
||||
CityAndState = (s is DBNull) ? null : (string)s;
|
||||
|
||||
s = profile.GetPropertyValue("Country");
|
||||
Country = (s is DBNull)?null:(string)s;
|
||||
s = profile.GetPropertyValue ("Country");
|
||||
Country = (s is DBNull) ? null : (string)s;
|
||||
|
||||
s = profile.GetPropertyValue("ZipCode");
|
||||
ZipCode = (s is DBNull)?null:(string)s;
|
||||
s = profile.GetPropertyValue ("ZipCode");
|
||||
ZipCode = (s is DBNull) ? null : (string)s;
|
||||
|
||||
s = profile.GetPropertyValue ("WebSite");
|
||||
WebSite = (s is DBNull) ? null : (string)s;
|
||||
|
||||
s = profile.GetPropertyValue ("Name");
|
||||
Name = (s is DBNull) ? null : (string)s;
|
||||
|
||||
s = profile.GetPropertyValue ("Phone");
|
||||
Phone = (s is DBNull) ? null : (string)s;
|
||||
|
||||
s = profile.GetPropertyValue ("Mobile");
|
||||
Mobile = (s is DBNull) ? null : (string)s;
|
||||
|
||||
MembershipUser u = Membership.GetUser (profile.UserName);
|
||||
Email = u.Email;
|
||||
|
||||
s = profile.GetPropertyValue ("BankCode");
|
||||
BankCode = (s is DBNull) ? null : (string)s;
|
||||
|
||||
s = profile.GetPropertyValue ("IBAN");
|
||||
IBAN = (s is DBNull) ? null : (string)s;
|
||||
|
||||
s = profile.GetPropertyValue ("BIC");
|
||||
BIC = (s is DBNull) ? null : (string)s;
|
||||
|
||||
s = profile.GetPropertyValue ("WicketCode");
|
||||
WicketCode = (s is DBNull) ? null : (string)s;
|
||||
|
||||
s = profile.GetPropertyValue ("AccountNumber");
|
||||
this.AccountNumber = (s is DBNull) ? null : (string)s;
|
||||
|
||||
s = profile.GetPropertyValue ("BankedKey");
|
||||
BankedKey = (s == null) ? 0 : (int)s;
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,15 +1,30 @@
|
||||
using System;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.ComponentModel;
|
||||
|
||||
namespace Yavsc.Model.WorkFlow
|
||||
{
|
||||
[Serializable]
|
||||
public class Estimate
|
||||
{
|
||||
public Estimate ()
|
||||
{
|
||||
}
|
||||
[Required]
|
||||
[DisplayName("Titre")]
|
||||
public string Title { get; set; }
|
||||
public string Owner { get; set; }
|
||||
[Required]
|
||||
[DisplayName("Description")]
|
||||
public string Description { get; set; }
|
||||
[Required]
|
||||
[DisplayName("Responsable")]
|
||||
public string Responsible { get; set; }
|
||||
[Required]
|
||||
[DisplayName("Client")]
|
||||
public string Client { get; set; }
|
||||
|
||||
public long Id { get; set; }
|
||||
[DisplayName("Chiffre")]
|
||||
public decimal Ciffer {
|
||||
get {
|
||||
decimal total = 0;
|
||||
@ -20,6 +35,7 @@ namespace Yavsc.Model.WorkFlow
|
||||
return total;
|
||||
}
|
||||
}
|
||||
|
||||
public Writting[] Lines { get; set; }
|
||||
}
|
||||
}
|
||||
|
@ -1,13 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Yavsc.Model.WorkFlow
|
||||
{
|
||||
public interface IContent
|
||||
{
|
||||
object Data { get; set; }
|
||||
string MimeType { get; set; }
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -42,7 +42,7 @@ namespace Yavsc.Model.WorkFlow
|
||||
/// <returns>The estimate.</returns>
|
||||
/// <param name="client">Client.</param>
|
||||
/// <param name="title">Title.</param>
|
||||
long CreateEstimate (string client, string title);
|
||||
Estimate CreateEstimate (string responsible, string client, string title, string description);
|
||||
/// <summary>
|
||||
/// Add a line to the specified estimate by id,
|
||||
/// using the specified desc, ucost, count and productid.
|
||||
@ -97,13 +97,7 @@ namespace Yavsc.Model.WorkFlow
|
||||
/// </summary>
|
||||
/// <param name="estid">Estid.</param>
|
||||
/// <param name="newTitle">New title.</param>
|
||||
void SetTitle (long estid, string newTitle);
|
||||
/// <summary>
|
||||
/// Sets the descripton for a writting.
|
||||
/// </summary>
|
||||
/// <param name="writid">Writid.</param>
|
||||
/// <param name="newDesc">New desc.</param>
|
||||
void SetDesc (long writid, string newDesc);
|
||||
void UpdateEstimate (Estimate estim);
|
||||
/// <summary>
|
||||
/// Sets the writting status.
|
||||
/// </summary>
|
||||
|
@ -8,19 +8,11 @@ namespace Yavsc.Model.WorkFlow
|
||||
{
|
||||
public class NewEstimateEvenArgs: EventArgs
|
||||
{
|
||||
private string clientName;
|
||||
private string estimateTitle;
|
||||
private long eid;
|
||||
|
||||
public string ClientName{ get { return clientName; } }
|
||||
public string EstimateTitle { get { return estimateTitle; } }
|
||||
public long EstimateId { get { return eid; } }
|
||||
|
||||
public NewEstimateEvenArgs(long estid, string client, string title)
|
||||
private Estimate data=null;
|
||||
public Estimate Data{ get { return data; } }
|
||||
public NewEstimateEvenArgs(Estimate created)
|
||||
{
|
||||
clientName = client;
|
||||
estimateTitle = title;
|
||||
eid = estid;
|
||||
data = created;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -17,9 +17,9 @@ namespace Yavsc.Model.WorkFlow
|
||||
public static Catalog Catalog { get; set; }
|
||||
|
||||
|
||||
public static void SetTitle (long id, string title)
|
||||
public static void UpdateEstimate (Estimate estim)
|
||||
{
|
||||
ContentProvider.SetTitle (id, title);
|
||||
ContentProvider.UpdateEstimate (estim);
|
||||
}
|
||||
|
||||
public static event EventHandler NewOrder;
|
||||
@ -95,12 +95,13 @@ namespace Yavsc.Model.WorkFlow
|
||||
/// </summary>
|
||||
/// <returns>The estimate identifier.</returns>
|
||||
/// <param name="title">Title.</param>
|
||||
public static long CreateEstimate(string client, string title)
|
||||
|
||||
public static Estimate CreateEstimate(string responsible, string client, string title, string description)
|
||||
{
|
||||
long estid = ContentProvider.CreateEstimate (client, title);
|
||||
Estimate created = ContentProvider.CreateEstimate (responsible, client, title, description);
|
||||
if (NewOrder != null)
|
||||
NewOrder.Invoke(ContentProvider, new NewEstimateEvenArgs(estid,client,title));
|
||||
return estid;
|
||||
NewOrder.Invoke(ContentProvider, new NewEstimateEvenArgs(created));
|
||||
return created;
|
||||
}
|
||||
|
||||
public static long Write(long estid, string desc, decimal ucost, int count, string productid)
|
||||
|
@ -7,6 +7,7 @@ namespace Yavsc.Model.WorkFlow
|
||||
/// A Writting.
|
||||
/// Une ligne d'écriture dans un devis ou une facture
|
||||
/// </summary>
|
||||
[Serializable]
|
||||
public class Writting
|
||||
{
|
||||
/// <summary>
|
||||
|
@ -35,6 +35,7 @@
|
||||
<Reference Include="System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
|
||||
<Reference Include="System.Configuration" />
|
||||
<Reference Include="System.Data" />
|
||||
<Reference Include="System.Web.ApplicationServices" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
@ -53,7 +54,6 @@
|
||||
<Compile Include="WorkFlow\Writting.cs" />
|
||||
<Compile Include="WorkFlow\Estimate.cs" />
|
||||
<Compile Include="WorkFlow\WFOrder.cs" />
|
||||
<Compile Include="WorkFlow\IContent.cs" />
|
||||
<Compile Include="WorkFlow\IContentProvider.cs" />
|
||||
<Compile Include="WorkFlow\IWFModule.cs" />
|
||||
<Compile Include="WorkFlow\IWFOrder.cs" />
|
||||
|
Reference in New Issue
Block a user